Merge "Cleanup utils 1/2"

This commit is contained in:
Zuul 2021-03-14 22:46:41 +00:00 committed by Gerrit Code Review
commit 3035ec76fb
7 changed files with 11 additions and 828 deletions

View File

@ -15,10 +15,6 @@
from unittest import mock
from heatclient import exc as heat_exc
import six
from swiftclient import exceptions as swiftexceptions
from tripleo_common.tests import base
from tripleo_common.utils import overcloudrc
@ -84,69 +80,3 @@ class OvercloudRcTest(base.TestCase):
result['overcloudrc'])
self.assertIn("OS_REGION_NAME=regionTwo",
result['overcloudrc'])
def test_overcloudrc_no_stack(self):
mock_swift = mock.MagicMock()
mock_heat = mock.MagicMock()
not_found = heat_exc.HTTPNotFound()
mock_heat.stacks.get.side_effect = not_found
ex = self.assertRaises(RuntimeError,
overcloudrc.create_overcloudrc,
mock_swift, mock_heat, "overcast")
self.assertEqual((
"The Heat stack overcast could not be found. Make sure you have "
"deployed before calling this action."
), six.text_type(ex))
def test_overcloudrc_no_env(self):
mock_swift = mock.MagicMock()
mock_heat = mock.MagicMock()
mock_swift.get_object.side_effect = (
swiftexceptions.ClientException("overcast"))
ex = self.assertRaises(RuntimeError,
overcloudrc.create_overcloudrc,
mock_swift, mock_heat, "overcast")
self.assertEqual("Error retrieving environment for plan overcast: "
"overcast", six.text_type(ex))
def test_overcloudrc_no_password(self):
mock_swift = mock.MagicMock()
mock_heat = mock.MagicMock()
mock_swift.get_object.return_value = (
{}, "version: 1.0")
ex = self.assertRaises(RuntimeError,
overcloudrc.create_overcloudrc,
mock_swift, mock_heat, "overcast")
self.assertEqual(
"Unable to find the AdminPassword in the plan environment.",
six.text_type(ex))
@mock.patch('tripleo_common.utils.overcloudrc._create_overcloudrc')
def test_success(self, mock_create_overcloudrc):
mock_env = """
version: 1.0
template: overcloud.yaml
environments:
- path: overcloud-resource-registry-puppet.yaml
- path: environments/services/sahara.yaml
parameter_defaults:
BlockStorageCount: 42
OvercloudControlFlavor: yummy
passwords:
AdminPassword: SUPERSECUREPASSWORD
"""
mock_swift = mock.MagicMock()
mock_heat = mock.MagicMock()
mock_swift.get_object.return_value = ({}, mock_env)
mock_create_overcloudrc.return_value = {
"overcloudrc": "fake overcloudrc"
}
result = overcloudrc.create_overcloudrc(
mock_swift, mock_heat, "overcast")
self.assertEqual(result, {"overcloudrc": "fake overcloudrc"})

View File

