From 3c8223cd5ed04ed12549a5ff9fe34ba4a05e82ea Mon Sep 17 00:00:00 2001 From: Dougal Matthews Date: Thu, 17 Nov 2016 12:23:54 +0000 Subject: [PATCH] Use the overcloudrc generated in a Mistral action This removes the code responsible for creating the action in tripleoclient and replaces it with a call to a Mistral action. Closes-Bug: #1615720 Change-Id: I33627cd3661193c0e7ac7fab174cfcbac6c8ab43 --- tripleoclient/tests/test_utils.py | 40 ++++-------- .../overcloud_deploy/test_overcloud_deploy.py | 41 ++++++------ tripleoclient/utils.py | 62 +++---------------- tripleoclient/v1/overcloud_deploy.py | 6 +- tripleoclient/workflows/deployment.py | 5 ++ 5 files changed, 52 insertions(+), 102 deletions(-) diff --git a/tripleoclient/tests/test_utils.py b/tripleoclient/tests/test_utils.py index 407980a57..2068e0ef4 100644 --- a/tripleoclient/tests/test_utils.py +++ b/tripleoclient/tests/test_utils.py @@ -22,8 +22,6 @@ from unittest import TestCase import yaml from tripleoclient import exceptions -from tripleoclient.tests.v1.utils import ( - generate_overcloud_passwords_mock) from tripleoclient import utils @@ -377,41 +375,25 @@ class TestEnsureRunAsNormalUser(TestCase): class TestCreateOvercloudRC(TestCase): - @mock.patch('tripleoclient.utils.generate_overcloud_passwords', - new=generate_overcloud_passwords_mock) - def test_create_overcloudrc(self): - stack = mock.MagicMock() - stack.stack_name = 'teststack' - endpoint_map = {'KeystoneAdmin': {'host': 'fd00::1'}} - stack.to_dict.return_value = { - 'outputs': [{'output_key': 'KeystoneURL', - 'output_value': 'http://foo.com:8000/'}, - {'output_key': 'EndpointMap', - 'output_value': endpoint_map}] - } + def test_write_overcloudrc(self): + stack_name = 'teststack' tempdir = tempfile.mkdtemp() rcfile = os.path.join(tempdir, 'teststackrc') rcfile_v3 = os.path.join(tempdir, 'teststackrc.v3') - mock_clients = mock.Mock() + + overcloudrcs = { + "overcloudrc": "overcloudrc not v3", + "overcloudrc.v3": "overcloudrc.v3", + } try: - utils.create_overcloudrc(clients=mock_clients, - stack=stack, - no_proxy='127.0.0.1', - config_directory=tempdir) + utils.write_overcloudrc(stack_name, overcloudrcs, + config_directory=tempdir) rc = open(rcfile, 'rt').read() - self.assertIn('export OS_AUTH_URL=http://foo.com:8000/', rc) - self.assertIn('export no_proxy=127.0.0.1,foo.com,[fd00::1]', - rc) - self.assertIn('export OS_CLOUDNAME=teststack', rc) - self.assertIn('export PYTHONWARNINGS="ignore:Certificate has no, ' - 'ignore:A true SSLContext object is not available"', - rc) + self.assertIn('overcloudrc not v3', rc) rc_v3 = open(rcfile_v3, 'rt').read() - self.assertIn('export OS_USER_DOMAIN_NAME=Default', rc_v3) - self.assertIn('export OS_PROJECT_DOMAIN_NAME=Default', rc_v3) - self.assertIn('export OS_IDENTITY_API_VERSION=3', rc_v3) + self.assertIn('overcloudrc.v3', rc_v3) finally: if os.path.exists(rcfile): os.unlink(rcfile) diff --git a/tripleoclient/tests/v1/overcloud_deploy/test_overcloud_deploy.py b/tripleoclient/tests/v1/overcloud_deploy/test_overcloud_deploy.py index f1633d715..65d42f123 100644 --- a/tripleoclient/tests/v1/overcloud_deploy/test_overcloud_deploy.py +++ b/tripleoclient/tests/v1/overcloud_deploy/test_overcloud_deploy.py @@ -73,7 +73,7 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): autospec=True) @mock.patch('tripleoclient.utils.generate_overcloud_passwords', autospec=True) - @mock.patch('tripleoclient.utils.create_overcloudrc', autospec=True) + @mock.patch('tripleoclient.utils.write_overcloudrc', autospec=True) @mock.patch('os_cloud_config.keystone.setup_endpoints', autospec=True) @mock.patch('time.sleep', return_value=None) @mock.patch('os_cloud_config.keystone.initialize', autospec=True) @@ -101,7 +101,7 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): wait_for_stack_ready_mock, mock_remove_known_hosts, mock_keystone_initialize, mock_sleep, mock_setup_endpoints, - mock_create_overcloudrc, + mock_write_overcloudrc, mock_generate_overcloud_passwords, mock_create_tempest_deployer_input, mock_deploy_postconfig, @@ -236,7 +236,7 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): autospec=True) @mock.patch('tripleoclient.utils.generate_overcloud_passwords', autospec=True) - @mock.patch('tripleoclient.utils.create_overcloudrc', autospec=True) + @mock.patch('tripleoclient.utils.write_overcloudrc', autospec=True) @mock.patch('os_cloud_config.utils.clients.get_nova_bm_client', autospec=True) @mock.patch('os_cloud_config.utils.clients.get_keystone_client', @@ -273,7 +273,7 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): mock_remove_known_hosts, mock_keystone_initialize, mock_sleep, mock_setup_endpoints, mock_get_keystone_client, mock_get_nova_bm_client, - mock_create_overcloudrc, + mock_write_overcloudrc, mock_generate_overcloud_passwords, mock_create_tempest_deployer_input, mock_create_parameters_env, mock_validate_args, @@ -419,7 +419,7 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): autospec=True) @mock.patch('tripleoclient.utils.generate_overcloud_passwords', autospec=True) - @mock.patch('tripleoclient.utils.create_overcloudrc', autospec=True) + @mock.patch('tripleoclient.utils.write_overcloudrc', autospec=True) @mock.patch('os_cloud_config.keystone.setup_endpoints', autospec=True) @mock.patch('time.sleep', return_value=None) @mock.patch('os_cloud_config.keystone.initialize', autospec=True) @@ -445,7 +445,7 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): mock_remove_known_hosts, mock_keystone_initialize, mock_sleep, mock_setup_endpoints, - mock_create_overcloudrc, + mock_write_overcloudrc, mock_generate_overcloud_passwords, mock_create_tempest_deployer_input, mock_deploy_postconfig, @@ -544,7 +544,7 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): autospec=True) @mock.patch('tripleoclient.utils.create_tempest_deployer_input', autospec=True) - @mock.patch('tripleoclient.utils.create_overcloudrc', autospec=True) + @mock.patch('tripleoclient.utils.write_overcloudrc', autospec=True) @mock.patch('tripleoclient.utils.get_overcloud_endpoint', autospec=True) @mock.patch('tripleoclient.utils.check_nodes_count', autospec=True) @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' @@ -601,7 +601,7 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): autospec=True) @mock.patch('tripleoclient.utils.create_tempest_deployer_input', autospec=True) - @mock.patch('tripleoclient.utils.create_overcloudrc', autospec=True) + @mock.patch('tripleoclient.utils.write_overcloudrc', autospec=True) @mock.patch('tripleoclient.utils.get_overcloud_endpoint', autospec=True) @mock.patch('tripleoclient.utils.check_nodes_count', autospec=True) @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' @@ -657,7 +657,7 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): autospec=True) @mock.patch('tripleoclient.utils.create_tempest_deployer_input', autospec=True) - @mock.patch('tripleoclient.utils.create_overcloudrc', autospec=True) + @mock.patch('tripleoclient.utils.write_overcloudrc', autospec=True) @mock.patch('tripleoclient.utils.get_overcloud_endpoint', autospec=True) @mock.patch('tripleoclient.utils.check_nodes_count', autospec=True) @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' @@ -713,7 +713,7 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): @mock.patch('tripleoclient.utils.create_tempest_deployer_input', autospec=True) - @mock.patch('tripleoclient.utils.create_overcloudrc', autospec=True) + @mock.patch('tripleoclient.utils.write_overcloudrc', autospec=True) @mock.patch('tripleoclient.utils.get_overcloud_endpoint', autospec=True) @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' '_deploy_tripleo_heat_templates', autospec=True) @@ -723,6 +723,11 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): mock_create_ocrc, mock_create_tempest_deployer_input): + clients = self.app.client_manager + workflow_client = clients.workflow_engine + workflow_client.action_executions.create.return_value = mock.MagicMock( + output='{"result":[]}') + arglist = ['--templates', '--rhel-reg', '--reg-sat-url', 'https://example.com', '--reg-method', 'satellite', '--reg-org', '123456789', @@ -755,7 +760,7 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): autospec=True) @mock.patch('tripleoclient.utils.generate_overcloud_passwords', autospec=True) - @mock.patch('tripleoclient.utils.create_overcloudrc', autospec=True) + @mock.patch('tripleoclient.utils.write_overcloudrc', autospec=True) @mock.patch('os_cloud_config.keystone.setup_endpoints', autospec=True) @mock.patch('time.sleep', return_value=None) @mock.patch('os_cloud_config.keystone.initialize', autospec=True) @@ -786,7 +791,7 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): mock_remove_known_hosts, mock_keystone_initialize, mock_sleep, mock_setup_endpoints, - mock_create_overcloudrc, + mock_write_overcloudrc, mock_generate_overcloud_passwords, mock_create_tempest_deployer_input, mock_deploy_postconfig, @@ -923,7 +928,7 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): @mock.patch('tripleoclient.utils.create_tempest_deployer_input', autospec=True) - @mock.patch('tripleoclient.utils.create_overcloudrc', autospec=True) + @mock.patch('tripleoclient.utils.write_overcloudrc', autospec=True) @mock.patch('tripleoclient.utils.get_overcloud_endpoint', autospec=True) @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' '_deploy_tripleo_heat_templates', autospec=True) @@ -951,7 +956,7 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): autospec=True) @mock.patch('tripleoclient.utils.create_tempest_deployer_input', autospec=True) - @mock.patch('tripleoclient.utils.create_overcloudrc', autospec=True) + @mock.patch('tripleoclient.utils.write_overcloudrc', autospec=True) @mock.patch('tripleoclient.utils.get_overcloud_endpoint', autospec=True) @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' '_heat_deploy', autospec=True) @@ -1156,7 +1161,7 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): @mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.' '_create_parameters_env') @mock.patch('tripleoclient.utils.generate_overcloud_passwords') - @mock.patch('tripleoclient.utils.create_overcloudrc') + @mock.patch('tripleoclient.utils.write_overcloudrc') @mock.patch('heatclient.common.template_utils.' 'process_environment_and_files', autospec=True) @mock.patch('heatclient.common.template_utils.get_template_contents', @@ -1170,7 +1175,7 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): mock_create_env, mock_get_template_contents, mock_process_env, - mock_create_overcloudrc, + mock_write_overcloudrc, mock_generate_overcloud_passwords, mock_create_parameters_env, mock_tarball): @@ -1221,7 +1226,7 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): @mock.patch('tripleoclient.utils.create_tempest_deployer_input', autospec=True) @mock.patch('tripleoclient.utils.generate_overcloud_passwords') - @mock.patch('tripleoclient.utils.create_overcloudrc') + @mock.patch('tripleoclient.utils.write_overcloudrc') @mock.patch('os_cloud_config.utils.clients.get_nova_bm_client', autospec=True) @mock.patch('os_cloud_config.utils.clients.get_keystone_client', @@ -1261,7 +1266,7 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud): mock_sleep, mock_setup_endpoints, mock_get_keystone_client, mock_get_nova_bm_client, - mock_create_overcloudrc, + mock_write_overcloudrc, mock_generate_overcloud_passwords, mock_create_tempest_deployer_input, mock_create_parameters_env, diff --git a/tripleoclient/utils.py b/tripleoclient/utils.py index eee5b1a4e..99820c48f 100644 --- a/tripleoclient/utils.py +++ b/tripleoclient/utils.py @@ -35,7 +35,6 @@ from heatclient.exc import HTTPNotFound from osc_lib.i18n import _ from osc_lib.i18n import _LI from six.moves import configparser -from six.moves import urllib from tripleoclient import exceptions from tripleoclient.workflows import parameters @@ -81,62 +80,17 @@ def unbracket_ipv6(address): return address -def create_overcloudrc(clients, stack, no_proxy, config_directory='.'): - """Given proxy settings and stack, create the overcloudrc +def write_overcloudrc(stack_name, overcloudrcs, config_directory='.'): + """Write the overcloudrc files""" - stack: Heat stack containing the deployed overcloud - no_proxy: a comma-separated string of hosts that shouldn't be proxied - """ - overcloud_endpoint = get_overcloud_endpoint(stack) - overcloud_host = urllib.parse.urlparse(overcloud_endpoint).hostname - overcloud_admin_vip = get_endpoint('KeystoneAdmin', stack) + rcpath = os.path.join(config_directory, '%src' % stack_name) + rcv3path = os.path.join(config_directory, '%src.v3' % stack_name) - no_proxy_list = map(bracket_ipv6, - [no_proxy, overcloud_host, overcloud_admin_vip]) + with open(rcpath, 'w') as rcfile: + rcfile.write(overcloudrcs['overcloudrc']) - rc_params = { - 'NOVA_VERSION': '1.1', - 'COMPUTE_API_VERSION': '1.1', - 'OS_USERNAME': 'admin', - 'OS_PROJECT_NAME': 'admin', - 'OS_NO_CACHE': 'True', - 'OS_CLOUDNAME': stack.stack_name, - 'no_proxy': ','.join(no_proxy_list), - 'PYTHONWARNINGS': ('"ignore:Certificate has no, ignore:A true ' - 'SSLContext object is not available"'), - } - rc_params.update({ - 'OS_PASSWORD': get_password(clients, stack.stack_name, - 'AdminPassword'), - 'OS_AUTH_URL': overcloud_endpoint, - }) - - config_path = os.path.join(config_directory, '%src' % stack.stack_name) - - with open(config_path, 'w') as f: - f.write("# Clear any old environment that may conflict.\n") - f.write("for key in $( set | awk '{FS=\"=\"} /^OS_/ {print $1}' );" - "do unset $key ; done\n") - for key, value in rc_params.items(): - f.write("export %(key)s=%(value)s\n" % - {'key': key, 'value': value}) - - rc_params.update({ - 'OS_AUTH_URL': overcloud_endpoint.replace('/v2.0', '') + '/v3', - 'OS_USER_DOMAIN_NAME': 'Default', - 'OS_PROJECT_DOMAIN_NAME': 'Default', - 'OS_IDENTITY_API_VERSION': '3' - }) - - config_path = os.path.join(config_directory, '%src.v3' % stack.stack_name) - - with open(config_path, 'w') as f: - f.write("# Clear any old environment that may conflict.\n") - f.write("for key in $( set | awk '{FS=\"=\"} /^OS_/ {print $1}' );" - "do unset $key ; done\n") - for key, value in rc_params.items(): - f.write("export %(key)s=%(value)s\n" % - {'key': key, 'value': value}) + with open(rcv3path, 'w') as rcv3file: + rcv3file.write(overcloudrcs['overcloudrc.v3']) def create_tempest_deployer_input(config_name='tempest-deployer-input.conf'): diff --git a/tripleoclient/v1/overcloud_deploy.py b/tripleoclient/v1/overcloud_deploy.py index 632771fee..9e8aecc1d 100644 --- a/tripleoclient/v1/overcloud_deploy.py +++ b/tripleoclient/v1/overcloud_deploy.py @@ -1123,7 +1123,11 @@ class DeployOvercloud(command.Command): # Force fetching of attributes stack.get() - utils.create_overcloudrc(clients, stack, parsed_args.no_proxy) + overcloudrcs = deployment.overcloudrc( + clients.workflow_engine, container=stack.stack_name, + no_proxy=parsed_args.no_proxy) + + utils.write_overcloudrc(stack.stack_name, overcloudrcs) utils.create_tempest_deployer_input() # Run postconfig on create or force. Use force to makes sure endpoints diff --git a/tripleoclient/workflows/deployment.py b/tripleoclient/workflows/deployment.py index 3ad74c710..fbc9476a5 100644 --- a/tripleoclient/workflows/deployment.py +++ b/tripleoclient/workflows/deployment.py @@ -83,3 +83,8 @@ def deploy_and_wait(log, clients, stack, plan_name, verbose_level, raise exceptions.DeploymentError("Heat Stack create failed.") else: raise exceptions.DeploymentError("Heat Stack update failed.") + + +def overcloudrc(workflow_client, **input_): + return base.call_action(workflow_client, 'tripleo.deployment.overcloudrc', + **input_)