def main(expansions_file: str = "expansions.yml",
         output_file: str = "powercycle_tasks.json") -> None:
    """Generate multiple powercycle tasks to run in evergreen."""

    config = make_config(expansions_file)
    build_variant = BuildVariant(config.build_variant)
    for task_name in config.task_names:
        if "skip_compile" in task_name:
            commands, task_dependency = get_skip_compile_setup_commands()
        else:
            commands, task_dependency = get_setup_commands()

        commands.extend([
            FunctionCall("set up remote credentials", config.remote_credentials_vars),
            BuiltInCommand("timeout.update", config.timeout_params),
            FunctionCall("set up EC2 instance", config.set_up_ec2_instance_vars),
            FunctionCall("run powercycle test", config.run_powercycle_vars),
        ])

        build_variant.display_task(
            task_name, {
                Task(
                    name_generated_task(task_name, index, config.num_tasks, config.build_variant),
                    commands, task_dependency)
                for index in range(config.num_tasks)
            }, distros=[config.distro])

    shrub_project = ShrubProject.empty()
    shrub_project.add_build_variant(build_variant)

    write_file(output_file, shrub_project.json())
Beispiel #2
0
    def _generate_task(self, sub_suite_name: str, sub_task_name: str,
                       target_dir: str, timeout_est: TimeoutEstimate) -> Task:
        """
        Generate a shrub evergreen config for a resmoke task.

        :param sub_suite_name: Name of suite being generated.
        :param sub_task_name: Name of task to generate.
        :param target_dir: Directory containing generated suite files.
        :param timeout_est: Estimated runtime to use for calculating timeouts.
        :return: Shrub configuration for the described task.
        """
        # pylint: disable=too-many-arguments
        LOGGER.debug("Generating task", sub_suite=sub_suite_name)

        # Evergreen always uses a unix shell, even on Windows, so instead of using os.path.join
        # here, just use the forward slash; otherwise the path separator will be treated as
        # the escape character on Windows.
        target_suite_file = '/'.join(
            [target_dir, os.path.basename(sub_suite_name)])
        run_tests_vars = self._get_run_tests_vars(target_suite_file)

        use_multiversion = self.options.use_multiversion
        timeout_cmd = timeout_est.generate_timeout_cmd(
            self.options.is_patch, self.options.repeat_suites,
            self.options.use_default_timeouts)
        commands = resmoke_commands("run generated tests", run_tests_vars,
                                    timeout_cmd, use_multiversion)

        return Task(sub_task_name, commands, self._get_dependencies())
