sahara resources observe reality implementation

Override parse_live_resource_data method for next resources:

 * OS::Sahara::ClusterTemplate
 * OS::Sahara::NodeGroupTemplate

to observe and update resource plugin.

implements bp get-reality-for-resources

Change-Id: Ia69afa8415d1ff2e6451f363e04598b874b511cc
This commit is contained in:
Peter Razumovsky 2016-01-29 16:50:22 +03:00
parent 7930886f07
commit aa48091f18
2 changed files with 166 additions and 1 deletions

View File

@ -118,6 +118,7 @@ class SaharaNodeGroupTemplate(resource.Resource):
constraints=[
constraints.Range(min=0),
],
default=0,
update_allowed=True
),
VOLUMES_SIZE: properties.Schema(
@ -351,6 +352,17 @@ class SaharaNodeGroupTemplate(resource.Resource):
self.stack.t.get_section_name('properties')],
message=msg)
def parse_live_resource_data(self, resource_properties, resource_data):
result = super(SaharaNodeGroupTemplate, self).parse_live_resource_data(
resource_properties, resource_data)
for group in result[self.SHARES] or []:
remove_keys = set(group.keys()) - set(self._SHARE_KEYS)
for key in remove_keys:
del group[key]
result[self.FLAVOR] = resource_data.get('flavor_id')
return result
class SaharaClusterTemplate(resource.Resource):
"""A resource for managing Sahara cluster templates.
@ -587,6 +599,20 @@ class SaharaClusterTemplate(resource.Resource):
self.properties[self.HADOOP_VERSION]
)
def parse_live_resource_data(self, resource_properties, resource_data):
result = super(SaharaClusterTemplate, self).parse_live_resource_data(
resource_properties, resource_data)
for group in result[self.NODE_GROUPS] or []:
remove_keys = set(group.keys()) - set(self._NODE_GROUP_KEYS)
for key in remove_keys:
del group[key]
for group in result[self.SHARES] or []:
remove_keys = set(group.keys()) - set(self._SHARE_KEYS)
for key in remove_keys:
del group[key]
return result
def resource_mapping():
return {

View File

@ -149,7 +149,7 @@ class SaharaNodeGroupTemplateTest(common.HeatTestCase):
'hadoop_version': '2.3.0',
'flavor_id': 'someflavorid',
'description': "",
'volumes_per_node': None,
'volumes_per_node': 0,
'volumes_size': None,
'volume_type': 'lvm',
'security_groups': None,
@ -260,6 +260,75 @@ class SaharaNodeGroupTemplateTest(common.HeatTestCase):
self.ngt_mgr.update.assert_called_once_with('some_ng_id', **args)
self.assertEqual((ngt.UPDATE, ngt.COMPLETE), ngt.state)
def test_get_live_state(self):
ngt = self._create_ngt(self.t)
resp = mock.MagicMock()
resp.to_dict.return_value = {
'volume_local_to_instance': False,
'availability_zone': None,
'updated_at': None,
'use_autoconfig': True,
'volumes_per_node': 0,
'id': '6157755e-dfd3-45b4-a445-36588e5f75ad',
'security_groups': None,
'shares': None,
'node_configs': {},
'auto_security_group': False,
'volumes_availability_zone': None,
'description': '',
'volume_mount_prefix': '/volumes/disk',
'plugin_name': 'vanilla',
'floating_ip_pool': None,
'is_default': False,
'image_id': None,
'volumes_size': 0,
'is_proxy_gateway': False,
'is_public': False,
'hadoop_version': '2.7.1',
'name': 'cluster-nodetemplate-jlgzovdaivn',
'tenant_id': '221b4f51e9bd4f659845f657a3051a46',
'created_at': '2016-01-29T11:08:46',
'volume_type': None,
'is_protected': False,
'node_processes': ['namenode'],
'flavor_id': '2'}
self.ngt_mgr.get.return_value = resp
# Simulate replace translation rule execution.
ngt.properties.data['flavor'] = '1'
reality = ngt.get_live_state(ngt.properties)
expected = {
'volume_local_to_instance': False,
'availability_zone': None,
'use_autoconfig': True,
'volumes_per_node': 0,
'security_groups': None,
'shares': None,
'node_configs': {},
'auto_security_group': False,
'volumes_availability_zone': None,
'description': '',
'plugin_name': 'vanilla',
'floating_ip_pool': None,
'image_id': None,
'volumes_size': 0,
'is_proxy_gateway': False,
'hadoop_version': '2.7.1',
'name': 'cluster-nodetemplate-jlgzovdaivn',
'volume_type': None,
'node_processes': ['namenode'],
'flavor': '2'
}
self.assertEqual(expected, reality)
# Make sure that old flavor will return when ids are equal - simulate
# replace translation rule execution.
ngt.properties.data['flavor'] = '2'
reality = ngt.get_live_state(ngt.properties)
self.assertEqual('2', reality.get('flavor'))
class SaharaClusterTemplateTest(common.HeatTestCase):
def setUp(self):
@ -355,3 +424,73 @@ class SaharaClusterTemplateTest(common.HeatTestCase):
}
self.ct_mgr.update.assert_called_once_with('some_ct_id', **args)
self.assertEqual((ct.UPDATE, ct.COMPLETE), ct.state)
def test_ct_get_live_state(self):
ct = self._create_ct(self.t)
resp = mock.MagicMock()
resp.to_dict.return_value = {
'neutron_management_network': 'public',
'description': '',
'cluster_configs': {},
'created_at': '2016-01-29T11:45:47',
'default_image_id': None,
'updated_at': None,
'plugin_name': 'vanilla',
'shares': None,
'is_default': False,
'is_protected': False,
'use_autoconfig': True,
'anti_affinity': [],
'tenant_id': '221b4f51e9bd4f659845f657a3051a46',
'node_groups': [{'volume_local_to_instance': False,
'availability_zone': None,
'updated_at': None,
'node_group_template_id': '1234',
'volumes_per_node': 0,
'id': '48c356f6-bbe1-4b26-a90a-f3d543c2ea4c',
'security_groups': None,
'shares': None,
'node_configs': {},
'auto_security_group': False,
'volumes_availability_zone': None,
'volume_mount_prefix': '/volumes/disk',
'floating_ip_pool': None,
'image_id': None,
'volumes_size': 0,
'is_proxy_gateway': False,
'count': 1,
'name': 'test',
'created_at': '2016-01-29T11:45:47',
'volume_type': None,
'node_processes': ['namenode'],
'flavor_id': '2',
'use_autoconfig': True}],
'is_public': False,
'hadoop_version': '2.7.1',
'id': 'c07b8c63-b944-47f9-8588-085547a45c1b',
'name': 'cluster-template-ykokor6auha4'}
self.ct_mgr.get.return_value = resp
reality = ct.get_live_state(ct.properties)
expected = {
'neutron_management_network': 'public',
'description': '',
'cluster_configs': {},
'default_image_id': None,
'plugin_name': 'vanilla',
'shares': None,
'anti_affinity': [],
'node_groups': [{'node_group_template_id': '1234',
'count': 1,
'name': 'test'}],
'hadoop_version': '2.7.1',
'name': 'cluster-template-ykokor6auha4'
}
self.assertEqual(set(expected.keys()), set(reality.keys()))
expected_node_group = sorted(expected.pop('node_groups'))
reality_node_group = sorted(reality.pop('node_groups'))
for i in range(len(expected_node_group)):
self.assertEqual(expected_node_group[i], reality_node_group[i])
self.assertEqual(expected, reality)