Merge "Cleanup utils 1/2"
commit
3035ec76fb
|
@ -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"})
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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={
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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(
|
||||
|
|
Loading…
Reference in New Issue