def adjust(self, adjustment, adjustment_type=CHANGE_IN_CAPACITY): """ Adjust the size of the scaling group if the cooldown permits. """ if self._cooldown_inprogress(): LOG.info( _("%(name)s NOT performing scaling adjustment, " "cooldown %(cooldown)s") % { 'name': self.name, 'cooldown': self.properties[self.COOLDOWN] }) return capacity = len(self.get_instances()) lower = self.properties[self.MIN_SIZE] upper = self.properties[self.MAX_SIZE] new_capacity = _calculate_new_capacity(capacity, adjustment, adjustment_type, lower, upper) if new_capacity == capacity: LOG.debug('no change in capacity %d' % capacity) return # send a notification before, on-error and on-success. notif = { 'stack': self.stack, 'adjustment': adjustment, 'adjustment_type': adjustment_type, 'capacity': capacity, 'groupname': self.FnGetRefId(), 'message': _("Start resizing the group %(group)s") % { 'group': self.FnGetRefId() }, 'suffix': 'start', } notification.send(**notif) try: self.resize(new_capacity) except Exception as resize_ex: with excutils.save_and_reraise_exception(): try: notif.update({ 'suffix': 'error', 'message': six.text_type(resize_ex), }) notification.send(**notif) except Exception: LOG.exception(_('Failed sending error notification')) else: notif.update({ 'suffix': 'end', 'capacity': new_capacity, 'message': _("End resizing the group %(group)s") % { 'group': notif['groupname'] }, }) notification.send(**notif) self._cooldown_timestamp("%s : %s" % (adjustment_type, adjustment))
def adjust(self, adjustment, adjustment_type=sc_util.CFN_CHANGE_IN_CAPACITY, min_adjustment_step=None, signal=False): """Adjust the size of the scaling group if the cooldown permits.""" if not self._is_scaling_allowed(): LOG.info(_LI("%(name)s NOT performing scaling adjustment, " "cooldown %(cooldown)s"), {'name': self.name, 'cooldown': self.properties[self.COOLDOWN]}) if signal: raise exception.NoActionRequired() else: return capacity = grouputils.get_size(self) lower = self.properties[self.MIN_SIZE] upper = self.properties[self.MAX_SIZE] new_capacity = sc_util.calculate_new_capacity(capacity, adjustment, adjustment_type, min_adjustment_step, lower, upper) changed_size = new_capacity != capacity # send a notification before, on-error and on-success. notif = { 'stack': self.stack, 'adjustment': adjustment, 'adjustment_type': adjustment_type, 'capacity': capacity, 'groupname': self.FnGetRefId(), 'message': _("Start resizing the group %(group)s") % { 'group': self.FnGetRefId()}, 'suffix': 'start', } notification.send(**notif) try: self.resize(new_capacity) except Exception as resize_ex: with excutils.save_and_reraise_exception(): try: notif.update({'suffix': 'error', 'message': six.text_type(resize_ex), 'capacity': grouputils.get_size(self), }) notification.send(**notif) except Exception: LOG.exception(_LE('Failed sending error notification')) else: notif.update({ 'suffix': 'end', 'capacity': new_capacity, 'message': _("End resizing the group %(group)s") % { 'group': notif['groupname']}, }) notification.send(**notif) finally: self._finished_scaling("%s : %s" % (adjustment_type, adjustment), changed_size=changed_size) return changed_size
def adjust(self, adjustment, adjustment_type=CHANGE_IN_CAPACITY, min_adjustment_step=None, signal=False): """ Adjust the size of the scaling group if the cooldown permits. """ if self._cooldown_inprogress(): LOG.info(_LI("%(name)s NOT performing scaling adjustment, " "cooldown %(cooldown)s"), {'name': self.name, 'cooldown': self.properties[self.COOLDOWN]}) if signal: raise resource.NoActionRequired() else: return capacity = grouputils.get_size(self) lower = self.properties[self.MIN_SIZE] upper = self.properties[self.MAX_SIZE] new_capacity = _calculate_new_capacity(capacity, adjustment, adjustment_type, min_adjustment_step, lower, upper) # send a notification before, on-error and on-success. notif = { 'stack': self.stack, 'adjustment': adjustment, 'adjustment_type': adjustment_type, 'capacity': capacity, 'groupname': self.FnGetRefId(), 'message': _("Start resizing the group %(group)s") % { 'group': self.FnGetRefId()}, 'suffix': 'start', } notification.send(**notif) try: self.resize(new_capacity) except Exception as resize_ex: with excutils.save_and_reraise_exception(): try: notif.update({'suffix': 'error', 'message': six.text_type(resize_ex), 'capacity': grouputils.get_size(self), }) notification.send(**notif) except Exception: LOG.exception(_LE('Failed sending error notification')) else: notif.update({ 'suffix': 'end', 'capacity': new_capacity, 'message': _("End resizing the group %(group)s") % { 'group': notif['groupname']}, }) notification.send(**notif) finally: self._cooldown_timestamp("%s : %s" % (adjustment_type, adjustment))
def adjust(self, adjustment, adjustment_type=CHANGE_IN_CAPACITY): """ Adjust the size of the scaling group if the cooldown permits. """ if self._cooldown_inprogress(): LOG.info(_("%(name)s NOT performing scaling adjustment, " "cooldown %(cooldown)s") % {'name': self.name, 'cooldown': self.properties[self.COOLDOWN]}) return capacity = len(self.get_instances()) lower = self.properties[self.MIN_SIZE] upper = self.properties[self.MAX_SIZE] new_capacity = _calculate_new_capacity(capacity, adjustment, adjustment_type, lower, upper) if new_capacity == capacity: LOG.debug('no change in capacity %d' % capacity) return # send a notification before, on-error and on-success. notif = { 'stack': self.stack, 'adjustment': adjustment, 'adjustment_type': adjustment_type, 'capacity': capacity, 'groupname': self.FnGetRefId(), 'message': _("Start resizing the group %(group)s") % { 'group': self.FnGetRefId()}, 'suffix': 'start', } notification.send(**notif) try: self.resize(new_capacity) except Exception as resize_ex: with excutils.save_and_reraise_exception(): try: notif.update({'suffix': 'error', 'message': six.text_type(resize_ex), }) notification.send(**notif) except Exception: LOG.exception(_('Failed sending error notification')) else: notif.update({ 'suffix': 'end', 'capacity': new_capacity, 'message': _("End resizing the group %(group)s") % { 'group': notif['groupname']}, }) notification.send(**notif) self._cooldown_timestamp("%s : %s" % (adjustment_type, adjustment))
def adjust(self, adjustment, adjustment_type=sc_util.CFN_CHANGE_IN_CAPACITY, min_adjustment_step=None): """Adjust the size of the scaling group if the cooldown permits.""" if not self._is_scaling_allowed(): LOG.info( _LI("%(name)s NOT performing scaling adjustment, " "cooldown %(cooldown)s"), {"name": self.name, "cooldown": self.properties[self.COOLDOWN]}, ) raise exception.NoActionRequired() capacity = grouputils.get_size(self) new_capacity = self._get_new_capacity(capacity, adjustment, adjustment_type, min_adjustment_step) changed_size = new_capacity != capacity # send a notification before, on-error and on-success. notif = { "stack": self.stack, "adjustment": adjustment, "adjustment_type": adjustment_type, "capacity": capacity, "groupname": self.FnGetRefId(), "message": _("Start resizing the group %(group)s") % {"group": self.FnGetRefId()}, "suffix": "start", } notification.send(**notif) try: self.resize(new_capacity) except Exception as resize_ex: with excutils.save_and_reraise_exception(): try: notif.update( {"suffix": "error", "message": six.text_type(resize_ex), "capacity": grouputils.get_size(self)} ) notification.send(**notif) except Exception: LOG.exception(_LE("Failed sending error notification")) else: notif.update( { "suffix": "end", "capacity": new_capacity, "message": _("End resizing the group %(group)s") % {"group": notif["groupname"]}, } ) notification.send(**notif) finally: self._finished_scaling("%s : %s" % (adjustment_type, adjustment), changed_size=changed_size) return changed_size
def _scale_out(self, adjustment, adjustment_type): capacity = len(self.get_instances()) lower = self.properties[self.MIN_SIZE] upper = self.properties[self.MAX_SIZE] new_capacity = _calculate_new_capacity(capacity, adjustment, adjustment_type, lower, upper) if new_capacity == capacity: LOG.debug('no change in capacity %d' % capacity) return True LOG.debug(_("scale out and vm counts %s") %new_capacity) # send a notification before, on-error and on-success. notif = { 'stack': self.stack, 'adjustment': adjustment, 'adjustment_type': adjustment_type, 'capacity': capacity, 'groupname': self.FnGetRefId(), 'message': _("Start resizing the group %(group)s") % { 'group': self.FnGetRefId()}, 'suffix': 'start', } notification.send(**notif) try: self.resize(new_capacity) except Exception as resize_ex: with excutils.save_and_reraise_exception(): try: notif.update({'suffix': 'error', 'message': six.text_type(resize_ex), }) notification.send(**notif) except Exception: LOG.exception(_('Failed sending error notification')) else: notif.update({ 'suffix': 'end', 'capacity': new_capacity, 'message': _("End resizing the group %(group)s") % { 'group': notif['groupname']}, }) notification.send(**notif)
def _stub_scale_notification(self, adjust, groupname, start_capacity, adjust_type='ChangeInCapacity', end_capacity=None, with_error=None): self.m.StubOutWithMock(notification, 'send') notification.send( stack=mox.IgnoreArg(), adjustment=adjust, adjustment_type=adjust_type, capacity=start_capacity, groupname=mox.IgnoreArg(), suffix='start', message="Start resizing the group %s" % groupname, ).AndReturn(False) if with_error: notification.send( stack=mox.IgnoreArg(), adjustment=adjust, capacity=start_capacity, adjustment_type=adjust_type, groupname=mox.IgnoreArg(), message='Nested stack update failed:' ' Error: %s' % with_error, suffix='error', ).AndReturn(False) else: notification.send( stack=mox.IgnoreArg(), adjustment=adjust, adjustment_type=adjust_type, capacity=end_capacity, groupname=mox.IgnoreArg(), message="End resizing the group %s" % groupname, suffix='end', ).AndReturn(False)
def _stub_scale_notification(self, adjust, groupname, start_capacity, adjust_type='ChangeInCapacity', end_capacity=None, with_error=None): self.m.StubOutWithMock(notification, 'send') notification.send(stack=mox.IgnoreArg(), adjustment=adjust, adjustment_type=adjust_type, capacity=start_capacity, groupname=mox.IgnoreArg(), suffix='start', message="Start resizing the group %s" % groupname, ).AndReturn(False) if with_error: notification.send(stack=mox.IgnoreArg(), adjustment=adjust, capacity=start_capacity, adjustment_type=adjust_type, groupname=mox.IgnoreArg(), message='Nested stack update failed:' ' Error: %s' % with_error, suffix='error', ).AndReturn(False) else: notification.send(stack=mox.IgnoreArg(), adjustment=adjust, adjustment_type=adjust_type, capacity=end_capacity, groupname=mox.IgnoreArg(), message="End resizing the group %s" % groupname, suffix='end', ).AndReturn(False)
def adjust(self, adjustment, adjustment_type=sc_util.CFN_CHANGE_IN_CAPACITY, min_adjustment_step=None): """Adjust the size of the scaling group if the cooldown permits.""" if self.status != self.COMPLETE: LOG.info("%s NOT performing scaling adjustment, " "when status is not COMPLETE", self.name) raise resource.NoActionRequired capacity = grouputils.get_size(self) new_capacity = self._get_new_capacity(capacity, adjustment, adjustment_type, min_adjustment_step) if new_capacity == capacity: LOG.info("%s NOT performing scaling adjustment, " "as there is no change in capacity.", self.name) raise resource.NoActionRequired self._check_scaling_allowed() # send a notification before, on-error and on-success. notif = { 'stack': self.stack, 'adjustment': adjustment, 'adjustment_type': adjustment_type, 'capacity': capacity, 'groupname': self.FnGetRefId(), 'message': _("Start resizing the group %(group)s") % { 'group': self.FnGetRefId()}, 'suffix': 'start', } size_changed = False try: notification.send(**notif) try: self.resize(new_capacity) except Exception as resize_ex: with excutils.save_and_reraise_exception(): try: notif.update({'suffix': 'error', 'message': six.text_type(resize_ex), 'capacity': grouputils.get_size(self), }) notification.send(**notif) except Exception: LOG.exception('Failed sending error notification') else: size_changed = True notif.update({ 'suffix': 'end', 'capacity': new_capacity, 'message': _("End resizing the group %(group)s") % { 'group': notif['groupname']}, }) notification.send(**notif) except Exception: LOG.error("Error in performing scaling adjustment for " "group %s.", self.name) raise finally: self._finished_scaling("%s : %s" % (adjustment_type, adjustment), size_changed=size_changed)
def adjust(self, adjustment, adjustment_type='ChangeInCapacity'): """ Adjust the size of the scaling group if the cooldown permits. """ if self._cooldown_inprogress(): logger.info(_("%(name)s NOT performing scaling adjustment, " "cooldown %(cooldown)s") % { 'name': self.name, 'cooldown': self.properties[self.COOLDOWN]}) return capacity = len(self.get_instances()) if adjustment_type == 'ChangeInCapacity': new_capacity = capacity + adjustment elif adjustment_type == 'ExactCapacity': new_capacity = adjustment else: # PercentChangeInCapacity delta = capacity * adjustment / 100.0 if math.fabs(delta) < 1.0: rounded = int(math.ceil(delta) if delta > 0.0 else math.floor(delta)) else: rounded = int(math.floor(delta) if delta > 0.0 else math.ceil(delta)) new_capacity = capacity + rounded upper = int(self.properties[self.MAX_SIZE]) lower = int(self.properties[self.MIN_SIZE]) if new_capacity > upper: if upper > capacity: logger.info(_('truncating growth to %s') % upper) new_capacity = upper else: logger.warn(_('can not exceed %s') % upper) return if new_capacity < lower: if lower < capacity: logger.info(_('truncating shrinkage to %s') % lower) new_capacity = lower else: logger.warn(_('can not be less than %s') % lower) return if new_capacity == capacity: logger.debug(_('no change in capacity %d') % capacity) return # send a notification before, on-error and on-success. notif = { 'stack': self.stack, 'adjustment': adjustment, 'adjustment_type': adjustment_type, 'capacity': capacity, 'groupname': self.FnGetRefId(), 'message': _("Start resizing the group %(group)s") % { 'group': self.FnGetRefId()}, 'suffix': 'start', } notification.send(**notif) try: self.resize(new_capacity) except Exception as resize_ex: with excutils.save_and_reraise_exception(): try: notif.update({'suffix': 'error', 'message': str(resize_ex), }) notification.send(**notif) except Exception: logger.exception(_('Failed sending error notification')) else: notif.update({ 'suffix': 'end', 'capacity': new_capacity, 'message': _("End resizing the group %(group)s") % { 'group': notif['groupname']}, }) notification.send(**notif) self._cooldown_timestamp("%s : %s" % (adjustment_type, adjustment))
def adjust(self, adjustment, adjustment_type=CHANGE_IN_CAPACITY): """ Adjust the size of the scaling group if the cooldown permits. """ if self._cooldown_inprogress(): logger.info( _("%(name)s NOT performing scaling adjustment, " "cooldown %(cooldown)s") % { 'name': self.name, 'cooldown': self.properties[self.COOLDOWN] }) return capacity = len(self.get_instances()) if adjustment_type == CHANGE_IN_CAPACITY: new_capacity = capacity + adjustment elif adjustment_type == EXACT_CAPACITY: new_capacity = adjustment else: # PercentChangeInCapacity delta = capacity * adjustment / 100.0 if math.fabs(delta) < 1.0: rounded = int( math.ceil(delta) if delta > 0.0 else math.floor(delta)) else: rounded = int( math.floor(delta) if delta > 0.0 else math.ceil(delta)) new_capacity = capacity + rounded upper = self.properties[self.MAX_SIZE] lower = self.properties[self.MIN_SIZE] if new_capacity > upper: if upper > capacity: logger.info(_('truncating growth to %s') % upper) new_capacity = upper else: logger.warn(_('can not exceed %s') % upper) return if new_capacity < lower: if lower < capacity: logger.info(_('truncating shrinkage to %s') % lower) new_capacity = lower else: logger.warn(_('can not be less than %s') % lower) return if new_capacity == capacity: logger.debug('no change in capacity %d' % capacity) return # send a notification before, on-error and on-success. notif = { 'stack': self.stack, 'adjustment': adjustment, 'adjustment_type': adjustment_type, 'capacity': capacity, 'groupname': self.FnGetRefId(), 'message': _("Start resizing the group %(group)s") % { 'group': self.FnGetRefId() }, 'suffix': 'start', } notification.send(**notif) try: self.resize(new_capacity) except Exception as resize_ex: with excutils.save_and_reraise_exception(): try: notif.update({ 'suffix': 'error', 'message': six.text_type(resize_ex), }) notification.send(**notif) except Exception: logger.exception(_('Failed sending error notification')) else: notif.update({ 'suffix': 'end', 'capacity': new_capacity, 'message': _("End resizing the group %(group)s") % { 'group': notif['groupname'] }, }) notification.send(**notif) self._cooldown_timestamp("%s : %s" % (adjustment_type, adjustment))
def adjust(self, adjustment, adjustment_type=sc_util.CFN_CHANGE_IN_CAPACITY, min_adjustment_step=None): """Adjust the size of the scaling group if the cooldown permits.""" if self.status != self.COMPLETE: LOG.info(_LI("%s NOT performing scaling adjustment, " "when status is not COMPLETE") % self.name) raise exception.NoActionRequired() capacity = grouputils.get_size(self) new_capacity = self._get_new_capacity(capacity, adjustment, adjustment_type, min_adjustment_step) if new_capacity == capacity: LOG.info(_LI("%s NOT performing scaling adjustment, " "as there is no change in capacity.") % self.name) raise exception.NoActionRequired() if not self._is_scaling_allowed(): LOG.info(_LI("%(name)s NOT performing scaling adjustment, " "cooldown %(cooldown)s") % { 'name': self.name, 'cooldown': self.properties[self.COOLDOWN]}) raise exception.NoActionRequired() # send a notification before, on-error and on-success. notif = { 'stack': self.stack, 'adjustment': adjustment, 'adjustment_type': adjustment_type, 'capacity': capacity, 'groupname': self.FnGetRefId(), 'message': _("Start resizing the group %(group)s") % { 'group': self.FnGetRefId()}, 'suffix': 'start', } size_changed = False try: notification.send(**notif) try: self.resize(new_capacity) except Exception as resize_ex: with excutils.save_and_reraise_exception(): try: notif.update({'suffix': 'error', 'message': six.text_type(resize_ex), 'capacity': grouputils.get_size(self), }) notification.send(**notif) except Exception: LOG.exception(_LE('Failed sending error notification')) else: size_changed = True notif.update({ 'suffix': 'end', 'capacity': new_capacity, 'message': _("End resizing the group %(group)s") % { 'group': notif['groupname']}, }) notification.send(**notif) except Exception: LOG.error(_LE("Error in performing scaling adjustment for" "group %s.") % self.name) raise finally: self._finished_scaling("%s : %s" % (adjustment_type, adjustment), size_changed=size_changed)