Beispiel #3
0
    def generate_tasks(self, gen_suite: GeneratedSuite,
                       params: BurnInGenTaskParams) -> List[Task]:
        """Create the task configuration for the given test using the given index."""

        tasks = set()
        for index, suite in enumerate(gen_suite.sub_suites):
            if len(suite.test_list) != 1:
                raise ValueError(
                    f"Can only run one test per suite in burn-in; got {suite.test_list}"
                )
            test_name = suite.test_list[0]
            test_unix_style = test_name.replace('\\', '/')
            run_tests_vars = {
                "suite":
                gen_suite.suite_name,
                "resmoke_args":
                self._generate_resmoke_args(gen_suite.task_name, params,
                                            test_unix_style)
            }

            timeout_cmd = self.generate_timeouts(test_name)
            commands = resmoke_commands("run tests", run_tests_vars,
                                        timeout_cmd,
                                        params.require_multiversion_setup)
            dependencies = {TaskDependency(ARCHIVE_DIST_TEST_DEBUG_TASK)}

            tasks.add(
                Task(self._generate_task_name(gen_suite, index), commands,
                     dependencies))

        return tasks
    def decorate_tasks_with_dynamically_generated_files(
            self, sub_tasks: Set[Task],
            params: MultiversionDecoratorParams) -> Set[Task]:
        """
        Make multiversion subtasks based on generated subtasks, for tasks with generated files. E.g. fuzzers.

        @param sub_tasks: set of existing sub-tasks to be converted to multiversion.
        @param params: decoration parameters.
        @return: Set of multiversion tasks.
        """
        fixture_type = self._get_suite_fixture_type(params.base_suite)
        versions_combinations = self._get_versions_combinations(fixture_type)

        decorated_tasks = set()
        for old_version in self.old_versions:
            for mixed_bin_versions in versions_combinations:
                for index, sub_task in enumerate(sub_tasks):
                    commands = list(sub_task.commands)
                    base_task_name = self._build_name(params.task, old_version,
                                                      mixed_bin_versions)
                    sub_task_name = taskname.name_generated_task(
                        base_task_name, index, params.num_tasks,
                        params.variant)
                    suite_name = self._build_name(params.base_suite,
                                                  old_version,
                                                  mixed_bin_versions)
                    self._update_execution_task_suite_info(
                        commands, suite_name, old_version)
                    commands = self._add_multiversion_commands(commands)
                    decorated_tasks.add(
                        Task(name=sub_task_name,
                             commands=commands,
                             dependencies=sub_task.dependencies))
        return decorated_tasks
    def create_task(self, index: int, test_name: str) -> Task:
        """
        Create the task configuration for the given test using the given index.

        :param index: Index of sub-task being created.
        :param test_name: Name of test that should be executed.
        :return: Configuration for generating the specified task.
        """
        resmoke_args = self.task_info.resmoke_args

        sub_task_name = self.generate_name(index)
        LOGGER.debug("Generating sub-task", sub_task=sub_task_name)

        test_unix_style = test_name.replace('\\', '/')
        run_tests_vars = {
            "resmoke_args":
            f"{resmoke_args} {self.repeat_config.generate_resmoke_options()} {test_unix_style}"
        }

        timeout = self.generate_timeouts(test_name)
        commands = resmoke_commands("run tests", run_tests_vars, timeout,
                                    self.task_info.require_multiversion)
        dependencies = {TaskDependency(ARCHIVE_DIST_TEST_TASK)}

        return Task(sub_task_name, commands, dependencies)
Beispiel #6
0
 def define_task(index):
     name = f"aggregation_multiversion_fuzzer_{index:03d}"
     return Task(
         name,
         [
             FunctionCall("do setup"),
             FunctionCall("do multiversion setup"),
             FunctionCall(
                 "run jstestfuzz",
                 {
                     "jstestfuzz_var": "--numGeneratedFiles 5",
                     "npm_command": "agg-fuzzer"
                 },
             ),
             FunctionCall(
                 "run tests",
                 {
                     "continue_on_failure": "false",
                     "resmoke_args": "--suites=generational_fuzzer",
                     "should_shuffle": "false",
                     "task_path_suffix": "false",
                     "timeout_secs": "1800",
                 },
             ),
         ],
     ).dependency("compile")
Beispiel #7
0
    def decorate_tasks(self, sub_tasks: Set[Task], params) -> Set[Task]:
        """Make multiversion subtasks based on generated subtasks."""
        fixture_type = self._get_suite_fixture_type(params.suite)
        versions_combinations = self._get_versions_combinations(fixture_type)

        decorated_tasks = set()
        for old_version in self.old_versions:
            for mixed_bin_versions in versions_combinations:
                for index, sub_task in enumerate(sub_tasks):
                    commands = list(sub_task.commands)
                    base_task_name = self._build_name(
                        params.task_name, old_version,
                        mixed_bin_versions.replace("-", "_"))
                    sub_task_name = taskname.name_generated_task(
                        base_task_name, index, params.num_tasks,
                        params.variant)
                    suite_name = self._build_name(
                        params.suite, old_version,
                        mixed_bin_versions.replace("-", "_"))
                    self._update_suite_name(commands, suite_name)
                    commands = self._add_multiversion_commands(commands)
                    decorated_tasks.add(
                        Task(name=sub_task_name,
                             commands=commands,
                             dependencies=sub_task.dependencies))
        return decorated_tasks
