def take_action(self, parsed_args):
        self.log.debug("take_action(%s)" % parsed_args)
        clients = self.app.client_manager

        if not parsed_args.yes:
            confirm = oooutils.prompt_user_for_confirmation(message=_(
                "Are you sure you want to delete these overcloud "
                "nodes [y/N]? "),
                                                            logger=self.log)
            if not confirm:
                raise oscexc.CommandError("Action not confirmed, exiting.")

        orchestration_client = clients.orchestration

        stack = oooutils.get_stack(orchestration_client, parsed_args.stack)

        if not stack:
            raise InvalidConfiguration("stack {} not found".format(
                parsed_args.stack))

        nodes = '\n'.join('- %s' % node for node in parsed_args.nodes)
        print(
            "Deleting the following nodes from stack {stack}:\n{nodes}".format(
                stack=stack.stack_name, nodes=nodes))

        scale.scale_down(clients, stack.stack_name, parsed_args.nodes,
                         parsed_args.timeout)
    def take_action(self, parsed_args):
        self.log.debug("take_action(%s)" % parsed_args)

        if not parsed_args.yes:
            confirm = utils.prompt_user_for_confirmation(
                    message=_("Are you sure you want to delete this image "
                              "[y/N]? "),
                    logger=self.log)
            if not confirm:
                raise oscexc.CommandError("Action not confirmed, exiting.")

        lock = processlock.ProcessLock()
        manager = image_uploader.ImageUploadManager(lock=lock)
        uploader = manager.uploader('python')
        registry_url_arg = parsed_args.registry_url
        if registry_url_arg is None:
            registry_url_arg = image_uploader.get_undercloud_registry()
        url = uploader._image_to_url(registry_url_arg)
        session = uploader.authenticate(url, parsed_args.username,
                                        parsed_args.password)

        try:
            uploader.delete(parsed_args.image_to_delete, session=session)
        except OSError as e:
            self.log.error("Unable to remove due to permissions. "
                           "Please prefix command with sudo.")
            raise oscexc.CommandError(e)
    def take_action(self, parsed_args):
        self.log.debug("take_action({args})".format(args=parsed_args))

        self._validate_args(parsed_args)

        if not parsed_args.yes:
            confirm = utils.prompt_user_for_confirmation(message=_(
                "Are you sure you want to delete this overcloud "
                "[y/N]? "),
                                                         logger=self.log)
            if not confirm:
                raise oscexc.CommandError("Action not confirmed, exiting.")

        if parsed_args.skip_ipa_cleanup:
            playbooks = ["cli-overcloud-delete.yaml"]
        else:
            # Order is important, let's make sure we cleanup FreeIPA before we
            # start removing infrastructure.
            playbooks = ["cli-cleanup-ipa.yml", "cli-overcloud-delete.yaml"]

        with utils.TempDirs() as tmp:
            utils.run_ansible_playbook(
                playbooks,
                constants.ANSIBLE_INVENTORY,
                workdir=tmp,
                playbook_dir=constants.ANSIBLE_TRIPLEO_PLAYBOOKS,
                verbosity=utils.playbook_verbosity(self=self),
                extra_vars={"stack_name": parsed_args.stack})

        print("Success.")
