diff --git a/derex/runner/cli/mongodb.py b/derex/runner/cli/mongodb.py index 8a950e1c..b605ed77 100644 --- a/derex/runner/cli/mongodb.py +++ b/derex/runner/cli/mongodb.py @@ -190,3 +190,27 @@ def reset_mongodb_password_cmd(current_password: Optional[str], force: bool): reset_mongodb_password(current_password) return 0 + + +@mongodb.command(name="dump") +@click.pass_obj +@click.argument("db_name", type=str) +def dump_database_cmd(project: Optional[Project], db_name: str): + """Dump a mongodb database""" + + from derex.runner.mongodb import dump_database + + dump_database(db_name) + return 0 + + +@mongodb.command(name="restore") +@click.argument("db_name", type=str, nargs=1) +@click.argument("dump_file", type=click.Path(exists=True), nargs=1) +def restore_database_cmd(db_name: str, dump_file: str): + """Restore a mysql database from a file""" + + from derex.runner.mongodb import restore_database + + restore_database(db_name, dump_file) + return 0 diff --git a/derex/runner/cli/mysql.py b/derex/runner/cli/mysql.py index 4462d326..fd46cd89 100644 --- a/derex/runner/cli/mysql.py +++ b/derex/runner/cli/mysql.py @@ -243,3 +243,27 @@ def reset_mysql_password_cmd(current_password: str, force: bool): reset_mysql_password(current_password) return 0 + + +@mysql.command(name="dump") +@click.pass_obj +@click.argument("db_name", type=str) +def dump_database_cmd(project: Optional[Project], db_name: str): + """Dump a mysql database""" + + from derex.runner.mysql import dump_database + + dump_database(db_name) + return 0 + + +@mysql.command(name="restore") +@click.argument("db_name", type=str, nargs=1) +@click.argument("dump_file", type=click.Path(exists=True), nargs=1) +def restore_database_cmd(db_name: str, dump_file: str): + """Restore a mysql database from a file""" + + from derex.runner.mysql import restore_database + + restore_database(db_name, dump_file) + return 0 diff --git a/derex/runner/mongodb.py b/derex/runner/mongodb.py index 2513b2b0..20db5b56 100644 --- a/derex/runner/mongodb.py +++ b/derex/runner/mongodb.py @@ -11,6 +11,7 @@ from typing import Optional import logging +import os import urllib.parse @@ -135,3 +136,29 @@ def reset_mongodb_password(current_password: str = None): run_ddc_services(compose_args, exit_afterwards=True) return 0 + + +@ensure_mongodb +def dump_database(database_name: str): + """Export the database""" + logger.info(f'Dumping the database "{database_name}"...') + os.system( + f"docker exec -i mongodb mongodump --authenticationDatabase=admin -u {MONGODB_ROOT_USER} -p{MONGODB_ROOT_PASSWORD} -d {database_name} --gzip --archive={database_name}.gz && docker cp mongodb:{database_name}.gz . && docker exec mongodb rm {database_name}.gz" + ) + logger.info( + f"The database {database_name} was successfully dumped on {database_name}" + ) + + +@ensure_mongodb +def restore_database(database_name: str, dump_file: str): + """Resore a database from a dump file""" + logger.info( + f'Restoring the database "{database_name}" from the the directory {dump_file}' + ) + os.system( + f"docker cp {dump_file} mongodb:/ && docker exec mongodb mongorestore --authenticationDatabase=admin -u {MONGODB_ROOT_USER} -p{MONGODB_ROOT_PASSWORD} --db {database_name} --drop --gzip --archive={dump_file} && docker exec mongodb rm {dump_file}" + ) + logger.info( + f"The database {database_name} was successfully retored from {dump_file}" + ) diff --git a/derex/runner/mysql.py b/derex/runner/mysql.py index 321aba20..ed3fe0b0 100644 --- a/derex/runner/mysql.py +++ b/derex/runner/mysql.py @@ -14,6 +14,7 @@ from typing import Tuple import logging +import os import pymysql @@ -187,6 +188,34 @@ def copy_database(source_db_name: str, destination_db_name: str): ) +def dump_database(database_name: str): + """ "Export the database""" + logger.info(f'Dumping the database "{database_name}"...') + # run_ddc_services( + # [ + # "exec", + # "-T", + # "mysql", + # f"mysqldump -u root -p{MYSQL_ROOT_PASSWORD} --databases {database_name} > dump.sql" + # ] + # ) + os.system( + f"docker exec mysql mysqldump -u {MYSQL_ROOT_USER} -p{MYSQL_ROOT_PASSWORD} {database_name} > {database_name}.sql" + ) + logger.info(f"The database {database_name} was successfully dumped") + + +def restore_database(database_name: str, dump_file: str): + """Resore a database from a dump file""" + logger.info(f'Restoring the database "{database_name}" from {dump_file}') + os.system( + f"docker exec mysql mysqldump -u {MYSQL_ROOT_USER} -p{MYSQL_ROOT_PASSWORD} {database_name} < {dump_file}" + ) + logger.info( + f"The database {database_name} was successfully retored from {dump_file}" + ) + + @ensure_mysql def reset_mysql_openedx(project: Project, dry_run: bool = False): """Run script from derex/openedx image to reset the mysql db."""