Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(287)

Unified Diff: boto/ec2/autoscale/__init__.py

Issue 8386013: Merging in latest boto. (Closed) Base URL: svn://svn.chromium.org/boto
Patch Set: Redoing vendor drop by deleting and then merging. Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « boto/ec2/address.py ('k') | boto/ec2/autoscale/activity.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: boto/ec2/autoscale/__init__.py
diff --git a/boto/ec2/autoscale/__init__.py b/boto/ec2/autoscale/__init__.py
index 5d68b3288ee134ff9750ed4b9eea05acb2be60ec..680c28f486850d368f22b821d06a50fe1388b819 100644
--- a/boto/ec2/autoscale/__init__.py
+++ b/boto/ec2/autoscale/__init__.py
@@ -1,4 +1,5 @@
-# Copyright (c) 2009 Reza Lotun http://reza.lotun.name/
+# Copyright (c) 2009-2011 Reza Lotun http://reza.lotun.name/
+# Copyright (c) 2011 Jann Kleen
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the
@@ -24,26 +25,68 @@ This module provides an interface to the Elastic Compute Cloud (EC2)
Auto Scaling service.
"""
+import base64
+
import boto
from boto.connection import AWSQueryConnection
from boto.ec2.regioninfo import RegionInfo
from boto.ec2.autoscale.request import Request
-from boto.ec2.autoscale.trigger import Trigger
from boto.ec2.autoscale.launchconfig import LaunchConfiguration
-from boto.ec2.autoscale.group import AutoScalingGroup
+from boto.ec2.autoscale.group import AutoScalingGroup, ProcessType
from boto.ec2.autoscale.activity import Activity
+from boto.ec2.autoscale.policy import AdjustmentType, MetricCollectionTypes, ScalingPolicy
+from boto.ec2.autoscale.instance import Instance
+from boto.ec2.autoscale.scheduled import ScheduledUpdateGroupAction
+
+
+RegionData = {
+ 'us-east-1' : 'autoscaling.us-east-1.amazonaws.com',
+ 'us-west-1' : 'autoscaling.us-west-1.amazonaws.com',
+ 'eu-west-1' : 'autoscaling.eu-west-1.amazonaws.com',
+ 'ap-northeast-1' : 'autoscaling.ap-northeast-1.amazonaws.com',
+ 'ap-southeast-1' : 'autoscaling.ap-southeast-1.amazonaws.com'}
+
+def regions():
+ """
+ Get all available regions for the Auto Scaling service.
+
+ :rtype: list
+ :return: A list of :class:`boto.RegionInfo` instances
+ """
+ regions = []
+ for region_name in RegionData:
+ region = RegionInfo(name=region_name,
+ endpoint=RegionData[region_name],
+ connection_cls=AutoScaleConnection)
+ regions.append(region)
+ return regions
+
+def connect_to_region(region_name, **kw_params):
+ """
+ Given a valid region name, return a
+ :class:`boto.ec2.autoscale.AutoScaleConnection`.
+
+ :param str region_name: The name of the region to connect to.
+
+ :rtype: :class:`boto.ec2.AutoScaleConnection` or ``None``
+ :return: A connection to the given region, or None if an invalid region
+ name is given
+ """
+ for region in regions():
+ if region.name == region_name:
+ return region.connect(**kw_params)
+ return None
class AutoScaleConnection(AWSQueryConnection):
- APIVersion = boto.config.get('Boto', 'autoscale_version', '2009-05-15')
- Endpoint = boto.config.get('Boto', 'autoscale_endpoint',
- 'autoscaling.amazonaws.com')
- DefaultRegionName = 'us-east-1'
- DefaultRegionEndpoint = 'autoscaling.amazonaws.com'
+ APIVersion = boto.config.get('Boto', 'autoscale_version', '2011-01-01')
+ DefaultRegionEndpoint = boto.config.get('Boto', 'autoscale_endpoint',
+ 'autoscaling.amazonaws.com')
+ DefaultRegionName = boto.config.get('Boto', 'autoscale_region_name', 'us-east-1')
def __init__(self, aws_access_key_id=None, aws_secret_access_key=None,
is_secure=True, port=None, proxy=None, proxy_port=None,
- proxy_user=None, proxy_pass=None, debug=1,
+ proxy_user=None, proxy_pass=None, debug=None,
https_connection_factory=None, region=None, path='/'):
"""
Init method to create a new connection to the AutoScaling service.
@@ -67,38 +110,62 @@ class AutoScaleConnection(AWSQueryConnection):
return ['ec2']
def build_list_params(self, params, items, label):
- """ items is a list of dictionaries or strings:
- [{'Protocol' : 'HTTP',
- 'LoadBalancerPort' : '80',
- 'InstancePort' : '80'},..] etc.
- or
- ['us-east-1b',...]
+ """
+ Items is a list of dictionaries or strings::
+
+ [
+ {
+ 'Protocol' : 'HTTP',
+ 'LoadBalancerPort' : '80',
+ 'InstancePort' : '80'
+ },
+ ..
+ ] etc.
+
+ or::
+
+ ['us-east-1b',...]
"""
# different from EC2 list params
for i in xrange(1, len(items)+1):
if isinstance(items[i-1], dict):
for k, v in items[i-1].iteritems():
- params['%s.member.%d.%s' % (label, i, k)] = v
+ if isinstance(v, dict):
+ for kk, vv in v.iteritems():
+ params['%s.member.%d.%s.%s' % (label, i, k, kk)] = vv
+ else:
+ params['%s.member.%d.%s' % (label, i, k)] = v
elif isinstance(items[i-1], basestring):
params['%s.member.%d' % (label, i)] = items[i-1]
def _update_group(self, op, as_group):
params = {
'AutoScalingGroupName' : as_group.name,
- 'Cooldown' : as_group.cooldown,
'LaunchConfigurationName' : as_group.launch_config_name,
'MinSize' : as_group.min_size,
'MaxSize' : as_group.max_size,
}
+ # get availability zone information (required param)
+ zones = as_group.availability_zones
+ self.build_list_params(params, zones,
+ 'AvailabilityZones')
+ if as_group.desired_capacity:
+ params['DesiredCapacity'] = as_group.desired_capacity
+ if as_group.vpc_zone_identifier:
+ params['VPCZoneIdentifier'] = as_group.vpc_zone_identifier
+ if as_group.health_check_period:
+ params['HealthCheckGracePeriod'] = as_group.health_check_period
+ if as_group.health_check_type:
+ params['HealthCheckType'] = as_group.health_check_type
+ if as_group.default_cooldown:
+ params['DefaultCooldown'] = as_group.default_cooldown
+ if as_group.placement_group:
+ params['PlacementGroup'] = as_group.placement_group
if op.startswith('Create'):
- if as_group.availability_zones:
- zones = as_group.availability_zones
- else:
- zones = [as_group.availability_zone]
- self.build_list_params(params, as_group.load_balancers,
- 'LoadBalancerNames')
- self.build_list_params(params, zones,
- 'AvailabilityZones')
+ # you can only associate load balancers with an autoscale group at creation time
+ if as_group.load_balancers:
+ self.build_list_params(params, as_group.load_balancers,
+ 'LoadBalancerNames')
return self.get_object(op, params, Request)
def create_auto_scaling_group(self, as_group):
@@ -107,22 +174,34 @@ class AutoScaleConnection(AWSQueryConnection):
"""
return self._update_group('CreateAutoScalingGroup', as_group)
+ def delete_auto_scaling_group(self, name, force_delete=False):
+ """
+ Deletes the specified auto scaling group if the group has no instances
+ and no scaling activities in progress.
+ """
+ if(force_delete):
+ params = {'AutoScalingGroupName' : name, 'ForceDelete' : 'true'}
+ else:
+ params = {'AutoScalingGroupName' : name}
+ return self.get_object('DeleteAutoScalingGroup', params, Request)
+
def create_launch_configuration(self, launch_config):
"""
Creates a new Launch Configuration.
- :type launch_config: boto.ec2.autoscale.launchconfig.LaunchConfiguration
- :param launch_config: LaunchConfiguraiton object.
+ :type launch_config: :class:`boto.ec2.autoscale.launchconfig.LaunchConfiguration`
+ :param launch_config: LaunchConfiguration object.
"""
params = {
'ImageId' : launch_config.image_id,
- 'KeyName' : launch_config.key_name,
'LaunchConfigurationName' : launch_config.name,
'InstanceType' : launch_config.instance_type,
}
+ if launch_config.key_name:
+ params['KeyName'] = launch_config.key_name
if launch_config.user_data:
- params['UserData'] = launch_config.user_data
+ params['UserData'] = base64.b64encode(launch_config.user_data)
if launch_config.kernel_id:
params['KernelId'] = launch_config.kernel_id
if launch_config.ramdisk_id:
@@ -130,89 +209,398 @@ class AutoScaleConnection(AWSQueryConnection):
if launch_config.block_device_mappings:
self.build_list_params(params, launch_config.block_device_mappings,
'BlockDeviceMappings')
- self.build_list_params(params, launch_config.security_groups,
- 'SecurityGroups')
+ if launch_config.security_groups:
+ self.build_list_params(params, launch_config.security_groups,
+ 'SecurityGroups')
+ if launch_config.instance_monitoring:
+ params['InstanceMonitoring.member.Enabled'] = 'true'
return self.get_object('CreateLaunchConfiguration', params,
Request, verb='POST')
- def create_trigger(self, trigger):
+ def create_scaling_policy(self, scaling_policy):
"""
+ Creates a new Scaling Policy.
+ :type scaling_policy: :class:`boto.ec2.autoscale.policy.ScalingPolicy`
+ :param scaling_policy: ScalingPolicy object.
"""
- params = {'TriggerName' : trigger.name,
- 'AutoScalingGroupName' : trigger.autoscale_group.name,
- 'MeasureName' : trigger.measure_name,
- 'Statistic' : trigger.statistic,
- 'Period' : trigger.period,
- 'Unit' : trigger.unit,
- 'LowerThreshold' : trigger.lower_threshold,
- 'LowerBreachScaleIncrement' : trigger.lower_breach_scale_increment,
- 'UpperThreshold' : trigger.upper_threshold,
- 'UpperBreachScaleIncrement' : trigger.upper_breach_scale_increment,
- 'BreachDuration' : trigger.breach_duration}
- # dimensions should be a list of tuples
- dimensions = []
- for dim in trigger.dimensions:
- name, value = dim
- dimensions.append(dict(Name=name, Value=value))
- self.build_list_params(params, dimensions, 'Dimensions')
+ params = {'AdjustmentType' : scaling_policy.adjustment_type,
+ 'AutoScalingGroupName': scaling_policy.as_name,
+ 'PolicyName' : scaling_policy.name,
+ 'ScalingAdjustment' : scaling_policy.scaling_adjustment,}
- req = self.get_object('CreateOrUpdateScalingTrigger', params,
- Request)
- return req
+ if scaling_policy.cooldown is not None:
+ params['Cooldown'] = scaling_policy.cooldown
- def get_all_groups(self, names=None):
+ return self.get_object('PutScalingPolicy', params, Request)
+
+ def delete_launch_configuration(self, launch_config_name):
"""
+ Deletes the specified LaunchConfiguration.
+
+ The specified launch configuration must not be attached to an Auto
+ Scaling group. Once this call completes, the launch configuration is no
+ longer available for use.
+ """
+ params = {'LaunchConfigurationName' : launch_config_name}
+ return self.get_object('DeleteLaunchConfiguration', params, Request)
+
+ def get_all_groups(self, names=None, max_records=None, next_token=None):
+ """
+ Returns a full description of each Auto Scaling group in the given
+ list. This includes all Amazon EC2 instances that are members of the
+ group. If a list of names is not provided, the service returns the full
+ details of all Auto Scaling groups.
+
+ This action supports pagination by returning a token if there are more
+ pages to retrieve. To get the next page, call this action again with
+ the returned token as the NextToken parameter.
+
+ :type names: list
+ :param names: List of group names which should be searched for.
+
+ :type max_records: int
+ :param max_records: Maximum amount of groups to return.
+
+ :rtype: list
+ :returns: List of :class:`boto.ec2.autoscale.group.AutoScalingGroup` instances.
"""
params = {}
+ if max_records:
+ params['MaxRecords'] = max_records
+ if next_token:
+ params['NextToken'] = next_token
if names:
self.build_list_params(params, names, 'AutoScalingGroupNames')
return self.get_list('DescribeAutoScalingGroups', params,
[('member', AutoScalingGroup)])
- def get_all_launch_configurations(self, names=None):
+ def get_all_launch_configurations(self, **kwargs):
"""
+ Returns a full description of the launch configurations given the
+ specified names.
+
+ If no names are specified, then the full details of all launch
+ configurations are returned.
+
+ :type names: list
+ :param names: List of configuration names which should be searched for.
+
+ :type max_records: int
+ :param max_records: Maximum amount of configurations to return.
+
+ :type next_token: str
+ :param next_token: If you have more results than can be returned at once, pass in this
+ parameter to page through all results.
+
+ :rtype: list
+ :returns: List of :class:`boto.ec2.autoscale.launchconfig.LaunchConfiguration` instances.
"""
params = {}
+ max_records = kwargs.get('max_records', None)
+ names = kwargs.get('names', None)
+ if max_records is not None:
+ params['MaxRecords'] = max_records
if names:
self.build_list_params(params, names, 'LaunchConfigurationNames')
+ next_token = kwargs.get('next_token')
+ if next_token:
+ params['NextToken'] = next_token
return self.get_list('DescribeLaunchConfigurations', params,
[('member', LaunchConfiguration)])
- def get_all_activities(self, autoscale_group,
- activity_ids=None,
- max_records=100):
+ def get_all_activities(self, autoscale_group, activity_ids=None, max_records=None, next_token=None):
"""
Get all activities for the given autoscaling group.
- :type autoscale_group: str or AutoScalingGroup object
+ This action supports pagination by returning a token if there are more
+ pages to retrieve. To get the next page, call this action again with
+ the returned token as the NextToken parameter
+
+ :type autoscale_group: str or :class:`boto.ec2.autoscale.group.AutoScalingGroup` object
:param autoscale_group: The auto scaling group to get activities on.
- @max_records: int
+ :type max_records: int
:param max_records: Maximum amount of activities to return.
+
+ :rtype: list
+ :returns: List of :class:`boto.ec2.autoscale.activity.Activity` instances.
"""
name = autoscale_group
if isinstance(autoscale_group, AutoScalingGroup):
name = autoscale_group.name
params = {'AutoScalingGroupName' : name}
+ if max_records:
+ params['MaxRecords'] = max_records
+ if next_token:
+ params['NextToken'] = next_token
if activity_ids:
self.build_list_params(params, activity_ids, 'ActivityIds')
- return self.get_list('DescribeScalingActivities', params,
- [('member', Activity)])
+ return self.get_list('DescribeScalingActivities',
+ params, [('member', Activity)])
+
+ def delete_scheduled_action(self, scheduled_action_name,
+ autoscale_group=None):
+ """
+ Deletes a previously scheduled action.
- def get_all_triggers(self, autoscale_group):
- params = {'AutoScalingGroupName' : autoscale_group}
- return self.get_list('DescribeTriggers', params,
- [('member', Trigger)])
+ :param str scheduled_action_name: The name of the action you want
+ to delete.
+ :param str autoscale_group: The name of the autoscale group.
+ """
+ params = {'ScheduledActionName' : scheduled_action_name}
+ if autoscale_group:
+ params['AutoScalingGroupName'] = autoscale_group
+ return self.get_status('DeleteScheduledAction', params)
def terminate_instance(self, instance_id, decrement_capacity=True):
- params = {
- 'InstanceId' : instance_id,
- 'ShouldDecrementDesiredCapacity' : decrement_capacity
- }
+ """
+ Terminates the specified instance. The desired group size can
+ also be adjusted, if desired.
+
+ :param str instance_id: The ID of the instance to be terminated.
+ :param bool decrement_capacity: Whether to decrement the size of the
+ autoscaling group or not.
+ """
+ params = {'InstanceId' : instance_id}
+ if decrement_capacity:
+ params['ShouldDecrementDesiredCapacity'] = 'true'
+ else:
+ params['ShouldDecrementDesiredCapacity'] = 'false'
return self.get_object('TerminateInstanceInAutoScalingGroup', params,
Activity)
+ def delete_policy(self, policy_name, autoscale_group=None):
+ """
+ Delete a policy.
+
+ :type policy_name: str
+ :param policy_name: The name or ARN of the policy to delete.
+
+ :type autoscale_group: str
+ :param autoscale_group: The name of the autoscale group.
+ """
+ params = {'PolicyName': policy_name}
+ if autoscale_group:
+ params['AutoScalingGroupName'] = autoscale_group
+ return self.get_status('DeletePolicy', params)
+
+ def get_all_adjustment_types(self):
+ return self.get_list('DescribeAdjustmentTypes', {}, [('member', AdjustmentType)])
+
+ def get_all_autoscaling_instances(self, instance_ids=None,
+ max_records=None, next_token=None):
+ """
+ Returns a description of each Auto Scaling instance in the instance_ids
+ list. If a list is not provided, the service returns the full details
+ of all instances up to a maximum of fifty.
+
+ This action supports pagination by returning a token if there are more
+ pages to retrieve. To get the next page, call this action again with
+ the returned token as the NextToken parameter.
+
+ :type instance_ids: list
+ :param instance_ids: List of Autoscaling Instance IDs which should be
+ searched for.
+
+ :type max_records: int
+ :param max_records: Maximum number of results to return.
+
+ :rtype: list
+ :returns: List of :class:`boto.ec2.autoscale.activity.Activity` instances.
+ """
+ params = {}
+ if instance_ids:
+ self.build_list_params(params, instance_ids, 'InstanceIds')
+ if max_records:
+ params['MaxRecords'] = max_records
+ if next_token:
+ params['NextToken'] = next_token
+ return self.get_list('DescribeAutoScalingInstances',
+ params, [('member', Instance)])
+
+ def get_all_metric_collection_types(self):
+ """
+ Returns a list of metrics and a corresponding list of granularities
+ for each metric.
+ """
+ return self.get_object('DescribeMetricCollectionTypes',
+ {}, MetricCollectionTypes)
+
+ def get_all_policies(self, as_group=None, policy_names=None,
+ max_records=None, next_token=None):
+ """
+ Returns descriptions of what each policy does. This action supports
+ pagination. If the response includes a token, there are more records
+ available. To get the additional records, repeat the request with the
+ response token as the NextToken parameter.
+
+ If no group name or list of policy names are provided, all available policies
+ are returned.
+
+ :type as_name: str
+ :param as_name: the name of the :class:`boto.ec2.autoscale.group.AutoScalingGroup` to filter for.
+
+ :type names: list
+ :param names: List of policy names which should be searched for.
+
+ :type max_records: int
+ :param max_records: Maximum amount of groups to return.
+ """
+ params = {}
+ if as_group:
+ params['AutoScalingGroupName'] = as_group
+ if policy_names:
+ self.build_list_params(params, policy_names, 'PolicyNames')
+ if max_records:
+ params['MaxRecords'] = max_records
+ if next_token:
+ params['NextToken'] = next_token
+ return self.get_list('DescribePolicies', params,
+ [('member', ScalingPolicy)])
+
+ def get_all_scaling_process_types(self):
+ """ Returns scaling process types for use in the ResumeProcesses and
+ SuspendProcesses actions.
+ """
+ return self.get_list('DescribeScalingProcessTypes', {},
+ [('member', ProcessType)])
+
+ def suspend_processes(self, as_group, scaling_processes=None):
+ """ Suspends Auto Scaling processes for an Auto Scaling group.
+
+ :type as_group: string
+ :param as_group: The auto scaling group to suspend processes on.
+
+ :type scaling_processes: list
+ :param scaling_processes: Processes you want to suspend. If omitted, all
+ processes will be suspended.
+ """
+ params = {'AutoScalingGroupName' : as_group}
+ if scaling_processes:
+ self.build_list_params(params, scaling_processes, 'ScalingProcesses')
+ return self.get_status('SuspendProcesses', params)
+
+ def resume_processes(self, as_group, scaling_processes=None):
+ """ Resumes Auto Scaling processes for an Auto Scaling group.
+
+ :type as_group: string
+ :param as_group: The auto scaling group to resume processes on.
+
+ :type scaling_processes: list
+ :param scaling_processes: Processes you want to resume. If omitted, all
+ processes will be resumed.
+ """
+ params = {
+ 'AutoScalingGroupName' : as_group
+ }
+ if scaling_processes:
+ self.build_list_params(params, scaling_processes, 'ScalingProcesses')
+ return self.get_status('ResumeProcesses', params)
+
+ def create_scheduled_group_action(self, as_group, name, time, desired_capacity=None,
+ min_size=None, max_size=None):
+ """ Creates a scheduled scaling action for a Auto Scaling group. If you
+ leave a parameter unspecified, the corresponding value remains
+ unchanged in the affected Auto Scaling group.
+
+ :type as_group: string
+ :param as_group: The auto scaling group to get activities on.
+
+ :type name: string
+ :param name: Scheduled action name.
+
+ :type time: datetime.datetime
+ :param time: The time for this action to start.
+
+ :type desired_capacity: int
+ :param desired_capacity: The number of EC2 instances that should be running in
+ this group.
+
+ :type min_size: int
+ :param min_size: The minimum size for the new auto scaling group.
+
+ :type max_size: int
+ :param max_size: The minimum size for the new auto scaling group.
+ """
+ params = {
+ 'AutoScalingGroupName' : as_group,
+ 'ScheduledActionName' : name,
+ 'Time' : time.isoformat(),
+ }
+ if desired_capacity is not None:
+ params['DesiredCapacity'] = desired_capacity
+ if min_size is not None:
+ params['MinSize'] = min_size
+ if max_size is not None:
+ params['MaxSize'] = max_size
+ return self.get_status('PutScheduledUpdateGroupAction', params)
+
+ def get_all_scheduled_actions(self, as_group=None, start_time=None, end_time=None, scheduled_actions=None,
+ max_records=None, next_token=None):
+ params = {}
+ if as_group:
+ params['AutoScalingGroupName'] = as_group
+ if scheduled_actions:
+ self.build_list_params(params, scheduled_actions, 'ScheduledActionNames')
+ if max_records:
+ params['MaxRecords'] = max_records
+ if next_token:
+ params['NextToken'] = next_token
+ return self.get_list('DescribeScheduledActions', params, [('member', ScheduledUpdateGroupAction)])
+
+ def disable_metrics_collection(self, as_group, metrics=None):
+ """
+ Disables monitoring of group metrics for the Auto Scaling group
+ specified in AutoScalingGroupName. You can specify the list of affected
+ metrics with the Metrics parameter.
+ """
+ params = {
+ 'AutoScalingGroupName' : as_group,
+ }
+ if metrics:
+ self.build_list_params(params, metrics, 'Metrics')
+ return self.get_status('DisableMetricsCollection', params)
+
+ def enable_metrics_collection(self, as_group, granularity, metrics=None):
+ """
+ Enables monitoring of group metrics for the Auto Scaling group
+ specified in AutoScalingGroupName. You can specify the list of enabled
+ metrics with the Metrics parameter.
+
+ Auto scaling metrics collection can be turned on only if the
+ InstanceMonitoring.Enabled flag, in the Auto Scaling group's launch
+ configuration, is set to true.
+
+ :type autoscale_group: string
+ :param autoscale_group: The auto scaling group to get activities on.
+
+ :type granularity: string
+ :param granularity: The granularity to associate with the metrics to
+ collect. Currently, the only legal granularity is "1Minute".
+
+ :type metrics: string list
+ :param metrics: The list of metrics to collect. If no metrics are
+ specified, all metrics are enabled.
+ """
+ params = {
+ 'AutoScalingGroupName' : as_group,
+ 'Granularity' : granularity,
+ }
+ if metrics:
+ self.build_list_params(params, metrics, 'Metrics')
+ return self.get_status('EnableMetricsCollection', params)
+
+ def execute_policy(self, policy_name, as_group=None, honor_cooldown=None):
+ params = {
+ 'PolicyName' : policy_name,
+ }
+ if as_group:
+ params['AutoScalingGroupName'] = as_group
+ if honor_cooldown:
+ params['HonorCooldown'] = honor_cooldown
+ return self.get_status('ExecutePolicy', params)
+
def set_instance_health(self, instance_id, health_status,
should_respect_grace_period=True):
"""
« no previous file with comments | « boto/ec2/address.py ('k') | boto/ec2/autoscale/activity.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698