Beispiel #8
0
    def _generate_task(self, sub_task_name: str, sub_suite_name: str, mixed_version_config: str,
                       params: MultiversionGenTaskParams, build_variant: str) -> Task:
        """
        Generate a sub task to be run with the provided suite and  mixed version config.

        :param sub_task_name: Name of task being generated.
        :param sub_suite_name: Name of suite to run.
        :param mixed_version_config: Versions task is being generated for.
        :param params: Parameters for how tasks should be generated.
        :return: Shrub configuration for task specified.
        """
        suite_file = self.gen_task_options.suite_location(f"{sub_suite_name}_{build_variant}.yml")

        run_tests_vars = {
            "resmoke_args": self._build_resmoke_args(suite_file, mixed_version_config, params),
            "task": params.parent_task_name,
            "gen_task_config_location": params.config_location,
        }

        commands = [
            FunctionCall("do setup"),
            # Fetch and download the proper mongod binaries before running multiversion tests.
            FunctionCall("configure evergreen api credentials"),
            FunctionCall("do multiversion setup"),
            FunctionCall("run generated tests", run_tests_vars),
        ]

        return Task(sub_task_name, commands, {TaskDependency("archive_dist_test_debug")})
Beispiel #9
0
    def _generate_task(self, sub_suite_name: str, sub_task_name: str,
                       timeout_est: TimeoutEstimate,
                       params: ResmokeGenTaskParams,
                       suite: GeneratedSuite) -> Task:
        """
        Generate a shrub evergreen config for a resmoke task.

        :param sub_suite_name: Name of suite being generated.
        :param sub_task_name: Name of task to generate.
        :param timeout_est: Estimated runtime to use for calculating timeouts.
        :param params: Parameters describing how tasks should be generated.
        :param suite: Parent suite being created.
        :return: Shrub configuration for the described task.
        """
        # pylint: disable=too-many-arguments
        LOGGER.debug("Generating task", sub_suite=sub_suite_name)

        target_suite_file = self.gen_task_options.suite_location(
            sub_suite_name)
        run_tests_vars = self._get_run_tests_vars(target_suite_file,
                                                  suite.suite_name, params,
                                                  suite.build_variant)

        require_multiversion = params.require_multiversion
        timeout_cmd = timeout_est.generate_timeout_cmd(
            self.gen_task_options.is_patch, params.repeat_suites,
            self.gen_task_options.use_default_timeouts)
        commands = resmoke_commands("run generated tests", run_tests_vars,
                                    timeout_cmd, require_multiversion)

        return Task(sub_task_name, commands, self._get_dependencies())
Beispiel #10
0
    def build_fuzzer_sub_task(task_index: int, params: FuzzerGenTaskParams) -> Task:
        """
        Build a shrub task to run the fuzzer.

        :param task_index: Index of sub task being generated.
        :param params: Parameters describing how tasks should be generated.
        :return: Shrub task to run the fuzzer.
        """
        sub_task_name = taskname.name_generated_task(params.task_name, task_index, params.num_tasks,
                                                     params.variant)

        run_tests_vars = {
            "continue_on_failure": params.continue_on_failure,
            "resmoke_args": params.get_resmoke_args(),
            "resmoke_jobs_max": params.resmoke_jobs_max,
            "should_shuffle": params.should_shuffle,
            "require_multiversion_setup": params.require_multiversion_setup,
            "timeout_secs": params.timeout_secs,
            "task": params.task_name,
            "gen_task_config_location": params.config_location,
            "suite": params.suite,
        }  # yapf: disable

        timeout_info = TimeoutInfo.overridden(timeout=params.timeout_secs)

        commands = [
            timeout_info.cmd,
            FunctionCall("do setup"),
            FunctionCall(CONFIGURE_EVG_CREDENTIALS),
            FunctionCall("setup jstestfuzz"),
            FunctionCall("run jstestfuzz", params.jstestfuzz_params()),
            FunctionCall(RUN_GENERATED_TESTS, run_tests_vars)
        ]

        return Task(sub_task_name, commands, {TaskDependency(ARCHIVE_DIST_TEST_DEBUG_TASK)})
