def take_action(self, parsed_args):
     self.log.debug("take_action(%s)" % parsed_args)
     _, ansible_dir = self.get_ansible_key_and_dir(
         no_workflow=True,
         stack=parsed_args.stack,
         orchestration=self.app.client_manager.orchestration
     )
     deployment.config_download(
         log=self.log,
         clients=self.app.client_manager,
         stack=oooutils.get_stack(
             self.app.client_manager.orchestration,
             parsed_args.stack
         ),
         output_dir=ansible_dir,
         verbosity=oooutils.playbook_verbosity(self=self),
         ansible_playbook_name=constants.FFWD_UPGRADE_PLAYBOOK,
         inventory_path=oooutils.get_tripleo_ansible_inventory(
             parsed_args.static_inventory,
             parsed_args.ssh_user,
             parsed_args.stack,
             return_inventory_file_path=True
         )
     )
     self.log.info("Completed Overcloud FFWD Upgrade Run.")
 def take_action(self, parsed_args):
     self.log.debug("take_action(%s)" % parsed_args)
     _, ansible_dir = self.get_ansible_key_and_dir(
         no_workflow=True,
         stack=parsed_args.stack,
         orchestration=self.app.client_manager.orchestration)
     deployment.config_download(
         log=self.log,
         clients=self.app.client_manager,
         stack=oooutils.get_stack(self.app.client_manager.orchestration,
                                  parsed_args.stack),
         output_dir=ansible_dir,
         verbosity=oooutils.playbook_verbosity(self=self),
         ansible_playbook_name=constants.EXTERNAL_UPDATE_PLAYBOOKS,
         extra_vars=oooutils.parse_extra_vars(
             extra_var_strings=parsed_args.extra_vars),
         inventory_path=oooutils.get_tripleo_ansible_inventory(
             parsed_args.static_inventory,
             parsed_args.ssh_user,
             parsed_args.stack,
             return_inventory_file_path=True),
         tags=parsed_args.tags,
         skip_tags=parsed_args.skip_tags,
         limit_hosts=oooutils.playbook_limit_parse(
             limit_nodes=parsed_args.limit))
     self.log.info("Completed Overcloud External Update Run.")
    def take_action(self, parsed_args):
        self.log.debug("take_action(%s)" % parsed_args)
        clients = self.app.client_manager
        orchestration = clients.orchestration
        verbosity = self.app_args.verbose_level
        stack = parsed_args.stack

        ansible_dir = None
        key = None
        # Disable mistral
        if parsed_args.no_workflow:
            ansible_dir = oooutils.download_ansible_playbooks(orchestration,
                                                              stack)
            key = package_update.get_key(clients)

        # Run ansible:
        limit_hosts = parsed_args.limit

        playbook = parsed_args.playbook
        inventory = oooutils.get_tripleo_ansible_inventory(
            parsed_args.static_inventory, parsed_args.ssh_user, stack)
        oooutils.run_update_ansible_action(self.log, clients, limit_hosts,
                                           inventory, playbook,
                                           constants.MINOR_UPDATE_PLAYBOOKS,
                                           parsed_args.ssh_user,
                                           (None if parsed_args.no_workflow
                                            else package_update),
                                           verbosity=verbosity,
                                           workdir=ansible_dir,
                                           priv_key=key)
    def take_action(self, parsed_args):
        self.log.debug("take_action(%s)" % parsed_args)
        oooutils.ffwd_upgrade_operator_confirm(parsed_args.yes, self.log)
        verbosity = self.app_args.verbose_level
        clients = self.app.client_manager
        orchestration = clients.orchestration
        stack = parsed_args.stack

        ansible_dir = None
        key = None
        # Disable mistral
        if parsed_args.no_workflow:
            ansible_dir = oooutils.download_ansible_playbooks(
                orchestration, stack)
            key = package_update.get_key(clients)

        # Run ansible:
        inventory = oooutils.get_tripleo_ansible_inventory(
            inventory_file=parsed_args.static_inventory,
            ssh_user=parsed_args.ssh_user,
            stack=parsed_args.stack)
        # Don't expost limit_hosts. We need this on the whole overcloud.
        limit_hosts = ''
        oooutils.run_update_ansible_action(
            self.log,
            clients,
            limit_hosts,
            inventory,
            constants.FFWD_UPGRADE_PLAYBOOK, [],
            parsed_args.ssh_user,
            (None if parsed_args.no_workflow else package_update),
            verbosity=verbosity,
            workdir=ansible_dir,
            priv_key=key)
    def take_action(self, parsed_args):
        self.log.debug("take_action(%s)" % parsed_args)
        clients = self.app.client_manager
        orchestration = clients.orchestration
        verbosity = self.app_args.verbose_level
        stack = parsed_args.stack

        ansible_dir = None
        key = None
        # Disable mistral
        if parsed_args.no_workflow:
            ansible_dir = oooutils.download_ansible_playbooks(orchestration,
                                                              stack)
            key = package_update.get_key(clients)

        # Run ansible:
        inventory = oooutils.get_tripleo_ansible_inventory(
            parsed_args.static_inventory, parsed_args.ssh_user, stack)
        limit_hosts = 'all'
        playbook = 'all'
        extra_vars = oooutils.parse_extra_vars(parsed_args.extra_vars)

        oooutils.run_update_ansible_action(
            self.log, clients, limit_hosts, inventory, playbook,
            constants.EXTERNAL_UPDATE_PLAYBOOKS, parsed_args.ssh_user,
            (None if parsed_args.no_workflow else package_update),
            tags=parsed_args.tags, skip_tags=parsed_args.skip_tags,
            verbosity=verbosity, extra_vars=extra_vars, workdir=ansible_dir,
            priv_key=key)

        self.log.info("Completed Overcloud External Update Run.")
    def take_action(self, parsed_args):
        self.log.debug("take_action(%s)" % parsed_args)
        # NOTE(cloudnull): The string option "all" was a special default
        #                  that is no longer relevant. To retain compatibility
        #                  this condition has been put in place.
        if not parsed_args.playbook or parsed_args.playbook == ['all']:
            playbook = constants.MAJOR_UPGRADE_PLAYBOOKS
        else:
            playbook = parsed_args.playbook

        _, ansible_dir = self.get_ansible_key_and_dir(
            no_workflow=parsed_args.no_workflow,
            stack=parsed_args.stack,
            orchestration=self.app.client_manager.orchestration)
        deployment.config_download(
            log=self.log,
            clients=self.app.client_manager,
            stack=oooutils.get_stack(self.app.client_manager.orchestration,
                                     parsed_args.stack),
            output_dir=ansible_dir,
            verbosity=oooutils.playbook_verbosity(self=self),
            ansible_playbook_name=playbook,
            inventory_path=oooutils.get_tripleo_ansible_inventory(
                parsed_args.static_inventory,
                parsed_args.ssh_user,
                parsed_args.stack,
                return_inventory_file_path=True),
            tags=parsed_args.tags,
            skip_tags=parsed_args.skip_tags,
            limit_list=[i.strip() for i in parsed_args.limit.split(',') if i])
        self.log.info("Completed Overcloud Major Upgrade Run.")
