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
This commit is contained in:
tengqm 2014-08-14 16:36:49 +08:00
parent 60e6eeb075
commit 6e22014cad
2 changed files with 47 additions and 33 deletions

View File

@ -31,7 +31,7 @@ from heat.engine import signal_responder
from heat.engine import stack_resource from heat.engine import stack_resource
from heat.openstack.common import excutils from heat.openstack.common import excutils
from heat.openstack.common import log as logging from heat.openstack.common import log as logging
from heat.openstack.common import timeutils from heat.scaling import cooldown
from heat.scaling import template from heat.scaling import template
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
@ -44,36 +44,6 @@ LOG = logging.getLogger(__name__)
'ExactCapacity', 'ChangeInCapacity', 'PercentChangeInCapacity') '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, def _calculate_new_capacity(current, adjustment, adjustment_type,
minimum, maximum): minimum, maximum):
""" """
@ -473,7 +443,7 @@ class InstanceGroup(stack_resource.StackResource):
return self._environment() return self._environment()
class AutoScalingGroup(InstanceGroup, CooldownMixin): class AutoScalingGroup(InstanceGroup, cooldown.CooldownMixin):
PROPERTIES = ( PROPERTIES = (
AVAILABILITY_ZONES, LAUNCH_CONFIGURATION_NAME, MAX_SIZE, MIN_SIZE, AVAILABILITY_ZONES, LAUNCH_CONFIGURATION_NAME, MAX_SIZE, MIN_SIZE,
@ -946,7 +916,7 @@ class AutoScalingResourceGroup(AutoScalingGroup):
template_version=template_version) template_version=template_version)
class ScalingPolicy(signal_responder.SignalResponder, CooldownMixin): class ScalingPolicy(signal_responder.SignalResponder, cooldown.CooldownMixin):
PROPERTIES = ( PROPERTIES = (
AUTO_SCALING_GROUP_NAME, SCALING_ADJUSTMENT, ADJUSTMENT_TYPE, AUTO_SCALING_GROUP_NAME, SCALING_ADJUSTMENT, ADJUSTMENT_TYPE,
COOLDOWN, COOLDOWN,

44
heat/scaling/cooldown.py Normal file
View File

@ -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)