Rework autoscaling group current_size attribute

The current implementation requires a path which is not needed.
rsrc.FnGetAtt('current_size', 'name')
it should allow:
rsrc.FnGetAtt('current_size')

Also move the tests to the correct test module and make them more
into unit tests.

Change-Id: Id05a1f09ecc6741cbf677baf52fbb58d93028ac4
This commit is contained in:
Angus Salkeld 2014-10-07 13:18:57 +10:00
parent aa38bab972
commit 30ffcdca4e
3 changed files with 23 additions and 81 deletions

View File

@ -845,6 +845,8 @@ class AutoScalingResourceGroup(AutoScalingGroup):
template_version=template_version)
def FnGetAtt(self, key, *path):
if key == self.CURRENT_SIZE:
return len(self.get_instances())
if path:
attrs = ((rsrc.name,
rsrc.FnGetAtt(*path)) for rsrc in self.get_instances())
@ -852,8 +854,6 @@ class AutoScalingResourceGroup(AutoScalingGroup):
return dict(attrs)
if key == self.OUTPUTS_LIST:
return [value for name, value in attrs]
if key == self.CURRENT_SIZE:
return len(list(attrs))
raise exception.InvalidTemplateAttribute(resource=self.name,
key=key)

View File

@ -40,53 +40,6 @@ from heat.tests import utils
as_template = inline_templates.as_template
as_template_HoT = '''
{
"heat_template_version": "2013-05-23",
"description": "AutoScaling Test",
"parameters": {
"flavor": {"type": "string"},
"image": {"type": "string"}
},
"resources": {
"WebServerGroup": {
"type": "OS::Heat::AutoScalingGroup",
"properties": {
"min_size": 1,
"max_size": 5,
"desired_capacity": 1,
"resource": {
"type": "OS::Nova::Server",
"properties": {
"flavor": {"get_param": "flavor"},
"image": {"get_param": "image"},
"metadata": {"metering.stack": "test-metadata"}
}
}
}
},
"WebServerScaleUpPolicy": {
"type": "OS::Heat::ScalingPolicy",
"properties": {
"adjustment_type": "change_in_capacity",
"auto_scaling_group_id": {"get_resource": "WebServerGroup"},
"cooldown": 60,
"scaling_adjustment": 1
}
},
"WebServerScaleDownPolicy": {
"type": "OS::Heat::ScalingPolicy",
"properties": {
"adjustment_type": "change_in_capacity",
"auto_scaling_group_id": {"get_resource": "WebServerGroup"},
"cooldown": 60,
"scaling_adjustment": -1
}
}
}
}
'''
as_template_bad_group = '''
{
"AWSTemplateFormatVersion" : "2010-09-09",
@ -1064,33 +1017,6 @@ class AutoScalingTest(common.HeatTestCase):
rsrc.delete()
self.m.VerifyAll()
def test_scaling_group_current_size(self):
t = template_format.parse(as_template_HoT)
stack = utils.parse_stack(t, params=self.params_HoT)
# create asg with size of 2
properties = t['resources']['WebServerGroup']['properties']
properties['desired_capacity'] = '2'
now = timeutils.utcnow()
self._stub_meta_expected(now, 'ExactCapacity : 2')
self._stub_create_hot(2)
self.m.ReplayAll()
rsrc = self.create_scaling_group_hot(t, stack, 'WebServerGroup')
self.assertEqual(2, rsrc.FnGetAtt("current_size", 'name'))
self.m.VerifyAll()
self.m.UnsetStubs()
# raise to 3
self._stub_meta_expected(now, 'ChangeInCapacity : 1')
self._stub_create_hot(1)
self._stub_scale_notification(adjust=1, groupname=rsrc.FnGetRefId(),
start_capacity=2, end_capacity=3)
self.m.ReplayAll()
rsrc.adjust(1)
self.assertEqual(3, rsrc.FnGetAtt("current_size", 'name'))
self.m.VerifyAll()
def test_scaling_policy_bad_group(self):
t = template_format.parse(as_template_bad_group)
stack = utils.parse_stack(t, params=self.params)

View File

@ -21,15 +21,16 @@ from heat.common import exception
from heat.common import short_id
from heat.common import template_format
from heat.engine import resource
from heat.engine.resources import autoscaling
from heat.engine import rsrc_defn
from heat.engine import scheduler
from heat.engine import stack_resource
from heat.tests.common import HeatTestCase
from heat.tests import common
from heat.tests import generic_resource
from heat.tests import utils
class AutoScalingGroupTest(HeatTestCase):
class AutoScalingGroupTest(common.HeatTestCase):
as_template = '''
heat_template_version: 2013-05-23
@ -264,8 +265,23 @@ class AutoScalingGroupTest(HeatTestCase):
self.assertEqual(dict((n, n) for n in member_names),
rsrc.FnGetAtt('outputs', 'Bar'))
def test_attribute_current_size(self):
rsrc = self.create_stack(self.parsed)['my-group']
mock_instances = self.patchobject(autoscaling.AutoScalingResourceGroup,
'get_instances')
mock_instances.return_value = ['one', 'two', 'three']
class HeatScalingGroupWithCFNScalingPolicyTest(HeatTestCase):
self.assertEqual(3, rsrc.FnGetAtt('current_size'))
def test_attribute_current_size_with_path(self):
rsrc = self.create_stack(self.parsed)['my-group']
mock_instances = self.patchobject(autoscaling.AutoScalingResourceGroup,
'get_instances')
mock_instances.return_value = ['one', 'two', 'three', 'four']
self.assertEqual(4, rsrc.FnGetAtt('current_size', 'name'))
class HeatScalingGroupWithCFNScalingPolicyTest(common.HeatTestCase):
as_template = '''
heat_template_version: 2013-05-23
description: AutoScaling Test
@ -322,7 +338,7 @@ class HeatScalingGroupWithCFNScalingPolicyTest(HeatTestCase):
group.FnGetAtt, 'InstanceList')
class ScalingPolicyTest(HeatTestCase):
class ScalingPolicyTest(common.HeatTestCase):
# TODO(Qiming): Add more tests to the scaling policy
as_template = '''
heat_template_version: 2013-05-23
@ -392,7 +408,7 @@ class ScalingPolicyTest(HeatTestCase):
self.assertEqual(3, len(group.get_instance_names()))
class RollingUpdatesTest(HeatTestCase):
class RollingUpdatesTest(common.HeatTestCase):
as_template = '''
heat_template_version: 2013-05-23