From: Swann Croiset Date: Fri, 6 Sep 2013 12:48:41 +0000 (+0200) Subject: Use physical_resource_name as Ref for Instance/AS Group X-Git-Tag: 2014.1~50^2 X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=01fe09007222a3a701896a514a5de4dba7383e36;p=openstack-build%2Fheat-build.git 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 --- diff --git a/heat/engine/resources/autoscaling.py b/heat/engine/resources/autoscaling.py index 68eaeb3a..34de4010 100644 --- a/heat/engine/resources/autoscaling.py +++ b/heat/engine/resources/autoscaling.py @@ -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, diff --git a/heat/tests/test_autoscaling.py b/heat/tests/test_autoscaling.py index 63a4d7c0..122b0e42 100644 --- a/heat/tests/test_autoscaling.py +++ b/heat/tests/test_autoscaling.py @@ -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' diff --git a/heat/tests/test_instance_group.py b/heat/tests/test_instance_group.py index e1b4c9b7..5d5923b0 100644 --- a/heat/tests/test_instance_group.py +++ b/heat/tests/test_instance_group.py @@ -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() diff --git a/heat/tests/test_server_tags.py b/heat/tests/test_server_tags.py index e6b517e9..68fe782d 100644 --- a/heat/tests/test_server_tags.py +++ b/heat/tests/test_server_tags.py @@ -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()