Beispiel #11
0
    def test_display_task_with_different_task_types(self):
        bv = under_test.BuildVariant("build variant")

        n_tasks = 5
        tasks = {Task(f"task {i}", []) for i in range(n_tasks)}
        n_task_groups = 3
        task_groups = {TaskGroup(f"task group {i}", []) for i in range(n_task_groups)}
        n_existing_tasks = 4
        existing_tasks = {ExistingTask(f"existing task {i}") for i in range(n_existing_tasks)}

        bv.display_task(
            "display",
            execution_tasks=tasks,
            execution_task_groups=task_groups,
            execution_existing_tasks=existing_tasks,
            distros=["the distro"],
        )

        d = bv.as_dict()

        assert d["name"] == "build variant"
        assert len(d["tasks"]) == n_tasks + n_task_groups  # Existing tasks should already exist.
        assert len(d["display_tasks"]) == 1
        display_task = d["display_tasks"][0]
        assert display_task["name"] == "display"
        assert len(display_task["execution_tasks"]) == n_tasks + n_task_groups + n_existing_tasks

        all_generated_execution_tasks = {t for t in display_task["execution_tasks"]}
        for task in chain(tasks, task_groups, existing_tasks):
            assert task.name in all_generated_execution_tasks

        for task in d["tasks"]:
            assert "the distro" in task["distros"]
Beispiel #12
0
    def decorate_tasks_with_explicit_files(
            self, sub_tasks: List[ResmokeTask],
            params: MultiversionDecoratorParams) -> List[ResmokeTask]:
        """
        Make multiversion subtasks based on generated subtasks for explicit tasks.

        Explicit tasks need to have new resmoke.py suite files created for each one with a
        unique list of test roots.
        """
        fixture_type = self._get_suite_fixture_type(params.base_suite)
        versions_combinations = self._get_versions_combinations(fixture_type)

        decorated_tasks = []
        for old_version in self.old_versions:
            for mixed_bin_versions in versions_combinations:
                for index, sub_task in enumerate(sub_tasks):
                    shrub_task = sub_task.shrub_task
                    commands = list(shrub_task.commands)

                    # Decorate the task name.
                    base_task_name = self._build_name(params.task, old_version,
                                                      mixed_bin_versions)
                    sub_task_name = taskname.name_generated_task(
                        base_task_name, index, params.num_tasks,
                        params.variant)

                    # Decorate the suite name
                    resmoke_suite_name = self._build_name(
                        sub_task.resmoke_suite_name, old_version,
                        mixed_bin_versions)
                    execution_task_suite_name = taskname.name_generated_task(
                        resmoke_suite_name, index, params.num_tasks)
                    execution_task_suite_yaml_dir = os.path.dirname(
                        sub_task.execution_task_suite_yaml_path)
                    execution_task_suite_yaml_file = f"{execution_task_suite_name}.yml"
                    execution_task_suite_yaml_path = os.path.join(
                        execution_task_suite_yaml_dir,
                        execution_task_suite_yaml_file)

                    # Decorate the command invocation options.
                    self._update_execution_task_suite_info(
                        commands, execution_task_suite_yaml_path, old_version)
                    commands = self._add_multiversion_commands(commands)

                    # Store the result.
                    shrub_task = Task(name=sub_task_name,
                                      commands=commands,
                                      dependencies=shrub_task.dependencies)
                    decorated_tasks.append(
                        ResmokeTask(shrub_task=shrub_task,
                                    resmoke_suite_name=resmoke_suite_name,
                                    execution_task_suite_yaml_name=
                                    execution_task_suite_yaml_file,
                                    execution_task_suite_yaml_path=
                                    execution_task_suite_yaml_path,
                                    test_list=sub_task.test_list,
                                    excludes=sub_task.excludes))

        return decorated_tasks
Beispiel #13
0
    def test_tasks_with_no_distros(self):
        bv = under_test.BuildVariant("build variant")

        task_1 = Task("task 1", [])
        task_2 = Task("task 2", [])

        bv.add_task(task_1)
        bv.add_tasks({task_2})

        d = bv.as_dict()

        assert d["name"] == "build variant"
        assert len(d["tasks"]) == 2
        assert d["tasks"][0]["name"] == "task 1"
        assert "distros" not in d["tasks"][0]
        assert d["tasks"][1]["name"] == "task 2"
        assert "distros" not in d["tasks"][1]
