From 4714df20ccab7e387416592beffc9cc395b8628b Mon Sep 17 00:00:00 2001 From: Dougal Matthews Date: Thu, 14 May 2015 14:18:32 +0100 Subject: [PATCH] Integrate Tuskar into openstack overcloud deploy Change-Id: Ic2a5b959e37bacbd614cbed9712b64b95aaeafb2 --- .../tests/v1/overcloud_deploy/fakes.py | 4 ++ .../overcloud_deploy/test_overcloud_deploy.py | 42 ++++++++++++++++++ rdomanager_oscplugin/v1/overcloud_deploy.py | 43 ++++++++++++++++++- 3 files changed, 88 insertions(+), 1 deletion(-) diff --git a/rdomanager_oscplugin/tests/v1/overcloud_deploy/fakes.py b/rdomanager_oscplugin/tests/v1/overcloud_deploy/fakes.py index 669cea3b6..d84fa03dd 100644 --- a/rdomanager_oscplugin/tests/v1/overcloud_deploy/fakes.py +++ b/rdomanager_oscplugin/tests/v1/overcloud_deploy/fakes.py @@ -30,6 +30,7 @@ class FakeClientWrapper(object): self._instance = mock.Mock() self._orchestration = mock.Mock() self._baremetal = mock.Mock() + self._management = mock.Mock() def orchestration(self): return self._orchestration @@ -37,6 +38,9 @@ class FakeClientWrapper(object): def baremetal(self): return self._baremetal + def management(self): + return self._management + class TestDeployOvercloud(utils.TestCommand): diff --git a/rdomanager_oscplugin/tests/v1/overcloud_deploy/test_overcloud_deploy.py b/rdomanager_oscplugin/tests/v1/overcloud_deploy/test_overcloud_deploy.py index 29ef68624..8de86a515 100644 --- a/rdomanager_oscplugin/tests/v1/overcloud_deploy/test_overcloud_deploy.py +++ b/rdomanager_oscplugin/tests/v1/overcloud_deploy/test_overcloud_deploy.py @@ -91,3 +91,45 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): self.assertEqual(kwargs['template'], 'template') self.assertEqual(kwargs['environment'], 'env') self.assertEqual(kwargs['stack_name'], 'overcloud') + + @mock.patch('heatclient.common.template_utils.' + 'process_multiple_environments_and_files') + @mock.patch('heatclient.common.template_utils.get_template_contents') + @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' + '_get_stack') + @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' + '_pre_heat_deploy') + @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' + '_post_heat_deploy') + @mock.patch('rdomanager_oscplugin.v1.overcloud_deploy.DeployOvercloud.' + '_heat_deploy') + def test_tuskar_deploy(self, mock_heat_deploy, mock_post_deploy, + most_pre_deploy, mock_get_stack, + mock_get_templte_contents, + mock_process_multiple_env): + + arglist = ['--plan-uuid', 'UUID', '--output-dir', 'fake'] + verifylist = [ + ('use_tht', False), + ('plan_uuid', 'UUID'), + ('output_dir', 'fake'), + ] + + clients = self.app.client_manager + management = clients.rdomanager_oscplugin.management() + + management.plans.templates.return_value = {} + + mock_get_templte_contents.return_value = ({}, "template") + mock_process_multiple_env.return_value = ({}, "envs") + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.cmd.take_action(parsed_args) + + mock_heat_deploy.assert_called_with( + mock_get_stack(), + 'fake/plan.yaml', + None, + ['fake/environment.yaml'] + ) diff --git a/rdomanager_oscplugin/v1/overcloud_deploy.py b/rdomanager_oscplugin/v1/overcloud_deploy.py index 31a791c0e..c2be5124c 100644 --- a/rdomanager_oscplugin/v1/overcloud_deploy.py +++ b/rdomanager_oscplugin/v1/overcloud_deploy.py @@ -18,6 +18,7 @@ import logging import os import six import sys +import tempfile import uuid from cliff import command @@ -232,7 +233,47 @@ class DeployOvercloud(command.Command): [RESOURCE_REGISTRY_PATH, env_path]) def _deploy_tuskar(self, stack, parsed_args): - pass + + clients = self.app.client_manager + management = clients.rdomanager_oscplugin.management() + + # TODO(dmatthews): The Tuskar client has very similar code to this. It + # should be refactored upstream so we can use it. + + if parsed_args.output_dir: + output_dir = parsed_args.output_dir + else: + output_dir = tempfile.mkdtemp() + + if not os.path.isdir(output_dir): + os.mkdir(output_dir) + + # retrieve templates + templates = management.plans.templates(parsed_args.plan_uuid) + + # write file for each key-value in templates + print("The following templates will be written:") + for template_name, template_content in templates.items(): + + # It's possible to organize the role templates and their dependent + # files into directories, in which case the template_name will + # carry the directory information. If that's the case, first + # create the directory structure (if it hasn't already been + # created by another file in the templates list). + template_dir = os.path.dirname(template_name) + output_template_dir = os.path.join(output_dir, template_dir) + if template_dir and not os.path.exists(output_template_dir): + os.makedirs(output_template_dir) + + filename = os.path.join(output_dir, template_name) + with open(filename, 'w+') as template_file: + template_file.write(template_content) + print(filename) + + overcloud_yaml = os.path.join(output_dir, 'plan.yaml') + environment_yaml = os.path.join(output_dir, 'environment.yaml') + + self._heat_deploy(stack, overcloud_yaml, None, [environment_yaml, ]) def _post_heat_deploy(self): """Setup after the Heat stack create or update has been done."""