]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Use physical_resource_name as Ref for Instance/AS Group
authorSwann Croiset <swann.croiset@bull.net>
Fri, 6 Sep 2013 12:48:41 +0000 (14:48 +0200)
committerSwann Croiset <swann.croiset@bull.net>
Tue, 10 Sep 2013 10:53:13 +0000 (12:53 +0200)
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

heat/engine/resources/autoscaling.py
heat/tests/test_autoscaling.py
heat/tests/test_instance_group.py
heat/tests/test_server_tags.py

index 68eaeb3a65fd17ee8e71c0103046f96794bda8ac..34de40100785f3000bd199555a23d5a9b46cd8b9 100644 (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,
index 63a4d7c004353eb3cd9f4c678fbf4b8983b03fec..122b0e425201a5525e0e9ee06bb0586ff0fef20f 100644 (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'
index e1b4c9b73e3c8299ec6dfc8fa5aad5d2ce3e7387..5d5923b0b979e949a0f6c05cb181291bf16d9927 100644 (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()
 
index e6b517e9ac7347ce633673e7a72d960af362efe1..68fe782df9e8f801acc3979aaa3c79a5f5b0827b 100644 (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()