@ -17,9 +17,6 @@ from unittest import mock
import yaml
import six
from swiftclient import exceptions as swiftexceptions
from tripleo_common.exception import NotFound
from tripleo_common.exception import RoleMetadataError
from tripleo_common.tests import base
@ -268,92 +265,3 @@ class TestRolesUtils(base.TestCase):
'/roles',
['sample', 'sample:sample'])
open_mock.assert_any_call('/roles/sample.yaml', 'r')
def test_list_role(self):
# setup swift
swift = mock.MagicMock()
swift.get_object.return_value = ({}, ROLES_DATA_YAML_CONTENTS)
# Test
result = rolesutils.get_roles_from_plan(swift)
# verify
expected = ['MyController', 'Compute', 'CustomRole']
self.assertEqual(expected, result)
def test_list_role_show_detail(self):
# setup swift
swift = mock.MagicMock()
swift.get_object.return_value = ({}, ROLES_DATA_YAML_CONTENTS)
# Test
result = rolesutils.get_roles_from_plan(swift, detail=True)
# verify
expected = [
{u'CountDefault': 1,
u'ServicesDefault': [u'OS::TripleO::Services::CACerts'],
u'name': u'MyController'},
{u'HostnameFormatDefault': u'%stackname%-novacompute-%index%',
u'ServicesDefault': [u'OS::TripleO::Services::NovaCompute',
u'OS::TripleO::Services::DummyService'],
u'name': u'Compute'},
{u'ServicesDefault': [u'OS::TripleO::Services::Kernel'],
u'name': u'CustomRole'}]
self.assertEqual(expected, result)
def test_no_roles_data_file(self):
swift = mock.MagicMock()
swift.get_object.side_effect = swiftexceptions.ClientException("404")
ex = self.assertRaises(RuntimeError,
rolesutils.get_roles_from_plan, swift)
error_str = ('Error retrieving roles data from deployment plan: 404')
self.assertEqual(six.text_type(ex), error_str)
@mock.patch(
'tripleo_common.utils.stack_parameters.get_flattened_parameters')
def test_valid_roles_list(self, mock_params):
swift = mock.MagicMock()
heat = mock.MagicMock()
mock_params.return_value = {
'heat_resource_tree': {
'resources': {
'1': {
'id': '1',
'name': 'Root',
'resources': [
'2'
],
'parameters': [
'ComputeCount'
]
},
'2': {
'id': '2',
'name': 'CephStorageHostsDeployment',
'type': 'OS::Heat::StructuredDeployments'
}
},
'parameters': {
'ComputeCount': {
'default': 1,
'type': 'Number',
'name': 'ComputeCount'
}
},
},
'environment_parameters': None,
}
swift.get_object.return_value = ({}, ROLES_DATA_YAML_CONTENTS)
# Test
result = rolesutils.get_roles_from_plan(swift, heat, valid=True)
# verify
expected = ['Compute']
self.assertEqual(expected, result)

View File