Beispiel #14
0
    def _generate_task(self, sub_suite_file, sub_task_name: str,
                       sub_suite_roots: List[str],
                       timeout_est: TimeoutEstimate,
                       params: ResmokeGenTaskParams, suite: GeneratedSuite,
                       excludes: List[str]) -> ResmokeTask:
        """
        Generate a shrub evergreen config for a resmoke task.

        :param sub_suite_file: Name of the suite file to run in the generated task.
        :param sub_task_name: Name of task to generate.
        :param sub_suite_roots: List of files to run.
        :param timeout_est: Estimated runtime to use for calculating timeouts.
        :param params: Parameters describing how tasks should be generated.
        :param suite: Parent suite being created.
        :param excludes: List of tests to exclude.
        :return: ResmokeTask object describing the task.
        """
        # pylint: disable=too-many-arguments
        LOGGER.debug("Generating task running suite",
                     sub_task_name=sub_task_name,
                     sub_suite_file=sub_suite_file)

        sub_suite_file_path = self.gen_task_options.suite_location(
            sub_suite_file)

        run_tests_vars = self._get_run_tests_vars(
            sub_suite_file_path=sub_suite_file_path,
            suite_file=suite.suite_name,
            task_name=suite.task_name,
            params=params)

        if timeout_est.is_specified():
            build_variant = self.evg_project_config.get_variant(
                suite.build_variant)
            timeout_info = timeout_est.generate_timeout_cmd(
                self.gen_task_options.is_patch, params.repeat_suites,
                build_variant.idle_timeout_factor,
                build_variant.exec_timeout_factor,
                self.gen_task_options.use_default_timeouts)
        else:
            timeout_info = self.gen_task_options.build_defualt_timeout()

        commands = [
            timeout_info.cmd,
            FunctionCall("do setup"),
            FunctionCall(CONFIGURE_EVG_CREDENTIALS),
            FunctionCall(RUN_GENERATED_TESTS, run_tests_vars),
        ]

        shrub_task = Task(sub_task_name, [cmd for cmd in commands if cmd],
                          self._get_dependencies(params))
        return ResmokeTask(shrub_task=shrub_task,
                           resmoke_suite_name=suite.suite_name,
                           execution_task_suite_yaml_path=sub_suite_file_path,
                           execution_task_suite_yaml_name=sub_suite_file,
                           test_list=sub_suite_roots,
                           excludes=excludes)
Beispiel #15
0
    def test_tasks_with_activate(self):
        bv = under_test.BuildVariant("build variant")

        task_1 = Task("task 1", [])
        task_2 = Task("task 2", [])
        task_3 = Task("task 3", [])

        bv.add_task(task_1, activate=True)
        bv.add_tasks({task_2}, activate=False)
        bv.display_task("my display task", execution_tasks={task_3}, activate=False)

        d = bv.as_dict()

        assert d["name"] == "build variant"
        assert len(d["tasks"]) == 3
        assert d["tasks"][0]["name"] == "task 1"
        assert d["tasks"][0]["activate"] is True
        assert d["tasks"][1]["name"] == "task 2"
        assert d["tasks"][1]["activate"] is False
        assert d["tasks"][2]["name"] == "task 3"
        assert d["tasks"][2]["activate"] is False
Beispiel #16
0
    def test_display_tasks(self):
        bv = under_test.BuildVariant("build variant")

        n_tasks = 5
        tasks = {Task(f"task {i}", []) for i in range(n_tasks)}
        bv.display_task("display", tasks)

        d = bv.as_dict()

        assert d["name"] == "build variant"
        assert len(d["tasks"]) == n_tasks
        assert len(d["display_tasks"]) == 1
        assert d["display_tasks"][0]["name"] == "display"
        assert len(d["display_tasks"][0]["execution_tasks"]) == n_tasks
