Exemplo n.º 1
0
    def _command(self, environment, code_package_url, step_name, step_cmds,
                 task_spec):
        mflog_expr = export_mflog_env_vars(datastore_type="s3",
                                           stdout_path=STDOUT_PATH,
                                           stderr_path=STDERR_PATH,
                                           **task_spec)
        init_cmds = environment.get_package_commands(code_package_url)
        init_expr = " && ".join(init_cmds)
        step_expr = bash_capture_logs(
            " && ".join(environment.bootstrap_commands(step_name) + step_cmds))

        # construct an entry point that
        # 1) initializes the mflog environment (mflog_expr)
        # 2) bootstraps a metaflow environment (init_expr)
        # 3) executes a task (step_expr)

        # the `true` command is to make sure that the generated command
        # plays well with docker containers which have entrypoint set as
        # eval $@
        cmd_str = "true && mkdir -p /logs && %s && %s && %s; " % (
            mflog_expr,
            init_expr,
            step_expr,
        )
        # after the task has finished, we save its exit code (fail/success)
        # and persist the final logs. The whole entrypoint should exit
        # with the exit code (c) of the task.
        #
        # Note that if step_expr OOMs, this tail expression is never executed.
        # We lose the last logs in this scenario (although they are visible
        # still through AWS CloudWatch console).
        cmd_str += "c=$?; %s; exit $c" % BASH_SAVE_LOGS
        return shlex.split('bash -c "%s"' % cmd_str)
Exemplo n.º 2
0
    def _command(self, environment, code_package_url, step_name, step_cmds,
                 task_spec):
        mflog_expr = export_mflog_env_vars(datastore_type='s3',
                                           stdout_path=STDOUT_PATH,
                                           stderr_path=STDERR_PATH,
                                           **task_spec)
        init_cmds = environment.get_package_commands(code_package_url)
        init_cmds.extend(environment.bootstrap_commands(step_name))
        init_expr = ' && '.join(init_cmds)
        step_expr = bash_capture_logs(' && '.join(step_cmds))

        # construct an entry point that
        # 1) initializes the mflog environment (mflog_expr)
        # 2) bootstraps a metaflow environment (init_expr)
        # 3) executes a task (step_expr)
        cmd_str = 'mkdir -p /logs && %s && %s && %s; ' % \
                        (mflog_expr, init_expr, step_expr)
        # after the task has finished, we save its exit code (fail/success)
        # and persist the final logs. The whole entrypoint should exit
        # with the exit code (c) of the task.
        #
        # Note that if step_expr OOMs, this tail expression is never executed.
        # We lose the last logs in this scenario (although they are visible
        # still through AWS CloudWatch console).
        cmd_str += 'c=$?; %s; exit $c' % BASH_SAVE_LOGS
        return shlex.split('bash -c \"%s\"' % cmd_str)
Exemplo n.º 3
0
    def _command(
        self,
        flow_name,
        run_id,
        step_name,
        task_id,
        attempt,
        code_package_url,
        step_cmds,
    ):
        mflog_expr = export_mflog_env_vars(
            flow_name=flow_name,
            run_id=run_id,
            step_name=step_name,
            task_id=task_id,
            retry_count=attempt,
            datastore_type=self._datastore.TYPE,
            stdout_path=STDOUT_PATH,
            stderr_path=STDERR_PATH,
        )
        init_cmds = self._environment.get_package_commands(code_package_url)
        init_expr = " && ".join(init_cmds)
        step_expr = bash_capture_logs(" && ".join(
            self._environment.bootstrap_commands(step_name) + step_cmds))

        # Construct an entry point that
        # 1) initializes the mflog environment (mflog_expr)
        # 2) bootstraps a metaflow environment (init_expr)
        # 3) executes a task (step_expr)

        # The `true` command is to make sure that the generated command
        # plays well with docker containers which have entrypoint set as
        # eval $@
        cmd_str = "true && mkdir -p %s && %s && %s && %s; " % (
            LOGS_DIR,
            mflog_expr,
            init_expr,
            step_expr,
        )
        # After the task has finished, we save its exit code (fail/success)
        # and persist the final logs. The whole entrypoint should exit
        # with the exit code (c) of the task.
        #
        # Note that if step_expr OOMs, this tail expression is never executed.
        # We lose the last logs in this scenario.
        #
        # TODO: Capture hard exit logs in Kubernetes.
        cmd_str += "c=$?; %s; exit $c" % BASH_SAVE_LOGS
        # For supporting sandboxes, ensure that a custom script is executed before
        # anything else is executed. The script is passed in as an env var.
        cmd_str = (
            '${METAFLOW_INIT_SCRIPT:+eval \\"${METAFLOW_INIT_SCRIPT}\\"} && %s'
            % cmd_str)
        return shlex.split('bash -c "%s"' % cmd_str)
Exemplo n.º 4
0
    def _command(
        self,
        code_package_url,
        step_cmds,
    ):
        mflog_expr = export_mflog_env_vars(
            flow_name=self._flow_name,
            run_id=self._run_id,
            step_name=self._step_name,
            task_id=self._task_id,
            retry_count=self._attempt,
            datastore_type=self._datastore.TYPE,
            stdout_path=STDOUT_PATH,
            stderr_path=STDERR_PATH,
        )
        init_cmds = self._environment.get_package_commands(code_package_url)
        init_expr = " && ".join(init_cmds)
        step_expr = " && ".join([
            capture_output_to_mflog(a)
            for a in (self._environment.bootstrap_commands(self._step_name) +
                      step_cmds)
        ])

        # Construct an entry point that
        # 1) initializes the mflog environment (mflog_expr)
        # 2) bootstraps a metaflow environment (init_expr)
        # 3) executes a task (step_expr)

        # The `true` command is to make sure that the generated command
        # plays well with docker containers which have entrypoint set as
        # eval $@
        cmd_str = "true && mkdir -p %s && %s && %s && %s; " % (
            LOGS_DIR,
            mflog_expr,
            init_expr,
            step_expr,
        )
        # After the task has finished, we save its exit code (fail/success)
        # and persist the final logs. The whole entrypoint should exit
        # with the exit code (c) of the task.
        #
        # Note that if step_expr OOMs, this tail expression is never executed.
        # We lose the last logs in this scenario.
        #
        # TODO: Find a way to capture hard exit logs in Kubernetes.
        cmd_str += "c=$?; %s; exit $c" % BASH_SAVE_LOGS
        return shlex.split('bash -c "%s"' % cmd_str)
Exemplo n.º 5
0
 def _commands(self, node, retry_count, user_code_retries):
     mflog_expr = export_mflog_env_vars(datastore_type='s3',
                                        stdout_path='/tmp/mflog_stdout',
                                        stderr_path='/tmp/mflog_stderr',
                                        flow_name=self.flow.name,
                                        run_id='{{workflow.name}}',
                                        step_name=node.name,
                                        task_id='{{pod.name}}',
                                        retry_count=retry_count)
     init_cmds = []
     if self.code_package_url:
         init_cmds.extend(
             self.environment.get_package_commands(self.code_package_url))
     init_cmds.extend(self.environment.bootstrap_commands(node.name))
     init_expr = ' && '.join(init_cmds)
     step_expr = " && ".join([
         capture_output_to_mflog(a) for a in (
             self._step_commands(node, retry_count, user_code_retries))
     ])
     cmd = ['true', mflog_expr, init_expr, step_expr]
     cmd_str = '%s; c=$?; %s; exit $c' % (' && '.join(
         c for c in cmd if c), BASH_SAVE_LOGS)
     return shlex.split('bash -c \"%s\"' % cmd_str)