From 6e22014cadf0a2da5590b6005f84a045b6f41ddb Mon Sep 17 00:00:00 2001 From: tengqm Date: Thu, 14 Aug 2014 16:36:49 +0800 Subject: [PATCH] Move CooldownMixin into separate file CooldownMixin is a class that can be shared between OS and AWS auto-scaling implementations. This patch moves it to a shared subdirectory. Implements: partial-blueprint reorg-asg-code Change-Id: I40e470460e84944d317f5b1772fc562abf62896d --- heat/engine/resources/autoscaling.py | 36 ++--------------------- heat/scaling/cooldown.py | 44 ++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 33 deletions(-) create mode 100644 heat/scaling/cooldown.py diff --git a/heat/engine/resources/autoscaling.py b/heat/engine/resources/autoscaling.py index a30e1f728..0c1614bf0 100644 --- a/heat/engine/resources/autoscaling.py +++ b/heat/engine/resources/autoscaling.py @@ -31,7 +31,7 @@ from heat.engine import signal_responder from heat.engine import stack_resource from heat.openstack.common import excutils from heat.openstack.common import log as logging -from heat.openstack.common import timeutils +from heat.scaling import cooldown from heat.scaling import template LOG = logging.getLogger(__name__) @@ -44,36 +44,6 @@ LOG = logging.getLogger(__name__) 'ExactCapacity', 'ChangeInCapacity', 'PercentChangeInCapacity') -class CooldownMixin(object): - ''' - Utility class to encapsulate Cooldown related logic which is shared - between AutoScalingGroup and ScalingPolicy - ''' - def _cooldown_inprogress(self): - inprogress = False - try: - # Negative values don't make sense, so they are clamped to zero - cooldown = max(0, self.properties[self.COOLDOWN]) - except TypeError: - # If not specified, it will be None, same as cooldown == 0 - cooldown = 0 - - metadata = self.metadata_get() - if metadata and cooldown != 0: - last_adjust = metadata.keys()[0] - if not timeutils.is_older_than(last_adjust, cooldown): - inprogress = True - return inprogress - - def _cooldown_timestamp(self, reason): - # Save resource metadata with a timestamp and reason - # If we wanted to implement the AutoScaling API like AWS does, - # we could maintain event history here, but since we only need - # the latest event for cooldown, just store that for now - metadata = {timeutils.strtime(): reason} - self.metadata_set(metadata) - - def _calculate_new_capacity(current, adjustment, adjustment_type, minimum, maximum): """ @@ -473,7 +443,7 @@ class InstanceGroup(stack_resource.StackResource): return self._environment() -class AutoScalingGroup(InstanceGroup, CooldownMixin): +class AutoScalingGroup(InstanceGroup, cooldown.CooldownMixin): PROPERTIES = ( AVAILABILITY_ZONES, LAUNCH_CONFIGURATION_NAME, MAX_SIZE, MIN_SIZE, @@ -946,7 +916,7 @@ class AutoScalingResourceGroup(AutoScalingGroup): template_version=template_version) -class ScalingPolicy(signal_responder.SignalResponder, CooldownMixin): +class ScalingPolicy(signal_responder.SignalResponder, cooldown.CooldownMixin): PROPERTIES = ( AUTO_SCALING_GROUP_NAME, SCALING_ADJUSTMENT, ADJUSTMENT_TYPE, COOLDOWN, diff --git a/heat/scaling/cooldown.py b/heat/scaling/cooldown.py new file mode 100644 index 000000000..54e84ccc2 --- /dev/null +++ b/heat/scaling/cooldown.py @@ -0,0 +1,44 @@ +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from heat.openstack.common import timeutils + + +class CooldownMixin(object): + ''' + Utility class to encapsulate Cooldown related logic which is shared + between AutoScalingGroup and ScalingPolicy + ''' + def _cooldown_inprogress(self): + inprogress = False + try: + # Negative values don't make sense, so they are clamped to zero + cooldown = max(0, self.properties[self.COOLDOWN]) + except TypeError: + # If not specified, it will be None, same as cooldown == 0 + cooldown = 0 + + metadata = self.metadata_get() + if metadata and cooldown != 0: + last_adjust = metadata.keys()[0] + if not timeutils.is_older_than(last_adjust, cooldown): + inprogress = True + return inprogress + + def _cooldown_timestamp(self, reason): + # Save resource metadata with a timestamp and reason + # If we wanted to implement the AutoScaling API like AWS does, + # we could maintain event history here, but since we only need + # the latest event for cooldown, just store that for now + metadata = {timeutils.strtime(): reason} + self.metadata_set(metadata)