Beispiel #17
0
    def build_fuzzer_sub_task(task_index: int, params: FuzzerGenTaskParams,
                              version: str) -> Task:
        """
        Build a shrub task to run the fuzzer.

        :param task_index: Index of sub task being generated.
        :param params: Parameters describing how tasks should be generated.
        :param version: Multiversion version to generate against.
        :return: Shrub task to run the fuzzer.
        """
        sub_task_name = taskname.name_generated_task(
            params.get_task_name(version), task_index, params.num_tasks,
            params.variant)

        suite_arg = f"--suites={params.suite}"
        run_tests_vars = {
            "continue_on_failure": params.continue_on_failure,
            "resmoke_args": f"{suite_arg} {params.get_resmoke_args()}",
            "resmoke_jobs_max": params.resmoke_jobs_max,
            "should_shuffle": params.should_shuffle,
            "require_multiversion": params.require_multiversion,
            "timeout_secs": params.timeout_secs,
            "task": params.get_task_name(version),
            "gen_task_config_location": params.config_location,
        }  # yapf: disable

        timeout_info = TimeoutInfo.overridden(timeout=params.timeout_secs)

        commands = []

        if params.require_multiversion:
            commands += [FunctionCall("git get project no modules")]

        commands += [
            timeout_info.cmd,
            FunctionCall("do setup"),
            FunctionCall("configure evergreen api credentials")
            if params.require_multiversion else None,
            FunctionCall("do multiversion setup")
            if params.require_multiversion else None,
            FunctionCall("setup jstestfuzz"),
            FunctionCall("run jstestfuzz", params.jstestfuzz_params()),
            FunctionCall("run generated tests", run_tests_vars)
        ]
        commands = [command for command in commands if command is not None]

        return Task(sub_task_name, commands,
                    {TaskDependency(ARCHIVE_DIST_TEST_DEBUG_TASK)})
Beispiel #18
0
    def build_fuzzer_sub_task(task_index: int,
                              params: FuzzerGenTaskParams) -> Task:
        """
        Build a shrub task to run the fuzzer.

        :param task_index: Index of sub task being generated.
        :param params: Parameters describing how tasks should be generated.
        :return: Shrub task to run the fuzzer.
        """
        sub_task_name = taskname.name_generated_task(params.task_name,
                                                     task_index,
                                                     params.num_tasks,
                                                     params.variant)

        run_tests_vars = {
            "continue_on_failure": params.continue_on_failure,
            "resmoke_args": params.get_resmoke_args(),
            "resmoke_jobs_max": params.resmoke_jobs_max,
            "should_shuffle": params.should_shuffle,
            "require_multiversion_setup": params.require_multiversion_setup,
            "timeout_secs": params.timeout_secs,
            "task": params.task_name,
            # This expansion's name was shortened to reduce the overall size of
            # the generated configuration file
            # gtcl = gen_task_config_location
            "gtcl": params.config_location,
            "suite": params.suite,
        }  # yapf: disable

        timeout_info = TimeoutInfo.overridden(timeout=params.timeout_secs)

        commands = [
            timeout_info.cmd,
            FunctionCall("do setup"),
            FunctionCall(CONFIGURE_EVG_CREDENTIALS),
            FunctionCall("setup jstestfuzz"),
            FunctionCall("run jstestfuzz", params.jstestfuzz_params()),
            FunctionCall(RUN_GENERATED_TESTS, run_tests_vars),
            FunctionCall("minimize jstestfuzz")
        ]

        dependencies = {
            TaskDependency(dependency)
            for dependency in params.dependencies
        }

        return Task(sub_task_name, commands, dependencies)
    def _generate_sub_task(self,
                           mixed_version_config: str,
                           task: str,
                           task_index: int,
                           suite: str,
                           num_suites: int,
                           is_sharded: bool,
                           burn_in_test: Optional[str] = None) -> Task:
        # pylint: disable=too-many-arguments
        """
        Generate a sub task to be run with the provided suite and  mixed version config.

        :param mixed_version_config: mixed version configuration.
        :param task: Name of task.
        :param task_index: Index of task to generate.
        :param suite: Name of suite being generated.
        :param num_suites: Number os suites being generated.
        :param is_sharded: If this is being generated for a sharded configuration.
        :param burn_in_test: If generation is for burn_in, burn_in options to use.
        :return: Shrub configuration for task specified.
        """
        # Create a sub task name appended with the task_index and build variant name.
        task_name = f"{task}_{mixed_version_config}"
        sub_task_name = taskname.name_generated_task(task_name, task_index,
                                                     num_suites,
                                                     self.options.variant)
        gen_task_name = BURN_IN_TASK if burn_in_test is not None else self.task

        run_tests_vars = {
            "resmoke_args":
            _generate_resmoke_args(suite, mixed_version_config, is_sharded,
                                   self.options, burn_in_test),
            "task":
            gen_task_name,
        }

        commands = [
            FunctionCall("do setup"),
            # Fetch and download the proper mongod binaries before running multiversion tests.
            FunctionCall("configure evergreen api credentials"),
            FunctionCall("do multiversion setup"),
            FunctionCall("run generated tests", run_tests_vars),
        ]

        return Task(sub_task_name, commands,
                    {TaskDependency("archive_dist_test_debug")})
