Beispiel #1
0
    def execute(self, args_dict):

        workdir, virtualenv, script = self._parse_args_dict(args_dict)

        activate_path = path.join(virtualenv, 'bin', 'activate')
        if not path.exists(activate_path) or not path.isfile(activate_path):
            raise PluginError(
                'Python virtualenv doesn\'t exist: {}'.format(activate_path))

        bash_input = ('cd {}\n'
                      'source {}\n'
                      'python {}').format(workdir, activate_path, script)

        log.debug('Running python script: {}'.format(bash_input))

        if self.dry_run:
            return TaskResult(EXECUTION_SUCCESSFUL)

        try:
            stdout = self._run_bash(bash_input)
            status = EXECUTION_SUCCESSFUL
        except BashExecuteError as e:
            status = EXECUTION_FAILED
            stdout = e.stderr

        return TaskResult(status, stdout)
Beispiel #2
0
    def execute(self, args_dict):
        if 'message' not in args_dict:
            raise PluginError('BashExecutor got incorrect arguments, got: {}'.format(
                args_dict.keys()
            ))
        message = args_dict['message']

        if self.dry_run:
            return TaskResult(EXECUTION_SUCCESSFUL)

        payload = {
            'username': '******',
            'text': message
        }

        for i in range(RETRY_COUNT + 1):
            resp = requests.post(self.webhook_url, json=payload)
            if resp.ok:
                log.debug('Successfully sent webhook')
                break
            log.debug('Problem sending webhook. Status {}'.format(resp.status_code))
        else:
            log.warning('Could not successfully send webhook. Status: {}'.format(resp.status_code))
            return TaskResult(EXECUTION_FAILED, 'Sending slack notification failed')

        return TaskResult(EXECUTION_SUCCESSFUL, 'Sending slack notification successful')
Beispiel #3
0
    def execute(self, args_dict):

        cmd = self._parse_args_dict(args_dict)

        if self.dry_run:
            return TaskResult(EXECUTION_SUCCESSFUL, 'Dry run')

        print('Running executor with command: %s' % cmd)
        return TaskResult(EXECUTION_SUCCESSFUL, 'Dummy execute completed')
    def execute(self, args_dict):
        self._validate_args_dict(args_dict)
        workdir = args_dict.get('workdir')
        script = args_dict.get('script')
        file = args_dict.get('file')
        virtualenv = args_dict.get('virtualenv')

        bash_input = ''
        if workdir:
            bash_input += 'cd {}\n'.format(workdir)

        if virtualenv:
            activate_path = path.join(virtualenv, 'bin', 'activate')
            if not path.exists(activate_path) or not path.isfile(
                    activate_path):
                raise PluginError(
                    'Python virtualenv doesn\'t exist: {}'.format(
                        activate_path))

            bash_input += 'source {}\n'.format(activate_path)

        filename = file

        if script:
            f = NamedTemporaryFile(delete=False)

            f.write(script)
            log.debug('Wrote script to file {}, {}'.format(f.name, script))
            filename = f.name
            f.close()

        bash_input += 'python {}'.format(filename)
        log.debug('Running python script: {}'.format(bash_input))

        if self.dry_run:
            return TaskResult(EXECUTION_SUCCESSFUL)

        return_obj = None
        try:
            stdout, return_obj = self._run_bash(bash_input)
            status = EXECUTION_SUCCESSFUL
        except BashExecuteError as e:
            status = EXECUTION_FAILED
            stdout = e.data.get('stdout')
        print('Finished, stdout: %s' % (stdout))

        return TaskResult(status,
                          'Execution finished',
                          data={'output': stdout},
                          return_obj=return_obj)
Beispiel #5
0
    def execute(self, args_dict):

        cmd = self._parse_args_dict(args_dict)

        if self.dry_run:
            return TaskResult(EXECUTION_SUCCESSFUL)

        try:
            stdout = self._run_bash(cmd)
            status = EXECUTION_SUCCESSFUL
        except BashExecuteError as e:
            status = EXECUTION_FAILED
            stdout = e.stderr

        return TaskResult(status, stdout)
