Don't create/update plan for overcloud deploy

As we now manage the stack without the plan, lets
remove create/update of plan from deployment.

We'll remove the plan management commands in a
later patch.

Depends-On: https://review.opendev.org/c/openstack/tripleo-common/+/770884
Change-Id: I634a76ea262a9bbc653fc2caec5db3c5461be057
This commit is contained in:
ramishra 2021-01-19 15:32:30 +05:30
parent 258ecb54b7
commit 5027962dd7
2 changed files with 32 additions and 165 deletions

View File

@ -54,10 +54,6 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
history_patcher.start()
self.addCleanup(history_patcher.stop)
# Mock this function to avoid file creation
self.real_download_missing = self.cmd._download_missing_files_from_plan
self.cmd._download_missing_files_from_plan = mock.Mock()
self.real_shutil = shutil.rmtree
self.uuid1_value = "uuid"
@ -87,6 +83,14 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
mock_sleep = mock.patch('time.sleep', autospec=True)
mock_sleep.start()
self.addCleanup(mock_sleep.stop)
mock_run_command = mock.patch(
'tripleoclient.utils.run_command_and_log',
autospec=True,
return_value=0)
mock_run_command.start()
self.addCleanup(mock_run_command.stop)
plan_list = mock.patch(
"tripleoclient.workflows.plan_management.list_deployment_plans",
autospec=True
@ -97,14 +101,6 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
"test-plan-2",
])
self.addCleanup(plan_list.stop)
client = self.app.client_manager.tripleoclient = plugin.ClientWrapper(
instance=ooofakes.FakeInstanceData
)
get_object = client.object_store.get_object = mock.Mock()
get_object.return_value = ('f1', 'content')
client.object_store.put_object = mock.Mock()
get_container = client.object_store.get_container = mock.MagicMock()
get_container.return_value = ('container', [{'name': 'f1'}])
roles = mock.patch(
'tripleoclient.workflows.roles.list_available_roles',
autospec=True,
@ -159,8 +155,6 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
horizon_url.return_value = 'fake://url:12345'
self.addCleanup(horizon_url.stop)
client.object_store.get_account = mock.MagicMock()
self.mock_tar = mock.patch(
'tripleo_common.utils.tarball.create_tarball',
autospec=True
@ -170,7 +164,6 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
def tearDown(self):
super(TestDeployOvercloud, self).tearDown()
os.unlink(self.parameter_defaults_env_file)
self.cmd._download_missing_files_from_plan = self.real_download_missing
shutil.rmtree = self.real_shutil
self.mock_tar.stop()
@ -236,12 +229,6 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
mock_event.id = '1234'
mock_events.return_value = [mock_events]
mock_roles_data.return_value = []
object_client = clients.tripleoclient.object_store
object_client.get_object = mock.Mock()
object_client.put_container = mock.Mock()
mock_env = yaml.safe_dump({'environments': []})
object_client.get_object.return_value = ({}, mock_env)
clients.network.api.find_attr.return_value = {
"id": "network id"
}
@ -292,8 +279,6 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
mock_create_tempest_deployer_input.assert_called_with()
mock_copy.assert_called_once()
object_client.put_container.assert_called_once_with(
'overcloud', headers={'x-container-meta-usage-tripleo': 'plan'})
@mock.patch('tripleoclient.utils.get_rc_params', autospec=True)
@mock.patch('tripleo_common.utils.plan.generate_passwords',
@ -356,12 +341,6 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
mock_stack = fakes.create_tht_stack()
orchestration_client.stacks.get.side_effect = [None, mock_stack]
object_client = clients.tripleoclient.object_store
object_client.get_object = mock.Mock()
object_client.put_container = mock.Mock()
mock_env = yaml.safe_dump({'environments': []})
object_client.get_object.return_value = ({}, mock_env)
def _orch_clt_create(**kwargs):
orchestration_client.stacks.get.return_value = mock_stack
@ -400,18 +379,8 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
utils_overcloud_fixture.mock_deploy_tht.assert_called_with()
mock_validate_args.assert_called_once_with(parsed_args)
self.assertFalse(mock_invoke_plan_env_wf.called)
calls = [
mock.call('overcloud',
'user-environments/tripleoclient-parameters.yaml',
yaml.safe_dump(parameters_env,
default_flow_style=False))]
object_client = clients.tripleoclient.object_store
object_client.put_object.assert_has_calls(calls)
@mock.patch('tripleoclient.utils.get_rc_params', autospec=True)
@mock.patch('tripleo_common.utils.plan.generate_passwords',
return_value={})
@ -483,12 +452,6 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
orchestration_client.stacks.create.side_effect = _orch_clt_create
object_client = clients.tripleoclient.object_store
object_client.get_object = mock.Mock()
object_client.put_container = mock.Mock()
mock_env = yaml.safe_dump({'environments': []})
object_client.get_object.return_value = ({}, mock_env)
clients.network.api.find_attr.return_value = {
"id": "network id"
}
@ -504,8 +467,6 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
self.cmd.take_action(parsed_args)
mock_copy.assert_called_once()
object_client.put_container.assert_called_once_with(
'overcloud', headers={'x-container-meta-usage-tripleo': 'plan'})
@mock.patch('tripleoclient.utils.get_rc_params', autospec=True)
@mock.patch('tripleo_common.utils.plan.generate_passwords',
@ -575,10 +536,6 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
mock_rc_params.return_value = {'password': 'password',
'region': 'region1'}
object_client = clients.tripleoclient.object_store
object_client.get_object = mock.Mock()
object_client.put_container = mock.Mock()
env = {'parameter_defaults': {},
'resource_registry': {}}
mock_process_env.return_value = {}, env
@ -595,8 +552,6 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
mock_create_tempest_deployer_input.assert_called_with()
mock_copy.assert_called_once()
object_client.put_container.assert_called_once_with(
'overcloud', headers={'x-container-meta-usage-tripleo': 'plan'})
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_deploy_tripleo_heat_templates', autospec=True)
@ -686,14 +641,9 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
mock_rc_params.return_value = {'password': 'password',
'region': 'region1'}
mock_deploy_heat.side_effect = _fake_heat_deploy
object_client = clients.tripleoclient.object_store
object_client.get_object = mock.Mock()
object_client.put_container = mock.Mock()
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.cmd.take_action(parsed_args)
mock_copy.assert_called_once()
object_client.put_container.assert_called_once_with(
'overcloud', headers={'x-container-meta-usage-tripleo': 'plan'})
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_deploy_postconfig', autospec=True)
@ -896,12 +846,6 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
('disable_password_generation', True)]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
object_client = clients.tripleoclient.object_store
object_client.get_object = mock.Mock()
object_client.put_container = mock.Mock()
mock_env = yaml.safe_dump({'parameter_defaults':
{'NovaComputeLibvirtType': 'qemu'}})
object_client.get_object.return_value = ({}, mock_env)
mock_rc_params.return_value = {'password': 'password',
'region': 'region1'}
@ -922,8 +866,6 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
utils_fixture.mock_deploy_tht.assert_called_with()
mock_copy.assert_called_once()
object_client.put_container.assert_called_once_with(
'overcloud', headers={'x-container-meta-usage-tripleo': 'plan'})
@mock.patch('tripleoclient.utils.get_rc_params', autospec=True)
@mock.patch('tripleo_common.utils.plan.generate_passwords',
@ -968,12 +910,6 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
('templates', '/usr/share/openstack-tripleo-heat-templates/'),
]
object_client = clients.tripleoclient.object_store
object_client.get_object = mock.Mock()
object_client.put_container = mock.Mock()
mock_env = yaml.safe_dump({'environments': []})
object_client.get_object.return_value = ({}, mock_env)
def _custom_create_params_env(_self, parameters, tht_root,
container_name):
parameters.update({"ControllerCount": 3})
@ -993,8 +929,6 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
self.assertRaises(exceptions.InvalidConfiguration,
self.cmd.take_action,
parsed_args)
object_client.put_container.assert_called_once_with(
'overcloud', headers={'x-container-meta-usage-tripleo': 'plan'})
@mock.patch('tripleoclient.utils.get_rc_params', autospec=True)
@mock.patch('tripleo_common.utils.plan.generate_passwords',
@ -1065,12 +999,6 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
orchestration_client.stacks.create.side_effect = _orch_clt_create
object_client = clients.tripleoclient.object_store
object_client.get_object = mock.Mock()
object_client.put_container = mock.Mock()
mock_env = yaml.safe_dump({'environments': []})
object_client.get_object.return_value = ({}, mock_env)
clients.network.api.find_attr.return_value = {
"id": "network id"
}
@ -1124,8 +1052,6 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
mock_validate_args.assert_called_once_with(parsed_args)
mock_copy.assert_called_once()
object_client.put_container.assert_called_once_with(
'overcloud', headers={'x-container-meta-usage-tripleo': 'plan'})
@mock.patch('tripleoclient.utils.get_rc_params', autospec=True)
@mock.patch('tripleoclient.utils.copy_clouds_yaml')
@ -1447,27 +1373,6 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
verbosity=3, workdir=mock.ANY, forks=None)],
utils_fixture2.mock_run_ansible_playbook.mock_calls)
def test_download_missing_files_from_plan(self):
# Restore the real function so we don't accidentally call the mock
self.cmd._download_missing_files_from_plan = self.real_download_missing
# Set up the client mocks
self.cmd._setup_clients(mock.Mock())
dirname = '/tmp/tht-missing'
mock_open = mock.mock_open()
mock_makedirs = mock.Mock()
builtin_mod = six.moves.builtins.__name__
with mock.patch('os.makedirs', mock_makedirs):
with mock.patch('%s.open' % builtin_mod, mock_open):
self.cmd._download_missing_files_from_plan(dirname,
'overcast')
mock_makedirs.assert_called_with(dirname)
mock_open.assert_called()
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
'_write_user_environment', autospec=True)
def test_provision_baremetal(self, mock_write):