def build_fuzzer_sub_task(task_name: str, task_index: int,
                          options: ConfigOptions) -> Task:
    """
    Build a shrub task to run the fuzzer.

    :param task_name: Parent name of task.
    :param task_index: Index of sub task being generated.
    :param options: Options to use for task.
    :return: Shrub task to run the fuzzer.
    """
    sub_task_name = taskname.name_generated_task(task_name, task_index,
                                                 options.num_tasks,
                                                 options.variant)

    run_jstestfuzz_vars = {
        "jstestfuzz_vars":
        "--numGeneratedFiles {0} {1}".format(options.num_files,
                                             options.jstestfuzz_vars),
        "npm_command":
        options.npm_command,
    }
    suite_arg = f"--suites={options.suite}"
    run_tests_vars = {
        "continue_on_failure": options.continue_on_failure,
        "resmoke_args": f"{suite_arg} {options.resmoke_args}",
        "resmoke_jobs_max": options.resmoke_jobs_max,
        "should_shuffle": options.should_shuffle,
        "task_path_suffix": options.use_multiversion,
        "timeout_secs": options.timeout_secs,
        "task": options.name
    }  # yapf: disable

    commands = [
        FunctionCall("do setup"),
        FunctionCall("configure evergreen api credentials")
        if options.use_multiversion else None,
        FunctionCall("do multiversion setup")
        if options.use_multiversion else None,
        FunctionCall("setup jstestfuzz"),
        FunctionCall("run jstestfuzz", run_jstestfuzz_vars),
        FunctionCall("run generated tests", run_tests_vars)
    ]
    commands = [command for command in commands if command is not None]

    return Task(sub_task_name, commands,
                {TaskDependency("archive_dist_test_debug")})
 def decorate_single_multiversion_tasks(self, sub_tasks: List[ResmokeTask]):
     """Decorate a multiversion version of a task without all multiversion combinations."""
     decorated_sub_tasks = []
     for sub_task in sub_tasks:
         shrub_task = sub_task.shrub_task
         commands = self._add_multiversion_commands(shrub_task.commands)
         shrub_task = Task(name=shrub_task.name,
                           commands=commands,
                           dependencies=shrub_task.dependencies)
         decorated_sub_tasks.append(
             ResmokeTask(shrub_task=shrub_task,
                         resmoke_suite_name=sub_task.resmoke_suite_name,
                         execution_task_suite_yaml_path=sub_task.
                         execution_task_suite_yaml_path,
                         execution_task_suite_yaml_name=sub_task.
                         execution_task_suite_yaml_name,
                         test_list=sub_task.test_list,
                         excludes=sub_task.excludes))
     return decorated_sub_tasks
    def _generate_task(self, sub_suite_file, sub_task_name: str,
                       timeout_est: TimeoutEstimate,
                       params: ResmokeGenTaskParams,
                       suite: GeneratedSuite) -> Task:
        """
        Generate a shrub evergreen config for a resmoke task.

        :param sub_suite_file: Name of the suite file to run in the generated task.
        :param sub_task_name: Name of task to generate.
        :param timeout_est: Estimated runtime to use for calculating timeouts.
        :param params: Parameters describing how tasks should be generated.
        :param suite: Parent suite being created.
        :return: Shrub configuration for the described task.
        """
        # pylint: disable=too-many-arguments
        LOGGER.debug("Generating task running suite",
                     sub_task_name=sub_task_name,
                     sub_suite_file=sub_suite_file)

        # Some splits don't generate new physical config files.
        if params.config_location is not None:
            sub_suite_file_path = self.gen_task_options.suite_location(
                sub_suite_file)
        else:
            sub_suite_file_path = None

        run_tests_vars = self._get_run_tests_vars(
            sub_suite_file_path=sub_suite_file_path,
            suite_file=suite.suite_name,
            task_name=suite.task_name,
            params=params)

        require_multiversion_setup = params.require_multiversion_setup
        timeout_cmd = timeout_est.generate_timeout_cmd(
            self.gen_task_options.is_patch, params.repeat_suites,
            self.gen_task_options.use_default_timeouts)
        commands = resmoke_commands("run generated tests", run_tests_vars,
                                    timeout_cmd, require_multiversion_setup)

        return Task(sub_task_name, commands, self._get_dependencies())