Beispiel #6
0
    def _run_task(self, task):
        log.debug('Starting to execute task {}'.format(task.name))

        self.plugin_mgr.trigger('on_task_start', task)

        event_name = '{}.execute'.format(task.executor)

        self._validate_executor_plugin(event_name)

        try:
            results = self.plugin_mgr.trigger(event_name,
                                              task.args)  # Run the task
        except KeyboardInterrupt as e:
            raise
        except Exception as e:
            log.warning('Unexpected error running task: %s' % e)
            log.exception(e)
            results = [TaskResult(EXECUTION_FAILED, 'Unknown Error: %s' % e)]

        result = results[0]

        if not result:
            raise PipelineError('Result still missing %s' % result)

        self.plugin_mgr.trigger('on_task_finish', task, result)
        log.debug('Task finished. Result: %s' % result)

        return result
Beispiel #7
0
    def run(self):
        log.debug('Run pipeline. params: {}'.format(self.context))
        pipeline_context = {
            'results': [],
            'vars': self.context.get('vars', {}),
            'status': PIPELINE_STATUS_OK,
            'prev_result': None,
            'params': self.context.get('params', {})
        }

        pipeline_context = DotMap(pipeline_context)

        self.plugin_mgr.trigger('on_pipeline_start', pipeline_context)
        log.debug('Pipeline starting. context: %s' % pipeline_context)
        for task in self.tasks:
            if self._should_run(task, pipeline_context):
                result_obj = None
                try:
                    task.args = substitute_variables(pipeline_context,
                                                     task.args)
                except TemplateError as e:
                    result_obj = TaskResult(EXECUTION_FAILED, e.message)

                if not result_obj:
                    result_obj = self._run_task(task)
                    if task.ignore_errors and result_obj.status == EXECUTION_FAILED:
                        log.debug(
                            'Task has ignore_errors set, overriding to successful'
                        )
                        # Override to be successful
                        result_obj['status'] = EXECUTION_SUCCESSFUL

                pipeline_context.results.append(result_obj)
                pipeline_context['prev_result'] = result_obj

                if pipeline_context[
                        'status'] == PIPELINE_STATUS_OK and result_obj.get(
                            'status') != 0:
                    pipeline_context['status'] = PIPELINE_STATUS_FAIL
            else:
                log.debug('Skipping task: {}'.format(task.name))
        log.debug('Pipeline finished. Status: {}'.format(
            pipeline_context['status']))
        self.plugin_mgr.trigger('on_pipeline_finish', pipeline_context)
        return pipeline_context
Beispiel #8
0
    def execute(self, args_dict):
        cmd, timeout = self._parse_args_dict(args_dict)

        if self.dry_run:
            return TaskResult(EXECUTION_SUCCESSFUL)

        try:
            output, return_obj = self._run_bash(cmd, timeout)
            status = EXECUTION_SUCCESSFUL
            msg = 'Bash task finished'
        except BashExecuteError as e:
            status = EXECUTION_FAILED
            # stdout = e.stderr
            msg = 'Bash task failed: %s' % e.msg
            output = e.data['stdout']

        return TaskResult(status,
                          msg,
                          data={'output': output},
                          return_obj=return_obj)
Beispiel #9
0
    def execute(self, args_dict):
        # try to use task level parameter first, then fallback to the top level
        slack_webhook = args_dict.get('slack_webhook', self.slack_webhook)
        if not slack_webhook:
            raise PluginError(
                'SlackExecutor is missing slack_webhook parameter. Can not execute'
            )

        if not isinstance(slack_webhook, str):
            raise PluginError(
                'SlackExecutor has invalid slack_webhook parameter')

        if 'message' not in args_dict:
            raise PluginError(
                'SlackExecutor got incorrect arguments, got: {}'.format(
                    args_dict.keys()))
        message = args_dict['message']

        if self.dry_run:
            return TaskResult(EXECUTION_SUCCESSFUL)

        payload = {'username': '******', 'link_names': 1, 'text': message}

        for i in range(RETRY_COUNT + 1):
            resp = requests.post(slack_webhook, json=payload)
            if resp.ok:
                log.debug('Successfully sent slack message')
                break
            log.debug('Problem sending slack message. Status {}'.format(
                resp.status_code))
        else:
            log.warning(
                'Could not successfully send slack message. Status: {}'.format(
                    resp.status_code))
            return TaskResult(EXECUTION_FAILED,
                              'Sending slack notification failed')

        return TaskResult(EXECUTION_SUCCESSFUL,
                          'Sending slack notification successful')