Merge "Showing member list for nested resources"

This commit is contained in:
Jenkins 2014-01-31 08:35:17 +00:00 committed by Gerrit Code Review
commit 04342caaf4
4 changed files with 163 additions and 2 deletions

View File

@ -124,6 +124,10 @@ def format_stack_resource(resource, detail=True):
res[api.RES_DESCRIPTION] = resource.parsed_template('Description', '')
res[api.RES_METADATA] = resource.metadata
if getattr(resource, 'nested', None) is not None:
res[api.RES_MEMBERS] = [r.resource_id for r in
resource.nested().resources.itervalues()]
return res

View File

@ -51,13 +51,13 @@ RES_KEYS = (
RES_NAME, RES_PHYSICAL_ID, RES_METADATA,
RES_ACTION, RES_STATUS, RES_STATUS_DATA,
RES_TYPE, RES_ID, RES_STACK_ID, RES_STACK_NAME,
RES_REQUIRED_BY,
RES_REQUIRED_BY, RES_MEMBERS,
) = (
'description', 'updated_time',
'resource_name', 'physical_resource_id', 'metadata',
'resource_action', 'resource_status', 'resource_status_reason',
'resource_type', 'resource_identity', STACK_ID, STACK_NAME,
'required_by',
'required_by', 'members',
)
RES_SCHEMA_KEYS = (

View File

@ -1929,6 +1929,71 @@ class ResourceControllerTest(ControllerTest, HeatTestCase):
self.assertEqual(403, resp.status_int)
self.assertIn('403 Forbidden', str(resp))
def test_show_nested(self, mock_enforce):
self._mock_enforce_setup(mock_enforce, 'show', True)
res_name = 'ServerGroup'
stack_identity = identifier.HeatIdentifier(self.tenant,
'nested_resource', '6')
res_identity = identifier.ResourceIdentifier(resource_name=res_name,
**stack_identity)
req = self._get(stack_identity._tenant_path())
engine_resp = {
u'description': u'',
u'resource_identity': dict(res_identity),
u'stack_name': stack_identity.stack_name,
u'resource_name': res_name,
u'resource_status_reason': None,
u'updated_time': u'2012-07-23T13:06:00Z',
u'stack_identity': dict(stack_identity),
u'resource_action': u'CREATE',
u'resource_status': u'COMPLETE',
u'physical_resource_id':
u'a3455d8c-9f88-404d-a85b-5315293e67de',
u'resource_type': u'OS::Heat::ResourceGroup',
u'metadata': {u'ensureRunning': u'true'},
u'members': [u'2bf47h48-45u4-4z47-371h-j2k4v236l562',
u'a3455d8c-9f88-404d-a85b-5315293e67de']
}
self.m.StubOutWithMock(rpc, 'call')
rpc.call(req.context, self.topic,
{'namespace': None,
'method': 'describe_stack_resource',
'args': {'stack_identity': stack_identity,
'resource_name': res_name},
'version': self.api_version},
None).AndReturn(engine_resp)
self.m.ReplayAll()
result = self.controller.show(req, tenant_id=self.tenant,
stack_name=stack_identity.stack_name,
stack_id=stack_identity.stack_id,
resource_name=res_name)
expected = {
'resource': {
'links': [
{'href': self._url(res_identity), 'rel': 'self'},
{'href': self._url(stack_identity), 'rel': 'stack'},
],
u'description': u'',
u'resource_name': res_name,
u'logical_resource_id': res_name,
u'resource_status_reason': None,
u'updated_time': u'2012-07-23T13:06:00Z',
u'resource_status': u'CREATE_COMPLETE',
u'physical_resource_id':
u'a3455d8c-9f88-404d-a85b-5315293e67de',
u'resource_type': u'OS::Heat::ResourceGroup',
u'members': [u'2bf47h48-45u4-4z47-371h-j2k4v236l562',
u'a3455d8c-9f88-404d-a85b-5315293e67de']
}
}
self.assertEqual(result, expected)
self.m.VerifyAll()
def test_metadata_show(self, mock_enforce):
self._mock_enforce_setup(mock_enforce, 'metadata', True)
res_name = 'WikiDatabase'

View File

@ -161,6 +161,31 @@ user_policy_template = '''
}
'''
nested_template = '''
{
"AWSTemplateFormatVersion" : "2010-09-09",
"Description" : "Nested resource",
"Parameters" : {},
"Resources" : {
"ServerGroup": {
"Type": "OS::Heat::ResourceGroup",
"Properties": {
"count": 2,
"resource_def": {
"type": "AWS::EC2::Instance",
"properties": {
"KeyName" : "test",
"ImageId" : "F17-x86_64-gold",
"InstanceType" : "m1.large",
"UserData" : "wordpress"
}
}
}
}
}
}
'''
def get_wordpress_stack(stack_name, ctx):
t = template_format.parse(wp_template)
@ -1689,6 +1714,73 @@ class StackServiceTest(HeatTestCase):
self.m.VerifyAll()
def test_stack_resource_describe_nested(self):
stack = get_stack('service_stack_resource_describe_nested_test_stack',
self.ctx,
nested_template)
self.stack = stack
stack.store()
fc = fakes.FakeClient()
self.m.StubOutWithMock(instances.Instance, 'nova')
instances.Instance.nova().MultipleTimes().AndReturn(fc)
patcher = mock.patch.object(
nova_utils, 'build_userdata', return_value=None)
patcher.start()
self.m.StubOutWithMock(fc.servers, 'create')
fc.servers.create(image=744, flavor=3, key_name='test',
name=utils.PhysName(
utils.PhysName(stack.name, 'ServerGroup'),
'0', 53),
security_groups=None,
userdata=None, scheduler_hints=None,
meta=None, nics=None,
availability_zone=None).InAnyOrder().AndReturn(
fc.servers.list()[1])
fc.servers.create(image=744, flavor=3, key_name='test',
name=utils.PhysName(
utils.PhysName(stack.name, 'ServerGroup'),
'1', 53),
security_groups=None,
userdata=None, scheduler_hints=None,
meta=None, nics=None,
availability_zone=None).InAnyOrder().AndReturn(
fc.servers.list()[1])
self.m.ReplayAll()
stack.create()
self.m.StubOutWithMock(parser.Stack, 'load')
parser.Stack.load(self.ctx,
stack=mox.IgnoreArg()).AndReturn(self.stack)
self.m.ReplayAll()
r = self.eng.describe_stack_resource(self.ctx, self.stack.identifier(),
'ServerGroup')
self.assertIn('resource_identity', r)
self.assertIn('description', r)
self.assertIn('updated_time', r)
self.assertIn('stack_identity', r)
self.assertIsNotNone(r['stack_identity'])
self.assertIn('stack_name', r)
self.assertEqual(self.stack.name, r['stack_name'])
self.assertIn('metadata', r)
self.assertIn('resource_status', r)
self.assertIn('resource_status_reason', r)
self.assertIn('resource_type', r)
self.assertIn('physical_resource_id', r)
self.assertIn('resource_name', r)
self.assertIn('members', r)
self.assertEqual([5678, 5678], r['members'])
self.assertEqual('ServerGroup', r['resource_name'])
self.m.VerifyAll()
self.m.UnsetStubs()
patcher.stop()
self.stack.delete()
@stack_context('service_resources_describe_test_stack')
def test_stack_resources_describe(self):
self.m.StubOutWithMock(parser.Stack, 'load')