Beispiel #23
0
    def build_fuzzer_sub_task(task_index: int,
                              params: FuzzerGenTaskParams) -> Task:
        """
        Build a shrub task to run the fuzzer.

        :param task_index: Index of sub task being generated.
        :param params: Parameters describing how tasks should be generated.
        :return: Shrub task to run the fuzzer.
        """
        sub_task_name = taskname.name_generated_task(params.task_name,
                                                     task_index,
                                                     params.num_tasks,
                                                     params.variant)

        suite_arg = f"--suites={params.suite}"
        run_tests_vars = {
            "continue_on_failure": params.continue_on_failure,
            "resmoke_args": f"{suite_arg} {params.resmoke_args}",
            "resmoke_jobs_max": params.resmoke_jobs_max,
            "should_shuffle": params.should_shuffle,
            "require_multiversion": params.require_multiversion,
            "timeout_secs": params.timeout_secs,
            "task": params.task_name,
            "gen_task_config_location": params.config_location,
        }  # yapf: disable

        commands = [
            FunctionCall("do setup"),
            FunctionCall("configure evergreen api credentials")
            if params.require_multiversion else None,
            FunctionCall("do multiversion setup")
            if params.require_multiversion else None,
            FunctionCall("setup jstestfuzz"),
            FunctionCall("run jstestfuzz", params.jstestfuzz_params()),
            FunctionCall("run generated tests", run_tests_vars)
        ]
        commands = [command for command in commands if command is not None]

        return Task(sub_task_name, commands,
                    {TaskDependency("archive_dist_test_debug")})
Beispiel #24
0
def _create_task(index: int, test_count: int, test: str, task_data: Dict,
                 task_runtime_stats: List[TestRuntime],
                 generate_config: GenerateConfig, repeat_config: RepeatConfig,
                 task_prefix: str) -> Task:
    # pylint: disable=too-many-arguments,too-many-locals
    """
    Create the described shrub sub task.

    :param index: Index of task being created.
    :param test_count: Total number of testing being created.
    :param test: Test task is being generated for.
    :param task_data: Data about task to create.
    :param task_runtime_stats: Historical runtime of test.
    :param generate_config: Configuration of how to generate the task.
    :param repeat_config: Configuration of how the task should be repeated.
    :param task_prefix: String to prefix generated task with.
    :return: Shrub task for given configuration.
    """
    # TODO: Extract multiversion related code into separate tooling - SERVER-47137
    multiversion_path = task_data.get("use_multiversion")
    display_task_name = task_data["display_task_name"]
    resmoke_args = task_data["resmoke_args"]
    sub_task_name = name_generated_task(f"{task_prefix}:{display_task_name}",
                                        index, test_count,
                                        generate_config.run_build_variant)
    LOGGER.debug("Generating sub-task", sub_task=sub_task_name)

    test_unix_style = test.replace('\\', '/')
    run_tests_vars = {
        "resmoke_args":
        f"{resmoke_args} {repeat_config.generate_resmoke_options()} {test_unix_style}"
    }
    if multiversion_path:
        run_tests_vars["task_path_suffix"] = multiversion_path
    timeout = _generate_timeouts(repeat_config, test, task_runtime_stats)
    commands = resmoke_commands("run tests", run_tests_vars, timeout,
                                multiversion_path)
    dependencies = {TaskDependency("compile")}

    return Task(sub_task_name, commands, dependencies)
 def define_task(target):
     name = f"make-lint-{target}"
     return Task(name, [FunctionCall("run-make", {"target": name})])