# License for the specific language governing permissions and limitations
# under the License.
+import eventlet
+
from heat.common import exception
from heat.engine import resource
def __init__(self, name, json_snippet, stack):
super(InstanceGroup, self).__init__(name, json_snippet, stack)
- # resource_id is a list of resources
+ self._activating = []
def handle_create(self):
self.resize(int(self.properties['Size']), raise_on_error=True)
+ def check_active(self):
+ active = all(i.check_active(override=False) for i in self._activating)
+ if active:
+ self._activating = []
+ return active
+
+ def _wait_for_activation(self):
+ while not self.check_active():
+ eventlet.sleep(1)
+
def handle_update(self, json_snippet):
try:
tmpl_diff = self.update_template_diff(json_snippet)
if len(inst_list) != int(self.properties['Size']):
self.resize(int(self.properties['Size']),
raise_on_error=True)
+ self._wait_for_activation()
return self.UPDATE_COMPLETE
def state_set(self, new_state, reason="state changed"):
self._store_or_update(new_state, reason)
+ def check_active(self, override=True):
+ '''
+ By default, report that the instance is active so that we
+ won't wait for it in create().
+ '''
+ if override:
+ return True
+ return super(GroupedInstance, self).check_active()
+
conf = self.properties['LaunchConfigurationName']
instance_definition = self.stack.t['Resources'][conf]
return GroupedInstance(name, instance_definition, self.stack)
name = '%s-%d' % (self.name, x)
inst = self._make_instance(name)
inst_list.append(name)
+ self._activating.append(inst)
self.resource_id_set(','.join(inst_list))
logger.info('creating inst')
error_str = inst.create()
if new_capacity is not None:
self._adjust(new_capacity)
+ self._wait_for_activation()
return self.UPDATE_COMPLETE
def adjust(self, adjustment, adjustment_type='ChangeInCapacity'):
self._adjust(adjustment, adjustment_type, False)
+ self._wait_for_activation()
def _adjust(self, adjustment, adjustment_type='ExactCapacity',
raise_on_error=True):
import datetime
import copy
+import eventlet
import unittest
import mox
return resource
def _stub_create(self, num):
+ self.m.StubOutWithMock(eventlet, 'sleep')
+
self.m.StubOutWithMock(instance.Instance, 'create')
+ self.m.StubOutWithMock(instance.Instance, 'check_active')
for x in range(num):
instance.Instance.create().AndReturn(None)
+ instance.Instance.check_active().AndReturn(False)
+ eventlet.sleep(mox.IsA(int)).AndReturn(None)
+ instance.Instance.check_active().MultipleTimes().AndReturn(True)
def _stub_lb_reload(self, expected_list, unset=True):
if unset:
import copy
import os
+import eventlet
import unittest
import mox
return stack
def _stub_create(self, num):
+ self.m.StubOutWithMock(eventlet, 'sleep')
+
self.m.StubOutWithMock(instance.Instance, 'create')
+ self.m.StubOutWithMock(instance.Instance, 'check_active')
for x in range(num):
instance.Instance.create().AndReturn(None)
+ instance.Instance.check_active().AndReturn(False)
+ eventlet.sleep(mox.IsA(int)).AndReturn(None)
+ instance.Instance.check_active().MultipleTimes().AndReturn(True)
def create_instance_group(self, t, stack, resource_name):
resource = asc.InstanceGroup(resource_name,