Merge "Fix update run for Ephemeral Heat"

This commit is contained in:
Zuul 2021-09-20 18:32:45 +00:00 committed by Gerrit Code Review
commit 4f426292d9
4 changed files with 105 additions and 53 deletions

View File

@ -0,0 +1,10 @@
---
prelude: >
During a minor update of the overcloud. It was previously necessary to
execute 3 steps.
- Update Prepare
- Update Run
- Update Converge
Starting in W, it is no longer necessary to perform a Stack update
during the converge. This change removes the stack update from the
converge step. Now, we will just run the deploy_steps_playbook instead.

View File

@ -101,7 +101,6 @@ EXTERNAL_UPGRADE_PLAYBOOKS = ['external_upgrade_steps_playbook.yaml']
# upgrade environment files expected by the client in the --templates
# tripleo-heat-templates default above $TRIPLEO_HEAT_TEMPLATES
UPDATE_PREPARE_ENV = "environments/lifecycle/update-prepare.yaml"
UPDATE_CONVERGE_ENV = "environments/lifecycle/update-converge.yaml"
UPGRADE_PREPARE_ENV = "environments/lifecycle/upgrade-prepare.yaml"
UPGRADE_CONVERGE_ENV = "environments/lifecycle/upgrade-converge.yaml"
UPGRADE_CONVERGE_FORBIDDEN_PARAMS = ["ceph3_namespace",

View File

@ -139,35 +139,57 @@ class TestOvercloudUpdateRun(fakes.TestOvercloudUpdateRun):
class TestOvercloudUpdateConverge(fakes.TestOvercloudUpdateConverge):
def setUp(self):
super(TestOvercloudUpdateConverge, self).setUp()
# Get the command object to test
app_args = mock.Mock()
app_args.verbose_level = 1
self.cmd = overcloud_update.UpdateConverge(self.app, app_args)
@mock.patch('tripleoclient.utils.get_key')
@mock.patch('tripleoclient.utils.get_default_working_dir')
@mock.patch('tripleoclient.utils.ensure_run_as_normal_user')
@mock.patch('tripleoclient.utils.prompt_user_for_confirmation',
return_value=True)
@mock.patch(
'tripleoclient.v1.overcloud_deploy.DeployOvercloud.take_action')
'tripleoclient.utils.run_ansible_playbook')
def test_update_converge(self, deploy_action, mock_confirm,
mock_usercheck):
argslist = ['--templates', '--stack', 'cloud']
mock_usercheck, mock_dir, mock_key):
argslist = ['--stack', 'cloud']
verifylist = [
('stack', 'cloud')
]
parsed_args = self.check_parser(self.cmd, argslist, verifylist)
mock_dir.return_value = "/home/stack/overcloud-deploy"
ansible_dir = "{}/config-download/cloud".format(
mock_dir.return_value
)
inventory = "{}/tripleo-ansible-inventory.yaml".format(
ansible_dir
)
ansible_cfg = "{}/ansible.cfg".format(
ansible_dir
)
mock_key.return_value = '/home/stack/.ssh/id_rsa_tripleo'
parsed_args = self.check_parser(self.cmd, argslist, verifylist)
with mock.patch('os.path.exists') as mock_exists, \
mock.patch('os.path.isfile') as mock_isfile:
mock_exists.return_value = True
mock_isfile.return_value = True
self.cmd.take_action(parsed_args)
mock_usercheck.assert_called_once()
assert('/usr/share/openstack-tripleo-heat-templates/'
'environments/lifecycle/update-converge.yaml'
in parsed_args.environment_files)
deploy_action.assert_called_once_with(parsed_args)
deploy_action.assert_called_once_with(
playbook='deploy_steps_playbook.yaml',
inventory=inventory,
workdir=ansible_dir,
playbook_dir=ansible_dir,
ansible_cfg=ansible_cfg,
ssh_user='tripleo-admin',
reproduce_command=True,
forks=parsed_args.ansible_forks,
extra_env_variables={
"ANSIBLE_BECOME": True,
"ANSIBLE_PRIVATE_KEY_FILE":
"/home/stack/.ssh/id_rsa_tripleo"
}
)

View File