View File

@ -25,6 +25,7 @@ import re
import shutil
import six
import subprocess
import sys
import tempfile
import time
import yaml
@ -44,7 +45,6 @@ from tripleoclient import exceptions
from tripleoclient import utils
from tripleoclient.workflows import deployment
from tripleoclient.workflows import parameters as workflow_params
from tripleoclient.workflows import plan_management
from tripleoclient.workflows import roles
CONF = cfg.CONF
@ -211,7 +211,7 @@ class DeployOvercloud(command.Command):
def _create_breakpoint_cleanup_env(self, tht_root, container_name):
bp_env = {}
update.add_breakpoints_cleanup_into_env(bp_env)
env_path, _ = self._write_user_environment(
env_path = self._write_user_environment(
bp_env,
'tripleoclient-breakpoint-cleanup.yaml',
tht_root,
@ -220,7 +220,7 @@ class DeployOvercloud(command.Command):
def _create_parameters_env(self, parameters, tht_root, container_name):
parameter_defaults = {"parameter_defaults": parameters}
env_path, _ = self._write_user_environment(
env_path = self._write_user_environment(
parameter_defaults,
'tripleoclient-parameters.yaml',
tht_root,
@ -252,18 +252,7 @@ class DeployOvercloud(command.Command):
with open(user_env_path, 'w') as f:
self.log.debug("Writing user environment %s" % user_env_path)
f.write(contents)
# Upload to swift
if abs_env_path.startswith("/"):
swift_path = "user-environments/{}".format(abs_env_path[1:])
else:
swift_path = "user-environments/{}".format(abs_env_path)
contents = yaml.safe_dump(env_map, default_flow_style=False)
self.log.debug("Uploading %s to swift at %s"
% (abs_env_path, swift_path))
self.object_client.put_object(container_name, swift_path, contents)
return user_env_path, swift_path
return user_env_path
def _heat_deploy(self, stack, stack_name, template_path, parameters,
env_files, timeout, tht_root, env,
@ -287,7 +276,8 @@ class DeployOvercloud(command.Command):
template_file=template_path)
files = dict(list(template_files.items()) + list(env_files.items()))
workflow_params.check_deprecated_parameters(self.clients, stack_name)
# Fix if required
# workflow_params.check_deprecated_parameters(self.clients, stack_name)
self.log.info("Deploying templates in the directory {0}".format(
os.path.abspath(tht_root)))
@ -296,21 +286,6 @@ class DeployOvercloud(command.Command):
template, files, env_files_tracker,
self.log)
def _download_missing_files_from_plan(self, tht_dir, plan_name):
# get and download missing files into tmp directory
plan_list = self.object_client.get_container(plan_name)
plan_filenames = [f['name'] for f in plan_list[1]]
for pf in plan_filenames:
file_path = os.path.join(tht_dir, pf)
if not os.path.isfile(file_path):
self.log.debug("Missing in templates directory, downloading \
%s from swift into %s" % (pf, file_path))
utils.makedirs(os.path.dirname(file_path))
# open in binary as the swiftclient get/put error under
# python3 if opened as Text I/O
with open(file_path, 'wb') as f:
f.write(self.object_client.get_object(plan_name, pf)[1])
def _deploy_tripleo_heat_templates_tmpdir(self, stack, parsed_args):
# copy tht_root to temporary directory because we need to
# download any missing (e.g j2 rendered) files from the plan
@ -319,8 +294,26 @@ class DeployOvercloud(command.Command):
new_tht_root = "%s/tripleo-heat-templates" % tht_tmp
self.log.debug("Creating temporary templates tree in %s"
% new_tht_root)
python_version = sys.version_info[0]
python_cmd = "python{}".format(python_version)
try:
shutil.copytree(tht_root, new_tht_root, symlinks=True)
process_templates = os.path.join(
parsed_args.templates, 'tools/process-templates.py')
roles_file_path = utils.get_roles_file_path(
parsed_args.roles_file, new_tht_root)
networks_file_path = utils.get_networks_file_path(
parsed_args.networks_file, new_tht_root)
args = [python_cmd, process_templates, '--roles-data',
roles_file_path, '--network-data', networks_file_path,
'-p', new_tht_root]
if utils.run_command_and_log(
self.log, args, new_tht_root) != 0:
msg = _("Problems generating templates.")
self.log.error(msg)
raise exceptions.DeploymentError(msg)
self._deploy_tripleo_heat_templates(stack, parsed_args,
new_tht_root, tht_root)
finally:
@ -334,37 +327,6 @@ class DeployOvercloud(command.Command):
tht_root, user_tht_root):
"""Deploy the fixed templates in TripleO Heat Templates"""
plans = plan_management.list_deployment_plans(self.clients)
generate_passwords = not parsed_args.disable_password_generation
# TODO(d0ugal): We need to put a more robust strategy in place here to
# handle updating plans.
if parsed_args.stack in plans:
# Upload the new plan templates to swift to replace the existing
# templates.
plan_management.update_plan_from_templates(
self.clients, parsed_args.stack, tht_root,
parsed_args.roles_file, generate_passwords,
parsed_args.plan_environment_file,
parsed_args.networks_file,
type(self)._keep_env_on_update,
utils.playbook_verbosity(self=self),
parsed_args.disable_container_prepare
)
else:
plan_management.create_plan_from_templates(
self.clients, parsed_args.stack, tht_root,
parsed_args.roles_file, generate_passwords,
parsed_args.plan_environment_file,
parsed_args.networks_file,
utils.playbook_verbosity(self=self),
parsed_args.disable_container_prepare
)
# Get any missing (e.g j2 rendered) files from the plan to tht_root
self._download_missing_files_from_plan(
tht_root, parsed_args.stack)
self.log.info("Processing templates in the directory {0}".format(
os.path.abspath(tht_root)))