예제 #7
0
    def test_get_tripleo_ansible_inventory(self, mock_inventory):

        with mock.patch('os.path.exists') as mock_exists:
            mock_exists.return_value = True

            self.cmd = utils.get_tripleo_ansible_inventory(
                inventory_file=self.inventory_file,
                ssh_user=self.ssh_user,
                stack=self.stack)

            self.cmd.take_action()

            mock_inventory.assert_called_once_with(inventory_file='',
                                                   ssh_user='******',
                                                   stack='foo-overcloud')
예제 #8
0
    def take_action(self, parsed_args):
        self.log.debug("take_action(%s)" % parsed_args)
        clients = self.app.client_manager

        # Run ansible:
        nodes = parsed_args.nodes
        if nodes == 'all':
            # unset this, the ansible action deals with unset 'limithosts'
            nodes = None
        playbook = parsed_args.playbook
        inventory = oooutils.get_tripleo_ansible_inventory(
            parsed_args.static_inventory, parsed_args.ssh_user)
        oooutils.run_update_ansible_action(self.log, clients, nodes, inventory,
                                           playbook, constants.UPDATE_QUEUE,
                                           constants.MINOR_UPDATE_PLAYBOOKS,
                                           package_update,
                                           parsed_args.ssh_user)
예제 #9
0
 def take_action(self, parsed_args):
     self.log.debug("take_action(%s)" % parsed_args)
     clients = self.app.client_manager
     # Run ansible:
     roles = parsed_args.roles
     nodes = parsed_args.nodes
     limit_hosts = roles or nodes
     playbook = parsed_args.playbook
     inventory = oooutils.get_tripleo_ansible_inventory(
         parsed_args.static_inventory, parsed_args.ssh_user)
     skip_tags = self._validate_skip_tags(parsed_args.skip_tags)
     oooutils.run_update_ansible_action(self.log, clients, limit_hosts,
                                        inventory, playbook,
                                        constants.UPGRADE_QUEUE,
                                        constants.MAJOR_UPGRADE_PLAYBOOKS,
                                        package_update,
                                        parsed_args.ssh_user, skip_tags)