@ -12,6 +12,8 @@
# License for the specific language governing permissions and limitations
# under the License.
#
import os
from oslo_config import cfg
from oslo_log import log as logging
@ -24,18 +26,17 @@ from tripleoclient import command
from tripleoclient import constants
from tripleoclient import utils as oooutils
from tripleoclient.v1.overcloud_deploy import DeployOvercloud
from tripleoclient.workflows import deployment
CONF = cfg.CONF
class UpdatePrepare(DeployOvercloud):
"""Run heat stack update for overcloud nodes to refresh heat stack outputs.
"""Use Heat to update and render the new Ansible playbooks based
on the updated templates.
The heat stack outputs are what we use later on to generate ansible
playbooks which deliver the minor update workflow. This is used as the
first step for a minor update of your overcloud.
These playbooks will be rendered and used during the update run step
to perform the minor update of the overcloud nodes.
"""
log = logging.getLogger(__name__ + ".MinorUpdatePrepare")
@ -188,44 +189,46 @@ class UpdateRun(command.Command):
else:
playbook = parsed_args.playbook
_, 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=playbook,
inventory_path=oooutils.get_tripleo_ansible_inventory(
parsed_args.static_inventory,
parsed_args.ssh_user,
parsed_args.stack,
return_inventory_file_path=True
),
limit_hosts=oooutils.playbook_limit_parse(
limit_nodes=parsed_args.limit
),
ansible_dir = os.path.join(oooutils.get_default_working_dir(
parsed_args.stack
),
'config-download',
parsed_args.stack)
if not parsed_args.static_inventory:
inventory = os.path.join(ansible_dir,
'tripleo-ansible-inventory.yaml')
else:
inventory = parsed_args.static_inventory
ansible_cfg = os.path.join(ansible_dir, 'ansible.cfg')
key_file = oooutils.get_key(parsed_args.stack)
oooutils.run_ansible_playbook(
playbook=playbook,
inventory=inventory,
workdir=ansible_dir,
playbook_dir=ansible_dir,
skip_tags=parsed_args.skip_tags,
tags=parsed_args.tags,
forks=parsed_args.ansible_forks
ansible_cfg=ansible_cfg,
ssh_user='tripleo-admin',
limit_hosts=parsed_args.limit,
reproduce_command=True,
forks=parsed_args.ansible_forks,
extra_env_variables={
"ANSIBLE_BECOME": True,
"ANSIBLE_PRIVATE_KEY_FILE": key_file
}
)
self.log.info("Completed Overcloud Minor Update Run.")
self.log.info("Completed Minor Update Run.")
class UpdateConverge(DeployOvercloud):
"""Converge the update on Overcloud nodes.
This restores the plan and stack so that normal deployment
workflow is back in place.
"""
log = logging.getLogger(__name__ + ".UpdateConverge")
def get_parser(self, prog_name):
@ -236,6 +239,7 @@ class UpdateConverge(DeployOvercloud):
"required before any update operation. "
"Use this with caution! "),
)
return parser
def take_action(self, parsed_args):
@ -249,13 +253,30 @@ class UpdateConverge(DeployOvercloud):
constants.UPDATE_PROMPT, self.log)):
raise OvercloudUpdateNotConfirmed(constants.UPDATE_NO)
# Add the update-converge.yaml environment to unset noops
templates_dir = (parsed_args.templates or
constants.TRIPLEO_HEAT_TEMPLATES)
parsed_args.environment_files = oooutils.prepend_environment(
parsed_args.environment_files, templates_dir,
constants.UPDATE_CONVERGE_ENV)
ansible_dir = os.path.join(oooutils.get_default_working_dir(
parsed_args.stack
),
'config-download',
parsed_args.stack)
super(UpdateConverge, self).take_action(parsed_args)
self.log.info("Update converge on stack {0} complete.".format(
parsed_args.stack))
inventory = os.path.join(ansible_dir,
'tripleo-ansible-inventory.yaml')
ansible_cfg = os.path.join(ansible_dir, 'ansible.cfg')
key_file = oooutils.get_key(parsed_args.stack)
oooutils.run_ansible_playbook(
playbook='deploy_steps_playbook.yaml',
inventory=inventory,
workdir=ansible_dir,
playbook_dir=ansible_dir,
ansible_cfg=ansible_cfg,
ssh_user='tripleo-admin',
reproduce_command=True,
forks=parsed_args.ansible_forks,
extra_env_variables={
"ANSIBLE_BECOME": True,
"ANSIBLE_PRIVATE_KEY_FILE": key_file
}
)
self.log.info("Completed Minor Update Converge.")