@ -13,12 +13,8 @@
from unittest import mock
import yaml
from swiftclient import exceptions as swiftexceptions
from ironicclient import exceptions as ironicexceptions
from tripleo_common import constants
from tripleo_common.tests import base
from tripleo_common.utils import stack_parameters
from tripleo_common.utils import nodes
@ -26,410 +22,6 @@ from tripleo_common.utils import nodes
class StackParametersTest(base.TestCase):
def test_reset_parameter(self):
swift = mock.MagicMock(url="http://test.com")
mock_env = yaml.safe_dump({
'name': constants.DEFAULT_CONTAINER_NAME,
'template': 'template',
'environments': [{u'path': u'environments/test.yaml'}],
'parameter_defaults': {'SomeTestParameter': 42}
}, default_flow_style=False)
swift.get_object.return_value = ({}, mock_env)
# Test
stack_parameters.reset_parameters(swift)
mock_env_reset = yaml.safe_dump({
'name': constants.DEFAULT_CONTAINER_NAME,
'template': 'template',
'environments': [{u'path': u'environments/test.yaml'}]
}, default_flow_style=False)
swift.put_object.assert_called_once_with(
constants.DEFAULT_CONTAINER_NAME,
constants.PLAN_ENVIRONMENT,
mock_env_reset
)
@mock.patch('uuid.uuid4')
@mock.patch('heatclient.common.template_utils.'
'process_multiple_environments_and_files')
@mock.patch('heatclient.common.template_utils.'
'get_template_contents')
def test_update_parameters(self,
mock_get_template_contents,
mock_env_files,
mock_uuid):
mock_env_files.return_value = ({}, {})
swift = mock.MagicMock(url="http://test.com")
mock_env = yaml.safe_dump({
'name': constants.DEFAULT_CONTAINER_NAME,
'temp_environment': 'temp_environment',
'template': 'template',
'environments': [{u'path': u'environments/test.yaml'}],
}, default_flow_style=False)
mock_roles = yaml.safe_dump([{"name": "foo"}])
mock_network = yaml.safe_dump([{'enabled': False}])
mock_exclude = yaml.safe_dump({"name": "foo"})
swift.get_object.side_effect = (
({}, mock_env),
({}, mock_env),
({}, mock_roles),
({}, mock_network),
({}, mock_exclude),
({}, mock_env),
({}, mock_env),
({}, mock_env),
({}, mock_roles),
({}, mock_network),
({}, mock_exclude),
({}, mock_env),
({}, mock_env),
swiftexceptions.ClientException('atest2')
)
def return_container_files(*args):
return ('headers', [{'name': 'foo.role.j2.yaml'}])
swift.get_container = mock.MagicMock(
side_effect=return_container_files)
mock_heat = mock.MagicMock()
mock_heat.stacks.validate.return_value = {
"Type": "Foo",
"Description": "Le foo bar",
"Parameters": {"bar": {"foo": "bar barz"}},
"NestedParameters": {"Type": "foobar"}
}
mock_uuid.return_value = "cheese"
expected_value = {
'environment_parameters': None,
'heat_resource_tree': {
'parameters': {'bar': {'foo': 'bar barz',
'name': 'bar'}},
'resources': {'cheese': {
'id': 'cheese',
'name': 'Root',
'description': 'Le foo bar',
'parameters': ['bar'],
'resources': ['cheese'],
'type': 'Foo'}
}
}
}
mock_get_template_contents.return_value = ({}, {
'heat_template_version': '2016-04-30'
})
# Test
test_parameters = {'SomeTestParameter': 42}
result = stack_parameters.update_parameters(
swift, mock_heat, test_parameters)
mock_env_updated = yaml.safe_dump({
'name': constants.DEFAULT_CONTAINER_NAME,
'temp_environment': 'temp_environment',
'parameter_defaults': {'SomeTestParameter': 42},
'template': 'template',
'environments': [{u'path': u'environments/test.yaml'}]
}, default_flow_style=False)
swift.put_object.assert_any_call(
constants.DEFAULT_CONTAINER_NAME,
constants.PLAN_ENVIRONMENT,
mock_env_updated
)
mock_heat.stacks.validate.assert_called_once_with(
environment={},
files={},
show_nested=True,
template={'heat_template_version': '2016-04-30'},
)
self.assertEqual(result, expected_value)
@mock.patch('heatclient.common.template_utils.'
'process_multiple_environments_and_files')
@mock.patch('heatclient.common.template_utils.'
'get_template_contents')
def test_update_parameter_new_key(self,
mock_get_template_contents,
mock_env_files):
mock_env_files.return_value = ({}, {})
swift = mock.MagicMock(url="http://test.com")
mock_env = yaml.safe_dump({
'name': constants.DEFAULT_CONTAINER_NAME,
'temp_environment': 'temp_environment',
'template': 'template',
'environments': [{u'path': u'environments/test.yaml'}],
}, default_flow_style=False)
mock_roles = yaml.safe_dump([{"name": "foo"}])
mock_network = yaml.safe_dump([{'enabled': False}])
mock_exclude = yaml.safe_dump({"name": "foo"})
swift.get_object.side_effect = (
({}, mock_env),
({}, mock_env),
({}, mock_roles),
({}, mock_network),
({}, mock_exclude),
({}, mock_env),
({}, mock_env),
({}, mock_env),
({}, mock_roles),
({}, mock_network),
({}, mock_exclude),
({}, mock_env),
({}, mock_env),
swiftexceptions.ClientException('atest2')
)
def return_container_files(*args):
return ('headers', [{'name': 'foo.role.j2.yaml'}])
swift.get_container = mock.MagicMock(
side_effect=return_container_files)
heat = mock.MagicMock()
heat.stacks.validate.return_value = {}
mock_get_template_contents.return_value = ({}, {
'heat_template_version': '2016-04-30'
})
# Test
test_parameters = {'SomeTestParameter': 42}
stack_parameters.update_parameters(
swift, heat, test_parameters,
parameter_key='test_key')
mock_env_updated = yaml.safe_dump({
'name': constants.DEFAULT_CONTAINER_NAME,
'temp_environment': 'temp_environment',
'test_key': {'SomeTestParameter': 42},
'template': 'template',
'environments': [{u'path': u'environments/test.yaml'}]
}, default_flow_style=False)
swift.put_object.assert_any_call(
constants.DEFAULT_CONTAINER_NAME,
constants.PLAN_ENVIRONMENT,
mock_env_updated
)
heat.stacks.validate.assert_called_once_with(
environment={},
files={},
show_nested=True,
template={'heat_template_version': '2016-04-30'},
)
@mock.patch('heatclient.common.template_utils.'
'process_multiple_environments_and_files')
@mock.patch('heatclient.common.template_utils.'
'get_template_contents')
@mock.patch('tripleo_common.utils.parameters.set_count_and_flavor_params')
def test_update_role_parameter(self, mock_set_count_and_flavor,
mock_get_template_contents,
mock_env_files):
mock_env_files.return_value = ({}, {})
swift = mock.MagicMock(url="http://test.com")
mock_env = yaml.safe_dump({
'name': 'overcast'
}, default_flow_style=False)
mock_roles = yaml.safe_dump([{"name": "foo"}])
mock_network = yaml.safe_dump([{'enabled': False}])
mock_exclude = yaml.safe_dump({"name": "foo"})
swift.get_object.side_effect = (
({}, mock_env),
({}, mock_env),
({}, mock_roles),
({}, mock_network),
({}, mock_exclude),
({}, mock_env),
({}, mock_env),
({}, mock_env),
({}, mock_roles),
({}, mock_network),
({}, mock_exclude),
({}, mock_env),
({}, mock_env),
swiftexceptions.ClientException('atest2')
)
def return_container_files(*args):
return ('headers', [{'name': 'foo.yaml'}])
swift.get_container = mock.MagicMock(
side_effect=return_container_files)
heat = mock.MagicMock()
ironic = mock.MagicMock()
compute = mock.MagicMock()
heat.stacks.validate.return_value = {}
mock_get_template_contents.return_value = ({}, {
'heat_template_version': '2016-04-30'
})
params = {'CephStorageCount': 1,
'OvercloudCephStorageFlavor': 'ceph-storage'}
mock_set_count_and_flavor.return_value = params
stack_parameters.update_role_parameters(
swift, heat, ironic, compute,
'ceph-storage', 'overcast')
mock_env_updated = yaml.safe_dump({
'name': 'overcast',
'parameter_defaults': params
}, default_flow_style=False)
swift.put_object.assert_any_call(
'overcast',
constants.PLAN_ENVIRONMENT,
mock_env_updated
)
heat.stacks.validate.assert_called_once_with(
environment={},
files={},
show_nested=True,
template={'heat_template_version': '2016-04-30'},
)
@mock.patch('heatclient.common.template_utils.'
'process_multiple_environments_and_files')
@mock.patch('heatclient.common.template_utils.get_template_contents')
def test_empty_resource_tree(self,
mock_get_template_contents,
mock_process_multiple_environments_and_files):
swift = mock.MagicMock(url="http://test.com")
mock_env = yaml.safe_dump({
'temp_environment': 'temp_environment',
'template': 'template',
'environments': [{u'path': u'environments/test.yaml'}]
}, default_flow_style=False)
swift.get_object.side_effect = (
({}, mock_env),
swiftexceptions.ClientException('atest2'),
({}, mock_env)
)
mock_get_template_contents.return_value = ({}, {
'heat_template_version': '2016-04-30'
})
mock_process_multiple_environments_and_files.return_value = ({}, {})
mock_heat = mock.MagicMock()
mock_heat.stacks.validate.return_value = {}
expected_value = {
'heat_resource_tree': {},
'environment_parameters': None,
}
# Test
result = stack_parameters.get_flattened_parameters(swift, mock_heat)
mock_heat.stacks.validate.assert_called_once_with(
environment={},
files={},
show_nested=True,
template={'heat_template_version': '2016-04-30'},
)
self.assertEqual(result, expected_value)
@mock.patch('uuid.uuid4', side_effect=['1', '2'])
@mock.patch('heatclient.common.template_utils.'
'process_multiple_environments_and_files')
@mock.patch('heatclient.common.template_utils.get_template_contents')
def test_valid_resource_tree(self,
mock_get_template_contents,
mock_process_multiple_environments_and_files,
mock_uuid):
swift = mock.MagicMock(url="http://test.com")
mock_env = yaml.safe_dump({
'temp_environment': 'temp_environment',
'template': 'template',
'environments': [{u'path': u'environments/test.yaml'}]
}, default_flow_style=False)
swift.get_object.side_effect = (
({}, mock_env),
swiftexceptions.ClientException('atest2'),
({}, mock_env)
)
mock_get_template_contents.return_value = ({}, {
'heat_template_version': '2016-04-30'
})
mock_process_multiple_environments_and_files.return_value = ({}, {})
mock_heat = mock.MagicMock()
mock_heat.stacks.validate.return_value = {
'NestedParameters': {
'CephStorageHostsDeployment': {
'Type': 'OS::Heat::StructuredDeployments',
},
},
'description': 'sample',
'Parameters': {
'ControllerCount': {
'Default': 1,
'Type': 'Number',
},
}
}
expected_value = {
'heat_resource_tree': {
'resources': {
'1': {
'id': '1',
'name': 'Root',
'resources': [
'2'
],
'parameters': [
'ControllerCount'
]
},
'2': {
'id': '2',
'name': 'CephStorageHostsDeployment',
'type': 'OS::Heat::StructuredDeployments'
}
},
'parameters': {
'ControllerCount': {
'default': 1,
'type': 'Number',
'name': 'ControllerCount'
}
},
},
'environment_parameters': None,
}
# Test
result = stack_parameters.get_flattened_parameters(swift, mock_heat)
self.assertEqual(result, expected_value)
def test_generate_hostmap(self):
# two instances in 'nova list'.
@ -625,17 +217,13 @@ class StackParametersTest(base.TestCase):
}
})
@mock.patch('tripleo_common.utils.template.process_templates')
def test_run_valid_network_config(self, mock_process_templates):
swift = mock.MagicMock(url="http://test.com")
def test_run_valid_network_config(self):
mock_env = {
'template': {},
'files': {},
'environment': [{'path': 'environments/test.yaml'}]
}
mock_process_templates.return_value = mock_env
mock_heat = mock.MagicMock()
mock_heat.stacks.preview.return_value = mock.Mock(resources=[{
@ -645,13 +233,10 @@ class StackParametersTest(base.TestCase):
" > /etc/os-net-config/config.json"}
}])
mock_heat.stacks.get.return_value = mock.Mock(
stack_name="overcloud-TEMP")
expected = {"network_config": {}}
# Test
result = stack_parameters.get_network_configs(
swift, mock_heat, container='overcloud', role_name='Compute')
mock_heat, mock_env, container='overcloud', role_name='Compute')
self.assertEqual(expected, result)
mock_heat.stacks.preview.assert_called_once_with(
environment=[{'path': 'environments/test.yaml'}],
@ -660,17 +245,13 @@ class StackParametersTest(base.TestCase):
stack_name='overcloud-TEMP',
)
@mock.patch('tripleo_common.utils.template.process_templates')
def test_run_invalid_network_config(self, mock_process_templates):
swift = mock.MagicMock(url="http://test.com")
def test_run_invalid_network_config(self):
mock_env = {
'template': {},
'files': {},
'environment': [{'path': 'environments/test.yaml'}]
}
mock_process_templates.return_value = mock_env
mock_heat = mock.MagicMock()
mock_heat.stacks.preview.return_value = mock.Mock(resources=[{
@ -679,13 +260,10 @@ class StackParametersTest(base.TestCase):
"properties": {"config": ""}
}])
mock_heat.stacks.get.return_value = mock.Mock(
stack_name="overcloud-TEMP")
# Test
self.assertRaises(RuntimeError,
stack_parameters.get_network_configs, swift,
mock_heat, container='overcloud',
stack_parameters.get_network_configs,
mock_heat, mock_env, container='overcloud',
role_name='Compute')
mock_heat.stacks.preview.assert_called_once_with(
environment=[{'path': 'environments/test.yaml'}],
@ -694,10 +272,7 @@ class StackParametersTest(base.TestCase):
stack_name='overcloud-TEMP',
)
@mock.patch('tripleo_common.utils.template.process_templates')
def test_run_valid_network_config_with_no_if_routes_inputs(
self, mock_process_templates):
swift = mock.MagicMock(url="http://test.com")
def test_run_valid_network_config_with_no_if_routes_inputs(self):
mock_env = {
'template': {
@ -715,7 +290,6 @@ class StackParametersTest(base.TestCase):
'environment': {'parameter_defaults': {}}
}
mock_process_templates.return_value = mock_env
mock_heat = mock.MagicMock()
mock_heat.stacks.preview.return_value = mock.Mock(resources=[{
@ -725,13 +299,10 @@ class StackParametersTest(base.TestCase):
" > /etc/os-net-config/config.json"}
}])
mock_heat.stacks.get.return_value = mock.Mock(
stack_name="overcloud-TEMP")
expected = {"network_config": {}}
# Test
result = stack_parameters.get_network_configs(
swift, mock_heat, container='overcloud', role_name='Compute')
mock_heat, mock_env, container='overcloud', role_name='Compute')
self.assertEqual(expected, result)
mock_heat.stacks.preview.assert_called_once_with(
environment={
@ -747,10 +318,7 @@ class StackParametersTest(base.TestCase):
stack_name='overcloud-TEMP',
)
@mock.patch('tripleo_common.utils.template.process_templates')
def test_run_valid_network_config_with_if_routes_inputs(
self, mock_process_templates):
swift = mock.MagicMock(url="http://test.com")
def test_run_valid_network_config_with_if_routes_inputs(self):
mock_env = {
'template': {
@ -772,7 +340,6 @@ class StackParametersTest(base.TestCase):
}}
}
mock_process_templates.return_value = mock_env
mock_heat = mock.MagicMock()
mock_heat.stacks.preview.return_value = mock.Mock(resources=[{
@ -782,13 +349,10 @@ class StackParametersTest(base.TestCase):
" > /etc/os-net-config/config.json"}
}])
mock_heat.stacks.get.return_value = mock.Mock(
stack_name="overcloud-TEMP")
expected = {"network_config": {}}
# Test
result = stack_parameters.get_network_configs(
swift, mock_heat, container='overcloud', role_name='Compute')
mock_heat, mock_env, container='overcloud', role_name='Compute')
self.assertEqual(expected, result)
mock_heat.stacks.preview.assert_called_once_with(
environment={

View File

@ -14,13 +14,10 @@
import logging
from heatclient import exc as heat_exc
from six.moves import urllib
from swiftclient import exceptions as swiftexceptions
from tripleo_common import constants
from tripleo_common.utils import common as common_utils
from tripleo_common.utils import plan as plan_utils
try: # py3
from shlex import quote
@ -72,46 +69,6 @@ fi
"""
def create_overcloudrc(swift, heat,
container=constants.DEFAULT_CONTAINER_NAME,
no_proxy=""):
try:
stack = heat.stacks.get(container)
except heat_exc.HTTPNotFound:
error = (
"The Heat stack {} could not be found. Make sure you have "
"deployed before calling this action.").format(container)
raise RuntimeError(error)
# We need to check parameter_defaults first for a user provided
# password. If that doesn't exist, we then should look in the
# automatically generated passwords.
# TODO(d0ugal): Abstract this operation somewhere. We shouldn't need to
# know about the structure of the environment to get a password.
try:
env = plan_utils.get_env(swift, container)
except swiftexceptions.ClientException as err:
err_msg = ("Error retrieving environment for plan %s: %s" % (
container, err))
LOG.error(err_msg)
raise RuntimeError(err_msg)
try:
parameter_defaults = env['parameter_defaults']
passwords = env['passwords']
admin_pass = parameter_defaults.get('AdminPassword')
if admin_pass is None:
admin_pass = passwords['AdminPassword']
except KeyError:
error = ("Unable to find the AdminPassword in the plan "
"environment.")
raise RuntimeError(error)
region_name = parameter_defaults.get('KeystoneRegion')
return _create_overcloudrc(stack, no_proxy,
admin_pass, region_name)
def _create_overcloudrc(stack, no_proxy, admin_password, region_name):
"""Given the stack and proxy settings, create the overcloudrc

View File

@ -21,10 +21,8 @@ import yaml
import six
from six.moves import cStringIO as StringIO
from tripleo_common import constants
from tripleo_common.exception import NotFound
from tripleo_common.exception import RoleMetadataError
from tripleo_common.utils import stack_parameters as stack_param_utils
LOG = logging.getLogger(__name__)
@ -188,60 +186,3 @@ def validate_role_yaml(role_data=None, role_path=None):
role['name'], k, schema[k]['type'])
raise RoleMetadataError(msg)
return role
def get_roles_from_plan(swift, heat=None,
container=constants.DEFAULT_CONTAINER_NAME,
role_file_name=constants.OVERCLOUD_J2_ROLES_NAME,
detail=False, valid=False):
"""Returns a deployment plan's roles list
Parses roles_data.yaml and returns the names of all available/valid roles.
:param swift: legacy object client
:param heat: legacy orchestration client
:param container: name of the Swift container / plan name
:param roles_file_name: name of the foles file
:param detail: if false(default), displays role names only. if true,
returns all roles data
:param valid: check if the role has count > 0 in heat environment
:return: list of roles in the container's deployment plan
"""
try:
roles_data = yaml.safe_load(swift.get_object(
container, role_file_name)[1])
except Exception as err:
err_msg = ("Error retrieving roles data from deployment plan: %s"
% err)
LOG.exception(err_msg)
raise RuntimeError(err_msg)
if detail:
return roles_data
role_names = [role['name'] for role in roles_data]
if not valid:
return role_names
assert heat is not None
try:
heat_resource_tree = stack_param_utils.get_flattened_parameters(
swift, heat, container)['heat_resource_tree']
except Exception as err:
err_msg = ("Error retrieving getting heat resource tree: %s"
% err)
LOG.exception(err_msg)
raise RuntimeError(err_msg)
valid_roles = []
for name in role_names:
role_count = heat_resource_tree['parameters'].get(
name + 'Count', {}).get('default', 0)
if role_count > 0:
valid_roles.append(name)
return valid_roles

View File

@ -230,15 +230,7 @@ def preview_stack_and_network_configs(heat, processed_data,
'stack_name': container_temp,
}
preview_data = heat.stacks.preview(**fields)
try:
stack = heat.stacks.get(container_temp)
except heat_exc.HTTPNotFound:
msg = "Error retrieving stack: %s" % container_temp
LOG.exception(msg)
raise RuntimeError(msg)
return get_network_config(preview_data, stack.stack_name, role_name)
return get_network_config(preview_data, container_temp, role_name)
def get_network_config(preview_data, stack_name, role_name):

View File

@ -13,119 +13,14 @@
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import copy
import logging
from heatclient import exc as heat_exc
from swiftclient import exceptions as swiftexceptions
from tripleo_common import constants
from tripleo_common.utils import nodes
from tripleo_common.utils import parameters as param_utils
from tripleo_common.utils import plan as plan_utils
from tripleo_common.utils import template as template_utils
from tripleo_common.utils import stack as stack_utils
LOG = logging.getLogger(__name__)
def get_flattened_parameters(swift, heat,
container=constants.DEFAULT_CONTAINER_NAME):
processed_data = template_utils.process_templates(
swift, heat, container=container
)
# respect previously user set param values
try:
env = plan_utils.get_env(swift, container)
except swiftexceptions.ClientException as err:
err_msg = ("Error retrieving environment for plan %s: %s" % (
container, err))
LOG.exception(err_msg)
raise RuntimeError(err_msg)
processed_data = stack_utils.validate_stack_and_flatten_parameters(
heat, processed_data, env)
return processed_data
def update_parameters(swift, heat, parameters,
container=constants.DEFAULT_CONTAINER_NAME,
parameter_key=constants.DEFAULT_PLAN_ENV_KEY,
validate=True):
try:
env = plan_utils.get_env(swift, container)
except swiftexceptions.ClientException as err:
err_msg = ("Error retrieving environment for plan %s: %s" % (
container, err))
LOG.exception(err_msg)
raise RuntimeError(err_msg)
saved_env = copy.deepcopy(env)
try:
plan_utils.update_in_env(swift, env, parameter_key, parameters)
except swiftexceptions.ClientException as err:
err_msg = ("Error updating environment for plan %s: %s" % (
container, err))
LOG.exception(err_msg)
raise RuntimeError(err_msg)
processed_data = template_utils.process_templates(
swift, heat, container=container
)
env = plan_utils.get_env(swift, container)
if not validate:
return env
try:
processed_data = stack_utils.validate_stack_and_flatten_parameters(
heat, processed_data, env)
except heat_exc.HTTPException as err:
LOG.debug("Validation failed rebuilding saved env")
# There has been an error validating we must reprocess the
# templates with the saved working env
plan_utils.put_env(swift, saved_env)
template_utils.process_custom_roles(swift, heat, container)
err_msg = ("Error validating environment for plan %s: %s" % (
container, err))
LOG.exception(err_msg)
raise RuntimeError(err_msg)
return processed_data
def reset_parameters(swift, container=constants.DEFAULT_CONTAINER_NAME,
key=constants.DEFAULT_PLAN_ENV_KEY):
try:
env = plan_utils.get_env(swift, container)
except swiftexceptions.ClientException as err:
err_msg = ("Error retrieving environment for plan %s: %s" % (
container, err))
LOG.exception(err_msg)
raise RuntimeError(err_msg)
try:
plan_utils.update_in_env(swift, env, key, None, delete_key=True)
except swiftexceptions.ClientException as err:
err_msg = ("Error updating environment for plan %s: %s" % (
container, err))
LOG.exception(err_msg)
raise RuntimeError(err_msg)
return env
def update_role_parameters(swift, heat, ironic, nova, role,
container=constants.DEFAULT_CONTAINER_NAME):
parameters = param_utils.set_count_and_flavor_params(role, ironic, nova)
return update_parameters(swift, heat, parameters, container)
def generate_fencing_parameters(nodes_json, delay,
ipmi_level, ipmi_cipher, ipmi_lanplus):
fence_params = {"EnableFencing": True, "FencingConfig": {}}
@ -198,11 +93,7 @@ def generate_fencing_parameters(nodes_json, delay,
return {"parameter_defaults": fence_params}
def get_network_configs(swift, heat, container, role_name):
processed_data = template_utils.process_templates(
swift, heat, container=container
)
def get_network_configs(heat, processed_data, container, role_name):
# Default temporary value is used when no user input for any
# interface routes for the role networks to find network config.
role_networks = processed_data['template'].get('resources', {}).get(