示例#4
0
    def _create_variables_file(self, data, varsfile):
        msg = (_("The file %s already exists on the filesystem, "
                 "do you still want to continue [y/N] "))

        if varsfile[0] not in ['json', 'yaml']:
            raise RuntimeError(_('Wrong file type: %s') % varsfile[0])
        else:
            LOG.debug(_('Launch variables file creation'))
            try:
                if os.path.exists(varsfile[-1]):
                    confirm = oooutils.prompt_user_for_confirmation(
                        message=msg % varsfile[-1], logger=LOG)
                    if not confirm:
                        raise RuntimeError(_("Action not confirmed, exiting"))

                with open(varsfile[-1], 'w') as f:
                    params = {}
                    for val_name in data.keys():
                        for k, v in data[val_name].get('parameters').items():
                            params[k] = v

                    if varsfile[0] == 'json':
                        f.write(oooutils.get_validations_json(params))
                    elif varsfile[0] == 'yaml':
                        f.write(oooutils.get_validations_yaml(params))
                print(
                    _('The file %s has been created successfully') %
                    varsfile[-1])
            except Exception as e:
                print(_("Creating variables file finished with errors"))
                print('Output: {}'.format(e))
    def take_action(self, parsed_args):
        # Fetch configuration used to add logging to a file
        utils.load_config(self.osloconfig, constants.UNDERCLOUD_CONF_PATH)
        utils.configure_logging(self.log, self.app_args.verbose_level,
                                self.osloconfig['undercloud_log_file'])
        self.log.debug("take action(%s)" % parsed_args)

        if (not parsed_args.yes and not utils.prompt_user_for_confirmation(
                constants.UPGRADE_PROMPT, self.log)):
            raise exceptions.UndercloudUpgradeNotConfirmed(
                constants.UPGRADE_NO)

        utils.ensure_run_as_normal_user()

        if not parsed_args.skip_package_updates:
            if ('python3' in sys.executable):
                pyver = '3'
            else:
                pyver = '2'
            client_pkgs = [
                "python{}-tripleoclient".format(pyver),
            ]
            pkgs = client_pkgs + constants.UNDERCLOUD_EXTRA_PACKAGES
            self._update_extra_packages(pkgs, parsed_args.dry_run)
            self._invoke_self(parsed_args)
        else:
            self._run_upgrade(parsed_args)
    def take_action(self, parsed_args):
        self.log.debug("take_action(%s)" % parsed_args)
        clients = self.app.client_manager

        if parsed_args.baremetal_deployment:
            with open(parsed_args.baremetal_deployment, 'r') as fp:
                roles = yaml.safe_load(fp)

            nodes_text, nodes = self._nodes_to_delete(parsed_args, roles)
            if nodes_text:
                print(nodes_text)
            else:
                return
        else:
            nodes = parsed_args.nodes
            nodes_text = '\n'.join('- %s' % node for node in nodes)
        if not parsed_args.yes:
            confirm = oooutils.prompt_user_for_confirmation(message=_(
                "Are you sure you want to delete these overcloud "
                "nodes [y/N]? "),
                                                            logger=self.log)
            if not confirm:
                raise oscexc.CommandError("Action not confirmed, exiting.")

        orchestration_client = clients.orchestration

        stack = oooutils.get_stack(orchestration_client, parsed_args.stack)

        if not stack:
            raise InvalidConfiguration("stack {} not found".format(
                parsed_args.stack))

        print(
            "Deleting the following nodes from stack {stack}:\n{nodes}".format(
                stack=stack.stack_name, nodes=nodes_text))

        scale.scale_down(
            log=self.log,
            clients=clients,
            stack=stack,
            nodes=nodes,
            connection_timeout=parsed_args.overcloud_ssh_port_timeout,
            timeout=parsed_args.timeout,
            verbosity=oooutils.playbook_verbosity(self=self))

        if parsed_args.baremetal_deployment:
            with oooutils.TempDirs() as tmp:
                oooutils.run_ansible_playbook(
                    playbook='cli-overcloud-node-unprovision.yaml',
                    inventory='localhost,',
                    workdir=tmp,
                    playbook_dir=constants.ANSIBLE_TRIPLEO_PLAYBOOKS,
                    verbosity=oooutils.playbook_verbosity(self=self),
                    extra_vars={
                        "stack_name": parsed_args.stack,
                        "baremetal_deployment": roles,
                        "prompt": False,
                    })
示例#7
0
    def take_action(self, parsed_args):
        self.log.debug("take_action(%s)" % parsed_args)
        if (not parsed_args.yes and not utils.prompt_user_for_confirmation(
                constants.UPGRADE_PROMPT, self.log)):
            raise UndercloudUpgradeNotConfirmed(constants.UPGRADE_NO)

        parsed_args.standalone = True
        parsed_args.upgrade = True
        super(Upgrade, self).take_action(parsed_args)