예제 #10
0
    def take_action(self, parsed_args):
        self.log.debug("take_action(%s)" % parsed_args)
        oooutils.ffwd_upgrade_operator_confirm(parsed_args.yes, self.log)

        clients = self.app.client_manager

        # Run ansible:
        inventory = oooutils.get_tripleo_ansible_inventory(
            inventory_file=parsed_args.static_inventory,
            ssh_user=parsed_args.ssh_user,
            stack=parsed_args.stack)
        # Don't expost limit_hosts. We need this on the whole overcloud.
        limit_hosts = ''
        oooutils.run_update_ansible_action(self.log, clients, limit_hosts,
                                           inventory,
                                           constants.FFWD_UPGRADE_PLAYBOOK,
                                           constants.FFWD_UPGRADE_QUEUE, [],
                                           package_update,
                                           parsed_args.ssh_user)
예제 #11
0
    def take_action(self, parsed_args):
        self.log.debug("take_action(%s)" % parsed_args)
        clients = self.app.client_manager
        verbosity = self.app_args.verbose_level
        orchestration = clients.orchestration
        stack = parsed_args.stack

        ansible_dir = None
        key = None
        # Disable mistral
        if parsed_args.no_workflow:
            ansible_dir = oooutils.download_ansible_playbooks(
                orchestration, stack)
            key = package_update.get_key(clients)

        # Run ansible:
        limit_hosts = parsed_args.limit

        playbook = parsed_args.playbook
        inventory = oooutils.get_tripleo_ansible_inventory(
            parsed_args.static_inventory, parsed_args.ssh_user, stack)
        skip_tags = self._validate_skip_tags(parsed_args.skip_tags)
        oooutils.run_update_ansible_action(
            self.log,
            clients,
            limit_hosts,
            inventory,
            playbook,
            constants.MAJOR_UPGRADE_PLAYBOOKS,
            parsed_args.ssh_user,
            (None if parsed_args.no_workflow else package_update),
            parsed_args.tags,
            skip_tags,
            verbosity,
            workdir=ansible_dir,
            priv_key=key)

        playbooks = (constants.MAJOR_UPGRADE_PLAYBOOKS
                     if playbook == 'all' else playbook)
        self.log.info(("Completed Overcloud Upgrade Run for {0} with "
                       "playbooks {1} ").format(limit_hosts, playbooks))
    def take_action(self, parsed_args):
        self.log.debug("take_action(%s)" % parsed_args)
        clients = self.app.client_manager
        stack = parsed_args.stack

        # Run ansible:
        roles = parsed_args.roles
        nodes = parsed_args.nodes
        limit_hosts = roles or nodes
        playbook = parsed_args.playbook
        inventory = oooutils.get_tripleo_ansible_inventory(
            parsed_args.static_inventory, parsed_args.ssh_user, stack)
        skip_tags = self._validate_skip_tags(parsed_args.skip_tags)
        oooutils.run_update_ansible_action(self.log, clients, limit_hosts,
                                           inventory, playbook,
                                           constants.UPGRADE_QUEUE,
                                           constants.MAJOR_UPGRADE_PLAYBOOKS,
                                           package_update,
                                           parsed_args.ssh_user, skip_tags)

        playbooks = (constants.MAJOR_UPGRADE_PLAYBOOKS
                     if playbook == 'all' else playbook)
        self.log.info(("Completed Overcloud Upgrade Run for {0} with "
                       "playbooks {1} ").format(limit_hosts, playbooks))
