示例#1
0
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
示例#2
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")
示例#3
0
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")
示例#4
0
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
示例#5
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
示例#6
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)
示例#7
0
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)
示例#8
0
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,
    )
示例#9
0
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
示例#10
0
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