def reset_mysql(project): """Reset the discovery mysql database""" from derex.runner.docker_utils import check_services from derex.runner.mysql import wait_for_mysql from derex.runner.project import ProjectRunMode from derex.runner.utils import abspath_from_egg from derex.runner.ddc import run_ddc_project if project.runmode is not ProjectRunMode.debug: click.get_current_context().fail( "This command can only be run in `debug` runmode") if not check_services(["mysql"]): click.echo( "Mysql service not found.\nMaybe you forgot to run\nddc-services up -d" ) return wait_for_mysql() restore_dump_path = abspath_from_egg("derex.discovery", "derex/discovery/restore_dump.py") run_ddc_project( [ "run", "--rm", "-v", f"{restore_dump_path}:/openedx/discovery/restore_dump.py", "discovery", "python", "/openedx/discovery/restore_dump.py", ], project=project, ) return 0
def test_ddc_project_addition(minimal_project, mocker, capsys): from derex.runner import hookimpl class CustomAdditional: @staticmethod @hookimpl def ddc_project_options( project: Project, ) -> Dict[str, Union[str, List[str]]]: """See derex.runner.plugin_spec.ddc_project_options docstring """ return { "options": ["custom-additional"], "name": "custom", "priority": ">local-derex", } with minimal_project: docker_compose_path = Project().root / "docker-compose.yml" with docker_compose_path.open("w") as fh: fh.write("lms:\n image: foobar\n") project = Project() run_ddc_project([], project, dry_run=True) output = capsys.readouterr().out # The last option should be the path of the user docker compose file for this project assert output.endswith(f"-f {docker_compose_path}\n")
def test_docker_compose_addition_per_runmode(minimal_project, mocker, capsys): with minimal_project: docker_compose_debug_path = Project().root / "docker-compose-debug.yml" with docker_compose_debug_path.open("w") as fh: fh.write("lms:\n image: foobar\n") project = Project() run_ddc_project([], project, dry_run=True) output = capsys.readouterr().out # The last option should be the path of the debug docker compose assert output.endswith(f"-f {docker_compose_debug_path}\n") project.runmode = ProjectRunMode.production default_project_docker_compose_file = project.private_filepath( "docker-compose.yml") run_ddc_project([], project, dry_run=True) output = capsys.readouterr().out # The last option should be the path of the project default docker compose file assert output.endswith(f"-f {default_project_docker_compose_file}\n")
def refresh_course_metadata(project): """Run discovery `refresh_course_metadata` Django command""" from derex.runner.docker_utils import check_services from derex.runner.ddc import run_ddc_project if not check_services(["elasticsearch"]): click.echo( "Elasticsearch service not found.\nMaybe you forgot to run\nddc-services up -d" ) return run_ddc_project( [ "run", "--rm", "discovery", "python", "manage.py", "refresh_course_metadata" ], project=project, ) return 0
def create_index(project): """Run discovery `install_es_indexes` Django command""" from derex.runner.docker_utils import check_services from derex.runner.ddc import run_ddc_project if not check_services(["elasticsearch"]): click.echo( "Elasticsearch service not found.\nMaybe you forgot to run\nddc-services up -d" ) return run_ddc_project( [ "run", "--rm", "discovery", "python", "manage.py", "install_es_indexes" ], project=project, ) return 0
def compile_theme(project): """Compile theme sass files""" from derex.runner.ddc import run_ddc_project if project.themes_dir is None: click.echo("No theme directory present in this project") return themes = ",".join(el.name for el in project.themes_dir.iterdir()) uid = os.getuid() args = [ "run", "--rm", "lms", "sh", "-c", f"""set -ex export PATH=/openedx/edx-platform/node_modules/.bin:$PATH # FIXME: this should not be necessary paver compile_sass --theme-dirs /openedx/themes --themes {themes} chown {uid}:{uid} /openedx/themes/* -R""", ] run_ddc_project(args, DebugBaseImageProject(), exit_afterwards=True)
def reindex_courses(project, course_ids): """Reindex all courses on elasticsearch. Course ids may be specified as arguemnts in order to reindex specific courses. e.g. `derex reindex_courses course-v1:edX+DemoX+Demo_Course`""" from derex.runner.ddc import run_ddc_project django_cmd = ["python", "manage.py", "cms", "reindex_course"] if course_ids: for course_id in course_ids: django_cmd.append(course_id) else: # Here we use the "--setup" option instead of "--all" to avoid # the confirmation prompt django_cmd.append("--setup") args = ["run", "--rm", "cms", "sh", "-c", " ".join(django_cmd)] run_ddc_project(args, DebugBaseImageProject(), exit_afterwards=True)
def reset_mysql_openedx(project: Project, dry_run: bool = False): """Run script from derex/openedx image to reset the mysql db.""" restore_dump_path = abspath_from_egg( "derex.runner", "derex/runner/restore_dump.py.source" ) assert ( restore_dump_path ), "Could not find restore_dump.py in derex.runner distribution" run_ddc_project( [ "run", "--rm", "-v", f"{restore_dump_path}:/restore_dump.py", "lms", "python", "/restore_dump.py", ], project=project, dry_run=dry_run, )
def load_fixtures(project): """Load fixtures from the plugin fixtures directory""" from derex.runner.ddc import run_ddc_project from derex.runner.utils import abspath_from_egg fixtures_dir = project.get_plugin_directories(__package__).get("fixtures") if fixtures_dir is None: click.echo("No fixtures directory present for this plugin") return load_fixtures_path = abspath_from_egg("derex.discovery", "derex/discovery/load_fixtures.py") compose_args = [ "run", "--rm", "-v", f"{load_fixtures_path}:/openedx/discovery/load_fixtures.py", "discovery", "python", "/openedx/discovery/load_fixtures.py", ] run_ddc_project(compose_args, project=project) return
def create_index(project): """Prime the elasticsearch index for the Forum service""" from derex.runner.ddc import run_ddc_project from derex.runner.docker_utils import wait_for_service try: wait_for_service("elasticsearch") except (TimeoutError, RuntimeError, NotImplementedError) as exc: click.echo(click.style(str(exc), fg="red")) sys.exit(1) compose_args = [ "run", "--rm", "-T", "forum", "sh", "-c", """bundle exec rake search:initialize && bundle exec rake search:rebuild_index """, ] run_ddc_project(compose_args, project=project) return 0