예제 #13
0
    def _run_validator_run(self, parsed_args):
        clients = self.app.client_manager
        LOG = logging.getLogger(__name__ + ".ValidationsRunAnsible")
        playbooks = []
        extra_vars_input = {}

        if parsed_args.extra_vars:
            extra_vars_input = parsed_args.extra_vars

        if parsed_args.extra_vars_file:
            extra_vars_input = parsed_args.extra_vars_file

        if parsed_args.group:
            workflow_input = {"group_names": parsed_args.group}

            LOG.debug(_('Getting the validations list by group'))
            try:
                output = validations.list_validations(clients, workflow_input)
                for val in output:
                    playbooks.append(val.get('id') + '.yaml')
            except Exception as e:
                print(_("Validations listing by group finished with errors"))
                print('Output: {}'.format(e))

        else:
            for pb in parsed_args.validation_name:
                playbooks.append(pb + '.yaml')

        python_interpreter = \
            "/usr/bin/python{}".format(sys.version_info[0])

        static_inventory = oooutils.get_tripleo_ansible_inventory(
            ssh_user='******',
            stack=parsed_args.plan,
            undercloud_connection='local',
            return_inventory_file_path=True)

        failed_val = False

        with ThreadPoolExecutor(max_workers=parsed_args.workers) as executor:
            LOG.debug(_('Running the validations with Ansible'))
            tasks_exec = {
                executor.submit(self._run_ansible,
                                logger=LOG,
                                plan=parsed_args.plan,
                                workdir=constants.ANSIBLE_VALIDATION_DIR,
                                log_path_dir=pwd.getpwuid(os.getuid()).pw_dir,
                                playbook=playbook,
                                inventory=static_inventory,
                                retries=False,
                                output_callback='validation_output',
                                extra_vars=extra_vars_input,
                                python_interpreter=python_interpreter,
                                gathering_policy='explicit'): playbook
                for playbook in playbooks
            }

        for tk, pl in six.iteritems(tasks_exec):
            try:
                rc, output = tk.result()
                print('[SUCCESS] - {}\n{}'.format(pl, oooutils.indent(output)))
            except Exception as e:
                failed_val = True
                LOG.error('[FAILED] - {}\n{}'.format(
                    pl, oooutils.indent(e.args[0])))

        LOG.debug(_('Removing static tripleo ansible inventory file'))
        oooutils.cleanup_tripleo_ansible_inventory_file(static_inventory)

        if failed_val:
            LOG.error(_('One or more validations have failed!'))
            sys.exit(1)
        sys.exit(0)
