Use physical_resource_name as Ref for Instance/AS Group

This allows to distinguish groups by stack when using resource
OS::Metering::Alarm with the rule:
matching_metadata: {
    'metadata.user_metadata.groupname': { 'Ref': 'WebServerASGroup'}}

And add test for AutoScalingGroup Tags

fixe bug #1215840

Change-Id: If3de5c4abddcfb49f711db223a0c1a8c70f3c15a
This commit is contained in:
Swann Croiset 2013-09-06 14:48:41 +02:00
parent 340dc1bdd2
commit 01fe090072
4 changed files with 116 additions and 17 deletions

View File

@ -249,7 +249,7 @@ class InstanceGroup(stack_resource.StackResource):
scheduler.TaskRunner(lb_resource.update, resolved_snippet)()
def FnGetRefId(self):
return unicode(self.name)
return self.physical_resource_name()
def _resolve_attribute(self, name):
'''
@ -409,9 +409,6 @@ class AutoScalingGroup(InstanceGroup, CooldownMixin):
'Value': self.FnGetRefId()}]
return super(AutoScalingGroup, self)._tags() + autoscaling_tag
def FnGetRefId(self):
return unicode(self.name)
def validate(self):
res = super(AutoScalingGroup, self).validate()
if res:
@ -512,7 +509,8 @@ class ScalingPolicy(signal_responder.SignalResponder, CooldownMixin):
(self.name, self.properties['Cooldown']))
return
group = self.stack[self.properties['AutoScalingGroupName']]
asgn_id = self.properties['AutoScalingGroupName']
group = self.stack.resource_by_refid(asgn_id)
logger.info('%s Alarm, adjusting Group %s by %s' %
(self.name, group.name,

View File

@ -237,7 +237,8 @@ class AutoScalingTest(HeatTestCase):
self.m.ReplayAll()
rsrc = self.create_scaling_group(t, stack, 'WebServerGroup')
self.assertEqual('WebServerGroup', rsrc.FnGetRefId())
self.assertEqual(utils.PhysName(stack.name, rsrc.name),
rsrc.FnGetRefId())
self.assertEqual(['WebServerGroup-0'], rsrc.get_instance_names())
update_snippet = copy.deepcopy(rsrc.parsed_template())
update_snippet['Properties']['AvailabilityZones'] = ['foo']
@ -257,7 +258,8 @@ class AutoScalingTest(HeatTestCase):
self._stub_create(1)
self.m.ReplayAll()
rsrc = self.create_scaling_group(t, stack, 'WebServerGroup')
self.assertEqual('WebServerGroup', rsrc.FnGetRefId())
self.assertEqual(utils.PhysName(stack.name, rsrc.name),
rsrc.FnGetRefId())
self.assertEqual(['WebServerGroup-0'], rsrc.get_instance_names())
self.assertEqual(rsrc.state, (rsrc.CREATE, rsrc.COMPLETE))
@ -288,7 +290,8 @@ class AutoScalingTest(HeatTestCase):
self._stub_create(1)
self.m.ReplayAll()
rsrc = self.create_scaling_group(t, stack, 'WebServerGroup')
self.assertEqual('WebServerGroup', rsrc.FnGetRefId())
self.assertEqual(utils.PhysName(stack.name, rsrc.name),
rsrc.FnGetRefId())
self.assertEqual(['WebServerGroup-0'], rsrc.get_instance_names())
self.assertEqual(rsrc.state, (rsrc.CREATE, rsrc.COMPLETE))
@ -325,7 +328,8 @@ class AutoScalingTest(HeatTestCase):
self._stub_create(2)
self.m.ReplayAll()
rsrc = self.create_scaling_group(t, stack, 'WebServerGroup')
self.assertEqual('WebServerGroup', rsrc.FnGetRefId())
self.assertEqual(utils.PhysName(stack.name, rsrc.name),
rsrc.FnGetRefId())
self.assertEqual(['WebServerGroup-0', 'WebServerGroup-1'],
rsrc.get_instance_names())
self.assertEqual(rsrc.state, (rsrc.CREATE, rsrc.COMPLETE))
@ -363,7 +367,8 @@ class AutoScalingTest(HeatTestCase):
self._stub_create(2)
self.m.ReplayAll()
rsrc = self.create_scaling_group(t, stack, 'WebServerGroup')
self.assertEqual('WebServerGroup', rsrc.FnGetRefId())
self.assertEqual(utils.PhysName(stack.name, rsrc.name),
rsrc.FnGetRefId())
self.assertEqual(['WebServerGroup-0', 'WebServerGroup-1'],
rsrc.get_instance_names())
self.assertEqual(rsrc.state, (rsrc.CREATE, rsrc.COMPLETE))
@ -403,7 +408,8 @@ class AutoScalingTest(HeatTestCase):
self._stub_create(1)
self.m.ReplayAll()
rsrc = self.create_scaling_group(t, stack, 'WebServerGroup')
self.assertEqual('WebServerGroup', rsrc.FnGetRefId())
self.assertEqual(utils.PhysName(stack.name, rsrc.name),
rsrc.FnGetRefId())
self.assertEqual(['WebServerGroup-0'], rsrc.get_instance_names())
self.assertEqual(rsrc.state, (rsrc.CREATE, rsrc.COMPLETE))
@ -434,7 +440,8 @@ class AutoScalingTest(HeatTestCase):
self._stub_create(1)
self.m.ReplayAll()
rsrc = self.create_scaling_group(t, stack, 'WebServerGroup')
self.assertEqual('WebServerGroup', rsrc.FnGetRefId())
self.assertEqual(utils.PhysName(stack.name, rsrc.name),
rsrc.FnGetRefId())
self.assertEqual(['WebServerGroup-0'], rsrc.get_instance_names())
self.assertEqual(rsrc.state, (rsrc.CREATE, rsrc.COMPLETE))
@ -615,7 +622,8 @@ class AutoScalingTest(HeatTestCase):
self.m.ReplayAll()
rsrc = self.create_scaling_group(t, stack, 'WebServerGroup')
self.assertEqual('WebServerGroup', rsrc.FnGetRefId())
self.assertEqual(utils.PhysName(stack.name, rsrc.name),
rsrc.FnGetRefId())
self.assertEqual(['WebServerGroup-0'], rsrc.get_instance_names())
update_snippet = copy.deepcopy(rsrc.parsed_template())
update_snippet['Properties']['Cooldown'] = '61'
@ -656,7 +664,8 @@ class AutoScalingTest(HeatTestCase):
self.m.ReplayAll()
rsrc = self.create_scaling_group(t, stack, 'WebServerGroup')
self.assertEqual('WebServerGroup', rsrc.FnGetRefId())
self.assertEqual(utils.PhysName(stack.name, rsrc.name),
rsrc.FnGetRefId())
self.assertEqual(['WebServerGroup-0'], rsrc.get_instance_names())
update_snippet = copy.deepcopy(rsrc.parsed_template())
update_snippet['Properties']['Cooldown'] = '61'

View File

@ -102,7 +102,8 @@ class InstanceGroupTest(HeatTestCase):
self.m.ReplayAll()
conf = self.create_resource(t, stack, 'JobServerConfig')
rsrc = self.create_resource(t, stack, 'JobServerGroup')
self.assertEqual('JobServerGroup', rsrc.FnGetRefId())
self.assertEqual(utils.PhysName(stack.name, rsrc.name),
rsrc.FnGetRefId())
self.assertEqual('1.2.3.4', rsrc.FnGetAtt('InstanceList'))
nested = rsrc.nested()
@ -134,7 +135,8 @@ class InstanceGroupTest(HeatTestCase):
self.m.ReplayAll()
conf = self.create_resource(t, stack, 'JobServerConfig')
rsrc = self.create_resource(t, stack, 'JobServerGroup')
self.assertEqual('JobServerGroup', rsrc.FnGetRefId())
self.assertEqual(utils.PhysName(stack.name, rsrc.name),
rsrc.FnGetRefId())
rsrc.delete()
self.m.VerifyAll()

View File

@ -84,6 +84,42 @@ group_template = '''
}
'''
autoscaling_template = '''
{
"AWSTemplateFormatVersion" : "2010-09-09",
"Description" : "WordPress",
"Parameters" : {
"KeyName" : {
"Description" : "KeyName",
"Type" : "String",
"Default" : "test"
}
},
"Resources" : {
"Config": {
"Type": "AWS::AutoScaling::LaunchConfiguration",
"Properties": {
"ImageId" : "CentOS 5.2",
"InstanceType" : "256 MB Server",
"KeyName" : "test",
"UserData" : "wordpress"
}
},
"WebServer": {
"Type": "AWS::AutoScaling::AutoScalingGroup",
"Properties": {
"AvailabilityZones" : ["nova"],
"LaunchConfigurationName": { "Ref": "Config" },
"MinSize" : "1",
"MaxSize" : "2",
"Tags" : [{"Key" : "foo", "Value" : "42"}],
}
}
}
}
'''
class ServerTagsTest(HeatTestCase):
def setUp(self):
@ -153,6 +189,9 @@ class ServerTagsTest(HeatTestCase):
group = stack.resources['WebServer']
nova_tags['metering.groupname'] = utils.PhysName(stack.name,
group.name)
self.m.StubOutWithMock(instances.Instance, 'nova')
instances.Instance.nova().MultipleTimes().AndReturn(self.fc)
@ -173,10 +212,61 @@ class ServerTagsTest(HeatTestCase):
def test_group_tags(self):
tags = [{'Key': 'Food', 'Value': 'yum'}]
metadata = dict((tm['Key'], tm['Value']) for tm in tags)
metadata['metering.groupname'] = 'WebServer'
group = self._setup_test_group(intags=tags, nova_tags=metadata)
self.m.ReplayAll()
scheduler.TaskRunner(group.create)()
# we are just using mock to verify that the tags get through to the
# nova call.
self.m.VerifyAll()
def _setup_test_group_autoscaling(self, intags=None, nova_tags=None):
stack_name = 'tag_as_name'
t = template_format.parse(autoscaling_template)
template = parser.Template(t)
stack = parser.Stack(utils.dummy_context(), stack_name, template,
environment.Environment({'KeyName': 'test'}),
stack_id=uuidutils.generate_uuid())
t['Resources']['WebServer']['Properties']['Tags'] += intags
# create the launch configuration
conf = stack.resources['Config']
self.assertEqual(None, conf.validate())
scheduler.TaskRunner(conf.create)()
self.assertEqual((conf.CREATE, conf.COMPLETE), conf.state)
group = stack.resources['WebServer']
group_refid = utils.PhysName(stack.name, group.name)
nova_tags['metering.groupname'] = group_refid
nova_tags['AutoScalingGroupName'] = group_refid
self.m.StubOutWithMock(group, '_cooldown_timestamp')
group._cooldown_timestamp(mox.IgnoreArg()).AndReturn(None)
self.m.StubOutWithMock(instances.Instance, 'nova')
instances.Instance.nova().MultipleTimes().AndReturn(self.fc)
group.t = group.stack.resolve_runtime_data(group.t)
# need to resolve the template functions
self.m.StubOutWithMock(self.fc.servers, 'create')
self.fc.servers.create(
image=1, flavor=1, key_name='test',
name=mox.IgnoreArg(),
security_groups=None,
userdata=mox.IgnoreArg(), scheduler_hints=None,
meta=nova_tags, nics=None, availability_zone=None).AndReturn(
self.fc.servers.list()[1])
return group
def test_as_group_tags(self):
tags = [{'Key': 'Food', 'Value': 'yum'}, {'Key': 'foo', 'Value': '42'}]
metadata = dict((tm['Key'], tm['Value']) for tm in tags)
group = self._setup_test_group_autoscaling(intags=[tags[0]],
nova_tags=metadata)
self.m.ReplayAll()
scheduler.TaskRunner(group.create)()
# we are just using mock to verify that the tags get through to the
# nova call.
self.m.VerifyAll()