Merge "Move ListRolesAction functionality to utils"
This commit is contained in:
commit
7998c9553d
|
@ -146,18 +146,12 @@ class ListRolesAction(base.TripleOAction):
|
|||
def run(self, context):
|
||||
try:
|
||||
swift = self.get_object_client(context)
|
||||
roles_data = yaml.safe_load(swiftutils.get_object_string(
|
||||
swift, self.container, self.role_file_name))
|
||||
return roles_utils.get_roles_from_plan(
|
||||
swift, container=self.container,
|
||||
role_file_name=self.role_file_name,
|
||||
detail=self.detail)
|
||||
except Exception as err:
|
||||
err_msg = ("Error retrieving roles data from deployment plan: %s"
|
||||
% err)
|
||||
LOG.exception(err_msg)
|
||||
return actions.Result(error=err_msg)
|
||||
|
||||
if self.detail:
|
||||
return roles_data
|
||||
else:
|
||||
return [role['name'] for role in roles_data]
|
||||
return actions.Result(error=six.text_type(err))
|
||||
|
||||
|
||||
class ExportPlanAction(base.TripleOAction):
|
||||
|
|
|
@ -54,23 +54,6 @@ notresources:
|
|||
"""
|
||||
|
||||
|
||||
ROLES_DATA_YAML_CONTENTS = """
|
||||
- name: MyController
|
||||
CountDefault: 1
|
||||
ServicesDefault:
|
||||
- OS::TripleO::Services::CACerts
|
||||
|
||||
- name: Compute
|
||||
HostnameFormatDefault: '%stackname%-novacompute-%index%'
|
||||
ServicesDefault:
|
||||
- OS::TripleO::Services::NovaCompute
|
||||
- OS::TripleO::Services::DummyService
|
||||
|
||||
- name: CustomRole
|
||||
ServicesDefault:
|
||||
- OS::TripleO::Services::Kernel
|
||||
"""
|
||||
|
||||
SAMPLE_ROLE = """
|
||||
###############################################################################
|
||||
# Role: sample #
|
||||
|
@ -310,67 +293,6 @@ class DeletePlanActionTest(base.TestCase):
|
|||
swift.delete_container.assert_called_with(self.container_name)
|
||||
|
||||
|
||||
class ListRolesActionTest(base.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(ListRolesActionTest, self).setUp()
|
||||
self.container = 'overcloud'
|
||||
self.ctx = mock.MagicMock()
|
||||
|
||||
@mock.patch('tripleo_common.actions.base.TripleOAction.get_object_client')
|
||||
def test_run(self, get_obj_client_mock):
|
||||
# setup swift
|
||||
swift = mock.MagicMock()
|
||||
swift.get_object.return_value = ({}, ROLES_DATA_YAML_CONTENTS)
|
||||
get_obj_client_mock.return_value = swift
|
||||
|
||||
# Test
|
||||
action = plan.ListRolesAction()
|
||||
result = action.run(self.ctx)
|
||||
|
||||
# verify
|
||||
expected = ['MyController', 'Compute', 'CustomRole']
|
||||
self.assertEqual(expected, result)
|
||||
|
||||
@mock.patch('tripleo_common.actions.base.TripleOAction.get_object_client')
|
||||
def test_run_show_detail(self, get_obj_client_mock):
|
||||
# setup swift
|
||||
swift = mock.MagicMock()
|
||||
swift.get_object.return_value = ({}, ROLES_DATA_YAML_CONTENTS)
|
||||
get_obj_client_mock.return_value = swift
|
||||
|
||||
# Test
|
||||
action = plan.ListRolesAction(detail=True)
|
||||
result = action.run(self.ctx)
|
||||
|
||||
# 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)
|
||||
|
||||
@mock.patch('tripleo_common.actions.base.TripleOAction.get_object_client')
|
||||
def test_no_roles_data_file(self, get_obj_client_mock):
|
||||
|
||||
swift = mock.MagicMock()
|
||||
swift.get_object.side_effect = swiftexceptions.ClientException("404")
|
||||
get_obj_client_mock.return_value = swift
|
||||
|
||||
action = plan.ListRolesAction()
|
||||
result = action.run(self.ctx)
|
||||
|
||||
error_str = ('Error retrieving roles data from deployment plan: 404')
|
||||
self.assertEqual(result.error, error_str)
|
||||
|
||||
|
||||
class ExportPlanActionTest(base.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
|
|
|
@ -16,6 +16,9 @@
|
|||
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
|
||||
|
@ -79,6 +82,23 @@ SAMPLE_ROLE_OBJ_NETWORK_DICT = {
|
|||
}
|
||||
}
|
||||
|
||||
ROLES_DATA_YAML_CONTENTS = """
|
||||
- name: MyController
|
||||
CountDefault: 1
|
||||
ServicesDefault:
|
||||
- OS::TripleO::Services::CACerts
|
||||
|
||||
- name: Compute
|
||||
HostnameFormatDefault: '%stackname%-novacompute-%index%'
|
||||
ServicesDefault:
|
||||
- OS::TripleO::Services::NovaCompute
|
||||
- OS::TripleO::Services::DummyService
|
||||
|
||||
- name: CustomRole
|
||||
ServicesDefault:
|
||||
- OS::TripleO::Services::Kernel
|
||||
"""
|
||||
|
||||
|
||||
class TestRolesUtils(base.TestCase):
|
||||
@mock.patch('os.listdir')
|
||||
|
@ -247,3 +267,92 @@ 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,6 +13,7 @@
|
|||
# under the License.
|
||||
#
|
||||
|
||||
import logging
|
||||
import os
|
||||
import shutil
|
||||
import yaml
|
||||
|
@ -20,8 +21,12 @@ 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__)
|
||||
|
||||
|
||||
def get_roles_list_from_directory(directory):
|
||||
|
@ -183,3 +188,60 @@ 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
|
||||
|
|
Loading…
Reference in New Issue