예제 #14
0
def invoke_plan_env_workflows(clients, stack_name, plan_env_file, verbosity=0):
    """Invokes the workflows in plan environment file"""

    try:
        with open(plan_env_file) as pf:
            plan_env_data = yaml.safe_load(pf.read())
    except IOError as exc:
        raise exceptions.PlanEnvWorkflowError('File (%s) is not found: '
                                              '%s' % (plan_env_file, exc))

    if plan_env_data and "playbook_parameters" in plan_env_data:
        static_inventory = utils.get_tripleo_ansible_inventory(
            ssh_user='******',
            stack=stack_name,
            undercloud_connection='local',
            return_inventory_file_path=True)
        with utils.TempDirs() as tmp:
            for pb, pb_vars in plan_env_data["playbook_parameters"].items():
                print('Invoking playbook ({}) specified in plan-environment'
                      ' file'.format(pb))
                LOG.debug('Running playbook "{}" with the'
                          ' following options {}.'.format(pb, pb_vars))
                playbook_dir = os.path.dirname(pb)
                if not playbook_dir:
                    playbook_dir = ANSIBLE_TRIPLEO_PLAYBOOKS

                utils.run_ansible_playbook(playbook=os.path.basename(pb),
                                           inventory=static_inventory,
                                           workdir=tmp,
                                           playbook_dir=playbook_dir,
                                           verbosity=verbosity,
                                           extra_vars=pb_vars)

    # NOTE(cloudnull): Remove this when mistral is gone.
    elif plan_env_data and "workflow_parameters" in plan_env_data:
        LOG.warning(
            'The workflow_parameters interface is deprecated, begin using'
            ' playbook_parameters instead.')
        for wf_name, wf_inputs in plan_env_data["workflow_parameters"].items():
            print('Invoking workflow (%s) specified in plan-environment '
                  'file' % wf_name)
            inputs = {'plan': stack_name, 'user_inputs': wf_inputs}
            workflow_client = clients.workflow_engine
            tripleoclients = clients.tripleoclient
            with tripleoclients.messaging_websocket() as ws:
                execution = base.start_workflow(workflow_client,
                                                wf_name,
                                                workflow_input=inputs)

                # Getting the derive parameters timeout after 600 seconds.
                for payload in base.wait_for_messages(workflow_client, ws,
                                                      execution, 600):
                    if ('message' in payload and
                        (payload.get('status', 'RUNNING') == "RUNNING")):
                        print(payload['message'])

            if payload.get('status', 'FAILED') == 'SUCCESS':
                result = payload.get('result', '')
                # Prints the workflow result
                if result:
                    print('Workflow execution is completed. result:')
                    print(yaml.safe_dump(result, default_flow_style=False))
            else:
                message = payload.get('message', '')
                msg = ('Workflow execution is failed: %s' % (message))
                raise exceptions.PlanEnvWorkflowError(msg)