示例#8
0
    def take_action(self, parsed_args):
        self.log.debug("take_action(%s)" % parsed_args)

        with open(parsed_args.input, 'r') as fp:
            roles = yaml.safe_load(fp)

        with oooutils.TempDirs() as tmp:
            unprovision_confirm = os.path.join(tmp, 'unprovision_confirm.json')

            if not parsed_args.yes:
                oooutils.run_ansible_playbook(
                    playbook='cli-overcloud-node-unprovision.yaml',
                    inventory='localhost,',
                    workdir=tmp,
                    playbook_dir=constants.ANSIBLE_TRIPLEO_PLAYBOOKS,
                    verbosity=oooutils.playbook_verbosity(self=self),
                    extra_vars={
                        "stack_name": parsed_args.stack,
                        "baremetal_deployment": roles,
                        "all": parsed_args.all,
                        "prompt": True,
                        "unprovision_confirm": unprovision_confirm
                    }
                )
                with open(unprovision_confirm) as f:
                    to_unprovision = json.load(f)
                    if not to_unprovision:
                        print('Nothing to unprovision, exiting')
                        return
                    self._print_nodes(to_unprovision)

                confirm = oooutils.prompt_user_for_confirmation(
                    message=_("Are you sure you want to unprovision these %s "
                              "nodes [y/N]? ") % parsed_args.stack,
                    logger=self.log)
                if not confirm:
                    raise oscexc.CommandError("Action not confirmed, exiting.")

            oooutils.run_ansible_playbook(
                playbook='cli-overcloud-node-unprovision.yaml',
                inventory='localhost,',
                workdir=tmp,
                playbook_dir=constants.ANSIBLE_TRIPLEO_PLAYBOOKS,
                verbosity=oooutils.playbook_verbosity(self=self),
                extra_vars={
                    "stack_name": parsed_args.stack,
                    "baremetal_deployment": roles,
                    "all": parsed_args.all,
                    "prompt": False,
                }
            )

        print('Unprovision complete')
    def take_action(self, parsed_args):
        self.log.debug("take_action({args})".format(args=parsed_args))

        self._validate_args(parsed_args)

        if not parsed_args.yes:
            confirm = utils.prompt_user_for_confirmation(message=_(
                "Are you sure you want to delete this overcloud "
                "[y/N]? "),
                                                         logger=self.log)
            if not confirm:
                raise oscexc.CommandError("Action not confirmed, exiting.")

        clients = self.app.client_manager

        self._plan_undeploy(clients, parsed_args.stack)
        self._plan_delete(clients, parsed_args.stack)
        print("Success.")
    def take_action(self, parsed_args):
        self.log.debug("take_action({args})".format(args=parsed_args))

        self._validate_args(parsed_args)

        if not parsed_args.yes:
            confirm = utils.prompt_user_for_confirmation(
                message=_("Are you sure you want to delete this overcloud "
                          "[y/N]? "),
                logger=self.log)
            if not confirm:
                raise oscexc.CommandError("Action not confirmed, exiting.")

        clients = self.app.client_manager
        orchestration_client = clients.orchestration
        workflow_client = self.app.client_manager.workflow_engine

        self._stack_delete(orchestration_client, parsed_args.stack)
        self._plan_delete(workflow_client, parsed_args.stack)
        print("Success.")
    def take_action(self, parsed_args):
        self.log.debug("take_action({args})".format(args=parsed_args))

        self._validate_args(parsed_args)

        if not parsed_args.yes:
            confirm = utils.prompt_user_for_confirmation(message=_(
                "Are you sure you want to delete this overcloud "
                "[y/N]? "),
                                                         logger=self.log)
            if not confirm:
                raise oscexc.CommandError("Action not confirmed, exiting.")

        with utils.TempDirs() as tmp:
            utils.run_ansible_playbook(
                "cli-overcloud-delete.yaml",
                'undercloud,',
                workdir=tmp,
                playbook_dir=constants.ANSIBLE_TRIPLEO_PLAYBOOKS,
                verbosity=utils.playbook_verbosity(self=self),
                extra_vars={"stack_name": parsed_args.stack})

        print("Success.")
示例#12
0
 def test_user_aborts_with_control_d(self, stdin_mock):
     stdin_mock.isatty.return_value = False
     stdin_mock.readline.side_effect = EOFError()
     result = utils.prompt_user_for_confirmation("[y/N]?", self.logger)
     self.assertFalse(result)
示例#13
0
 def test_user_aborts_control_c(self, stdin_mock):
     stdin_mock.isatty.return_value = False
     stdin_mock.readline.side_effect = KeyboardInterrupt()
     result = utils.prompt_user_for_confirmation("[y/N]?", self.logger)
     self.assertFalse(result)
示例#14
0
 def test_user_no_tty(self, stdin_mock):
     stdin_mock.isatty.return_value = False
     stdin_mock.readline.return_value = "yes"
     result = utils.prompt_user_for_confirmation("[y/N]?", self.logger)
     self.assertFalse(result)
示例#15
0
 def test_user_accepts(self, stdin_mock):
     stdin_mock.isatty.return_value = True
     stdin_mock.readline.return_value = "yes"
     result = utils.prompt_user_for_confirmation("[y/N]?", self.logger)
     self.assertTrue(result)
 def test_user_accepts(self, stdin_mock):
     stdin_mock.isatty.return_value = True
     stdin_mock.readline.return_value = "yes"
     result = utils.prompt_user_for_confirmation("[y/N]?", self.logger)
     self.assertTrue(result)
 def test_user_no_tty(self, stdin_mock):
     stdin_mock.isatty.return_value = False
     stdin_mock.readline.return_value = "yes"
     result = utils.prompt_user_for_confirmation("[y/N]?", self.logger)
     self.assertFalse(result)
 def test_user_aborts_control_c(self, stdin_mock):
     stdin_mock.isatty.return_value = False
     stdin_mock.readline.side_effect = KeyboardInterrupt()
     result = utils.prompt_user_for_confirmation("[y/N]?", self.logger)
     self.assertFalse(result)
 def test_user_aborts_with_control_d(self, stdin_mock):
     stdin_mock.isatty.return_value = False
     stdin_mock.readline.side_effect = EOFError()
     result = utils.prompt_user_for_confirmation("[y/N]?", self.logger)
     self.assertFalse(result)