def test_scale_vnf_scale_wait_failed_exception(self): dummy_vnf_obj, vnf_scale = \ self._get_scaling_vnf('in') self.scale_wait.side_effect = vnfm.VNFScaleWaitFailed(reason='test') self.assertRaises(vnfm.VNFScaleWaitFailed, self.vnfm_plugin.create_vnf_scale, self.context, dummy_vnf_obj['id'], vnf_scale)
def scale_wait(self, context, plugin, auth_attr, policy, region_name, last_event_id): heatclient = hc.HeatClient(auth_attr, region_name) # TODO(kanagaraj-manickam) make wait logic into separate utility method # and make use of it here and other actions like create and delete stack_retries = self.STACK_RETRIES while (True): try: time.sleep(self.STACK_RETRY_WAIT) stack_id = policy['instance_id'] policy_name = get_scaling_policy_name( policy_name=policy['name'], action=policy['action']) events = heatclient.resource_event_list(stack_id, policy_name, limit=1, sort_dir='desc', sort_keys='event_time') if events[0].id != last_event_id: if events[0].resource_status == 'SIGNAL_COMPLETE': break except Exception as e: error_reason = _("VNF scaling failed for stack %(stack)s with " "error %(error)s") % { 'stack': policy['instance_id'], 'error': str(e) } LOG.warning(error_reason) raise vnfm.VNFScaleWaitFailed(vnf_id=policy['vnf']['id'], reason=error_reason) if stack_retries == 0: metadata = heatclient.resource_metadata(stack_id, policy_name) if not metadata['scaling_in_progress']: error_reason = _('when signal occurred within cool down ' 'window, no events generated from heat, ' 'so ignore it') LOG.warning(error_reason) break error_reason = _( "VNF scaling failed to complete within %{wait}s seconds " "while waiting for the stack %(stack)s to be " "scaled.") % { 'stack': stack_id, 'wait': self.STACK_RETRIES * self.STACK_RETRY_WAIT } LOG.warning(error_reason) raise vnfm.VNFScaleWaitFailed(vnf_id=policy['vnf']['id'], reason=error_reason) stack_retries -= 1 def _fill_scaling_group_name(): vnf = policy['vnf'] scaling_group_names = vnf['attributes']['scaling_group_names'] policy['group_name'] = jsonutils.loads(scaling_group_names)[ policy['name']] _fill_scaling_group_name() mgmt_ips = self._find_mgmt_ips_from_groups(heatclient, policy['instance_id'], [policy['group_name']]) return jsonutils.dumps(mgmt_ips)