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:
parent
258ecb54b7
commit
5027962dd7
|
@ -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):
|
||||
|
|
|
@ -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)))
|
||||
|
||||
|
|
Loading…
Reference in New Issue