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
This commit is contained in:
Dougal Matthews 2016-11-17 12:23:54 +00:00
parent 1082fdb518
commit 3c8223cd5e
5 changed files with 52 additions and 102 deletions

View File

@ -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)

View File

@ -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,

View File

@ -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'):

View File

@ -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

View File

@ -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_)