Move more functions to utils.py
Moves create_overcloudrc and create_tempest_deployer_input to utils.py because they didn't require the instance information from DeployOvercloud, and now can be better tested independently. Depends-On: I98e19cc29d69cbd6636cd4ce77a07c7a0e3dc048 Depends-On: I205569f4be0bcee2b284048dec7ddf0b28bbd8a1 Change-Id: I4a819c4262bde4d38e3f51150413836ca83646a0
This commit is contained in:
parent
59c5e4d980
commit
c75be2b2f8
@ -56,11 +56,10 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
|
|||||||
'_create_parameters_env')
|
'_create_parameters_env')
|
||||||
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
|
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
|
||||||
'_deploy_postconfig')
|
'_deploy_postconfig')
|
||||||
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
|
@mock.patch('tripleoclient.utils.create_tempest_deployer_input',
|
||||||
'_create_tempest_deployer_input', autospec=True)
|
autospec=True)
|
||||||
@mock.patch('tripleoclient.utils.generate_overcloud_passwords')
|
@mock.patch('tripleoclient.utils.generate_overcloud_passwords')
|
||||||
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
|
@mock.patch('tripleoclient.utils.create_overcloudrc')
|
||||||
'_create_overcloudrc')
|
|
||||||
@mock.patch('os_cloud_config.keystone.setup_endpoints', autospec=True)
|
@mock.patch('os_cloud_config.keystone.setup_endpoints', autospec=True)
|
||||||
@mock.patch('time.sleep', return_value=None)
|
@mock.patch('time.sleep', return_value=None)
|
||||||
@mock.patch('os_cloud_config.keystone.initialize', autospec=True)
|
@mock.patch('os_cloud_config.keystone.initialize', autospec=True)
|
||||||
@ -196,7 +195,7 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
|
|||||||
('/usr/share/openstack-tripleo-heat-templates/overcloud-without-'
|
('/usr/share/openstack-tripleo-heat-templates/overcloud-without-'
|
||||||
'mergepy.yaml'))
|
'mergepy.yaml'))
|
||||||
|
|
||||||
mock_create_tempest_deployer_input.assert_called_with(self.cmd)
|
mock_create_tempest_deployer_input.assert_called_with()
|
||||||
mock_process_multiple_env.assert_called_with(
|
mock_process_multiple_env.assert_called_with(
|
||||||
[self.parameter_defaults_env_file])
|
[self.parameter_defaults_env_file])
|
||||||
|
|
||||||
@ -207,11 +206,10 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
|
|||||||
'_create_parameters_env')
|
'_create_parameters_env')
|
||||||
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
|
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
|
||||||
'_deploy_postconfig')
|
'_deploy_postconfig')
|
||||||
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
|
@mock.patch('tripleoclient.utils.create_tempest_deployer_input',
|
||||||
'_create_tempest_deployer_input', autospec=True)
|
autospec=True)
|
||||||
@mock.patch('tripleoclient.utils.generate_overcloud_passwords')
|
@mock.patch('tripleoclient.utils.generate_overcloud_passwords')
|
||||||
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
|
@mock.patch('tripleoclient.utils.create_overcloudrc')
|
||||||
'_create_overcloudrc')
|
|
||||||
@mock.patch('os_cloud_config.keystone.setup_endpoints', autospec=True)
|
@mock.patch('os_cloud_config.keystone.setup_endpoints', autospec=True)
|
||||||
@mock.patch('time.sleep', return_value=None)
|
@mock.patch('time.sleep', return_value=None)
|
||||||
@mock.patch('os_cloud_config.keystone.initialize', autospec=True)
|
@mock.patch('os_cloud_config.keystone.initialize', autospec=True)
|
||||||
@ -360,7 +358,7 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
|
|||||||
('/usr/share/openstack-tripleo-heat-templates/overcloud-without-'
|
('/usr/share/openstack-tripleo-heat-templates/overcloud-without-'
|
||||||
'mergepy.yaml'))
|
'mergepy.yaml'))
|
||||||
|
|
||||||
mock_create_tempest_deployer_input.assert_called_with(self.cmd)
|
mock_create_tempest_deployer_input.assert_called_with()
|
||||||
mock_process_multiple_env.assert_called_with(
|
mock_process_multiple_env.assert_called_with(
|
||||||
['/usr/share/openstack-tripleo-heat-templates/overcloud-resource-'
|
['/usr/share/openstack-tripleo-heat-templates/overcloud-resource-'
|
||||||
'registry-puppet.yaml', '/fake/path',
|
'registry-puppet.yaml', '/fake/path',
|
||||||
@ -371,11 +369,10 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
|
|||||||
@mock.patch('tripleo_common.update.add_breakpoints_cleanup_into_env')
|
@mock.patch('tripleo_common.update.add_breakpoints_cleanup_into_env')
|
||||||
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
|
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
|
||||||
'_deploy_postconfig')
|
'_deploy_postconfig')
|
||||||
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
|
@mock.patch('tripleoclient.utils.create_tempest_deployer_input',
|
||||||
'_create_tempest_deployer_input', autospec=True)
|
autospec=True)
|
||||||
@mock.patch('tripleoclient.utils.generate_overcloud_passwords')
|
@mock.patch('tripleoclient.utils.generate_overcloud_passwords')
|
||||||
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
|
@mock.patch('tripleoclient.utils.create_overcloudrc')
|
||||||
'_create_overcloudrc')
|
|
||||||
@mock.patch('os_cloud_config.keystone.setup_endpoints', autospec=True)
|
@mock.patch('os_cloud_config.keystone.setup_endpoints', autospec=True)
|
||||||
@mock.patch('time.sleep', return_value=None)
|
@mock.patch('time.sleep', return_value=None)
|
||||||
@mock.patch('os_cloud_config.keystone.initialize', autospec=True)
|
@mock.patch('os_cloud_config.keystone.initialize', autospec=True)
|
||||||
@ -458,7 +455,7 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
|
|||||||
'/home/stack/tripleo-heat-templates/overcloud-without-mergepy.yaml'
|
'/home/stack/tripleo-heat-templates/overcloud-without-mergepy.yaml'
|
||||||
)
|
)
|
||||||
|
|
||||||
mock_create_tempest_deployer_input.assert_called_with(self.cmd)
|
mock_create_tempest_deployer_input.assert_called_with()
|
||||||
mock_process_multiple_env.assert_called_with(
|
mock_process_multiple_env.assert_called_with(
|
||||||
[self.parameter_defaults_env_file])
|
[self.parameter_defaults_env_file])
|
||||||
|
|
||||||
@ -484,10 +481,9 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
|
|||||||
self.assertFalse(result)
|
self.assertFalse(result)
|
||||||
self.assertFalse(mock_deploy_tht.called)
|
self.assertFalse(mock_deploy_tht.called)
|
||||||
|
|
||||||
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
|
@mock.patch('tripleoclient.utils.create_tempest_deployer_input',
|
||||||
'_create_tempest_deployer_input', autospec=True)
|
autospec=True)
|
||||||
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
|
@mock.patch('tripleoclient.utils.create_overcloudrc', autospec=True)
|
||||||
'_create_overcloudrc', autospec=True)
|
|
||||||
@mock.patch('tripleoclient.utils.get_overcloud_endpoint', autospec=True)
|
@mock.patch('tripleoclient.utils.get_overcloud_endpoint', autospec=True)
|
||||||
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
|
@mock.patch('tripleoclient.v1.overcloud_deploy.DeployOvercloud.'
|
||||||
'_deploy_tripleo_heat_templates', autospec=True)
|
'_deploy_tripleo_heat_templates', autospec=True)
|
||||||
@ -518,7 +514,7 @@ class TestDeployOvercloud(fakes.TestDeployOvercloud):
|
|||||||
self.assertTrue(mock_oc_endpoint.called)
|
self.assertTrue(mock_oc_endpoint.called)
|
||||||
self.assertTrue(mock_create_ocrc.called)
|
self.assertTrue(mock_create_ocrc.called)
|
||||||
|
|
||||||
mock_create_tempest_deployer_input.assert_called_with(self.cmd)
|
mock_create_tempest_deployer_input.assert_called_with()
|
||||||
|
|
||||||
def test_validate_args_correct(self):
|
def test_validate_args_correct(self):
|
||||||
arglist = ['--templates',
|
arglist = ['--templates',
|
||||||
|
@ -27,6 +27,8 @@ import sys
|
|||||||
import time
|
import time
|
||||||
|
|
||||||
from heatclient.exc import HTTPNotFound
|
from heatclient.exc import HTTPNotFound
|
||||||
|
from six.moves import configparser
|
||||||
|
from six.moves import urllib
|
||||||
|
|
||||||
from tripleoclient import exceptions
|
from tripleoclient import exceptions
|
||||||
|
|
||||||
@ -72,6 +74,77 @@ def generate_overcloud_passwords(output_file="tripleo-overcloud-passwords"):
|
|||||||
return passwords
|
return passwords
|
||||||
|
|
||||||
|
|
||||||
|
def create_overcloudrc(stack, no_proxy, config_directory='.'):
|
||||||
|
"""Given proxy settings and stack, create the overcloudrc
|
||||||
|
|
||||||
|
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_ip = urllib.parse.urlparse(overcloud_endpoint).hostname
|
||||||
|
|
||||||
|
rc_params = {
|
||||||
|
'NOVA_VERSION': '1.1',
|
||||||
|
'COMPUTE_API_VERSION': '1.1',
|
||||||
|
'OS_USERNAME': 'admin',
|
||||||
|
'OS_TENANT_NAME': 'admin',
|
||||||
|
'OS_NO_CACHE': 'True',
|
||||||
|
'OS_CLOUDNAME': stack.stack_name,
|
||||||
|
'no_proxy': "%(no_proxy)s,%(overcloud_ip)s" % {
|
||||||
|
'no_proxy': no_proxy,
|
||||||
|
'overcloud_ip': overcloud_ip,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rc_params.update({
|
||||||
|
'OS_PASSWORD': get_password('OVERCLOUD_ADMIN_PASSWORD'),
|
||||||
|
'OS_AUTH_URL': overcloud_endpoint,
|
||||||
|
})
|
||||||
|
|
||||||
|
config_path = os.path.join(config_directory, '%src' % stack.stack_name)
|
||||||
|
|
||||||
|
with open(config_path, 'w') as f:
|
||||||
|
for key, value in rc_params.items():
|
||||||
|
f.write("export %(key)s=%(value)s\n" %
|
||||||
|
{'key': key, 'value': value})
|
||||||
|
|
||||||
|
|
||||||
|
def create_tempest_deployer_input(config_name='tempest-deployer-input.conf'):
|
||||||
|
config = configparser.ConfigParser()
|
||||||
|
|
||||||
|
config.add_section('compute-feature-enabled')
|
||||||
|
# Does the test environment support obtaining instance serial console
|
||||||
|
# output? (default: true)
|
||||||
|
# set in [nova.serial_console]->enabled
|
||||||
|
config.set('compute-feature-enabled', 'console_output', 'false')
|
||||||
|
|
||||||
|
config.add_section('object-storage')
|
||||||
|
# Role to add to users created for swift tests to enable creating
|
||||||
|
# containers (default: 'Member')
|
||||||
|
# keystone role-list returns this role
|
||||||
|
config.set('object-storage', 'operator_role', 'swiftoperator')
|
||||||
|
|
||||||
|
config.add_section('orchestration')
|
||||||
|
# Role required for users to be able to manage stacks
|
||||||
|
# (default: 'heat_stack_owner')
|
||||||
|
# keystone role-list returns this role
|
||||||
|
config.set('orchestration', 'stack_owner_role', 'heat_stack_user')
|
||||||
|
|
||||||
|
config.add_section('volume')
|
||||||
|
# Name of the backend1 (must be declared in cinder.conf)
|
||||||
|
# (default: 'BACKEND_1')
|
||||||
|
# set in [cinder]->enabled_backends
|
||||||
|
config.set('volume', 'backend1_name', 'tripleo_iscsi')
|
||||||
|
|
||||||
|
config.add_section('volume-feature-enabled')
|
||||||
|
# Update bootable status of a volume Not implemented on icehouse
|
||||||
|
# (default: false)
|
||||||
|
# python-cinderclient supports set-bootable
|
||||||
|
config.set('volume-feature-enabled', 'bootable', 'true')
|
||||||
|
|
||||||
|
with open(config_name, 'w+') as config_file:
|
||||||
|
config.write(config_file)
|
||||||
|
|
||||||
|
|
||||||
def check_hypervisor_stats(compute_client, nodes=1, memory=0, vcpu=0):
|
def check_hypervisor_stats(compute_client, nodes=1, memory=0, vcpu=0):
|
||||||
"""Check the Hypervisor stats meet a minimum value
|
"""Check the Hypervisor stats meet a minimum value
|
||||||
|
|
||||||
|
@ -33,7 +33,6 @@ from openstackclient.i18n import _
|
|||||||
from os_cloud_config import keystone
|
from os_cloud_config import keystone
|
||||||
from os_cloud_config import keystone_pki
|
from os_cloud_config import keystone_pki
|
||||||
from os_cloud_config.utils import clients
|
from os_cloud_config.utils import clients
|
||||||
from six.moves import configparser
|
|
||||||
from tripleo_common import update
|
from tripleo_common import update
|
||||||
|
|
||||||
from tripleoclient import constants
|
from tripleoclient import constants
|
||||||
@ -58,7 +57,7 @@ class DeployOvercloud(command.Command):
|
|||||||
undercloud_ceilometer_snmpd_password = utils.get_config_value(
|
undercloud_ceilometer_snmpd_password = utils.get_config_value(
|
||||||
"auth", "undercloud_ceilometer_snmpd_password")
|
"auth", "undercloud_ceilometer_snmpd_password")
|
||||||
|
|
||||||
self.passwords = passwords = utils.generate_overcloud_passwords()
|
passwords = utils.generate_overcloud_passwords()
|
||||||
ceilometer_pass = passwords['OVERCLOUD_CEILOMETER_PASSWORD']
|
ceilometer_pass = passwords['OVERCLOUD_CEILOMETER_PASSWORD']
|
||||||
ceilometer_secret = passwords['OVERCLOUD_CEILOMETER_SECRET']
|
ceilometer_secret = passwords['OVERCLOUD_CEILOMETER_SECRET']
|
||||||
parameters['AdminPassword'] = passwords['OVERCLOUD_ADMIN_PASSWORD']
|
parameters['AdminPassword'] = passwords['OVERCLOUD_ADMIN_PASSWORD']
|
||||||
@ -330,68 +329,6 @@ class DeployOvercloud(command.Command):
|
|||||||
self._heat_deploy(stack, parsed_args.stack, overcloud_yaml, parameters,
|
self._heat_deploy(stack, parsed_args.stack, overcloud_yaml, parameters,
|
||||||
environments, parsed_args.timeout)
|
environments, parsed_args.timeout)
|
||||||
|
|
||||||
def _create_overcloudrc(self, stack, parsed_args):
|
|
||||||
overcloud_endpoint = utils.get_overcloud_endpoint(stack)
|
|
||||||
overcloud_ip = six.moves.urllib.parse.urlparse(
|
|
||||||
overcloud_endpoint).hostname
|
|
||||||
|
|
||||||
rc_params = {
|
|
||||||
'NOVA_VERSION': '1.1',
|
|
||||||
'COMPUTE_API_VERSION': '1.1',
|
|
||||||
'OS_USERNAME': 'admin',
|
|
||||||
'OS_TENANT_NAME': 'admin',
|
|
||||||
'OS_NO_CACHE': 'True',
|
|
||||||
'OS_CLOUDNAME': stack.stack_name,
|
|
||||||
'no_proxy': "%(no_proxy)s,%(overcloud_ip)s" % {
|
|
||||||
'no_proxy': parsed_args.no_proxy,
|
|
||||||
'overcloud_ip': overcloud_ip,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
rc_params.update({
|
|
||||||
'OS_PASSWORD': utils.get_password('OVERCLOUD_ADMIN_PASSWORD'),
|
|
||||||
'OS_AUTH_URL': utils.get_overcloud_endpoint(stack),
|
|
||||||
})
|
|
||||||
with open('%src' % stack.stack_name, 'w') as f:
|
|
||||||
for key, value in rc_params.items():
|
|
||||||
f.write("export %(key)s=%(value)s\n" %
|
|
||||||
{'key': key, 'value': value})
|
|
||||||
|
|
||||||
def _create_tempest_deployer_input(self):
|
|
||||||
config = configparser.ConfigParser()
|
|
||||||
|
|
||||||
config.add_section('compute-feature-enabled')
|
|
||||||
# Does the test environment support obtaining instance serial console
|
|
||||||
# output? (default: true)
|
|
||||||
# set in [nova.serial_console]->enabled
|
|
||||||
config.set('compute-feature-enabled', 'console_output', 'false')
|
|
||||||
|
|
||||||
config.add_section('object-storage')
|
|
||||||
# Role to add to users created for swift tests to enable creating
|
|
||||||
# containers (default: 'Member')
|
|
||||||
# keystone role-list returns this role
|
|
||||||
config.set('object-storage', 'operator_role', 'swiftoperator')
|
|
||||||
|
|
||||||
config.add_section('orchestration')
|
|
||||||
# Role required for users to be able to manage stacks
|
|
||||||
# (default: 'heat_stack_owner')
|
|
||||||
# keystone role-list returns this role
|
|
||||||
config.set('orchestration', 'stack_owner_role', 'heat_stack_owner')
|
|
||||||
|
|
||||||
config.add_section('volume')
|
|
||||||
# Name of the backend1 (must be declared in cinder.conf)
|
|
||||||
# (default: 'BACKEND_1')
|
|
||||||
# set in [cinder]->enabled_backends
|
|
||||||
config.set('volume', 'backend1_name', 'tripleo_iscsi')
|
|
||||||
|
|
||||||
config.add_section('volume-feature-enabled')
|
|
||||||
# Update bootable status of a volume Not implemented on icehouse
|
|
||||||
# (default: false)
|
|
||||||
# python-cinderclient supports set-bootable
|
|
||||||
config.set('volume-feature-enabled', 'bootable', 'true')
|
|
||||||
|
|
||||||
with open('tempest-deployer-input.conf', 'w+') as config_file:
|
|
||||||
config.write(config_file)
|
|
||||||
|
|
||||||
def _deploy_postconfig(self, stack, parsed_args):
|
def _deploy_postconfig(self, stack, parsed_args):
|
||||||
self.log.debug("_deploy_postconfig(%s)" % parsed_args)
|
self.log.debug("_deploy_postconfig(%s)" % parsed_args)
|
||||||
|
|
||||||
@ -941,8 +878,8 @@ class DeployOvercloud(command.Command):
|
|||||||
# a create then the previous stack object would be None.
|
# a create then the previous stack object would be None.
|
||||||
stack = utils.get_stack(orchestration_client, parsed_args.stack)
|
stack = utils.get_stack(orchestration_client, parsed_args.stack)
|
||||||
|
|
||||||
self._create_overcloudrc(stack, parsed_args)
|
utils.create_overcloudrc(stack, parsed_args.no_proxy)
|
||||||
self._create_tempest_deployer_input()
|
utils.create_tempest_deployer_input()
|
||||||
|
|
||||||
if stack_create:
|
if stack_create:
|
||||||
self._deploy_postconfig(stack, parsed_args)
|
self._deploy_postconfig(stack, parsed_args)
|
||||||
|
Loading…
Reference in New Issue
Block a user