summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--heat/engine/resources/autoscaling.py6
-rw-r--r--heat/tests/test_instance_group.py46
2 files changed, 44 insertions, 8 deletions
diff --git a/heat/engine/resources/autoscaling.py b/heat/engine/resources/autoscaling.py
index da937f110..94edf816f 100644
--- a/heat/engine/resources/autoscaling.py
+++ b/heat/engine/resources/autoscaling.py
@@ -113,14 +113,16 @@ class InstanceGroup(resource.Resource):
self._wait_for_activation(creator)
def _make_instance(self, name):
-
+ # We look up and subclass the class for AWS::EC2::Instance instead of
+ # just importing Instance, so that if someone overrides that resource
+ # we'll use the custom one.
Instance = resource.get_class('AWS::EC2::Instance',
resource_name=name,
environment=self.stack.env)
class GroupedInstance(Instance):
'''
- Subclass instance.Instance to supress event transitions, since the
+ Subclass Instance to suppress event transitions, since the
scaling-group instances are not "real" resources, ie defined in the
template, which causes problems for event handling since we can't
look up the resources via parser.Stack
diff --git a/heat/tests/test_instance_group.py b/heat/tests/test_instance_group.py
index 5cf135575..e387975e2 100644
--- a/heat/tests/test_instance_group.py
+++ b/heat/tests/test_instance_group.py
@@ -19,6 +19,7 @@ from heat.common import template_format
from heat.engine.resources import autoscaling as asc
from heat.engine.resources import instance
from heat.engine import resource
+from heat.engine import resources
from heat.engine import scheduler
from heat.tests.common import HeatTestCase
from heat.tests.utils import setup_dummy_db
@@ -59,15 +60,21 @@ class InstanceGroupTest(HeatTestCase):
super(InstanceGroupTest, self).setUp()
setup_dummy_db()
- def _stub_create(self, num):
+ def _stub_create(self, num, instance_class=instance.Instance):
+ """
+ Expect creation of C{num} number of Instances.
- self.m.StubOutWithMock(instance.Instance, 'handle_create')
- self.m.StubOutWithMock(instance.Instance, 'check_create_complete')
+ :param instance_class: The resource class to expect to be created
+ instead of instance.Instance.
+ """
+
+ self.m.StubOutWithMock(instance_class, 'handle_create')
+ self.m.StubOutWithMock(instance_class, 'check_create_complete')
cookie = object()
for x in range(num):
- instance.Instance.handle_create().AndReturn(cookie)
- instance.Instance.check_create_complete(cookie).AndReturn(False)
- instance.Instance.check_create_complete(
+ instance_class.handle_create().AndReturn(cookie)
+ instance_class.check_create_complete(cookie).AndReturn(False)
+ instance_class.check_create_complete(
cookie).MultipleTimes().AndReturn(True)
def create_instance_group(self, t, stack, resource_name):
@@ -99,6 +106,33 @@ class InstanceGroupTest(HeatTestCase):
rsrc.delete()
self.m.VerifyAll()
+ def test_instance_group_custom_resource(self):
+ """
+ If AWS::EC2::Instance is overridden, InstanceGroup will automatically
+ use that overridden resource type.
+ """
+ # resources may need to be initialised if this is the first test run.
+ resources.initialise()
+
+ class MyInstance(instance.Instance):
+ """A customized Instance resource."""
+
+ original_instance = resource.get_class("AWS::EC2::Instance")
+ resource._register_class("AWS::EC2::Instance", MyInstance)
+ self.addCleanup(resource._register_class, "AWS::EC2::Instance",
+ original_instance)
+
+ t = template_format.parse(ig_template)
+ stack = parse_stack(t)
+ self._stub_create(1, instance_class=MyInstance)
+
+ self.m.ReplayAll()
+
+ rsrc = self.create_instance_group(t, stack, 'JobServerGroup')
+ self.assertEqual('JobServerGroup', rsrc.FnGetRefId())
+ rsrc.delete()
+ self.m.VerifyAll()
+
def test_missing_image(self):
t = template_format.parse(ig_template)