예제 #15
0
    def _run_validator_run(self, parsed_args):
        LOG = logging.getLogger(__name__ + ".ValidationsRunAnsible")
        playbooks = []
        extra_vars_input = {}

        if parsed_args.extra_vars:
            extra_vars_input = parsed_args.extra_vars

        if parsed_args.extra_vars_file:
            extra_vars_input = parsed_args.extra_vars_file

        if parsed_args.group:
            LOG.debug(_('Getting the validations list by group'))
            try:
                output = oooutils.parse_all_validations_on_disk(
                    constants.ANSIBLE_VALIDATION_DIR, parsed_args.group)
                for val in output:
                    playbooks.append(val.get('id') + '.yaml')
            except Exception as e:
                print(
                    _("Getting Validations list by group name"
                      "finished with errors"))
                print('Output: {}'.format(e))

        else:
            for pb in parsed_args.validation_name:
                if pb not in oooutils.get_validation_group_name_list():
                    playbooks.append(pb + '.yaml')
                else:
                    raise exceptions.CommandError(
                        "Please, use '--group' argument instead of "
                        "'--validation' to run validation(s) by their name(s)."
                    )

        static_inventory = oooutils.get_tripleo_ansible_inventory(
            ssh_user='******',
            stack=parsed_args.plan,
            undercloud_connection='local',
            return_inventory_file_path=True)

        failed_val = False

        with oooutils.TempDirs() as tmp:
            with ThreadPoolExecutor(max_workers=parsed_args.workers) as exe:
                LOG.debug(_('Running the validations with Ansible'))
                tasks_exec = {
                    exe.submit(oooutils.run_ansible_playbook,
                               plan=parsed_args.plan,
                               workdir=tmp,
                               playbook=playbook,
                               playbook_dir=constants.ANSIBLE_VALIDATION_DIR,
                               parallel_run=True,
                               inventory=static_inventory,
                               output_callback='validation_json',
                               quiet=True,
                               extra_vars=extra_vars_input,
                               gathering_policy='explicit'): playbook
                    for playbook in playbooks
                }

        results = []

        for tk, pl in six.iteritems(tasks_exec):
            try:
                _rc, output = tk.result()
                results.append({
                    'validation': {
                        'validation_id': pl,
                        'logfile': None,
                        'status': 'PASSED',
                        'output': output
                    }
                })
            except Exception as e:
                failed_val = True
                results.append({
                    'validation': {
                        'validation_id': pl,
                        'logfile': None,
                        'status': 'FAILED',
                        'output': str(e)
                    }
                })

        if results:
            new_log_files = oooutils.get_new_validations_logs_on_disk()

            for i in new_log_files:
                val_id = "{}.yaml".format(i.split('_')[1])
                for res in results:
                    if res['validation'].get('validation_id') == val_id:
                        res['validation']['logfile'] = \
                            os.path.join(constants.VALIDATIONS_LOG_BASEDIR, i)

            t = PrettyTable(border=True, header=True, padding_width=1)
            t.field_names = [
                "UUID", "Validations", "Status", "Host Group(s)",
                "Status by Host", "Unreachable Host(s)", "Duration"
            ]

            for validation in results:
                r = []
                logfile = validation['validation'].get('logfile', None)
                if logfile and os.path.exists(logfile):
                    with open(logfile, 'r') as val:
                        contents = json.load(val)

                    for i in contents['plays']:
                        host = [x for x in i['play'].get('host').split(', ')]
                        val_id = i['play'].get('validation_id')
                        time_elapsed = \
                            i['play']['duration'].get('time_elapsed', None)

                    r.append(contents['plays'][0]['play'].get('id'))
                    r.append(val_id)
                    if validation['validation'].get('status') == "PASSED":
                        r.append(PASSED_VALIDATION)
                    else:
                        r.append(FAILED_VALIDATION)

                    unreachable_hosts = []
                    hosts_result = []
                    for ht in list(contents['stats'].keys()):
                        if contents['stats'][ht]['unreachable'] != 0:
                            unreachable_hosts.append(ht)
                        elif contents['stats'][ht]['failures'] != 0:
                            hosts_result.append("{}{}{}".format(
                                RED, ht, RESET))
                        else:
                            hosts_result.append("{}{}{}".format(
                                GREEN, ht, RESET))

                    r.append(", ".join(host))
                    r.append(", ".join(hosts_result))
                    r.append("{}{}{}".format(RED, ", ".join(unreachable_hosts),
                                             RESET))
                    r.append(time_elapsed)
                    t.add_row(r)

            t.sortby = "UUID"
            for field in t.field_names:
                if field == "Status":
                    t.align['Status'] = "l"
                else:
                    t.align[field] = "l"

            print(t)

            if len(new_log_files) > len(results):
                LOG.warn(
                    _('Looks like we have more log files than '
                      'executed validations'))

            for i in new_log_files:
                os.rename(
                    "{}/{}".format(constants.VALIDATIONS_LOG_BASEDIR, i),
                    "{}/processed_{}".format(constants.VALIDATIONS_LOG_BASEDIR,
                                             i))

        LOG.debug(_('Removing static tripleo ansible inventory file'))
        oooutils.cleanup_tripleo_ansible_inventory_file(static_inventory)

        if failed_val:
            raise exceptions.CommandError(
                _('One or more validations have failed!'))