mirror of
https://github.com/ansible/awx.git
synced 2026-05-23 00:37:37 -02:30
AC-505 Add vendored copies of ec2 and rax inventory scripts from Ansible (for now). Add vendored versions of boto and pyrax and all their dependencies, updated all vendored packages to latest versions.
This commit is contained in:
102
awx/lib/site-packages/boto/ec2/__init__.py
Normal file
102
awx/lib/site-packages/boto/ec2/__init__.py
Normal file
@@ -0,0 +1,102 @@
|
||||
# Copyright (c) 2006-2008 Mitch Garnaat http://garnaat.org/
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
#
|
||||
"""
|
||||
This module provides an interface to the Elastic Compute Cloud (EC2)
|
||||
service from AWS.
|
||||
"""
|
||||
from boto.ec2.connection import EC2Connection
|
||||
from boto.regioninfo import RegionInfo
|
||||
|
||||
|
||||
RegionData = {
|
||||
'us-east-1': 'ec2.us-east-1.amazonaws.com',
|
||||
'us-gov-west-1': 'ec2.us-gov-west-1.amazonaws.com',
|
||||
'us-west-1': 'ec2.us-west-1.amazonaws.com',
|
||||
'us-west-2': 'ec2.us-west-2.amazonaws.com',
|
||||
'sa-east-1': 'ec2.sa-east-1.amazonaws.com',
|
||||
'eu-west-1': 'ec2.eu-west-1.amazonaws.com',
|
||||
'ap-northeast-1': 'ec2.ap-northeast-1.amazonaws.com',
|
||||
'ap-southeast-1': 'ec2.ap-southeast-1.amazonaws.com',
|
||||
'ap-southeast-2': 'ec2.ap-southeast-2.amazonaws.com',
|
||||
}
|
||||
|
||||
|
||||
def regions(**kw_params):
|
||||
"""
|
||||
Get all available regions for the EC2 service.
|
||||
You may pass any of the arguments accepted by the EC2Connection
|
||||
object's constructor as keyword arguments and they will be
|
||||
passed along to the EC2Connection object.
|
||||
|
||||
:rtype: list
|
||||
:return: A list of :class:`boto.ec2.regioninfo.RegionInfo`
|
||||
"""
|
||||
regions = []
|
||||
for region_name in RegionData:
|
||||
region = RegionInfo(name=region_name,
|
||||
endpoint=RegionData[region_name],
|
||||
connection_cls=EC2Connection)
|
||||
regions.append(region)
|
||||
return regions
|
||||
|
||||
|
||||
def connect_to_region(region_name, **kw_params):
|
||||
"""
|
||||
Given a valid region name, return a
|
||||
:class:`boto.ec2.connection.EC2Connection`.
|
||||
Any additional parameters after the region_name are passed on to
|
||||
the connect method of the region object.
|
||||
|
||||
:type: str
|
||||
:param region_name: The name of the region to connect to.
|
||||
|
||||
:rtype: :class:`boto.ec2.connection.EC2Connection` or ``None``
|
||||
:return: A connection to the given region, or None if an invalid region
|
||||
name is given
|
||||
"""
|
||||
if 'region' in kw_params and isinstance(kw_params['region'], RegionInfo)\
|
||||
and region_name == kw_params['region'].name:
|
||||
return EC2Connection(**kw_params)
|
||||
|
||||
for region in regions(**kw_params):
|
||||
if region.name == region_name:
|
||||
return region.connect(**kw_params)
|
||||
|
||||
return None
|
||||
|
||||
|
||||
def get_region(region_name, **kw_params):
|
||||
"""
|
||||
Find and return a :class:`boto.ec2.regioninfo.RegionInfo` object
|
||||
given a region name.
|
||||
|
||||
:type: str
|
||||
:param: The name of the region.
|
||||
|
||||
:rtype: :class:`boto.ec2.regioninfo.RegionInfo`
|
||||
:return: The RegionInfo object for the given region or None if
|
||||
an invalid region name is provided.
|
||||
"""
|
||||
for region in regions(**kw_params):
|
||||
if region.name == region_name:
|
||||
return region
|
||||
return None
|
||||
120
awx/lib/site-packages/boto/ec2/address.py
Normal file
120
awx/lib/site-packages/boto/ec2/address.py
Normal file
@@ -0,0 +1,120 @@
|
||||
# Copyright (c) 2006-2009 Mitch Garnaat http://garnaat.org/
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
|
||||
from boto.ec2.ec2object import EC2Object
|
||||
|
||||
class Address(EC2Object):
|
||||
"""
|
||||
Represents an EC2 Elastic IP Address
|
||||
|
||||
:ivar public_ip: The Elastic IP address.
|
||||
:ivar instance_id: The instance the address is associated with (if any).
|
||||
:ivar domain: Indicates whether the address is a EC2 address or a VPC address (standard|vpc).
|
||||
:ivar allocation_id: The allocation ID for the address (VPC addresses only).
|
||||
:ivar association_id: The association ID for the address (VPC addresses only).
|
||||
:ivar network_interface_id: The network interface (if any) that the address is associated with (VPC addresses only).
|
||||
:ivar network_interface_owner_id: The owner IID (VPC addresses only).
|
||||
:ivar private_ip_address: The private IP address associated with the Elastic IP address (VPC addresses only).
|
||||
"""
|
||||
|
||||
def __init__(self, connection=None, public_ip=None, instance_id=None):
|
||||
EC2Object.__init__(self, connection)
|
||||
self.connection = connection
|
||||
self.public_ip = public_ip
|
||||
self.instance_id = instance_id
|
||||
self.domain = None
|
||||
self.allocation_id = None
|
||||
self.association_id = None
|
||||
self.network_interface_id = None
|
||||
self.network_interface_owner_id = None
|
||||
self.private_ip_address = None
|
||||
|
||||
def __repr__(self):
|
||||
return 'Address:%s' % self.public_ip
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'publicIp':
|
||||
self.public_ip = value
|
||||
elif name == 'instanceId':
|
||||
self.instance_id = value
|
||||
elif name == 'domain':
|
||||
self.domain = value
|
||||
elif name == 'allocationId':
|
||||
self.allocation_id = value
|
||||
elif name == 'associationId':
|
||||
self.association_id = value
|
||||
elif name == 'networkInterfaceId':
|
||||
self.network_interface_id = value
|
||||
elif name == 'networkInterfaceOwnerId':
|
||||
self.network_interface_owner_id = value
|
||||
elif name == 'privateIpAddress':
|
||||
self.private_ip_address = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
def release(self, dry_run=False):
|
||||
"""
|
||||
Free up this Elastic IP address.
|
||||
:see: :meth:`boto.ec2.connection.EC2Connection.release_address`
|
||||
"""
|
||||
if self.allocation_id:
|
||||
return self.connection.release_address(
|
||||
None,
|
||||
self.allocation_id,
|
||||
dry_run=dry_run)
|
||||
else:
|
||||
return self.connection.release_address(
|
||||
self.public_ip,
|
||||
dry_run=dry_run
|
||||
)
|
||||
|
||||
delete = release
|
||||
|
||||
def associate(self, instance_id, dry_run=False):
|
||||
"""
|
||||
Associate this Elastic IP address with a currently running instance.
|
||||
:see: :meth:`boto.ec2.connection.EC2Connection.associate_address`
|
||||
"""
|
||||
return self.connection.associate_address(
|
||||
instance_id,
|
||||
self.public_ip,
|
||||
dry_run=dry_run
|
||||
)
|
||||
|
||||
def disassociate(self, dry_run=False):
|
||||
"""
|
||||
Disassociate this Elastic IP address from a currently running instance.
|
||||
:see: :meth:`boto.ec2.connection.EC2Connection.disassociate_address`
|
||||
"""
|
||||
if self.association_id:
|
||||
return self.connection.disassociate_address(
|
||||
None,
|
||||
self.association_id,
|
||||
dry_run=dry_run
|
||||
)
|
||||
else:
|
||||
return self.connection.disassociate_address(
|
||||
self.public_ip,
|
||||
dry_run=dry_run
|
||||
)
|
||||
|
||||
|
||||
71
awx/lib/site-packages/boto/ec2/attributes.py
Normal file
71
awx/lib/site-packages/boto/ec2/attributes.py
Normal file
@@ -0,0 +1,71 @@
|
||||
# Copyright (c) 2012 Amazon.com, Inc. or its affiliates. All Rights Reserved
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
|
||||
class AccountAttribute(object):
|
||||
def __init__(self, connection=None):
|
||||
self.connection = connection
|
||||
self.attribute_name = None
|
||||
self.attribute_values = None
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'attributeValueSet':
|
||||
self.attribute_values = AttributeValues()
|
||||
return self.attribute_values
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'attributeName':
|
||||
self.attribute_name = value
|
||||
|
||||
|
||||
class AttributeValues(list):
|
||||
def startElement(self, name, attrs, connection):
|
||||
pass
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'attributeValue':
|
||||
self.append(value)
|
||||
|
||||
|
||||
class VPCAttribute(object):
|
||||
def __init__(self, connection=None):
|
||||
self.connection = connection
|
||||
self.vpc_id = None
|
||||
self.enable_dns_hostnames = None
|
||||
self.enable_dns_support = None
|
||||
self._current_attr = None
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name in ('enableDnsHostnames', 'enableDnsSupport'):
|
||||
self._current_attr = name
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'vpcId':
|
||||
self.vpc_id = value
|
||||
elif name == 'value':
|
||||
if value == 'true':
|
||||
value = True
|
||||
else:
|
||||
value = False
|
||||
if self._current_attr == 'enableDnsHostnames':
|
||||
self.enable_dns_hostnames = value
|
||||
elif self._current_attr == 'enableDnsSupport':
|
||||
self.enable_dns_support = value
|
||||
808
awx/lib/site-packages/boto/ec2/autoscale/__init__.py
Normal file
808
awx/lib/site-packages/boto/ec2/autoscale/__init__.py
Normal file
@@ -0,0 +1,808 @@
|
||||
# Copyright (c) 2009-2011 Reza Lotun http://reza.lotun.name/
|
||||
# Copyright (c) 2011 Jann Kleen
|
||||
# Copyright (c) 2012 Mitch Garnaat http://garnaat.org/
|
||||
# Copyright (c) 2012 Amazon.com, Inc. or its affiliates. All Rights Reserved
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
"""
|
||||
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.launchconfig import LaunchConfiguration
|
||||
from boto.ec2.autoscale.group import AutoScalingGroup
|
||||
from boto.ec2.autoscale.group import ProcessType
|
||||
from boto.ec2.autoscale.activity import Activity
|
||||
from boto.ec2.autoscale.policy import AdjustmentType
|
||||
from boto.ec2.autoscale.policy import MetricCollectionTypes
|
||||
from boto.ec2.autoscale.policy import ScalingPolicy
|
||||
from boto.ec2.autoscale.policy import TerminationPolicies
|
||||
from boto.ec2.autoscale.instance import Instance
|
||||
from boto.ec2.autoscale.scheduled import ScheduledUpdateGroupAction
|
||||
from boto.ec2.autoscale.tag import Tag
|
||||
|
||||
RegionData = {
|
||||
'us-east-1': 'autoscaling.us-east-1.amazonaws.com',
|
||||
'us-gov-west-1': 'autoscaling.us-gov-west-1.amazonaws.com',
|
||||
'us-west-1': 'autoscaling.us-west-1.amazonaws.com',
|
||||
'us-west-2': 'autoscaling.us-west-2.amazonaws.com',
|
||||
'sa-east-1': 'autoscaling.sa-east-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',
|
||||
'ap-southeast-2': 'autoscaling.ap-southeast-2.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', '2011-01-01')
|
||||
DefaultRegionEndpoint = boto.config.get('Boto', 'autoscale_endpoint',
|
||||
'autoscaling.us-east-1.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=0,
|
||||
https_connection_factory=None, region=None, path='/',
|
||||
security_token=None, validate_certs=True):
|
||||
"""
|
||||
Init method to create a new connection to the AutoScaling service.
|
||||
|
||||
B{Note:} The host argument is overridden by the host specified in the
|
||||
boto configuration file.
|
||||
"""
|
||||
if not region:
|
||||
region = RegionInfo(self, self.DefaultRegionName,
|
||||
self.DefaultRegionEndpoint,
|
||||
AutoScaleConnection)
|
||||
self.region = region
|
||||
AWSQueryConnection.__init__(self, aws_access_key_id,
|
||||
aws_secret_access_key,
|
||||
is_secure, port, proxy, proxy_port,
|
||||
proxy_user, proxy_pass,
|
||||
self.region.endpoint, debug,
|
||||
https_connection_factory, path=path,
|
||||
security_token=security_token,
|
||||
validate_certs=validate_certs)
|
||||
|
||||
def _required_auth_capability(self):
|
||||
return ['hmac-v4']
|
||||
|
||||
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',...]
|
||||
"""
|
||||
# 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():
|
||||
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,
|
||||
'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 as_group.termination_policies:
|
||||
self.build_list_params(params, as_group.termination_policies,
|
||||
'TerminationPolicies')
|
||||
if op.startswith('Create'):
|
||||
# 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')
|
||||
if as_group.tags:
|
||||
for i, tag in enumerate(as_group.tags):
|
||||
tag.build_params(params, i + 1)
|
||||
return self.get_object(op, params, Request)
|
||||
|
||||
def create_auto_scaling_group(self, as_group):
|
||||
"""
|
||||
Create auto scaling group.
|
||||
"""
|
||||
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: :class:`boto.ec2.autoscale.launchconfig.LaunchConfiguration`
|
||||
:param launch_config: LaunchConfiguration object.
|
||||
"""
|
||||
params = {'ImageId': launch_config.image_id,
|
||||
'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'] = base64.b64encode(launch_config.user_data)
|
||||
if launch_config.kernel_id:
|
||||
params['KernelId'] = launch_config.kernel_id
|
||||
if launch_config.ramdisk_id:
|
||||
params['RamdiskId'] = launch_config.ramdisk_id
|
||||
if launch_config.block_device_mappings:
|
||||
[x.autoscale_build_list_params(params) for x in launch_config.block_device_mappings]
|
||||
if launch_config.security_groups:
|
||||
self.build_list_params(params, launch_config.security_groups,
|
||||
'SecurityGroups')
|
||||
if launch_config.instance_monitoring:
|
||||
params['InstanceMonitoring.Enabled'] = 'true'
|
||||
else:
|
||||
params['InstanceMonitoring.Enabled'] = 'false'
|
||||
if launch_config.spot_price is not None:
|
||||
params['SpotPrice'] = str(launch_config.spot_price)
|
||||
if launch_config.instance_profile_name is not None:
|
||||
params['IamInstanceProfile'] = launch_config.instance_profile_name
|
||||
if launch_config.ebs_optimized:
|
||||
params['EbsOptimized'] = 'true'
|
||||
else:
|
||||
params['EbsOptimized'] = 'false'
|
||||
return self.get_object('CreateLaunchConfiguration', params,
|
||||
Request, verb='POST')
|
||||
|
||||
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 = {'AdjustmentType': scaling_policy.adjustment_type,
|
||||
'AutoScalingGroupName': scaling_policy.as_name,
|
||||
'PolicyName': scaling_policy.name,
|
||||
'ScalingAdjustment': scaling_policy.scaling_adjustment}
|
||||
|
||||
if scaling_policy.adjustment_type == "PercentChangeInCapacity" and \
|
||||
scaling_policy.min_adjustment_step is not None:
|
||||
params['MinAdjustmentStep'] = scaling_policy.min_adjustment_step
|
||||
|
||||
if scaling_policy.cooldown is not None:
|
||||
params['Cooldown'] = scaling_policy.cooldown
|
||||
|
||||
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, **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=None, next_token=None):
|
||||
"""
|
||||
Get all activities for the given autoscaling group.
|
||||
|
||||
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.
|
||||
|
||||
: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)])
|
||||
|
||||
def get_termination_policies(self):
|
||||
"""Gets all valid termination policies.
|
||||
|
||||
These values can then be used as the termination_policies arg
|
||||
when creating and updating autoscale groups.
|
||||
"""
|
||||
return self.get_object('DescribeTerminationPolicyTypes',
|
||||
{}, TerminationPolicies)
|
||||
|
||||
def delete_scheduled_action(self, scheduled_action_name,
|
||||
autoscale_group=None):
|
||||
"""
|
||||
Deletes a previously scheduled action.
|
||||
|
||||
:type scheduled_action_name: str
|
||||
:param scheduled_action_name: The name of the action you want
|
||||
to delete.
|
||||
|
||||
:type autoscale_group: str
|
||||
:param 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):
|
||||
"""
|
||||
Terminates the specified instance. The desired group size can
|
||||
also be adjusted, if desired.
|
||||
|
||||
:type instance_id: str
|
||||
:param instance_id: The ID of the instance to be terminated.
|
||||
|
||||
:type decrement_capability: bool
|
||||
:param 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.instance.Instance` objects.
|
||||
"""
|
||||
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=None,
|
||||
desired_capacity=None,
|
||||
min_size=None, max_size=None,
|
||||
start_time=None, end_time=None,
|
||||
recurrence=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. (Depracated)
|
||||
|
||||
: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.
|
||||
|
||||
:type start_time: datetime.datetime
|
||||
:param start_time: The time for this action to start. When StartTime and EndTime are specified with Recurrence, they form the boundaries of when the recurring action will start and stop.
|
||||
|
||||
:type end_time: datetime.datetime
|
||||
:param end_time: The time for this action to end. When StartTime and EndTime are specified with Recurrence, they form the boundaries of when the recurring action will start and stop.
|
||||
|
||||
:type recurrence: string
|
||||
:param recurrence: The time when recurring future actions will start. Start time is specified by the user following the Unix cron syntax format. EXAMPLE: '0 10 * * *'
|
||||
"""
|
||||
params = {'AutoScalingGroupName': as_group,
|
||||
'ScheduledActionName': name}
|
||||
if start_time is not None:
|
||||
params['StartTime'] = start_time.isoformat()
|
||||
if end_time is not None:
|
||||
params['EndTime'] = end_time.isoformat()
|
||||
if recurrence is not None:
|
||||
params['Recurrence'] = recurrence
|
||||
if time:
|
||||
params['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 put_notification_configuration(self, autoscale_group, topic, notification_types):
|
||||
"""
|
||||
Configures an Auto Scaling group to send notifications when
|
||||
specified events take place.
|
||||
|
||||
:type as_group: str or
|
||||
:class:`boto.ec2.autoscale.group.AutoScalingGroup` object
|
||||
:param as_group: The Auto Scaling group to put notification
|
||||
configuration on.
|
||||
|
||||
:type topic: str
|
||||
:param topic: The Amazon Resource Name (ARN) of the Amazon Simple
|
||||
Notification Service (SNS) topic.
|
||||
|
||||
:type notification_types: list
|
||||
:param notification_types: The type of events that will trigger
|
||||
the notification.
|
||||
"""
|
||||
|
||||
name = autoscale_group
|
||||
if isinstance(autoscale_group, AutoScalingGroup):
|
||||
name = autoscale_group.name
|
||||
|
||||
params = {'AutoScalingGroupName': name,
|
||||
'TopicARN': topic}
|
||||
self.build_list_params(params, notification_types, 'NotificationTypes')
|
||||
return self.get_status('PutNotificationConfiguration', params)
|
||||
|
||||
def set_instance_health(self, instance_id, health_status,
|
||||
should_respect_grace_period=True):
|
||||
"""
|
||||
Explicitly set the health status of an instance.
|
||||
|
||||
:type instance_id: str
|
||||
:param instance_id: The identifier of the EC2 instance.
|
||||
|
||||
:type health_status: str
|
||||
:param health_status: The health status of the instance.
|
||||
"Healthy" means that the instance is healthy and should remain
|
||||
in service. "Unhealthy" means that the instance is unhealthy.
|
||||
Auto Scaling should terminate and replace it.
|
||||
|
||||
:type should_respect_grace_period: bool
|
||||
:param should_respect_grace_period: If True, this call should
|
||||
respect the grace period associated with the group.
|
||||
"""
|
||||
params = {'InstanceId': instance_id,
|
||||
'HealthStatus': health_status}
|
||||
if should_respect_grace_period:
|
||||
params['ShouldRespectGracePeriod'] = 'true'
|
||||
else:
|
||||
params['ShouldRespectGracePeriod'] = 'false'
|
||||
return self.get_status('SetInstanceHealth', params)
|
||||
|
||||
def set_desired_capacity(self, group_name, desired_capacity, honor_cooldown=False):
|
||||
"""
|
||||
Adjusts the desired size of the AutoScalingGroup by initiating scaling
|
||||
activities. When reducing the size of the group, it is not possible to define
|
||||
which Amazon EC2 instances will be terminated. This applies to any Auto Scaling
|
||||
decisions that might result in terminating instances.
|
||||
|
||||
:type group_name: string
|
||||
:param group_name: name of the auto scaling group
|
||||
|
||||
:type desired_capacity: integer
|
||||
:param desired_capacity: new capacity setting for auto scaling group
|
||||
|
||||
:type honor_cooldown: boolean
|
||||
:param honor_cooldown: by default, overrides any cooldown period
|
||||
"""
|
||||
params = {'AutoScalingGroupName': group_name,
|
||||
'DesiredCapacity': desired_capacity}
|
||||
if honor_cooldown:
|
||||
params['HonorCooldown'] = json.dumps('True')
|
||||
|
||||
return self.get_status('SetDesiredCapacity', params)
|
||||
|
||||
# Tag methods
|
||||
|
||||
def get_all_tags(self, filters=None, max_records=None, next_token=None):
|
||||
"""
|
||||
Lists the Auto Scaling group tags.
|
||||
|
||||
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 filters: dict
|
||||
:param filters: The value of the filter type used to identify
|
||||
the tags to be returned. NOT IMPLEMENTED YET.
|
||||
|
||||
:type max_records: int
|
||||
:param max_records: Maximum number of tags to return.
|
||||
|
||||
:rtype: list
|
||||
:returns: List of :class:`boto.ec2.autoscale.tag.Tag`
|
||||
instances.
|
||||
"""
|
||||
params = {}
|
||||
if max_records:
|
||||
params['MaxRecords'] = max_records
|
||||
if next_token:
|
||||
params['NextToken'] = next_token
|
||||
return self.get_list('DescribeTags', params,
|
||||
[('member', Tag)])
|
||||
|
||||
def create_or_update_tags(self, tags):
|
||||
"""
|
||||
Creates new tags or updates existing tags for an Auto Scaling group.
|
||||
|
||||
:type tags: List of :class:`boto.ec2.autoscale.tag.Tag`
|
||||
:param tags: The new or updated tags.
|
||||
"""
|
||||
params = {}
|
||||
for i, tag in enumerate(tags):
|
||||
tag.build_params(params, i + 1)
|
||||
return self.get_status('CreateOrUpdateTags', params, verb='POST')
|
||||
|
||||
def delete_tags(self, tags):
|
||||
"""
|
||||
Deletes existing tags for an Auto Scaling group.
|
||||
|
||||
:type tags: List of :class:`boto.ec2.autoscale.tag.Tag`
|
||||
:param tags: The new or updated tags.
|
||||
"""
|
||||
params = {}
|
||||
for i, tag in enumerate(tags):
|
||||
tag.build_params(params, i + 1)
|
||||
return self.get_status('DeleteTags', params, verb='POST')
|
||||
74
awx/lib/site-packages/boto/ec2/autoscale/activity.py
Normal file
74
awx/lib/site-packages/boto/ec2/autoscale/activity.py
Normal file
@@ -0,0 +1,74 @@
|
||||
# Copyright (c) 2009-2011 Reza Lotun http://reza.lotun.name/
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
from datetime import datetime
|
||||
|
||||
|
||||
class Activity(object):
|
||||
def __init__(self, connection=None):
|
||||
self.connection = connection
|
||||
self.start_time = None
|
||||
self.end_time = None
|
||||
self.activity_id = None
|
||||
self.progress = None
|
||||
self.status_code = None
|
||||
self.cause = None
|
||||
self.description = None
|
||||
self.status_message = None
|
||||
self.group_name = None
|
||||
|
||||
def __repr__(self):
|
||||
return 'Activity<%s>: For group:%s, progress:%s, cause:%s' % (self.activity_id,
|
||||
self.group_name,
|
||||
self.status_message,
|
||||
self.cause)
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'ActivityId':
|
||||
self.activity_id = value
|
||||
elif name == 'AutoScalingGroupName':
|
||||
self.group_name = value
|
||||
elif name == 'StartTime':
|
||||
try:
|
||||
self.start_time = datetime.strptime(value, '%Y-%m-%dT%H:%M:%S.%fZ')
|
||||
except ValueError:
|
||||
self.start_time = datetime.strptime(value, '%Y-%m-%dT%H:%M:%SZ')
|
||||
elif name == 'EndTime':
|
||||
try:
|
||||
self.end_time = datetime.strptime(value, '%Y-%m-%dT%H:%M:%S.%fZ')
|
||||
except ValueError:
|
||||
self.end_time = datetime.strptime(value, '%Y-%m-%dT%H:%M:%SZ')
|
||||
elif name == 'Progress':
|
||||
self.progress = value
|
||||
elif name == 'Cause':
|
||||
self.cause = value
|
||||
elif name == 'Description':
|
||||
self.description = value
|
||||
elif name == 'StatusMessage':
|
||||
self.status_message = value
|
||||
elif name == 'StatusCode':
|
||||
self.status_code = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
337
awx/lib/site-packages/boto/ec2/autoscale/group.py
Normal file
337
awx/lib/site-packages/boto/ec2/autoscale/group.py
Normal file
@@ -0,0 +1,337 @@
|
||||
# Copyright (c) 2009-2011 Reza Lotun http://reza.lotun.name/
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
from boto.ec2.elb.listelement import ListElement
|
||||
from boto.resultset import ResultSet
|
||||
from boto.ec2.autoscale.launchconfig import LaunchConfiguration
|
||||
from boto.ec2.autoscale.request import Request
|
||||
from boto.ec2.autoscale.instance import Instance
|
||||
from boto.ec2.autoscale.tag import Tag
|
||||
|
||||
|
||||
class ProcessType(object):
|
||||
def __init__(self, connection=None):
|
||||
self.connection = connection
|
||||
self.process_name = None
|
||||
|
||||
def __repr__(self):
|
||||
return 'ProcessType(%s)' % self.process_name
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
pass
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'ProcessName':
|
||||
self.process_name = value
|
||||
|
||||
|
||||
class SuspendedProcess(object):
|
||||
def __init__(self, connection=None):
|
||||
self.connection = connection
|
||||
self.process_name = None
|
||||
self.reason = None
|
||||
|
||||
def __repr__(self):
|
||||
return 'SuspendedProcess(%s, %s)' % (self.process_name, self.reason)
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
pass
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'ProcessName':
|
||||
self.process_name = value
|
||||
elif name == 'SuspensionReason':
|
||||
self.reason = value
|
||||
|
||||
|
||||
class EnabledMetric(object):
|
||||
def __init__(self, connection=None, metric=None, granularity=None):
|
||||
self.connection = connection
|
||||
self.metric = metric
|
||||
self.granularity = granularity
|
||||
|
||||
def __repr__(self):
|
||||
return 'EnabledMetric(%s, %s)' % (self.metric, self.granularity)
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
pass
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'Granularity':
|
||||
self.granularity = value
|
||||
elif name == 'Metric':
|
||||
self.metric = value
|
||||
|
||||
|
||||
class TerminationPolicies(list):
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
pass
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'member':
|
||||
self.append(value)
|
||||
|
||||
|
||||
class AutoScalingGroup(object):
|
||||
def __init__(self, connection=None, name=None,
|
||||
launch_config=None, availability_zones=None,
|
||||
load_balancers=None, default_cooldown=None,
|
||||
health_check_type=None, health_check_period=None,
|
||||
placement_group=None, vpc_zone_identifier=None,
|
||||
desired_capacity=None, min_size=None, max_size=None,
|
||||
tags=None, termination_policies=None, **kwargs):
|
||||
"""
|
||||
Creates a new AutoScalingGroup with the specified name.
|
||||
|
||||
You must not have already used up your entire quota of
|
||||
AutoScalingGroups in order for this call to be successful. Once the
|
||||
creation request is completed, the AutoScalingGroup is ready to be
|
||||
used in other calls.
|
||||
|
||||
:type name: str
|
||||
:param name: Name of autoscaling group (required).
|
||||
|
||||
:type availability_zones: list
|
||||
:param availability_zones: List of availability zones (required).
|
||||
|
||||
:type default_cooldown: int
|
||||
:param default_cooldown: Number of seconds after a Scaling Activity
|
||||
completes before any further scaling activities can start.
|
||||
|
||||
:type desired_capacity: int
|
||||
:param desired_capacity: The desired capacity for the group.
|
||||
|
||||
:type health_check_period: str
|
||||
:param health_check_period: Length of time in seconds after a new
|
||||
EC2 instance comes into service that Auto Scaling starts
|
||||
checking its health.
|
||||
|
||||
:type health_check_type: str
|
||||
:param health_check_type: The service you want the health status from,
|
||||
Amazon EC2 or Elastic Load Balancer.
|
||||
|
||||
:type launch_config_name: str or LaunchConfiguration
|
||||
:param launch_config_name: Name of launch configuration (required).
|
||||
|
||||
:type load_balancers: list
|
||||
:param load_balancers: List of load balancers.
|
||||
|
||||
:type max_size: int
|
||||
:param max_size: Maximum size of group (required).
|
||||
|
||||
:type min_size: int
|
||||
:param min_size: Minimum size of group (required).
|
||||
|
||||
:type placement_group: str
|
||||
:param placement_group: Physical location of your cluster placement
|
||||
group created in Amazon EC2.
|
||||
|
||||
:type vpc_zone_identifier: str
|
||||
:param vpc_zone_identifier: The subnet identifier of the Virtual
|
||||
Private Cloud.
|
||||
|
||||
:type termination_policies: list
|
||||
:param termination_policies: A list of termination policies. Valid values
|
||||
are: "OldestInstance", "NewestInstance", "OldestLaunchConfiguration",
|
||||
"ClosestToNextInstanceHour", "Default". If no value is specified,
|
||||
the "Default" value is used.
|
||||
|
||||
:rtype: :class:`boto.ec2.autoscale.group.AutoScalingGroup`
|
||||
:return: An autoscale group.
|
||||
"""
|
||||
self.name = name or kwargs.get('group_name') # backwards compat
|
||||
self.connection = connection
|
||||
self.min_size = int(min_size) if min_size is not None else None
|
||||
self.max_size = int(max_size) if max_size is not None else None
|
||||
self.created_time = None
|
||||
# backwards compatibility
|
||||
default_cooldown = default_cooldown or kwargs.get('cooldown')
|
||||
if default_cooldown is not None:
|
||||
default_cooldown = int(default_cooldown)
|
||||
self.default_cooldown = default_cooldown
|
||||
self.launch_config_name = launch_config
|
||||
if launch_config and isinstance(launch_config, LaunchConfiguration):
|
||||
self.launch_config_name = launch_config.name
|
||||
self.desired_capacity = desired_capacity
|
||||
lbs = load_balancers or []
|
||||
self.load_balancers = ListElement(lbs)
|
||||
zones = availability_zones or []
|
||||
self.availability_zones = ListElement(zones)
|
||||
self.health_check_period = health_check_period
|
||||
self.health_check_type = health_check_type
|
||||
self.placement_group = placement_group
|
||||
self.autoscaling_group_arn = None
|
||||
self.vpc_zone_identifier = vpc_zone_identifier
|
||||
self.instances = None
|
||||
self.tags = tags or None
|
||||
termination_policies = termination_policies or []
|
||||
self.termination_policies = ListElement(termination_policies)
|
||||
|
||||
# backwards compatible access to 'cooldown' param
|
||||
def _get_cooldown(self):
|
||||
return self.default_cooldown
|
||||
|
||||
def _set_cooldown(self, val):
|
||||
self.default_cooldown = val
|
||||
|
||||
cooldown = property(_get_cooldown, _set_cooldown)
|
||||
|
||||
def __repr__(self):
|
||||
return 'AutoScaleGroup<%s>' % self.name
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'Instances':
|
||||
self.instances = ResultSet([('member', Instance)])
|
||||
return self.instances
|
||||
elif name == 'LoadBalancerNames':
|
||||
return self.load_balancers
|
||||
elif name == 'AvailabilityZones':
|
||||
return self.availability_zones
|
||||
elif name == 'EnabledMetrics':
|
||||
self.enabled_metrics = ResultSet([('member', EnabledMetric)])
|
||||
return self.enabled_metrics
|
||||
elif name == 'SuspendedProcesses':
|
||||
self.suspended_processes = ResultSet([('member', SuspendedProcess)])
|
||||
return self.suspended_processes
|
||||
elif name == 'Tags':
|
||||
self.tags = ResultSet([('member', Tag)])
|
||||
return self.tags
|
||||
elif name == 'TerminationPolicies':
|
||||
return self.termination_policies
|
||||
else:
|
||||
return
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'MinSize':
|
||||
self.min_size = int(value)
|
||||
elif name == 'AutoScalingGroupARN':
|
||||
self.autoscaling_group_arn = value
|
||||
elif name == 'CreatedTime':
|
||||
self.created_time = value
|
||||
elif name == 'DefaultCooldown':
|
||||
self.default_cooldown = int(value)
|
||||
elif name == 'LaunchConfigurationName':
|
||||
self.launch_config_name = value
|
||||
elif name == 'DesiredCapacity':
|
||||
self.desired_capacity = int(value)
|
||||
elif name == 'MaxSize':
|
||||
self.max_size = int(value)
|
||||
elif name == 'AutoScalingGroupName':
|
||||
self.name = value
|
||||
elif name == 'PlacementGroup':
|
||||
self.placement_group = value
|
||||
elif name == 'HealthCheckGracePeriod':
|
||||
try:
|
||||
self.health_check_period = int(value)
|
||||
except ValueError:
|
||||
self.health_check_period = None
|
||||
elif name == 'HealthCheckType':
|
||||
self.health_check_type = value
|
||||
elif name == 'VPCZoneIdentifier':
|
||||
self.vpc_zone_identifier = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
def set_capacity(self, capacity):
|
||||
"""
|
||||
Set the desired capacity for the group.
|
||||
"""
|
||||
params = {'AutoScalingGroupName': self.name,
|
||||
'DesiredCapacity': capacity}
|
||||
req = self.connection.get_object('SetDesiredCapacity', params,
|
||||
Request)
|
||||
self.connection.last_request = req
|
||||
return req
|
||||
|
||||
def update(self):
|
||||
"""
|
||||
Sync local changes with AutoScaling group.
|
||||
"""
|
||||
return self.connection._update_group('UpdateAutoScalingGroup', self)
|
||||
|
||||
def shutdown_instances(self):
|
||||
"""
|
||||
Convenience method which shuts down all instances associated with
|
||||
this group.
|
||||
"""
|
||||
self.min_size = 0
|
||||
self.max_size = 0
|
||||
self.desired_capacity = 0
|
||||
self.update()
|
||||
|
||||
def delete(self, force_delete=False):
|
||||
"""
|
||||
Delete this auto-scaling group if no instances attached or no
|
||||
scaling activities in progress.
|
||||
"""
|
||||
return self.connection.delete_auto_scaling_group(self.name,
|
||||
force_delete)
|
||||
|
||||
def get_activities(self, activity_ids=None, max_records=50):
|
||||
"""
|
||||
Get all activies for this group.
|
||||
"""
|
||||
return self.connection.get_all_activities(self, activity_ids,
|
||||
max_records)
|
||||
|
||||
def put_notification_configuration(self, topic, notification_types):
|
||||
"""
|
||||
Configures an Auto Scaling group to send notifications when
|
||||
specified events take place.
|
||||
"""
|
||||
return self.connection.put_notification_configuration(self,
|
||||
topic,
|
||||
notification_types)
|
||||
|
||||
def suspend_processes(self, scaling_processes=None):
|
||||
"""
|
||||
Suspends Auto Scaling processes for an Auto Scaling group.
|
||||
"""
|
||||
return self.connection.suspend_processes(self.name, scaling_processes)
|
||||
|
||||
def resume_processes(self, scaling_processes=None):
|
||||
"""
|
||||
Resumes Auto Scaling processes for an Auto Scaling group.
|
||||
"""
|
||||
return self.connection.resume_processes(self.name, scaling_processes)
|
||||
|
||||
|
||||
class AutoScalingGroupMetric(object):
|
||||
def __init__(self, connection=None):
|
||||
|
||||
self.connection = connection
|
||||
self.metric = None
|
||||
self.granularity = None
|
||||
|
||||
def __repr__(self):
|
||||
return 'AutoScalingGroupMetric:%s' % self.metric
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
return
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'Metric':
|
||||
self.metric = value
|
||||
elif name == 'Granularity':
|
||||
self.granularity = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
60
awx/lib/site-packages/boto/ec2/autoscale/instance.py
Normal file
60
awx/lib/site-packages/boto/ec2/autoscale/instance.py
Normal file
@@ -0,0 +1,60 @@
|
||||
# Copyright (c) 2009 Reza Lotun http://reza.lotun.name/
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
|
||||
class Instance(object):
|
||||
def __init__(self, connection=None):
|
||||
self.connection = connection
|
||||
self.instance_id = None
|
||||
self.health_status = None
|
||||
self.launch_config_name = None
|
||||
self.lifecycle_state = None
|
||||
self.availability_zone = None
|
||||
self.group_name = None
|
||||
|
||||
def __repr__(self):
|
||||
r = 'Instance<id:%s, state:%s, health:%s' % (self.instance_id,
|
||||
self.lifecycle_state,
|
||||
self.health_status)
|
||||
if self.group_name:
|
||||
r += ' group:%s' % self.group_name
|
||||
r += '>'
|
||||
return r
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'InstanceId':
|
||||
self.instance_id = value
|
||||
elif name == 'HealthStatus':
|
||||
self.health_status = value
|
||||
elif name == 'LaunchConfigurationName':
|
||||
self.launch_config_name = value
|
||||
elif name == 'LifecycleState':
|
||||
self.lifecycle_state = value
|
||||
elif name == 'AvailabilityZone':
|
||||
self.availability_zone = value
|
||||
elif name == 'AutoScalingGroupName':
|
||||
self.group_name = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
216
awx/lib/site-packages/boto/ec2/autoscale/launchconfig.py
Normal file
216
awx/lib/site-packages/boto/ec2/autoscale/launchconfig.py
Normal file
@@ -0,0 +1,216 @@
|
||||
# Copyright (c) 2009 Reza Lotun http://reza.lotun.name/
|
||||
# Copyright (c) 2012 Amazon.com, Inc. or its affiliates. All Rights Reserved
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
from datetime import datetime
|
||||
from boto.resultset import ResultSet
|
||||
from boto.ec2.elb.listelement import ListElement
|
||||
import boto.utils
|
||||
import base64
|
||||
|
||||
# this should use the corresponding object from boto.ec2
|
||||
|
||||
|
||||
class Ebs(object):
|
||||
def __init__(self, connection=None, snapshot_id=None, volume_size=None):
|
||||
self.connection = connection
|
||||
self.snapshot_id = snapshot_id
|
||||
self.volume_size = volume_size
|
||||
|
||||
def __repr__(self):
|
||||
return 'Ebs(%s, %s)' % (self.snapshot_id, self.volume_size)
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
pass
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'SnapshotId':
|
||||
self.snapshot_id = value
|
||||
elif name == 'VolumeSize':
|
||||
self.volume_size = value
|
||||
|
||||
|
||||
class InstanceMonitoring(object):
|
||||
def __init__(self, connection=None, enabled='false'):
|
||||
self.connection = connection
|
||||
self.enabled = enabled
|
||||
|
||||
def __repr__(self):
|
||||
return 'InstanceMonitoring(%s)' % self.enabled
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
pass
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'Enabled':
|
||||
self.enabled = value
|
||||
|
||||
|
||||
# this should use the BlockDeviceMapping from boto.ec2.blockdevicemapping
|
||||
class BlockDeviceMapping(object):
|
||||
def __init__(self, connection=None, device_name=None, virtual_name=None):
|
||||
self.connection = connection
|
||||
self.device_name = None
|
||||
self.virtual_name = None
|
||||
self.ebs = None
|
||||
|
||||
def __repr__(self):
|
||||
return 'BlockDeviceMapping(%s, %s)' % (self.device_name,
|
||||
self.virtual_name)
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'Ebs':
|
||||
self.ebs = Ebs(self)
|
||||
return self.ebs
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'DeviceName':
|
||||
self.device_name = value
|
||||
elif name == 'VirtualName':
|
||||
self.virtual_name = value
|
||||
|
||||
|
||||
class LaunchConfiguration(object):
|
||||
def __init__(self, connection=None, name=None, image_id=None,
|
||||
key_name=None, security_groups=None, user_data=None,
|
||||
instance_type='m1.small', kernel_id=None,
|
||||
ramdisk_id=None, block_device_mappings=None,
|
||||
instance_monitoring=False, spot_price=None,
|
||||
instance_profile_name=None, ebs_optimized=False):
|
||||
"""
|
||||
A launch configuration.
|
||||
|
||||
:type name: str
|
||||
:param name: Name of the launch configuration to create.
|
||||
|
||||
:type image_id: str
|
||||
:param image_id: Unique ID of the Amazon Machine Image (AMI) which was
|
||||
assigned during registration.
|
||||
|
||||
:type key_name: str
|
||||
:param key_name: The name of the EC2 key pair.
|
||||
|
||||
:type security_groups: list
|
||||
:param security_groups: Names of the security groups with which to
|
||||
associate the EC2 instances.
|
||||
|
||||
:type user_data: str
|
||||
:param user_data: The user data available to launched EC2 instances.
|
||||
|
||||
:type instance_type: str
|
||||
:param instance_type: The instance type
|
||||
|
||||
:type kern_id: str
|
||||
:param kern_id: Kernel id for instance
|
||||
|
||||
:type ramdisk_id: str
|
||||
:param ramdisk_id: RAM disk id for instance
|
||||
|
||||
:type block_device_mappings: list
|
||||
:param block_device_mappings: Specifies how block devices are exposed
|
||||
for instances
|
||||
|
||||
:type instance_monitoring: bool
|
||||
:param instance_monitoring: Whether instances in group are launched
|
||||
with detailed monitoring.
|
||||
|
||||
:type spot_price: float
|
||||
:param spot_price: The spot price you are bidding. Only applies
|
||||
if you are building an autoscaling group with spot instances.
|
||||
|
||||
:type instance_profile_name: string
|
||||
:param instance_profile_name: The name or the Amazon Resource
|
||||
Name (ARN) of the instance profile associated with the IAM
|
||||
role for the instance.
|
||||
|
||||
:type ebs_optimized: bool
|
||||
:param ebs_optimized: Specifies whether the instance is optimized
|
||||
for EBS I/O (true) or not (false).
|
||||
"""
|
||||
self.connection = connection
|
||||
self.name = name
|
||||
self.instance_type = instance_type
|
||||
self.block_device_mappings = block_device_mappings
|
||||
self.key_name = key_name
|
||||
sec_groups = security_groups or []
|
||||
self.security_groups = ListElement(sec_groups)
|
||||
self.image_id = image_id
|
||||
self.ramdisk_id = ramdisk_id
|
||||
self.created_time = None
|
||||
self.kernel_id = kernel_id
|
||||
self.user_data = user_data
|
||||
self.created_time = None
|
||||
self.instance_monitoring = instance_monitoring
|
||||
self.spot_price = spot_price
|
||||
self.instance_profile_name = instance_profile_name
|
||||
self.launch_configuration_arn = None
|
||||
self.ebs_optimized = ebs_optimized
|
||||
|
||||
def __repr__(self):
|
||||
return 'LaunchConfiguration:%s' % self.name
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'SecurityGroups':
|
||||
return self.security_groups
|
||||
elif name == 'BlockDeviceMappings':
|
||||
self.block_device_mappings = ResultSet([('member',
|
||||
BlockDeviceMapping)])
|
||||
return self.block_device_mappings
|
||||
elif name == 'InstanceMonitoring':
|
||||
self.instance_monitoring = InstanceMonitoring(self)
|
||||
return self.instance_monitoring
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'InstanceType':
|
||||
self.instance_type = value
|
||||
elif name == 'LaunchConfigurationName':
|
||||
self.name = value
|
||||
elif name == 'KeyName':
|
||||
self.key_name = value
|
||||
elif name == 'ImageId':
|
||||
self.image_id = value
|
||||
elif name == 'CreatedTime':
|
||||
self.created_time = boto.utils.parse_ts(value)
|
||||
elif name == 'KernelId':
|
||||
self.kernel_id = value
|
||||
elif name == 'RamdiskId':
|
||||
self.ramdisk_id = value
|
||||
elif name == 'UserData':
|
||||
try:
|
||||
self.user_data = base64.b64decode(value)
|
||||
except TypeError:
|
||||
self.user_data = value
|
||||
elif name == 'LaunchConfigurationARN':
|
||||
self.launch_configuration_arn = value
|
||||
elif name == 'InstanceMonitoring':
|
||||
self.instance_monitoring = value
|
||||
elif name == 'SpotPrice':
|
||||
self.spot_price = float(value)
|
||||
elif name == 'IamInstanceProfile':
|
||||
self.instance_profile_name = value
|
||||
elif name == 'EbsOptimized':
|
||||
self.ebs_optimized = True if value.lower() == 'true' else False
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
def delete(self):
|
||||
""" Delete this launch configuration. """
|
||||
return self.connection.delete_launch_configuration(self.name)
|
||||
173
awx/lib/site-packages/boto/ec2/autoscale/policy.py
Normal file
173
awx/lib/site-packages/boto/ec2/autoscale/policy.py
Normal file
@@ -0,0 +1,173 @@
|
||||
# Copyright (c) 2009-2010 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
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
from boto.resultset import ResultSet
|
||||
from boto.ec2.elb.listelement import ListElement
|
||||
|
||||
class Alarm(object):
|
||||
def __init__(self, connection=None):
|
||||
self.connection = connection
|
||||
self.name = None
|
||||
self.alarm_arn = None
|
||||
|
||||
def __repr__(self):
|
||||
return 'Alarm:%s' % self.name
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'AlarmName':
|
||||
self.name = value
|
||||
elif name == 'AlarmARN':
|
||||
self.alarm_arn = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
|
||||
class AdjustmentType(object):
|
||||
def __init__(self, connection=None):
|
||||
self.connection = connection
|
||||
self.adjustment_types = ListElement([])
|
||||
|
||||
def __repr__(self):
|
||||
return 'AdjustmentType:%s' % self.adjustment_types
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'AdjustmentType':
|
||||
return self.adjustment_types
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
return
|
||||
|
||||
|
||||
class MetricCollectionTypes(object):
|
||||
class BaseType(object):
|
||||
arg = ''
|
||||
def __init__(self, connection):
|
||||
self.connection = connection
|
||||
self.val = None
|
||||
def __repr__(self):
|
||||
return '%s:%s' % (self.arg, self.val)
|
||||
def startElement(self, name, attrs, connection):
|
||||
return
|
||||
def endElement(self, name, value, connection):
|
||||
if name == self.arg:
|
||||
self.val = value
|
||||
class Metric(BaseType):
|
||||
arg = 'Metric'
|
||||
class Granularity(BaseType):
|
||||
arg = 'Granularity'
|
||||
|
||||
def __init__(self, connection=None):
|
||||
self.connection = connection
|
||||
self.metrics = []
|
||||
self.granularities = []
|
||||
|
||||
def __repr__(self):
|
||||
return 'MetricCollectionTypes:<%s, %s>' % (self.metrics, self.granularities)
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'Granularities':
|
||||
self.granularities = ResultSet([('member', self.Granularity)])
|
||||
return self.granularities
|
||||
elif name == 'Metrics':
|
||||
self.metrics = ResultSet([('member', self.Metric)])
|
||||
return self.metrics
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
return
|
||||
|
||||
|
||||
class ScalingPolicy(object):
|
||||
def __init__(self, connection=None, **kwargs):
|
||||
"""
|
||||
Scaling Policy
|
||||
|
||||
:type name: str
|
||||
:param name: Name of scaling policy.
|
||||
|
||||
:type adjustment_type: str
|
||||
:param adjustment_type: Specifies the type of adjustment. Valid values are `ChangeInCapacity`, `ExactCapacity` and `PercentChangeInCapacity`.
|
||||
|
||||
:type as_name: str or int
|
||||
:param as_name: Name or ARN of the Auto Scaling Group.
|
||||
|
||||
:type scaling_adjustment: int
|
||||
:param scaling_adjustment: Value of adjustment (type specified in `adjustment_type`).
|
||||
|
||||
:type min_adjustment_step: int
|
||||
:param min_adjustment_step: Value of min adjustment step required to
|
||||
apply the scaling policy (only make sense when use `PercentChangeInCapacity` as adjustment_type.).
|
||||
|
||||
:type cooldown: int
|
||||
:param cooldown: Time (in seconds) before Alarm related Scaling Activities can start after the previous Scaling Activity ends.
|
||||
|
||||
"""
|
||||
self.name = kwargs.get('name', None)
|
||||
self.adjustment_type = kwargs.get('adjustment_type', None)
|
||||
self.as_name = kwargs.get('as_name', None)
|
||||
self.scaling_adjustment = kwargs.get('scaling_adjustment', None)
|
||||
self.cooldown = kwargs.get('cooldown', None)
|
||||
self.connection = connection
|
||||
self.min_adjustment_step = kwargs.get('min_adjustment_step', None)
|
||||
|
||||
def __repr__(self):
|
||||
return 'ScalingPolicy(%s group:%s adjustment:%s)' % (self.name,
|
||||
self.as_name,
|
||||
self.adjustment_type)
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'Alarms':
|
||||
self.alarms = ResultSet([('member', Alarm)])
|
||||
return self.alarms
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'PolicyName':
|
||||
self.name = value
|
||||
elif name == 'AutoScalingGroupName':
|
||||
self.as_name = value
|
||||
elif name == 'PolicyARN':
|
||||
self.policy_arn = value
|
||||
elif name == 'ScalingAdjustment':
|
||||
self.scaling_adjustment = int(value)
|
||||
elif name == 'Cooldown':
|
||||
self.cooldown = int(value)
|
||||
elif name == 'AdjustmentType':
|
||||
self.adjustment_type = value
|
||||
elif name == 'MinAdjustmentStep':
|
||||
self.min_adjustment_step = int(value)
|
||||
|
||||
def delete(self):
|
||||
return self.connection.delete_policy(self.name, self.as_name)
|
||||
|
||||
|
||||
class TerminationPolicies(list):
|
||||
def __init__(self, connection=None, **kwargs):
|
||||
pass
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
pass
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'member':
|
||||
self.append(value)
|
||||
38
awx/lib/site-packages/boto/ec2/autoscale/request.py
Normal file
38
awx/lib/site-packages/boto/ec2/autoscale/request.py
Normal file
@@ -0,0 +1,38 @@
|
||||
# Copyright (c) 2009 Reza Lotun http://reza.lotun.name/
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
class Request(object):
|
||||
def __init__(self, connection=None):
|
||||
self.connection = connection
|
||||
self.request_id = ''
|
||||
|
||||
def __repr__(self):
|
||||
return 'Request:%s' % self.request_id
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'RequestId':
|
||||
self.request_id = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
78
awx/lib/site-packages/boto/ec2/autoscale/scheduled.py
Normal file
78
awx/lib/site-packages/boto/ec2/autoscale/scheduled.py
Normal file
@@ -0,0 +1,78 @@
|
||||
# Copyright (c) 2009-2010 Reza Lotun http://reza.lotun.name/
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
|
||||
from datetime import datetime
|
||||
|
||||
|
||||
class ScheduledUpdateGroupAction(object):
|
||||
def __init__(self, connection=None):
|
||||
self.connection = connection
|
||||
self.name = None
|
||||
self.action_arn = None
|
||||
self.as_group = None
|
||||
self.time = None
|
||||
self.start_time = None
|
||||
self.end_time = None
|
||||
self.recurrence = None
|
||||
self.desired_capacity = None
|
||||
self.max_size = None
|
||||
self.min_size = None
|
||||
|
||||
def __repr__(self):
|
||||
return 'ScheduledUpdateGroupAction:%s' % self.name
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'DesiredCapacity':
|
||||
self.desired_capacity = value
|
||||
elif name == 'ScheduledActionName':
|
||||
self.name = value
|
||||
elif name == 'AutoScalingGroupName':
|
||||
self.as_group = value
|
||||
elif name == 'MaxSize':
|
||||
self.max_size = int(value)
|
||||
elif name == 'MinSize':
|
||||
self.min_size = int(value)
|
||||
elif name == 'ScheduledActionARN':
|
||||
self.action_arn = value
|
||||
elif name == 'Recurrence':
|
||||
self.recurrence = value
|
||||
elif name == 'Time':
|
||||
try:
|
||||
self.time = datetime.strptime(value, '%Y-%m-%dT%H:%M:%S.%fZ')
|
||||
except ValueError:
|
||||
self.time = datetime.strptime(value, '%Y-%m-%dT%H:%M:%SZ')
|
||||
elif name == 'StartTime':
|
||||
try:
|
||||
self.start_time = datetime.strptime(value, '%Y-%m-%dT%H:%M:%S.%fZ')
|
||||
except ValueError:
|
||||
self.start_time = datetime.strptime(value, '%Y-%m-%dT%H:%M:%SZ')
|
||||
elif name == 'EndTime':
|
||||
try:
|
||||
self.end_time = datetime.strptime(value, '%Y-%m-%dT%H:%M:%S.%fZ')
|
||||
except ValueError:
|
||||
self.end_time = datetime.strptime(value, '%Y-%m-%dT%H:%M:%SZ')
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
84
awx/lib/site-packages/boto/ec2/autoscale/tag.py
Normal file
84
awx/lib/site-packages/boto/ec2/autoscale/tag.py
Normal file
@@ -0,0 +1,84 @@
|
||||
# Copyright (c) 2012 Mitch Garnaat http://garnaat.org/
|
||||
# Copyright (c) 2012 Amazon.com, Inc. or its affiliates. All Rights Reserved
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
|
||||
class Tag(object):
|
||||
"""
|
||||
A name/value tag on an AutoScalingGroup resource.
|
||||
|
||||
:ivar key: The key of the tag.
|
||||
:ivar value: The value of the tag.
|
||||
:ivar propagate_at_launch: Boolean value which specifies whether the
|
||||
new tag will be applied to instances launched after the tag is created.
|
||||
:ivar resource_id: The name of the autoscaling group.
|
||||
:ivar resource_type: The only supported resource type at this time
|
||||
is "auto-scaling-group".
|
||||
"""
|
||||
|
||||
def __init__(self, connection=None, key=None, value=None,
|
||||
propagate_at_launch=False, resource_id=None,
|
||||
resource_type='auto-scaling-group'):
|
||||
self.connection = connection
|
||||
self.key = key
|
||||
self.value = value
|
||||
self.propagate_at_launch = propagate_at_launch
|
||||
self.resource_id = resource_id
|
||||
self.resource_type = resource_type
|
||||
|
||||
def __repr__(self):
|
||||
return 'Tag(%s=%s)' % (self.key, self.value)
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
pass
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'Key':
|
||||
self.key = value
|
||||
elif name == 'Value':
|
||||
self.value = value
|
||||
elif name == 'PropogateAtLaunch':
|
||||
if value.lower() == 'true':
|
||||
self.propogate_at_launch = True
|
||||
else:
|
||||
self.propogate_at_launch = False
|
||||
elif name == 'ResourceId':
|
||||
self.resource_id = value
|
||||
elif name == 'ResourceType':
|
||||
self.resource_type = value
|
||||
|
||||
def build_params(self, params, i):
|
||||
"""
|
||||
Populates a dictionary with the name/value pairs necessary
|
||||
to identify this Tag in a request.
|
||||
"""
|
||||
prefix = 'Tags.member.%d.' % i
|
||||
params[prefix + 'ResourceId'] = self.resource_id
|
||||
params[prefix + 'ResourceType'] = self.resource_type
|
||||
params[prefix + 'Key'] = self.key
|
||||
params[prefix + 'Value'] = self.value
|
||||
if self.propagate_at_launch:
|
||||
params[prefix + 'PropagateAtLaunch'] = 'true'
|
||||
else:
|
||||
params[prefix + 'PropagateAtLaunch'] = 'false'
|
||||
|
||||
def delete(self):
|
||||
return self.connection.delete_tags([self])
|
||||
150
awx/lib/site-packages/boto/ec2/blockdevicemapping.py
Normal file
150
awx/lib/site-packages/boto/ec2/blockdevicemapping.py
Normal file
@@ -0,0 +1,150 @@
|
||||
# Copyright (c) 2009-2012 Mitch Garnaat http://garnaat.org/
|
||||
# Copyright (c) 2012 Amazon.com, Inc. or its affiliates. All Rights Reserved
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
|
||||
class BlockDeviceType(object):
|
||||
"""
|
||||
Represents parameters for a block device.
|
||||
"""
|
||||
|
||||
def __init__(self,
|
||||
connection=None,
|
||||
ephemeral_name=None,
|
||||
no_device=False,
|
||||
volume_id=None,
|
||||
snapshot_id=None,
|
||||
status=None,
|
||||
attach_time=None,
|
||||
delete_on_termination=False,
|
||||
size=None,
|
||||
volume_type=None,
|
||||
iops=None):
|
||||
self.connection = connection
|
||||
self.ephemeral_name = ephemeral_name
|
||||
self.no_device = no_device
|
||||
self.volume_id = volume_id
|
||||
self.snapshot_id = snapshot_id
|
||||
self.status = status
|
||||
self.attach_time = attach_time
|
||||
self.delete_on_termination = delete_on_termination
|
||||
self.size = size
|
||||
self.volume_type = volume_type
|
||||
self.iops = iops
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
pass
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'volumeId':
|
||||
self.volume_id = value
|
||||
elif name == 'virtualName':
|
||||
self.ephemeral_name = value
|
||||
elif name == 'NoDevice':
|
||||
self.no_device = (value == 'true')
|
||||
elif name == 'snapshotId':
|
||||
self.snapshot_id = value
|
||||
elif name == 'volumeSize':
|
||||
self.size = int(value)
|
||||
elif name == 'status':
|
||||
self.status = value
|
||||
elif name == 'attachTime':
|
||||
self.attach_time = value
|
||||
elif name == 'deleteOnTermination':
|
||||
self.delete_on_termination = (value == 'true')
|
||||
elif name == 'volumeType':
|
||||
self.volume_type = value
|
||||
elif name == 'iops':
|
||||
self.iops = int(value)
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
# for backwards compatibility
|
||||
EBSBlockDeviceType = BlockDeviceType
|
||||
|
||||
|
||||
class BlockDeviceMapping(dict):
|
||||
"""
|
||||
Represents a collection of BlockDeviceTypes when creating ec2 instances.
|
||||
|
||||
Example:
|
||||
dev_sda1 = BlockDeviceType()
|
||||
dev_sda1.size = 100 # change root volume to 100GB instead of default
|
||||
bdm = BlockDeviceMapping()
|
||||
bdm['/dev/sda1'] = dev_sda1
|
||||
reservation = image.run(..., block_device_map=bdm, ...)
|
||||
"""
|
||||
|
||||
def __init__(self, connection=None):
|
||||
"""
|
||||
:type connection: :class:`boto.ec2.EC2Connection`
|
||||
:param connection: Optional connection.
|
||||
"""
|
||||
dict.__init__(self)
|
||||
self.connection = connection
|
||||
self.current_name = None
|
||||
self.current_value = None
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'ebs' or name == 'virtualName':
|
||||
self.current_value = BlockDeviceType(self)
|
||||
return self.current_value
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'device' or name == 'deviceName':
|
||||
self.current_name = value
|
||||
elif name == 'item':
|
||||
self[self.current_name] = self.current_value
|
||||
|
||||
def ec2_build_list_params(self, params, prefix=''):
|
||||
pre = '%sBlockDeviceMapping' % prefix
|
||||
return self._build_list_params(params, prefix=pre)
|
||||
|
||||
def autoscale_build_list_params(self, params, prefix=''):
|
||||
pre = '%sBlockDeviceMappings.member' % prefix
|
||||
return self._build_list_params(params, prefix=pre)
|
||||
|
||||
def _build_list_params(self, params, prefix=''):
|
||||
i = 1
|
||||
for dev_name in self:
|
||||
pre = '%s.%d' % (prefix, i)
|
||||
params['%s.DeviceName' % pre] = dev_name
|
||||
block_dev = self[dev_name]
|
||||
if block_dev.ephemeral_name:
|
||||
params['%s.VirtualName' % pre] = block_dev.ephemeral_name
|
||||
else:
|
||||
if block_dev.no_device:
|
||||
params['%s.NoDevice' % pre] = ''
|
||||
else:
|
||||
if block_dev.snapshot_id:
|
||||
params['%s.Ebs.SnapshotId' % pre] = block_dev.snapshot_id
|
||||
if block_dev.size:
|
||||
params['%s.Ebs.VolumeSize' % pre] = block_dev.size
|
||||
if block_dev.delete_on_termination:
|
||||
params['%s.Ebs.DeleteOnTermination' % pre] = 'true'
|
||||
else:
|
||||
params['%s.Ebs.DeleteOnTermination' % pre] = 'false'
|
||||
if block_dev.volume_type:
|
||||
params['%s.Ebs.VolumeType' % pre] = block_dev.volume_type
|
||||
if block_dev.iops is not None:
|
||||
params['%s.Ebs.Iops' % pre] = block_dev.iops
|
||||
i += 1
|
||||
78
awx/lib/site-packages/boto/ec2/bundleinstance.py
Normal file
78
awx/lib/site-packages/boto/ec2/bundleinstance.py
Normal file
@@ -0,0 +1,78 @@
|
||||
# Copyright (c) 2010 Mitch Garnaat http://garnaat.org/
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
"""
|
||||
Represents an EC2 Bundle Task
|
||||
"""
|
||||
|
||||
from boto.ec2.ec2object import EC2Object
|
||||
|
||||
class BundleInstanceTask(EC2Object):
|
||||
|
||||
def __init__(self, connection=None):
|
||||
EC2Object.__init__(self, connection)
|
||||
self.id = None
|
||||
self.instance_id = None
|
||||
self.progress = None
|
||||
self.start_time = None
|
||||
self.state = None
|
||||
self.bucket = None
|
||||
self.prefix = None
|
||||
self.upload_policy = None
|
||||
self.upload_policy_signature = None
|
||||
self.update_time = None
|
||||
self.code = None
|
||||
self.message = None
|
||||
|
||||
def __repr__(self):
|
||||
return 'BundleInstanceTask:%s' % self.id
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'bundleId':
|
||||
self.id = value
|
||||
elif name == 'instanceId':
|
||||
self.instance_id = value
|
||||
elif name == 'progress':
|
||||
self.progress = value
|
||||
elif name == 'startTime':
|
||||
self.start_time = value
|
||||
elif name == 'state':
|
||||
self.state = value
|
||||
elif name == 'bucket':
|
||||
self.bucket = value
|
||||
elif name == 'prefix':
|
||||
self.prefix = value
|
||||
elif name == 'uploadPolicy':
|
||||
self.upload_policy = value
|
||||
elif name == 'uploadPolicySignature':
|
||||
self.upload_policy_signature = value
|
||||
elif name == 'updateTime':
|
||||
self.update_time = value
|
||||
elif name == 'code':
|
||||
self.code = value
|
||||
elif name == 'message':
|
||||
self.message = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
84
awx/lib/site-packages/boto/ec2/buyreservation.py
Normal file
84
awx/lib/site-packages/boto/ec2/buyreservation.py
Normal file
@@ -0,0 +1,84 @@
|
||||
# Copyright (c) 2006-2009 Mitch Garnaat http://garnaat.org/
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
import boto.ec2
|
||||
from boto.sdb.db.property import StringProperty, IntegerProperty
|
||||
from boto.manage import propget
|
||||
|
||||
InstanceTypes = ['m1.small', 'm1.large', 'm1.xlarge',
|
||||
'c1.medium', 'c1.xlarge', 'm2.xlarge',
|
||||
'm2.2xlarge', 'm2.4xlarge', 'cc1.4xlarge',
|
||||
't1.micro']
|
||||
|
||||
class BuyReservation(object):
|
||||
|
||||
def get_region(self, params):
|
||||
if not params.get('region', None):
|
||||
prop = StringProperty(name='region', verbose_name='EC2 Region',
|
||||
choices=boto.ec2.regions)
|
||||
params['region'] = propget.get(prop, choices=boto.ec2.regions)
|
||||
|
||||
def get_instance_type(self, params):
|
||||
if not params.get('instance_type', None):
|
||||
prop = StringProperty(name='instance_type', verbose_name='Instance Type',
|
||||
choices=InstanceTypes)
|
||||
params['instance_type'] = propget.get(prop)
|
||||
|
||||
def get_quantity(self, params):
|
||||
if not params.get('quantity', None):
|
||||
prop = IntegerProperty(name='quantity', verbose_name='Number of Instances')
|
||||
params['quantity'] = propget.get(prop)
|
||||
|
||||
def get_zone(self, params):
|
||||
if not params.get('zone', None):
|
||||
prop = StringProperty(name='zone', verbose_name='EC2 Availability Zone',
|
||||
choices=self.ec2.get_all_zones)
|
||||
params['zone'] = propget.get(prop)
|
||||
|
||||
def get(self, params):
|
||||
self.get_region(params)
|
||||
self.ec2 = params['region'].connect()
|
||||
self.get_instance_type(params)
|
||||
self.get_zone(params)
|
||||
self.get_quantity(params)
|
||||
|
||||
if __name__ == "__main__":
|
||||
obj = BuyReservation()
|
||||
params = {}
|
||||
obj.get(params)
|
||||
offerings = obj.ec2.get_all_reserved_instances_offerings(instance_type=params['instance_type'],
|
||||
availability_zone=params['zone'].name)
|
||||
print '\nThe following Reserved Instances Offerings are available:\n'
|
||||
for offering in offerings:
|
||||
offering.describe()
|
||||
prop = StringProperty(name='offering', verbose_name='Offering',
|
||||
choices=offerings)
|
||||
offering = propget.get(prop)
|
||||
print '\nYou have chosen this offering:'
|
||||
offering.describe()
|
||||
unit_price = float(offering.fixed_price)
|
||||
total_price = unit_price * params['quantity']
|
||||
print '!!! You are about to purchase %d of these offerings for a total of $%.2f !!!' % (params['quantity'], total_price)
|
||||
answer = raw_input('Are you sure you want to do this? If so, enter YES: ')
|
||||
if answer.strip().lower() == 'yes':
|
||||
offering.purchase(params['quantity'])
|
||||
else:
|
||||
print 'Purchase cancelled'
|
||||
604
awx/lib/site-packages/boto/ec2/cloudwatch/__init__.py
Normal file
604
awx/lib/site-packages/boto/ec2/cloudwatch/__init__.py
Normal file
@@ -0,0 +1,604 @@
|
||||
# Copyright (c) 2006-2011 Mitch Garnaat http://garnaat.org/
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
#
|
||||
"""
|
||||
This module provides an interface to the Elastic Compute Cloud (EC2)
|
||||
CloudWatch service from AWS.
|
||||
"""
|
||||
from boto.compat import json
|
||||
from boto.connection import AWSQueryConnection
|
||||
from boto.ec2.cloudwatch.metric import Metric
|
||||
from boto.ec2.cloudwatch.alarm import MetricAlarm, MetricAlarms, AlarmHistoryItem
|
||||
from boto.ec2.cloudwatch.datapoint import Datapoint
|
||||
from boto.regioninfo import RegionInfo
|
||||
import boto
|
||||
|
||||
RegionData = {
|
||||
'us-east-1': 'monitoring.us-east-1.amazonaws.com',
|
||||
'us-gov-west-1': 'monitoring.us-gov-west-1.amazonaws.com',
|
||||
'us-west-1': 'monitoring.us-west-1.amazonaws.com',
|
||||
'us-west-2': 'monitoring.us-west-2.amazonaws.com',
|
||||
'sa-east-1': 'monitoring.sa-east-1.amazonaws.com',
|
||||
'eu-west-1': 'monitoring.eu-west-1.amazonaws.com',
|
||||
'ap-northeast-1': 'monitoring.ap-northeast-1.amazonaws.com',
|
||||
'ap-southeast-1': 'monitoring.ap-southeast-1.amazonaws.com',
|
||||
'ap-southeast-2': 'monitoring.ap-southeast-2.amazonaws.com',
|
||||
}
|
||||
|
||||
|
||||
def regions():
|
||||
"""
|
||||
Get all available regions for the CloudWatch 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=CloudWatchConnection)
|
||||
regions.append(region)
|
||||
return regions
|
||||
|
||||
|
||||
def connect_to_region(region_name, **kw_params):
|
||||
"""
|
||||
Given a valid region name, return a
|
||||
:class:`boto.ec2.cloudwatch.CloudWatchConnection`.
|
||||
|
||||
:param str region_name: The name of the region to connect to.
|
||||
|
||||
:rtype: :class:`boto.ec2.CloudWatchConnection` 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 CloudWatchConnection(AWSQueryConnection):
|
||||
|
||||
APIVersion = boto.config.get('Boto', 'cloudwatch_version', '2010-08-01')
|
||||
DefaultRegionName = boto.config.get('Boto', 'cloudwatch_region_name',
|
||||
'us-east-1')
|
||||
DefaultRegionEndpoint = boto.config.get('Boto',
|
||||
'cloudwatch_region_endpoint',
|
||||
'monitoring.us-east-1.amazonaws.com')
|
||||
|
||||
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=0,
|
||||
https_connection_factory=None, region=None, path='/',
|
||||
security_token=None, validate_certs=True):
|
||||
"""
|
||||
Init method to create a new connection to EC2 Monitoring Service.
|
||||
|
||||
B{Note:} The host argument is overridden by the host specified in the
|
||||
boto configuration file.
|
||||
"""
|
||||
if not region:
|
||||
region = RegionInfo(self, self.DefaultRegionName,
|
||||
self.DefaultRegionEndpoint)
|
||||
self.region = region
|
||||
|
||||
# Ugly hack to get around both a bug in Python and a
|
||||
# misconfigured SSL cert for the eu-west-1 endpoint
|
||||
if self.region.name == 'eu-west-1':
|
||||
validate_certs = False
|
||||
|
||||
AWSQueryConnection.__init__(self, aws_access_key_id,
|
||||
aws_secret_access_key,
|
||||
is_secure, port, proxy, proxy_port,
|
||||
proxy_user, proxy_pass,
|
||||
self.region.endpoint, debug,
|
||||
https_connection_factory, path,
|
||||
security_token,
|
||||
validate_certs=validate_certs)
|
||||
|
||||
def _required_auth_capability(self):
|
||||
return ['ec2']
|
||||
|
||||
def build_dimension_param(self, dimension, params):
|
||||
prefix = 'Dimensions.member'
|
||||
i = 0
|
||||
for dim_name in dimension:
|
||||
dim_value = dimension[dim_name]
|
||||
if dim_value:
|
||||
if isinstance(dim_value, basestring):
|
||||
dim_value = [dim_value]
|
||||
for value in dim_value:
|
||||
params['%s.%d.Name' % (prefix, i+1)] = dim_name
|
||||
params['%s.%d.Value' % (prefix, i+1)] = value
|
||||
i += 1
|
||||
else:
|
||||
params['%s.%d.Name' % (prefix, i+1)] = dim_name
|
||||
i += 1
|
||||
|
||||
def build_list_params(self, params, items, label):
|
||||
if isinstance(items, basestring):
|
||||
items = [items]
|
||||
for index, item in enumerate(items):
|
||||
i = index + 1
|
||||
if isinstance(item, dict):
|
||||
for k, v in item.iteritems():
|
||||
params[label % (i, 'Name')] = k
|
||||
if v is not None:
|
||||
params[label % (i, 'Value')] = v
|
||||
else:
|
||||
params[label % i] = item
|
||||
|
||||
def build_put_params(self, params, name, value=None, timestamp=None,
|
||||
unit=None, dimensions=None, statistics=None):
|
||||
args = (name, value, unit, dimensions, statistics, timestamp)
|
||||
length = max(map(lambda a: len(a) if isinstance(a, list) else 1, args))
|
||||
|
||||
def aslist(a):
|
||||
if isinstance(a, list):
|
||||
if len(a) != length:
|
||||
raise Exception('Must specify equal number of elements; expected %d.' % length)
|
||||
return a
|
||||
return [a] * length
|
||||
|
||||
for index, (n, v, u, d, s, t) in enumerate(zip(*map(aslist, args))):
|
||||
metric_data = {'MetricName': n}
|
||||
|
||||
if timestamp:
|
||||
metric_data['Timestamp'] = t.isoformat()
|
||||
|
||||
if unit:
|
||||
metric_data['Unit'] = u
|
||||
|
||||
if dimensions:
|
||||
self.build_dimension_param(d, metric_data)
|
||||
|
||||
if statistics:
|
||||
metric_data['StatisticValues.Maximum'] = s['maximum']
|
||||
metric_data['StatisticValues.Minimum'] = s['minimum']
|
||||
metric_data['StatisticValues.SampleCount'] = s['samplecount']
|
||||
metric_data['StatisticValues.Sum'] = s['sum']
|
||||
if value != None:
|
||||
msg = 'You supplied a value and statistics for a ' + \
|
||||
'metric.Posting statistics and not value.'
|
||||
boto.log.warn(msg)
|
||||
elif value != None:
|
||||
metric_data['Value'] = v
|
||||
else:
|
||||
raise Exception('Must specify a value or statistics to put.')
|
||||
|
||||
for key, val in metric_data.iteritems():
|
||||
params['MetricData.member.%d.%s' % (index + 1, key)] = val
|
||||
|
||||
def get_metric_statistics(self, period, start_time, end_time, metric_name,
|
||||
namespace, statistics, dimensions=None,
|
||||
unit=None):
|
||||
"""
|
||||
Get time-series data for one or more statistics of a given metric.
|
||||
|
||||
:type period: integer
|
||||
:param period: The granularity, in seconds, of the returned datapoints.
|
||||
Period must be at least 60 seconds and must be a multiple
|
||||
of 60. The default value is 60.
|
||||
|
||||
:type start_time: datetime
|
||||
:param start_time: The time stamp to use for determining the
|
||||
first datapoint to return. The value specified is
|
||||
inclusive; results include datapoints with the time stamp
|
||||
specified.
|
||||
|
||||
:type end_time: datetime
|
||||
:param end_time: The time stamp to use for determining the
|
||||
last datapoint to return. The value specified is
|
||||
exclusive; results will include datapoints up to the time
|
||||
stamp specified.
|
||||
|
||||
:type metric_name: string
|
||||
:param metric_name: The metric name.
|
||||
|
||||
:type namespace: string
|
||||
:param namespace: The metric's namespace.
|
||||
|
||||
:type statistics: list
|
||||
:param statistics: A list of statistics names Valid values:
|
||||
Average | Sum | SampleCount | Maximum | Minimum
|
||||
|
||||
:type dimensions: dict
|
||||
:param dimensions: A dictionary of dimension key/values where
|
||||
the key is the dimension name and the value
|
||||
is either a scalar value or an iterator
|
||||
of values to be associated with that
|
||||
dimension.
|
||||
|
||||
:type unit: string
|
||||
:param unit: The unit for the metric. Value values are:
|
||||
Seconds | Microseconds | Milliseconds | Bytes | Kilobytes |
|
||||
Megabytes | Gigabytes | Terabytes | Bits | Kilobits |
|
||||
Megabits | Gigabits | Terabits | Percent | Count |
|
||||
Bytes/Second | Kilobytes/Second | Megabytes/Second |
|
||||
Gigabytes/Second | Terabytes/Second | Bits/Second |
|
||||
Kilobits/Second | Megabits/Second | Gigabits/Second |
|
||||
Terabits/Second | Count/Second | None
|
||||
|
||||
:rtype: list
|
||||
"""
|
||||
params = {'Period': period,
|
||||
'MetricName': metric_name,
|
||||
'Namespace': namespace,
|
||||
'StartTime': start_time.isoformat(),
|
||||
'EndTime': end_time.isoformat()}
|
||||
self.build_list_params(params, statistics, 'Statistics.member.%d')
|
||||
if dimensions:
|
||||
self.build_dimension_param(dimensions, params)
|
||||
if unit:
|
||||
params['Unit'] = unit
|
||||
return self.get_list('GetMetricStatistics', params,
|
||||
[('member', Datapoint)])
|
||||
|
||||
def list_metrics(self, next_token=None, dimensions=None,
|
||||
metric_name=None, namespace=None):
|
||||
"""
|
||||
Returns a list of the valid metrics for which there is recorded
|
||||
data available.
|
||||
|
||||
:type next_token: str
|
||||
:param next_token: A maximum of 500 metrics will be returned
|
||||
at one time. If more results are available, the ResultSet
|
||||
returned will contain a non-Null next_token attribute.
|
||||
Passing that token as a parameter to list_metrics will
|
||||
retrieve the next page of metrics.
|
||||
|
||||
:type dimensions: dict
|
||||
:param dimensions: A dictionary containing name/value
|
||||
pairs that will be used to filter the results. The key in
|
||||
the dictionary is the name of a Dimension. The value in
|
||||
the dictionary is either a scalar value of that Dimension
|
||||
name that you want to filter on, a list of values to
|
||||
filter on or None if you want all metrics with that
|
||||
Dimension name.
|
||||
|
||||
:type metric_name: str
|
||||
:param metric_name: The name of the Metric to filter against. If None,
|
||||
all Metric names will be returned.
|
||||
|
||||
:type namespace: str
|
||||
:param namespace: A Metric namespace to filter against (e.g. AWS/EC2).
|
||||
If None, Metrics from all namespaces will be returned.
|
||||
"""
|
||||
params = {}
|
||||
if next_token:
|
||||
params['NextToken'] = next_token
|
||||
if dimensions:
|
||||
self.build_dimension_param(dimensions, params)
|
||||
if metric_name:
|
||||
params['MetricName'] = metric_name
|
||||
if namespace:
|
||||
params['Namespace'] = namespace
|
||||
|
||||
return self.get_list('ListMetrics', params, [('member', Metric)])
|
||||
|
||||
def put_metric_data(self, namespace, name, value=None, timestamp=None,
|
||||
unit=None, dimensions=None, statistics=None):
|
||||
"""
|
||||
Publishes metric data points to Amazon CloudWatch. Amazon Cloudwatch
|
||||
associates the data points with the specified metric. If the specified
|
||||
metric does not exist, Amazon CloudWatch creates the metric. If a list
|
||||
is specified for some, but not all, of the arguments, the remaining
|
||||
arguments are repeated a corresponding number of times.
|
||||
|
||||
:type namespace: str
|
||||
:param namespace: The namespace of the metric.
|
||||
|
||||
:type name: str or list
|
||||
:param name: The name of the metric.
|
||||
|
||||
:type value: float or list
|
||||
:param value: The value for the metric.
|
||||
|
||||
:type timestamp: datetime or list
|
||||
:param timestamp: The time stamp used for the metric. If not specified,
|
||||
the default value is set to the time the metric data was received.
|
||||
|
||||
:type unit: string or list
|
||||
:param unit: The unit of the metric. Valid Values: Seconds |
|
||||
Microseconds | Milliseconds | Bytes | Kilobytes |
|
||||
Megabytes | Gigabytes | Terabytes | Bits | Kilobits |
|
||||
Megabits | Gigabits | Terabits | Percent | Count |
|
||||
Bytes/Second | Kilobytes/Second | Megabytes/Second |
|
||||
Gigabytes/Second | Terabytes/Second | Bits/Second |
|
||||
Kilobits/Second | Megabits/Second | Gigabits/Second |
|
||||
Terabits/Second | Count/Second | None
|
||||
|
||||
:type dimensions: dict
|
||||
:param dimensions: Add extra name value pairs to associate
|
||||
with the metric, i.e.:
|
||||
{'name1': value1, 'name2': (value2, value3)}
|
||||
|
||||
:type statistics: dict or list
|
||||
:param statistics: Use a statistic set instead of a value, for example::
|
||||
|
||||
{'maximum': 30, 'minimum': 1, 'samplecount': 100, 'sum': 10000}
|
||||
"""
|
||||
params = {'Namespace': namespace}
|
||||
self.build_put_params(params, name, value=value, timestamp=timestamp,
|
||||
unit=unit, dimensions=dimensions, statistics=statistics)
|
||||
|
||||
return self.get_status('PutMetricData', params, verb="POST")
|
||||
|
||||
def describe_alarms(self, action_prefix=None, alarm_name_prefix=None,
|
||||
alarm_names=None, max_records=None, state_value=None,
|
||||
next_token=None):
|
||||
"""
|
||||
Retrieves alarms with the specified names. If no name is specified, all
|
||||
alarms for the user are returned. Alarms can be retrieved by using only
|
||||
a prefix for the alarm name, the alarm state, or a prefix for any
|
||||
action.
|
||||
|
||||
:type action_prefix: string
|
||||
:param action_name: The action name prefix.
|
||||
|
||||
:type alarm_name_prefix: string
|
||||
:param alarm_name_prefix: The alarm name prefix. AlarmNames cannot
|
||||
be specified if this parameter is specified.
|
||||
|
||||
:type alarm_names: list
|
||||
:param alarm_names: A list of alarm names to retrieve information for.
|
||||
|
||||
:type max_records: int
|
||||
:param max_records: The maximum number of alarm descriptions
|
||||
to retrieve.
|
||||
|
||||
:type state_value: string
|
||||
:param state_value: The state value to be used in matching alarms.
|
||||
|
||||
:type next_token: string
|
||||
:param next_token: The token returned by a previous call to
|
||||
indicate that there is more data.
|
||||
|
||||
:rtype list
|
||||
"""
|
||||
params = {}
|
||||
if action_prefix:
|
||||
params['ActionPrefix'] = action_prefix
|
||||
if alarm_name_prefix:
|
||||
params['AlarmNamePrefix'] = alarm_name_prefix
|
||||
elif alarm_names:
|
||||
self.build_list_params(params, alarm_names, 'AlarmNames.member.%s')
|
||||
if max_records:
|
||||
params['MaxRecords'] = max_records
|
||||
if next_token:
|
||||
params['NextToken'] = next_token
|
||||
if state_value:
|
||||
params['StateValue'] = state_value
|
||||
|
||||
result = self.get_list('DescribeAlarms', params,
|
||||
[('MetricAlarms', MetricAlarms)])
|
||||
ret = result[0]
|
||||
ret.next_token = result.next_token
|
||||
return ret
|
||||
|
||||
def describe_alarm_history(self, alarm_name=None,
|
||||
start_date=None, end_date=None,
|
||||
max_records=None, history_item_type=None,
|
||||
next_token=None):
|
||||
"""
|
||||
Retrieves history for the specified alarm. Filter alarms by date range
|
||||
or item type. If an alarm name is not specified, Amazon CloudWatch
|
||||
returns histories for all of the owner's alarms.
|
||||
|
||||
Amazon CloudWatch retains the history of deleted alarms for a period of
|
||||
six weeks. If an alarm has been deleted, its history can still be
|
||||
queried.
|
||||
|
||||
:type alarm_name: string
|
||||
:param alarm_name: The name of the alarm.
|
||||
|
||||
:type start_date: datetime
|
||||
:param start_date: The starting date to retrieve alarm history.
|
||||
|
||||
:type end_date: datetime
|
||||
:param end_date: The starting date to retrieve alarm history.
|
||||
|
||||
:type history_item_type: string
|
||||
:param history_item_type: The type of alarm histories to retreive
|
||||
(ConfigurationUpdate | StateUpdate | Action)
|
||||
|
||||
:type max_records: int
|
||||
:param max_records: The maximum number of alarm descriptions
|
||||
to retrieve.
|
||||
|
||||
:type next_token: string
|
||||
:param next_token: The token returned by a previous call to indicate
|
||||
that there is more data.
|
||||
|
||||
:rtype list
|
||||
"""
|
||||
params = {}
|
||||
if alarm_name:
|
||||
params['AlarmName'] = alarm_name
|
||||
if start_date:
|
||||
params['StartDate'] = start_date.isoformat()
|
||||
if end_date:
|
||||
params['EndDate'] = end_date.isoformat()
|
||||
if history_item_type:
|
||||
params['HistoryItemType'] = history_item_type
|
||||
if max_records:
|
||||
params['MaxRecords'] = max_records
|
||||
if next_token:
|
||||
params['NextToken'] = next_token
|
||||
return self.get_list('DescribeAlarmHistory', params,
|
||||
[('member', AlarmHistoryItem)])
|
||||
|
||||
def describe_alarms_for_metric(self, metric_name, namespace, period=None,
|
||||
statistic=None, dimensions=None, unit=None):
|
||||
"""
|
||||
Retrieves all alarms for a single metric. Specify a statistic, period,
|
||||
or unit to filter the set of alarms further.
|
||||
|
||||
:type metric_name: string
|
||||
:param metric_name: The name of the metric
|
||||
|
||||
:type namespace: string
|
||||
:param namespace: The namespace of the metric.
|
||||
|
||||
:type period: int
|
||||
:param period: The period in seconds over which the statistic
|
||||
is applied.
|
||||
|
||||
:type statistic: string
|
||||
:param statistic: The statistic for the metric.
|
||||
|
||||
:param dimension_filters: A dictionary containing name/value
|
||||
pairs that will be used to filter the results. The key in
|
||||
the dictionary is the name of a Dimension. The value in
|
||||
the dictionary is either a scalar value of that Dimension
|
||||
name that you want to filter on, a list of values to
|
||||
filter on or None if you want all metrics with that
|
||||
Dimension name.
|
||||
|
||||
:type unit: string
|
||||
|
||||
:rtype list
|
||||
"""
|
||||
params = {'MetricName': metric_name,
|
||||
'Namespace': namespace}
|
||||
if period:
|
||||
params['Period'] = period
|
||||
if statistic:
|
||||
params['Statistic'] = statistic
|
||||
if dimensions:
|
||||
self.build_dimension_param(dimensions, params)
|
||||
if unit:
|
||||
params['Unit'] = unit
|
||||
return self.get_list('DescribeAlarmsForMetric', params,
|
||||
[('member', MetricAlarm)])
|
||||
|
||||
def put_metric_alarm(self, alarm):
|
||||
"""
|
||||
Creates or updates an alarm and associates it with the specified Amazon
|
||||
CloudWatch metric. Optionally, this operation can associate one or more
|
||||
Amazon Simple Notification Service resources with the alarm.
|
||||
|
||||
When this operation creates an alarm, the alarm state is immediately
|
||||
set to INSUFFICIENT_DATA. The alarm is evaluated and its StateValue is
|
||||
set appropriately. Any actions associated with the StateValue is then
|
||||
executed.
|
||||
|
||||
When updating an existing alarm, its StateValue is left unchanged.
|
||||
|
||||
:type alarm: boto.ec2.cloudwatch.alarm.MetricAlarm
|
||||
:param alarm: MetricAlarm object.
|
||||
"""
|
||||
params = {
|
||||
'AlarmName': alarm.name,
|
||||
'MetricName': alarm.metric,
|
||||
'Namespace': alarm.namespace,
|
||||
'Statistic': alarm.statistic,
|
||||
'ComparisonOperator': alarm.comparison,
|
||||
'Threshold': alarm.threshold,
|
||||
'EvaluationPeriods': alarm.evaluation_periods,
|
||||
'Period': alarm.period,
|
||||
}
|
||||
if alarm.actions_enabled is not None:
|
||||
params['ActionsEnabled'] = alarm.actions_enabled
|
||||
if alarm.alarm_actions:
|
||||
self.build_list_params(params, alarm.alarm_actions,
|
||||
'AlarmActions.member.%s')
|
||||
if alarm.description:
|
||||
params['AlarmDescription'] = alarm.description
|
||||
if alarm.dimensions:
|
||||
self.build_dimension_param(alarm.dimensions, params)
|
||||
if alarm.insufficient_data_actions:
|
||||
self.build_list_params(params, alarm.insufficient_data_actions,
|
||||
'InsufficientDataActions.member.%s')
|
||||
if alarm.ok_actions:
|
||||
self.build_list_params(params, alarm.ok_actions,
|
||||
'OKActions.member.%s')
|
||||
if alarm.unit:
|
||||
params['Unit'] = alarm.unit
|
||||
alarm.connection = self
|
||||
return self.get_status('PutMetricAlarm', params)
|
||||
create_alarm = put_metric_alarm
|
||||
update_alarm = put_metric_alarm
|
||||
|
||||
def delete_alarms(self, alarms):
|
||||
"""
|
||||
Deletes all specified alarms. In the event of an error, no
|
||||
alarms are deleted.
|
||||
|
||||
:type alarms: list
|
||||
:param alarms: List of alarm names.
|
||||
"""
|
||||
params = {}
|
||||
self.build_list_params(params, alarms, 'AlarmNames.member.%s')
|
||||
return self.get_status('DeleteAlarms', params)
|
||||
|
||||
def set_alarm_state(self, alarm_name, state_reason, state_value,
|
||||
state_reason_data=None):
|
||||
"""
|
||||
Temporarily sets the state of an alarm. When the updated StateValue
|
||||
differs from the previous value, the action configured for the
|
||||
appropriate state is invoked. This is not a permanent change. The next
|
||||
periodic alarm check (in about a minute) will set the alarm to its
|
||||
actual state.
|
||||
|
||||
:type alarm_name: string
|
||||
:param alarm_name: Descriptive name for alarm.
|
||||
|
||||
:type state_reason: string
|
||||
:param state_reason: Human readable reason.
|
||||
|
||||
:type state_value: string
|
||||
:param state_value: OK | ALARM | INSUFFICIENT_DATA
|
||||
|
||||
:type state_reason_data: string
|
||||
:param state_reason_data: Reason string (will be jsonified).
|
||||
"""
|
||||
params = {'AlarmName': alarm_name,
|
||||
'StateReason': state_reason,
|
||||
'StateValue': state_value}
|
||||
if state_reason_data:
|
||||
params['StateReasonData'] = json.dumps(state_reason_data)
|
||||
|
||||
return self.get_status('SetAlarmState', params)
|
||||
|
||||
def enable_alarm_actions(self, alarm_names):
|
||||
"""
|
||||
Enables actions for the specified alarms.
|
||||
|
||||
:type alarms: list
|
||||
:param alarms: List of alarm names.
|
||||
"""
|
||||
params = {}
|
||||
self.build_list_params(params, alarm_names, 'AlarmNames.member.%s')
|
||||
return self.get_status('EnableAlarmActions', params)
|
||||
|
||||
def disable_alarm_actions(self, alarm_names):
|
||||
"""
|
||||
Disables actions for the specified alarms.
|
||||
|
||||
:type alarms: list
|
||||
:param alarms: List of alarm names.
|
||||
"""
|
||||
params = {}
|
||||
self.build_list_params(params, alarm_names, 'AlarmNames.member.%s')
|
||||
return self.get_status('DisableAlarmActions', params)
|
||||
316
awx/lib/site-packages/boto/ec2/cloudwatch/alarm.py
Normal file
316
awx/lib/site-packages/boto/ec2/cloudwatch/alarm.py
Normal file
@@ -0,0 +1,316 @@
|
||||
# Copyright (c) 2010 Reza Lotun http://reza.lotun.name
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
from datetime import datetime
|
||||
from boto.resultset import ResultSet
|
||||
from boto.ec2.cloudwatch.listelement import ListElement
|
||||
from boto.ec2.cloudwatch.dimension import Dimension
|
||||
from boto.compat import json
|
||||
|
||||
|
||||
class MetricAlarms(list):
|
||||
def __init__(self, connection=None):
|
||||
"""
|
||||
Parses a list of MetricAlarms.
|
||||
"""
|
||||
list.__init__(self)
|
||||
self.connection = connection
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'member':
|
||||
metric_alarm = MetricAlarm(connection)
|
||||
self.append(metric_alarm)
|
||||
return metric_alarm
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
pass
|
||||
|
||||
|
||||
class MetricAlarm(object):
|
||||
|
||||
OK = 'OK'
|
||||
ALARM = 'ALARM'
|
||||
INSUFFICIENT_DATA = 'INSUFFICIENT_DATA'
|
||||
|
||||
_cmp_map = {
|
||||
'>=': 'GreaterThanOrEqualToThreshold',
|
||||
'>': 'GreaterThanThreshold',
|
||||
'<': 'LessThanThreshold',
|
||||
'<=': 'LessThanOrEqualToThreshold',
|
||||
}
|
||||
_rev_cmp_map = dict((v, k) for (k, v) in _cmp_map.iteritems())
|
||||
|
||||
def __init__(self, connection=None, name=None, metric=None,
|
||||
namespace=None, statistic=None, comparison=None,
|
||||
threshold=None, period=None, evaluation_periods=None,
|
||||
unit=None, description='', dimensions=None,
|
||||
alarm_actions=None, insufficient_data_actions=None,
|
||||
ok_actions=None):
|
||||
"""
|
||||
Creates a new Alarm.
|
||||
|
||||
:type name: str
|
||||
:param name: Name of alarm.
|
||||
|
||||
:type metric: str
|
||||
:param metric: Name of alarm's associated metric.
|
||||
|
||||
:type namespace: str
|
||||
:param namespace: The namespace for the alarm's metric.
|
||||
|
||||
:type statistic: str
|
||||
:param statistic: The statistic to apply to the alarm's associated
|
||||
metric.
|
||||
Valid values: SampleCount|Average|Sum|Minimum|Maximum
|
||||
|
||||
:type comparison: str
|
||||
:param comparison: Comparison used to compare statistic with threshold.
|
||||
Valid values: >= | > | < | <=
|
||||
|
||||
:type threshold: float
|
||||
:param threshold: The value against which the specified statistic
|
||||
is compared.
|
||||
|
||||
:type period: int
|
||||
:param period: The period in seconds over which teh specified
|
||||
statistic is applied.
|
||||
|
||||
:type evaluation_periods: int
|
||||
:param evaluation_period: The number of periods over which data is
|
||||
compared to the specified threshold.
|
||||
|
||||
:type unit: str
|
||||
:param unit: Allowed Values are:
|
||||
Seconds|Microseconds|Milliseconds,
|
||||
Bytes|Kilobytes|Megabytes|Gigabytes|Terabytes,
|
||||
Bits|Kilobits|Megabits|Gigabits|Terabits,
|
||||
Percent|Count|
|
||||
Bytes/Second|Kilobytes/Second|Megabytes/Second|
|
||||
Gigabytes/Second|Terabytes/Second,
|
||||
Bits/Second|Kilobits/Second|Megabits/Second,
|
||||
Gigabits/Second|Terabits/Second|Count/Second|None
|
||||
|
||||
:type description: str
|
||||
:param description: Description of MetricAlarm
|
||||
|
||||
:type dimensions: list of dicts
|
||||
:param description: Dimensions of alarm, such as:
|
||||
[{'InstanceId':['i-0123456,i-0123457']}]
|
||||
|
||||
:type alarm_actions: list of strs
|
||||
:param alarm_actions: A list of the ARNs of the actions to take in
|
||||
ALARM state
|
||||
|
||||
:type insufficient_data_actions: list of strs
|
||||
:param insufficient_data_actions: A list of the ARNs of the actions to
|
||||
take in INSUFFICIENT_DATA state
|
||||
|
||||
:type ok_actions: list of strs
|
||||
:param ok_actions: A list of the ARNs of the actions to take in OK state
|
||||
"""
|
||||
self.name = name
|
||||
self.connection = connection
|
||||
self.metric = metric
|
||||
self.namespace = namespace
|
||||
self.statistic = statistic
|
||||
if threshold is not None:
|
||||
self.threshold = float(threshold)
|
||||
else:
|
||||
self.threshold = None
|
||||
self.comparison = self._cmp_map.get(comparison)
|
||||
if period is not None:
|
||||
self.period = int(period)
|
||||
else:
|
||||
self.period = None
|
||||
if evaluation_periods is not None:
|
||||
self.evaluation_periods = int(evaluation_periods)
|
||||
else:
|
||||
self.evaluation_periods = None
|
||||
self.actions_enabled = None
|
||||
self.alarm_arn = None
|
||||
self.last_updated = None
|
||||
self.description = description
|
||||
self.dimensions = dimensions
|
||||
self.state_reason = None
|
||||
self.state_value = None
|
||||
self.unit = unit
|
||||
self.alarm_actions = alarm_actions
|
||||
self.insufficient_data_actions = insufficient_data_actions
|
||||
self.ok_actions = ok_actions
|
||||
|
||||
def __repr__(self):
|
||||
return 'MetricAlarm:%s[%s(%s) %s %s]' % (self.name, self.metric,
|
||||
self.statistic,
|
||||
self.comparison,
|
||||
self.threshold)
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'AlarmActions':
|
||||
self.alarm_actions = ListElement()
|
||||
return self.alarm_actions
|
||||
elif name == 'InsufficientDataActions':
|
||||
self.insufficient_data_actions = ListElement()
|
||||
return self.insufficient_data_actions
|
||||
elif name == 'OKActions':
|
||||
self.ok_actions = ListElement()
|
||||
return self.ok_actions
|
||||
elif name == 'Dimensions':
|
||||
self.dimensions = Dimension()
|
||||
return self.dimensions
|
||||
else:
|
||||
pass
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'ActionsEnabled':
|
||||
self.actions_enabled = value
|
||||
elif name == 'AlarmArn':
|
||||
self.alarm_arn = value
|
||||
elif name == 'AlarmConfigurationUpdatedTimestamp':
|
||||
self.last_updated = value
|
||||
elif name == 'AlarmDescription':
|
||||
self.description = value
|
||||
elif name == 'AlarmName':
|
||||
self.name = value
|
||||
elif name == 'ComparisonOperator':
|
||||
setattr(self, 'comparison', self._rev_cmp_map[value])
|
||||
elif name == 'EvaluationPeriods':
|
||||
self.evaluation_periods = int(value)
|
||||
elif name == 'MetricName':
|
||||
self.metric = value
|
||||
elif name == 'Namespace':
|
||||
self.namespace = value
|
||||
elif name == 'Period':
|
||||
self.period = int(value)
|
||||
elif name == 'StateReason':
|
||||
self.state_reason = value
|
||||
elif name == 'StateValue':
|
||||
self.state_value = value
|
||||
elif name == 'Statistic':
|
||||
self.statistic = value
|
||||
elif name == 'Threshold':
|
||||
self.threshold = float(value)
|
||||
elif name == 'Unit':
|
||||
self.unit = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
def set_state(self, value, reason, data=None):
|
||||
""" Temporarily sets the state of an alarm.
|
||||
|
||||
:type value: str
|
||||
:param value: OK | ALARM | INSUFFICIENT_DATA
|
||||
|
||||
:type reason: str
|
||||
:param reason: Reason alarm set (human readable).
|
||||
|
||||
:type data: str
|
||||
:param data: Reason data (will be jsonified).
|
||||
"""
|
||||
return self.connection.set_alarm_state(self.name, reason, value, data)
|
||||
|
||||
def update(self):
|
||||
return self.connection.update_alarm(self)
|
||||
|
||||
def enable_actions(self):
|
||||
return self.connection.enable_alarm_actions([self.name])
|
||||
|
||||
def disable_actions(self):
|
||||
return self.connection.disable_alarm_actions([self.name])
|
||||
|
||||
def describe_history(self, start_date=None, end_date=None, max_records=None,
|
||||
history_item_type=None, next_token=None):
|
||||
return self.connection.describe_alarm_history(self.name, start_date,
|
||||
end_date, max_records,
|
||||
history_item_type,
|
||||
next_token)
|
||||
|
||||
def add_alarm_action(self, action_arn=None):
|
||||
"""
|
||||
Adds an alarm action, represented as an SNS topic, to this alarm.
|
||||
What do do when alarm is triggered.
|
||||
|
||||
:type action_arn: str
|
||||
:param action_arn: SNS topics to which notification should be
|
||||
sent if the alarm goes to state ALARM.
|
||||
"""
|
||||
if not action_arn:
|
||||
return # Raise exception instead?
|
||||
self.actions_enabled = 'true'
|
||||
self.alarm_actions.append(action_arn)
|
||||
|
||||
def add_insufficient_data_action(self, action_arn=None):
|
||||
"""
|
||||
Adds an insufficient_data action, represented as an SNS topic, to
|
||||
this alarm. What to do when the insufficient_data state is reached.
|
||||
|
||||
:type action_arn: str
|
||||
:param action_arn: SNS topics to which notification should be
|
||||
sent if the alarm goes to state INSUFFICIENT_DATA.
|
||||
"""
|
||||
if not action_arn:
|
||||
return
|
||||
self.actions_enabled = 'true'
|
||||
self.insufficient_data_actions.append(action_arn)
|
||||
|
||||
def add_ok_action(self, action_arn=None):
|
||||
"""
|
||||
Adds an ok action, represented as an SNS topic, to this alarm. What
|
||||
to do when the ok state is reached.
|
||||
|
||||
:type action_arn: str
|
||||
:param action_arn: SNS topics to which notification should be
|
||||
sent if the alarm goes to state INSUFFICIENT_DATA.
|
||||
"""
|
||||
if not action_arn:
|
||||
return
|
||||
self.actions_enabled = 'true'
|
||||
self.ok_actions.append(action_arn)
|
||||
|
||||
def delete(self):
|
||||
self.connection.delete_alarms([self.name])
|
||||
|
||||
class AlarmHistoryItem(object):
|
||||
def __init__(self, connection=None):
|
||||
self.connection = connection
|
||||
|
||||
def __repr__(self):
|
||||
return 'AlarmHistory:%s[%s at %s]' % (self.name, self.summary, self.timestamp)
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
pass
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'AlarmName':
|
||||
self.name = value
|
||||
elif name == 'HistoryData':
|
||||
self.data = json.loads(value)
|
||||
elif name == 'HistoryItemType':
|
||||
self.tem_type = value
|
||||
elif name == 'HistorySummary':
|
||||
self.summary = value
|
||||
elif name == 'Timestamp':
|
||||
try:
|
||||
self.timestamp = datetime.strptime(value,
|
||||
'%Y-%m-%dT%H:%M:%S.%fZ')
|
||||
except ValueError:
|
||||
self.timestamp = datetime.strptime(value, '%Y-%m-%dT%H:%M:%SZ')
|
||||
|
||||
40
awx/lib/site-packages/boto/ec2/cloudwatch/datapoint.py
Normal file
40
awx/lib/site-packages/boto/ec2/cloudwatch/datapoint.py
Normal file
@@ -0,0 +1,40 @@
|
||||
# Copyright (c) 2006-2009 Mitch Garnaat http://garnaat.org/
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
#
|
||||
from datetime import datetime
|
||||
|
||||
class Datapoint(dict):
|
||||
|
||||
def __init__(self, connection=None):
|
||||
dict.__init__(self)
|
||||
self.connection = connection
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
pass
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name in ['Average', 'Maximum', 'Minimum', 'Sum', 'SampleCount']:
|
||||
self[name] = float(value)
|
||||
elif name == 'Timestamp':
|
||||
self[name] = datetime.strptime(value, '%Y-%m-%dT%H:%M:%SZ')
|
||||
elif name != 'member':
|
||||
self[name] = value
|
||||
|
||||
38
awx/lib/site-packages/boto/ec2/cloudwatch/dimension.py
Normal file
38
awx/lib/site-packages/boto/ec2/cloudwatch/dimension.py
Normal file
@@ -0,0 +1,38 @@
|
||||
# Copyright (c) 2006-2012 Mitch Garnaat http://garnaat.org/
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
class Dimension(dict):
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
pass
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'Name':
|
||||
self._name = value
|
||||
elif name == 'Value':
|
||||
if self._name in self:
|
||||
self[self._name].append(value)
|
||||
else:
|
||||
self[self._name] = [value]
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
31
awx/lib/site-packages/boto/ec2/cloudwatch/listelement.py
Normal file
31
awx/lib/site-packages/boto/ec2/cloudwatch/listelement.py
Normal file
@@ -0,0 +1,31 @@
|
||||
# Copyright (c) 2006-2009 Mitch Garnaat http://garnaat.org/
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
class ListElement(list):
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
pass
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'member':
|
||||
self.append(value)
|
||||
|
||||
|
||||
175
awx/lib/site-packages/boto/ec2/cloudwatch/metric.py
Normal file
175
awx/lib/site-packages/boto/ec2/cloudwatch/metric.py
Normal file
@@ -0,0 +1,175 @@
|
||||
# Copyright (c) 2006-2012 Mitch Garnaat http://garnaat.org/
|
||||
# Copyright (c) 2012 Amazon.com, Inc. or its affiliates.
|
||||
# All Rights Reserved
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
#
|
||||
|
||||
from boto.ec2.cloudwatch.alarm import MetricAlarm
|
||||
from boto.ec2.cloudwatch.dimension import Dimension
|
||||
|
||||
|
||||
class Metric(object):
|
||||
|
||||
Statistics = ['Minimum', 'Maximum', 'Sum', 'Average', 'SampleCount']
|
||||
Units = ['Seconds', 'Microseconds', 'Milliseconds', 'Bytes', 'Kilobytes',
|
||||
'Megabytes', 'Gigabytes', 'Terabytes', 'Bits', 'Kilobits',
|
||||
'Megabits', 'Gigabits', 'Terabits', 'Percent', 'Count',
|
||||
'Bytes/Second', 'Kilobytes/Second', 'Megabytes/Second',
|
||||
'Gigabytes/Second', 'Terabytes/Second', 'Bits/Second',
|
||||
'Kilobits/Second', 'Megabits/Second', 'Gigabits/Second',
|
||||
'Terabits/Second', 'Count/Second', None]
|
||||
|
||||
def __init__(self, connection=None):
|
||||
self.connection = connection
|
||||
self.name = None
|
||||
self.namespace = None
|
||||
self.dimensions = None
|
||||
|
||||
def __repr__(self):
|
||||
return 'Metric:%s' % self.name
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'Dimensions':
|
||||
self.dimensions = Dimension()
|
||||
return self.dimensions
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'MetricName':
|
||||
self.name = value
|
||||
elif name == 'Namespace':
|
||||
self.namespace = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
def query(self, start_time, end_time, statistics, unit=None, period=60):
|
||||
"""
|
||||
:type start_time: datetime
|
||||
:param start_time: The time stamp to use for determining the
|
||||
first datapoint to return. The value specified is
|
||||
inclusive; results include datapoints with the time stamp
|
||||
specified.
|
||||
|
||||
:type end_time: datetime
|
||||
:param end_time: The time stamp to use for determining the
|
||||
last datapoint to return. The value specified is
|
||||
exclusive; results will include datapoints up to the time
|
||||
stamp specified.
|
||||
|
||||
:type statistics: list
|
||||
:param statistics: A list of statistics names Valid values:
|
||||
Average | Sum | SampleCount | Maximum | Minimum
|
||||
|
||||
:type dimensions: dict
|
||||
:param dimensions: A dictionary of dimension key/values where
|
||||
the key is the dimension name and the value
|
||||
is either a scalar value or an iterator
|
||||
of values to be associated with that
|
||||
dimension.
|
||||
|
||||
:type unit: string
|
||||
:param unit: The unit for the metric. Value values are:
|
||||
Seconds | Microseconds | Milliseconds | Bytes | Kilobytes |
|
||||
Megabytes | Gigabytes | Terabytes | Bits | Kilobits |
|
||||
Megabits | Gigabits | Terabits | Percent | Count |
|
||||
Bytes/Second | Kilobytes/Second | Megabytes/Second |
|
||||
Gigabytes/Second | Terabytes/Second | Bits/Second |
|
||||
Kilobits/Second | Megabits/Second | Gigabits/Second |
|
||||
Terabits/Second | Count/Second | None
|
||||
|
||||
:type period: integer
|
||||
:param period: The granularity, in seconds, of the returned datapoints.
|
||||
Period must be at least 60 seconds and must be a multiple
|
||||
of 60. The default value is 60.
|
||||
|
||||
"""
|
||||
if not isinstance(statistics, list):
|
||||
statistics = [statistics]
|
||||
return self.connection.get_metric_statistics(period,
|
||||
start_time,
|
||||
end_time,
|
||||
self.name,
|
||||
self.namespace,
|
||||
statistics,
|
||||
self.dimensions,
|
||||
unit)
|
||||
|
||||
def create_alarm(self, name, comparison, threshold,
|
||||
period, evaluation_periods,
|
||||
statistic, enabled=True, description=None,
|
||||
dimensions=None, alarm_actions=None, ok_actions=None,
|
||||
insufficient_data_actions=None, unit=None):
|
||||
"""
|
||||
Creates or updates an alarm and associates it with this metric.
|
||||
Optionally, this operation can associate one or more
|
||||
Amazon Simple Notification Service resources with the alarm.
|
||||
|
||||
When this operation creates an alarm, the alarm state is immediately
|
||||
set to INSUFFICIENT_DATA. The alarm is evaluated and its StateValue is
|
||||
set appropriately. Any actions associated with the StateValue is then
|
||||
executed.
|
||||
|
||||
When updating an existing alarm, its StateValue is left unchanged.
|
||||
|
||||
:type alarm: boto.ec2.cloudwatch.alarm.MetricAlarm
|
||||
:param alarm: MetricAlarm object.
|
||||
"""
|
||||
if not dimensions:
|
||||
dimensions = self.dimensions
|
||||
alarm = MetricAlarm(self.connection, name, self.name,
|
||||
self.namespace, statistic, comparison,
|
||||
threshold, period, evaluation_periods,
|
||||
unit, description, dimensions,
|
||||
alarm_actions, insufficient_data_actions,
|
||||
ok_actions)
|
||||
if self.connection.put_metric_alarm(alarm):
|
||||
return alarm
|
||||
|
||||
def describe_alarms(self, period=None, statistic=None,
|
||||
dimensions=None, unit=None):
|
||||
"""
|
||||
Retrieves all alarms for this metric. Specify a statistic, period,
|
||||
or unit to filter the set of alarms further.
|
||||
|
||||
:type period: int
|
||||
:param period: The period in seconds over which the statistic
|
||||
is applied.
|
||||
|
||||
:type statistic: string
|
||||
:param statistic: The statistic for the metric.
|
||||
|
||||
:param dimension_filters: A dictionary containing name/value
|
||||
pairs that will be used to filter the results. The key in
|
||||
the dictionary is the name of a Dimension. The value in
|
||||
the dictionary is either a scalar value of that Dimension
|
||||
name that you want to filter on, a list of values to
|
||||
filter on or None if you want all metrics with that
|
||||
Dimension name.
|
||||
|
||||
:type unit: string
|
||||
|
||||
:rtype list
|
||||
"""
|
||||
return self.connection.describe_alarms_for_metric(self.name,
|
||||
self.namespace,
|
||||
period,
|
||||
statistic,
|
||||
dimensions,
|
||||
unit)
|
||||
4220
awx/lib/site-packages/boto/ec2/connection.py
Normal file
4220
awx/lib/site-packages/boto/ec2/connection.py
Normal file
File diff suppressed because it is too large
Load Diff
115
awx/lib/site-packages/boto/ec2/ec2object.py
Normal file
115
awx/lib/site-packages/boto/ec2/ec2object.py
Normal file
@@ -0,0 +1,115 @@
|
||||
# Copyright (c) 2006-2010 Mitch Garnaat http://garnaat.org/
|
||||
# Copyright (c) 2010, Eucalyptus Systems, Inc.
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
"""
|
||||
Represents an EC2 Object
|
||||
"""
|
||||
from boto.ec2.tag import TagSet
|
||||
|
||||
class EC2Object(object):
|
||||
|
||||
def __init__(self, connection=None):
|
||||
self.connection = connection
|
||||
if self.connection and hasattr(self.connection, 'region'):
|
||||
self.region = connection.region
|
||||
else:
|
||||
self.region = None
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
setattr(self, name, value)
|
||||
|
||||
|
||||
class TaggedEC2Object(EC2Object):
|
||||
"""
|
||||
Any EC2 resource that can be tagged should be represented
|
||||
by a Python object that subclasses this class. This class
|
||||
has the mechanism in place to handle the tagSet element in
|
||||
the Describe* responses. If tags are found, it will create
|
||||
a TagSet object and allow it to parse and collect the tags
|
||||
into a dict that is stored in the "tags" attribute of the
|
||||
object.
|
||||
"""
|
||||
|
||||
def __init__(self, connection=None):
|
||||
EC2Object.__init__(self, connection)
|
||||
self.tags = TagSet()
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'tagSet':
|
||||
return self.tags
|
||||
else:
|
||||
return None
|
||||
|
||||
def add_tag(self, key, value='', dry_run=False):
|
||||
"""
|
||||
Add a tag to this object. Tag's are stored by AWS and can be used
|
||||
to organize and filter resources. Adding a tag involves a round-trip
|
||||
to the EC2 service.
|
||||
|
||||
:type key: str
|
||||
:param key: The key or name of the tag being stored.
|
||||
|
||||
:type value: str
|
||||
:param value: An optional value that can be stored with the tag.
|
||||
If you want only the tag name and no value, the
|
||||
value should be the empty string.
|
||||
"""
|
||||
status = self.connection.create_tags(
|
||||
[self.id],
|
||||
{key : value},
|
||||
dry_run=dry_run
|
||||
)
|
||||
if self.tags is None:
|
||||
self.tags = TagSet()
|
||||
self.tags[key] = value
|
||||
|
||||
def remove_tag(self, key, value=None, dry_run=False):
|
||||
"""
|
||||
Remove a tag from this object. Removing a tag involves a round-trip
|
||||
to the EC2 service.
|
||||
|
||||
:type key: str
|
||||
:param key: The key or name of the tag being stored.
|
||||
|
||||
:type value: str
|
||||
:param value: An optional value that can be stored with the tag.
|
||||
If a value is provided, it must match the value
|
||||
currently stored in EC2. If not, the tag will not
|
||||
be removed. If a value of None is provided, all
|
||||
tags with the specified name will be deleted.
|
||||
NOTE: There is an important distinction between
|
||||
a value of '' and a value of None.
|
||||
"""
|
||||
if value:
|
||||
tags = {key : value}
|
||||
else:
|
||||
tags = [key]
|
||||
status = self.connection.delete_tags(
|
||||
[self.id],
|
||||
tags,
|
||||
dry_run=dry_run
|
||||
)
|
||||
if key in self.tags:
|
||||
del self.tags[key]
|
||||
651
awx/lib/site-packages/boto/ec2/elb/__init__.py
Normal file
651
awx/lib/site-packages/boto/ec2/elb/__init__.py
Normal file
@@ -0,0 +1,651 @@
|
||||
# Copyright (c) 2006-2012 Mitch Garnaat http://garnaat.org/
|
||||
# Copyright (c) 2012 Amazon.com, Inc. or its affiliates.
|
||||
# All Rights Reserved
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
#
|
||||
"""
|
||||
This module provides an interface to the Elastic Compute Cloud (EC2)
|
||||
load balancing service from AWS.
|
||||
"""
|
||||
from boto.connection import AWSQueryConnection
|
||||
from boto.ec2.instanceinfo import InstanceInfo
|
||||
from boto.ec2.elb.loadbalancer import LoadBalancer, LoadBalancerZones
|
||||
from boto.ec2.elb.instancestate import InstanceState
|
||||
from boto.ec2.elb.healthcheck import HealthCheck
|
||||
from boto.ec2.elb.listelement import ListElement
|
||||
from boto.regioninfo import RegionInfo
|
||||
import boto
|
||||
|
||||
RegionData = {
|
||||
'us-east-1': 'elasticloadbalancing.us-east-1.amazonaws.com',
|
||||
'us-gov-west-1': 'elasticloadbalancing.us-gov-west-1.amazonaws.com',
|
||||
'us-west-1': 'elasticloadbalancing.us-west-1.amazonaws.com',
|
||||
'us-west-2': 'elasticloadbalancing.us-west-2.amazonaws.com',
|
||||
'sa-east-1': 'elasticloadbalancing.sa-east-1.amazonaws.com',
|
||||
'eu-west-1': 'elasticloadbalancing.eu-west-1.amazonaws.com',
|
||||
'ap-northeast-1': 'elasticloadbalancing.ap-northeast-1.amazonaws.com',
|
||||
'ap-southeast-1': 'elasticloadbalancing.ap-southeast-1.amazonaws.com',
|
||||
'ap-southeast-2': 'elasticloadbalancing.ap-southeast-2.amazonaws.com',
|
||||
}
|
||||
|
||||
|
||||
def regions():
|
||||
"""
|
||||
Get all available regions for the ELB 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=ELBConnection)
|
||||
regions.append(region)
|
||||
return regions
|
||||
|
||||
|
||||
def connect_to_region(region_name, **kw_params):
|
||||
"""
|
||||
Given a valid region name, return a
|
||||
:class:`boto.ec2.elb.ELBConnection`.
|
||||
|
||||
:param str region_name: The name of the region to connect to.
|
||||
|
||||
:rtype: :class:`boto.ec2.ELBConnection` 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 ELBConnection(AWSQueryConnection):
|
||||
|
||||
APIVersion = boto.config.get('Boto', 'elb_version', '2012-06-01')
|
||||
DefaultRegionName = boto.config.get('Boto', 'elb_region_name', 'us-east-1')
|
||||
DefaultRegionEndpoint = boto.config.get('Boto', 'elb_region_endpoint',
|
||||
'elasticloadbalancing.us-east-1.amazonaws.com')
|
||||
|
||||
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=0,
|
||||
https_connection_factory=None, region=None, path='/',
|
||||
security_token=None, validate_certs=True):
|
||||
"""
|
||||
Init method to create a new connection to EC2 Load Balancing Service.
|
||||
|
||||
.. note:: The region argument is overridden by the region specified in
|
||||
the boto configuration file.
|
||||
"""
|
||||
if not region:
|
||||
region = RegionInfo(self, self.DefaultRegionName,
|
||||
self.DefaultRegionEndpoint)
|
||||
self.region = region
|
||||
AWSQueryConnection.__init__(self, aws_access_key_id,
|
||||
aws_secret_access_key,
|
||||
is_secure, port, proxy, proxy_port,
|
||||
proxy_user, proxy_pass,
|
||||
self.region.endpoint, debug,
|
||||
https_connection_factory, path,
|
||||
security_token,
|
||||
validate_certs=validate_certs)
|
||||
|
||||
def _required_auth_capability(self):
|
||||
return ['ec2']
|
||||
|
||||
def build_list_params(self, params, items, label):
|
||||
if isinstance(items, str):
|
||||
items = [items]
|
||||
for index, item in enumerate(items):
|
||||
params[label % (index + 1)] = item
|
||||
|
||||
def get_all_load_balancers(self, load_balancer_names=None):
|
||||
"""
|
||||
Retrieve all load balancers associated with your account.
|
||||
|
||||
:type load_balancer_names: list
|
||||
:keyword load_balancer_names: An optional list of load balancer names.
|
||||
|
||||
:rtype: :py:class:`boto.resultset.ResultSet`
|
||||
:return: A ResultSet containing instances of
|
||||
:class:`boto.ec2.elb.loadbalancer.LoadBalancer`
|
||||
"""
|
||||
params = {}
|
||||
if load_balancer_names:
|
||||
self.build_list_params(params, load_balancer_names,
|
||||
'LoadBalancerNames.member.%d')
|
||||
return self.get_list('DescribeLoadBalancers', params,
|
||||
[('member', LoadBalancer)])
|
||||
|
||||
def create_load_balancer(self, name, zones, listeners=None, subnets=None,
|
||||
security_groups=None, scheme='internet-facing', complex_listeners=None):
|
||||
"""
|
||||
Create a new load balancer for your account. By default the load
|
||||
balancer will be created in EC2. To create a load balancer inside a
|
||||
VPC, parameter zones must be set to None and subnets must not be None.
|
||||
The load balancer will be automatically created under the VPC that
|
||||
contains the subnet(s) specified.
|
||||
|
||||
:type name: string
|
||||
:param name: The mnemonic name associated with the new load balancer
|
||||
|
||||
:type zones: List of strings
|
||||
:param zones: The names of the availability zone(s) to add.
|
||||
|
||||
:type listeners: List of tuples
|
||||
:param listeners: Each tuple contains three or four values,
|
||||
(LoadBalancerPortNumber, InstancePortNumber, Protocol,
|
||||
[SSLCertificateId]) where LoadBalancerPortNumber and
|
||||
InstancePortNumber are integer values between 1 and 65535,
|
||||
Protocol is a string containing either 'TCP', 'SSL', HTTP', or
|
||||
'HTTPS'; SSLCertificateID is the ARN of a AWS AIM
|
||||
certificate, and must be specified when doing HTTPS.
|
||||
|
||||
:type subnets: list of strings
|
||||
:param subnets: A list of subnet IDs in your VPC to attach to
|
||||
your LoadBalancer.
|
||||
|
||||
:type security_groups: list of strings
|
||||
:param security_groups: The security groups assigned to your
|
||||
LoadBalancer within your VPC.
|
||||
|
||||
:type scheme: string
|
||||
:param scheme: The type of a LoadBalancer. By default, Elastic
|
||||
Load Balancing creates an internet-facing LoadBalancer with
|
||||
a publicly resolvable DNS name, which resolves to public IP
|
||||
addresses.
|
||||
|
||||
Specify the value internal for this option to create an
|
||||
internal LoadBalancer with a DNS name that resolves to
|
||||
private IP addresses.
|
||||
|
||||
This option is only available for LoadBalancers attached
|
||||
to an Amazon VPC.
|
||||
|
||||
:type complex_listeners: List of tuples
|
||||
:param complex_listeners: Each tuple contains four or five values,
|
||||
(LoadBalancerPortNumber, InstancePortNumber, Protocol, InstanceProtocol,
|
||||
SSLCertificateId).
|
||||
|
||||
Where;
|
||||
- LoadBalancerPortNumber and InstancePortNumber are integer
|
||||
values between 1 and 65535.
|
||||
- Protocol and InstanceProtocol is a string containing either 'TCP',
|
||||
'SSL', 'HTTP', or 'HTTPS'
|
||||
- SSLCertificateId is the ARN of an SSL certificate loaded into
|
||||
AWS IAM
|
||||
|
||||
:rtype: :class:`boto.ec2.elb.loadbalancer.LoadBalancer`
|
||||
:return: The newly created
|
||||
:class:`boto.ec2.elb.loadbalancer.LoadBalancer`
|
||||
"""
|
||||
if not listeners and not complex_listeners:
|
||||
# Must specify one of the two options
|
||||
return None
|
||||
|
||||
params = {'LoadBalancerName': name,
|
||||
'Scheme': scheme}
|
||||
|
||||
# Handle legacy listeners
|
||||
if listeners:
|
||||
for index, listener in enumerate(listeners):
|
||||
i = index + 1
|
||||
protocol = listener[2].upper()
|
||||
params['Listeners.member.%d.LoadBalancerPort' % i] = listener[0]
|
||||
params['Listeners.member.%d.InstancePort' % i] = listener[1]
|
||||
params['Listeners.member.%d.Protocol' % i] = listener[2]
|
||||
if protocol == 'HTTPS' or protocol == 'SSL':
|
||||
params['Listeners.member.%d.SSLCertificateId' % i] = listener[3]
|
||||
|
||||
# Handle the full listeners
|
||||
if complex_listeners:
|
||||
for index, listener in enumerate(complex_listeners):
|
||||
i = index + 1
|
||||
protocol = listener[2].upper()
|
||||
InstanceProtocol = listener[3].upper()
|
||||
params['Listeners.member.%d.LoadBalancerPort' % i] = listener[0]
|
||||
params['Listeners.member.%d.InstancePort' % i] = listener[1]
|
||||
params['Listeners.member.%d.Protocol' % i] = listener[2]
|
||||
params['Listeners.member.%d.InstanceProtocol' % i] = listener[3]
|
||||
if protocol == 'HTTPS' or protocol == 'SSL':
|
||||
params['Listeners.member.%d.SSLCertificateId' % i] = listener[4]
|
||||
|
||||
if zones:
|
||||
self.build_list_params(params, zones, 'AvailabilityZones.member.%d')
|
||||
|
||||
if subnets:
|
||||
self.build_list_params(params, subnets, 'Subnets.member.%d')
|
||||
|
||||
if security_groups:
|
||||
self.build_list_params(params, security_groups,
|
||||
'SecurityGroups.member.%d')
|
||||
|
||||
load_balancer = self.get_object('CreateLoadBalancer',
|
||||
params, LoadBalancer)
|
||||
load_balancer.name = name
|
||||
load_balancer.listeners = listeners
|
||||
load_balancer.availability_zones = zones
|
||||
load_balancer.subnets = subnets
|
||||
load_balancer.security_groups = security_groups
|
||||
return load_balancer
|
||||
|
||||
def create_load_balancer_listeners(self, name, listeners=None, complex_listeners=None):
|
||||
"""
|
||||
Creates a Listener (or group of listeners) for an existing
|
||||
Load Balancer
|
||||
|
||||
:type name: string
|
||||
:param name: The name of the load balancer to create the listeners for
|
||||
|
||||
:type listeners: List of tuples
|
||||
:param listeners: Each tuple contains three or four values,
|
||||
(LoadBalancerPortNumber, InstancePortNumber, Protocol,
|
||||
[SSLCertificateId]) where LoadBalancerPortNumber and
|
||||
InstancePortNumber are integer values between 1 and 65535,
|
||||
Protocol is a string containing either 'TCP', 'SSL', HTTP', or
|
||||
'HTTPS'; SSLCertificateID is the ARN of a AWS AIM
|
||||
certificate, and must be specified when doing HTTPS.
|
||||
|
||||
:type complex_listeners: List of tuples
|
||||
:param complex_listeners: Each tuple contains four or five values,
|
||||
(LoadBalancerPortNumber, InstancePortNumber, Protocol, InstanceProtocol,
|
||||
SSLCertificateId).
|
||||
|
||||
Where;
|
||||
- LoadBalancerPortNumber and InstancePortNumber are integer
|
||||
values between 1 and 65535.
|
||||
- Protocol and InstanceProtocol is a string containing either 'TCP',
|
||||
'SSL', 'HTTP', or 'HTTPS'
|
||||
- SSLCertificateId is the ARN of an SSL certificate loaded into
|
||||
AWS IAM
|
||||
|
||||
:return: The status of the request
|
||||
"""
|
||||
if not listeners and not complex_listeners:
|
||||
# Must specify one of the two options
|
||||
return None
|
||||
|
||||
params = {'LoadBalancerName': name}
|
||||
|
||||
# Handle the simple listeners
|
||||
if listeners:
|
||||
for index, listener in enumerate(listeners):
|
||||
i = index + 1
|
||||
protocol = listener[2].upper()
|
||||
params['Listeners.member.%d.LoadBalancerPort' % i] = listener[0]
|
||||
params['Listeners.member.%d.InstancePort' % i] = listener[1]
|
||||
params['Listeners.member.%d.Protocol' % i] = listener[2]
|
||||
if protocol == 'HTTPS' or protocol == 'SSL':
|
||||
params['Listeners.member.%d.SSLCertificateId' % i] = listener[3]
|
||||
|
||||
# Handle the full listeners
|
||||
if complex_listeners:
|
||||
for index, listener in enumerate(complex_listeners):
|
||||
i = index + 1
|
||||
protocol = listener[2].upper()
|
||||
InstanceProtocol = listener[3].upper()
|
||||
params['Listeners.member.%d.LoadBalancerPort' % i] = listener[0]
|
||||
params['Listeners.member.%d.InstancePort' % i] = listener[1]
|
||||
params['Listeners.member.%d.Protocol' % i] = listener[2]
|
||||
params['Listeners.member.%d.InstanceProtocol' % i] = listener[3]
|
||||
if protocol == 'HTTPS' or protocol == 'SSL':
|
||||
params['Listeners.member.%d.SSLCertificateId' % i] = listener[4]
|
||||
|
||||
return self.get_status('CreateLoadBalancerListeners', params)
|
||||
|
||||
def delete_load_balancer(self, name):
|
||||
"""
|
||||
Delete a Load Balancer from your account.
|
||||
|
||||
:type name: string
|
||||
:param name: The name of the Load Balancer to delete
|
||||
"""
|
||||
params = {'LoadBalancerName': name}
|
||||
return self.get_status('DeleteLoadBalancer', params)
|
||||
|
||||
def delete_load_balancer_listeners(self, name, ports):
|
||||
"""
|
||||
Deletes a load balancer listener (or group of listeners)
|
||||
|
||||
:type name: string
|
||||
:param name: The name of the load balancer to create the listeners for
|
||||
|
||||
:type ports: List int
|
||||
:param ports: Each int represents the port on the ELB to be removed
|
||||
|
||||
:return: The status of the request
|
||||
"""
|
||||
params = {'LoadBalancerName': name}
|
||||
for index, port in enumerate(ports):
|
||||
params['LoadBalancerPorts.member.%d' % (index + 1)] = port
|
||||
return self.get_status('DeleteLoadBalancerListeners', params)
|
||||
|
||||
def enable_availability_zones(self, load_balancer_name, zones_to_add):
|
||||
"""
|
||||
Add availability zones to an existing Load Balancer
|
||||
All zones must be in the same region as the Load Balancer
|
||||
Adding zones that are already registered with the Load Balancer
|
||||
has no effect.
|
||||
|
||||
:type load_balancer_name: string
|
||||
:param load_balancer_name: The name of the Load Balancer
|
||||
|
||||
:type zones: List of strings
|
||||
:param zones: The name of the zone(s) to add.
|
||||
|
||||
:rtype: List of strings
|
||||
:return: An updated list of zones for this Load Balancer.
|
||||
|
||||
"""
|
||||
params = {'LoadBalancerName': load_balancer_name}
|
||||
self.build_list_params(params, zones_to_add,
|
||||
'AvailabilityZones.member.%d')
|
||||
obj = self.get_object('EnableAvailabilityZonesForLoadBalancer',
|
||||
params, LoadBalancerZones)
|
||||
return obj.zones
|
||||
|
||||
def disable_availability_zones(self, load_balancer_name, zones_to_remove):
|
||||
"""
|
||||
Remove availability zones from an existing Load Balancer.
|
||||
All zones must be in the same region as the Load Balancer.
|
||||
Removing zones that are not registered with the Load Balancer
|
||||
has no effect.
|
||||
You cannot remove all zones from an Load Balancer.
|
||||
|
||||
:type load_balancer_name: string
|
||||
:param load_balancer_name: The name of the Load Balancer
|
||||
|
||||
:type zones: List of strings
|
||||
:param zones: The name of the zone(s) to remove.
|
||||
|
||||
:rtype: List of strings
|
||||
:return: An updated list of zones for this Load Balancer.
|
||||
|
||||
"""
|
||||
params = {'LoadBalancerName': load_balancer_name}
|
||||
self.build_list_params(params, zones_to_remove,
|
||||
'AvailabilityZones.member.%d')
|
||||
obj = self.get_object('DisableAvailabilityZonesForLoadBalancer',
|
||||
params, LoadBalancerZones)
|
||||
return obj.zones
|
||||
|
||||
def register_instances(self, load_balancer_name, instances):
|
||||
"""
|
||||
Add new Instances to an existing Load Balancer.
|
||||
|
||||
:type load_balancer_name: string
|
||||
:param load_balancer_name: The name of the Load Balancer
|
||||
|
||||
:type instances: List of strings
|
||||
:param instances: The instance ID's of the EC2 instances to add.
|
||||
|
||||
:rtype: List of strings
|
||||
:return: An updated list of instances for this Load Balancer.
|
||||
|
||||
"""
|
||||
params = {'LoadBalancerName': load_balancer_name}
|
||||
self.build_list_params(params, instances,
|
||||
'Instances.member.%d.InstanceId')
|
||||
return self.get_list('RegisterInstancesWithLoadBalancer',
|
||||
params, [('member', InstanceInfo)])
|
||||
|
||||
def deregister_instances(self, load_balancer_name, instances):
|
||||
"""
|
||||
Remove Instances from an existing Load Balancer.
|
||||
|
||||
:type load_balancer_name: string
|
||||
:param load_balancer_name: The name of the Load Balancer
|
||||
|
||||
:type instances: List of strings
|
||||
:param instances: The instance ID's of the EC2 instances to remove.
|
||||
|
||||
:rtype: List of strings
|
||||
:return: An updated list of instances for this Load Balancer.
|
||||
|
||||
"""
|
||||
params = {'LoadBalancerName': load_balancer_name}
|
||||
self.build_list_params(params, instances,
|
||||
'Instances.member.%d.InstanceId')
|
||||
return self.get_list('DeregisterInstancesFromLoadBalancer',
|
||||
params, [('member', InstanceInfo)])
|
||||
|
||||
def describe_instance_health(self, load_balancer_name, instances=None):
|
||||
"""
|
||||
Get current state of all Instances registered to an Load Balancer.
|
||||
|
||||
:type load_balancer_name: string
|
||||
:param load_balancer_name: The name of the Load Balancer
|
||||
|
||||
:type instances: List of strings
|
||||
:param instances: The instance ID's of the EC2 instances
|
||||
to return status for. If not provided,
|
||||
the state of all instances will be returned.
|
||||
|
||||
:rtype: List of :class:`boto.ec2.elb.instancestate.InstanceState`
|
||||
:return: list of state info for instances in this Load Balancer.
|
||||
|
||||
"""
|
||||
params = {'LoadBalancerName': load_balancer_name}
|
||||
if instances:
|
||||
self.build_list_params(params, instances,
|
||||
'Instances.member.%d.InstanceId')
|
||||
return self.get_list('DescribeInstanceHealth', params,
|
||||
[('member', InstanceState)])
|
||||
|
||||
def configure_health_check(self, name, health_check):
|
||||
"""
|
||||
Define a health check for the EndPoints.
|
||||
|
||||
:type name: string
|
||||
:param name: The mnemonic name associated with the load balancer
|
||||
|
||||
:type health_check: :class:`boto.ec2.elb.healthcheck.HealthCheck`
|
||||
:param health_check: A HealthCheck object populated with the desired
|
||||
values.
|
||||
|
||||
:rtype: :class:`boto.ec2.elb.healthcheck.HealthCheck`
|
||||
:return: The updated :class:`boto.ec2.elb.healthcheck.HealthCheck`
|
||||
"""
|
||||
params = {'LoadBalancerName': name,
|
||||
'HealthCheck.Timeout': health_check.timeout,
|
||||
'HealthCheck.Target': health_check.target,
|
||||
'HealthCheck.Interval': health_check.interval,
|
||||
'HealthCheck.UnhealthyThreshold': health_check.unhealthy_threshold,
|
||||
'HealthCheck.HealthyThreshold': health_check.healthy_threshold}
|
||||
return self.get_object('ConfigureHealthCheck', params, HealthCheck)
|
||||
|
||||
def set_lb_listener_SSL_certificate(self, lb_name, lb_port,
|
||||
ssl_certificate_id):
|
||||
"""
|
||||
Sets the certificate that terminates the specified listener's SSL
|
||||
connections. The specified certificate replaces any prior certificate
|
||||
that was used on the same LoadBalancer and port.
|
||||
"""
|
||||
params = {'LoadBalancerName': lb_name,
|
||||
'LoadBalancerPort': lb_port,
|
||||
'SSLCertificateId': ssl_certificate_id}
|
||||
return self.get_status('SetLoadBalancerListenerSSLCertificate', params)
|
||||
|
||||
def create_app_cookie_stickiness_policy(self, name, lb_name, policy_name):
|
||||
"""
|
||||
Generates a stickiness policy with sticky session lifetimes that follow
|
||||
that of an application-generated cookie. This policy can only be
|
||||
associated with HTTP listeners.
|
||||
|
||||
This policy is similar to the policy created by
|
||||
CreateLBCookieStickinessPolicy, except that the lifetime of the special
|
||||
Elastic Load Balancing cookie follows the lifetime of the
|
||||
application-generated cookie specified in the policy configuration. The
|
||||
load balancer only inserts a new stickiness cookie when the application
|
||||
response includes a new application cookie.
|
||||
|
||||
If the application cookie is explicitly removed or expires, the session
|
||||
stops being sticky until a new application cookie is issued.
|
||||
"""
|
||||
params = {'CookieName': name,
|
||||
'LoadBalancerName': lb_name,
|
||||
'PolicyName': policy_name}
|
||||
return self.get_status('CreateAppCookieStickinessPolicy', params)
|
||||
|
||||
def create_lb_cookie_stickiness_policy(self, cookie_expiration_period,
|
||||
lb_name, policy_name):
|
||||
"""
|
||||
Generates a stickiness policy with sticky session lifetimes controlled
|
||||
by the lifetime of the browser (user-agent) or a specified expiration
|
||||
period. This policy can only be associated only with HTTP listeners.
|
||||
|
||||
When a load balancer implements this policy, the load balancer uses a
|
||||
special cookie to track the backend server instance for each request.
|
||||
When the load balancer receives a request, it first checks to see if
|
||||
this cookie is present in the request. If so, the load balancer sends
|
||||
the request to the application server specified in the cookie. If not,
|
||||
the load balancer sends the request to a server that is chosen based on
|
||||
the existing load balancing algorithm.
|
||||
|
||||
A cookie is inserted into the response for binding subsequent requests
|
||||
from the same user to that server. The validity of the cookie is based
|
||||
on the cookie expiration time, which is specified in the policy
|
||||
configuration.
|
||||
|
||||
None may be passed for cookie_expiration_period.
|
||||
"""
|
||||
params = {'LoadBalancerName': lb_name,
|
||||
'PolicyName': policy_name}
|
||||
if cookie_expiration_period is not None:
|
||||
params['CookieExpirationPeriod'] = cookie_expiration_period
|
||||
return self.get_status('CreateLBCookieStickinessPolicy', params)
|
||||
|
||||
def create_lb_policy(self, lb_name, policy_name, policy_type, policy_attributes):
|
||||
"""
|
||||
Creates a new policy that contais the necessary attributes depending on
|
||||
the policy type. Policies are settings that are saved for your load
|
||||
balancer and that can be applied to the front-end listener, or
|
||||
the back-end application server.
|
||||
"""
|
||||
params = {'LoadBalancerName': lb_name,
|
||||
'PolicyName': policy_name,
|
||||
'PolicyTypeName': policy_type}
|
||||
for index, (name, value) in enumerate(policy_attributes.iteritems(), 1):
|
||||
params['PolicyAttributes.member.%d.AttributeName' % index] = name
|
||||
params['PolicyAttributes.member.%d.AttributeValue' % index] = value
|
||||
else:
|
||||
params['PolicyAttributes'] = ''
|
||||
return self.get_status('CreateLoadBalancerPolicy', params)
|
||||
|
||||
def delete_lb_policy(self, lb_name, policy_name):
|
||||
"""
|
||||
Deletes a policy from the LoadBalancer. The specified policy must not
|
||||
be enabled for any listeners.
|
||||
"""
|
||||
params = {'LoadBalancerName': lb_name,
|
||||
'PolicyName': policy_name}
|
||||
return self.get_status('DeleteLoadBalancerPolicy', params)
|
||||
|
||||
def set_lb_policies_of_listener(self, lb_name, lb_port, policies):
|
||||
"""
|
||||
Associates, updates, or disables a policy with a listener on the load
|
||||
balancer. Currently only zero (0) or one (1) policy can be associated
|
||||
with a listener.
|
||||
"""
|
||||
params = {'LoadBalancerName': lb_name,
|
||||
'LoadBalancerPort': lb_port}
|
||||
self.build_list_params(params, policies, 'PolicyNames.member.%d')
|
||||
return self.get_status('SetLoadBalancerPoliciesOfListener', params)
|
||||
|
||||
def set_lb_policies_of_backend_server(self, lb_name, instance_port, policies):
|
||||
"""
|
||||
Replaces the current set of policies associated with a port on which
|
||||
the back-end server is listening with a new set of policies.
|
||||
"""
|
||||
params = {'LoadBalancerName': lb_name,
|
||||
'InstancePort': instance_port}
|
||||
if policies:
|
||||
self.build_list_params(params, policies, 'PolicyNames.member.%d')
|
||||
else:
|
||||
params['PolicyNames'] = ''
|
||||
return self.get_status('SetLoadBalancerPoliciesForBackendServer', params)
|
||||
|
||||
def apply_security_groups_to_lb(self, name, security_groups):
|
||||
"""
|
||||
Applies security groups to the load balancer.
|
||||
Applying security groups that are already registered with the
|
||||
Load Balancer has no effect.
|
||||
|
||||
:type name: string
|
||||
:param name: The name of the Load Balancer
|
||||
|
||||
:type security_groups: List of strings
|
||||
:param security_groups: The name of the security group(s) to add.
|
||||
|
||||
:rtype: List of strings
|
||||
:return: An updated list of security groups for this Load Balancer.
|
||||
|
||||
"""
|
||||
params = {'LoadBalancerName': name}
|
||||
self.build_list_params(params, security_groups,
|
||||
'SecurityGroups.member.%d')
|
||||
return self.get_list('ApplySecurityGroupsToLoadBalancer',
|
||||
params, None)
|
||||
|
||||
def attach_lb_to_subnets(self, name, subnets):
|
||||
"""
|
||||
Attaches load balancer to one or more subnets.
|
||||
Attaching subnets that are already registered with the
|
||||
Load Balancer has no effect.
|
||||
|
||||
:type name: string
|
||||
:param name: The name of the Load Balancer
|
||||
|
||||
:type subnets: List of strings
|
||||
:param subnets: The name of the subnet(s) to add.
|
||||
|
||||
:rtype: List of strings
|
||||
:return: An updated list of subnets for this Load Balancer.
|
||||
|
||||
"""
|
||||
params = {'LoadBalancerName': name}
|
||||
self.build_list_params(params, subnets,
|
||||
'Subnets.member.%d')
|
||||
return self.get_list('AttachLoadBalancerToSubnets',
|
||||
params, None)
|
||||
|
||||
def detach_lb_from_subnets(self, name, subnets):
|
||||
"""
|
||||
Detaches load balancer from one or more subnets.
|
||||
|
||||
:type name: string
|
||||
:param name: The name of the Load Balancer
|
||||
|
||||
:type subnets: List of strings
|
||||
:param subnets: The name of the subnet(s) to detach.
|
||||
|
||||
:rtype: List of strings
|
||||
:return: An updated list of subnets for this Load Balancer.
|
||||
|
||||
"""
|
||||
params = {'LoadBalancerName': name}
|
||||
self.build_list_params(params, subnets,
|
||||
'Subnets.member.%d')
|
||||
return self.get_list('DetachLoadBalancerFromSubnets',
|
||||
params, None)
|
||||
89
awx/lib/site-packages/boto/ec2/elb/healthcheck.py
Normal file
89
awx/lib/site-packages/boto/ec2/elb/healthcheck.py
Normal file
@@ -0,0 +1,89 @@
|
||||
# Copyright (c) 2006-2012 Mitch Garnaat http://garnaat.org/
|
||||
# Copyright (c) 2012 Amazon.com, Inc. or its affiliates.
|
||||
# All Rights Reserved
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
|
||||
class HealthCheck(object):
|
||||
"""
|
||||
Represents an EC2 Access Point Health Check. See
|
||||
:ref:`elb-configuring-a-health-check` for a walkthrough on configuring
|
||||
load balancer health checks.
|
||||
"""
|
||||
def __init__(self, access_point=None, interval=30, target=None,
|
||||
healthy_threshold=3, timeout=5, unhealthy_threshold=5):
|
||||
"""
|
||||
:ivar str access_point: The name of the load balancer this
|
||||
health check is associated with.
|
||||
:ivar int interval: Specifies how many seconds there are between
|
||||
health checks.
|
||||
:ivar str target: Determines what to check on an instance. See the
|
||||
Amazon HealthCheck_ documentation for possible Target values.
|
||||
|
||||
.. _HealthCheck: http://docs.amazonwebservices.com/ElasticLoadBalancing/latest/APIReference/API_HealthCheck.html
|
||||
"""
|
||||
self.access_point = access_point
|
||||
self.interval = interval
|
||||
self.target = target
|
||||
self.healthy_threshold = healthy_threshold
|
||||
self.timeout = timeout
|
||||
self.unhealthy_threshold = unhealthy_threshold
|
||||
|
||||
def __repr__(self):
|
||||
return 'HealthCheck:%s' % self.target
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'Interval':
|
||||
self.interval = int(value)
|
||||
elif name == 'Target':
|
||||
self.target = value
|
||||
elif name == 'HealthyThreshold':
|
||||
self.healthy_threshold = int(value)
|
||||
elif name == 'Timeout':
|
||||
self.timeout = int(value)
|
||||
elif name == 'UnhealthyThreshold':
|
||||
self.unhealthy_threshold = int(value)
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
def update(self):
|
||||
"""
|
||||
In the case where you have accessed an existing health check on a
|
||||
load balancer, this method applies this instance's health check
|
||||
values to the load balancer it is attached to.
|
||||
|
||||
.. note:: This method will not do anything if the :py:attr:`access_point`
|
||||
attribute isn't set, as is the case with a newly instantiated
|
||||
HealthCheck instance.
|
||||
"""
|
||||
if not self.access_point:
|
||||
return
|
||||
|
||||
new_hc = self.connection.configure_health_check(self.access_point,
|
||||
self)
|
||||
self.interval = new_hc.interval
|
||||
self.target = new_hc.target
|
||||
self.healthy_threshold = new_hc.healthy_threshold
|
||||
self.unhealthy_threshold = new_hc.unhealthy_threshold
|
||||
self.timeout = new_hc.timeout
|
||||
62
awx/lib/site-packages/boto/ec2/elb/instancestate.py
Normal file
62
awx/lib/site-packages/boto/ec2/elb/instancestate.py
Normal file
@@ -0,0 +1,62 @@
|
||||
# Copyright (c) 2006-2009 Mitch Garnaat http://garnaat.org/
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
class InstanceState(object):
|
||||
"""
|
||||
Represents the state of an EC2 Load Balancer Instance
|
||||
"""
|
||||
|
||||
def __init__(self, load_balancer=None, description=None,
|
||||
state=None, instance_id=None, reason_code=None):
|
||||
"""
|
||||
:ivar boto.ec2.elb.loadbalancer.LoadBalancer load_balancer: The
|
||||
load balancer this instance is registered to.
|
||||
:ivar str description: A description of the instance.
|
||||
:ivar str instance_id: The EC2 instance ID.
|
||||
:ivar str reason_code: Provides information about the cause of
|
||||
an OutOfService instance. Specifically, it indicates whether the
|
||||
cause is Elastic Load Balancing or the instance behind the
|
||||
LoadBalancer.
|
||||
:ivar str state: Specifies the current state of the instance.
|
||||
"""
|
||||
self.load_balancer = load_balancer
|
||||
self.description = description
|
||||
self.state = state
|
||||
self.instance_id = instance_id
|
||||
self.reason_code = reason_code
|
||||
|
||||
def __repr__(self):
|
||||
return 'InstanceState:(%s,%s)' % (self.instance_id, self.state)
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'Description':
|
||||
self.description = value
|
||||
elif name == 'State':
|
||||
self.state = value
|
||||
elif name == 'InstanceId':
|
||||
self.instance_id = value
|
||||
elif name == 'ReasonCode':
|
||||
self.reason_code = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
36
awx/lib/site-packages/boto/ec2/elb/listelement.py
Normal file
36
awx/lib/site-packages/boto/ec2/elb/listelement.py
Normal file
@@ -0,0 +1,36 @@
|
||||
# Copyright (c) 2006-2012 Mitch Garnaat http://garnaat.org/
|
||||
# Copyright (c) 2012 Amazon.com, Inc. or its affiliates.
|
||||
# All Rights Reserved
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
|
||||
class ListElement(list):
|
||||
"""
|
||||
A :py:class:`list` subclass that has some additional methods
|
||||
for interacting with Amazon's XML API.
|
||||
"""
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
pass
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'member':
|
||||
self.append(value)
|
||||
85
awx/lib/site-packages/boto/ec2/elb/listener.py
Normal file
85
awx/lib/site-packages/boto/ec2/elb/listener.py
Normal file
@@ -0,0 +1,85 @@
|
||||
# Copyright (c) 2006-2012 Mitch Garnaat http://garnaat.org/
|
||||
# Copyright (c) 2012 Amazon.com, Inc. or its affiliates.
|
||||
# All Rights Reserved
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
from boto.ec2.elb.listelement import ListElement
|
||||
|
||||
|
||||
class Listener(object):
|
||||
"""
|
||||
Represents an EC2 Load Balancer Listener tuple
|
||||
"""
|
||||
|
||||
def __init__(self, load_balancer=None, load_balancer_port=0,
|
||||
instance_port=0, protocol='', ssl_certificate_id=None, instance_protocol=None):
|
||||
self.load_balancer = load_balancer
|
||||
self.load_balancer_port = load_balancer_port
|
||||
self.instance_port = instance_port
|
||||
self.protocol = protocol
|
||||
self.instance_protocol = instance_protocol
|
||||
self.ssl_certificate_id = ssl_certificate_id
|
||||
self.policy_names = ListElement()
|
||||
|
||||
def __repr__(self):
|
||||
r = "(%d, %d, '%s'" % (self.load_balancer_port, self.instance_port, self.protocol)
|
||||
if self.instance_protocol:
|
||||
r += ", '%s'" % self.instance_protocol
|
||||
if self.ssl_certificate_id:
|
||||
r += ', %s' % (self.ssl_certificate_id)
|
||||
r += ')'
|
||||
return r
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'PolicyNames':
|
||||
return self.policy_names
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'LoadBalancerPort':
|
||||
self.load_balancer_port = int(value)
|
||||
elif name == 'InstancePort':
|
||||
self.instance_port = int(value)
|
||||
elif name == 'InstanceProtocol':
|
||||
self.instance_protocol = value
|
||||
elif name == 'Protocol':
|
||||
self.protocol = value
|
||||
elif name == 'SSLCertificateId':
|
||||
self.ssl_certificate_id = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
def get_tuple(self):
|
||||
return self.load_balancer_port, self.instance_port, self.protocol
|
||||
|
||||
def get_complex_tuple(self):
|
||||
return self.load_balancer_port, self.instance_port, self.protocol, self.instance_protocol
|
||||
|
||||
def __getitem__(self, key):
|
||||
if key == 0:
|
||||
return self.load_balancer_port
|
||||
if key == 1:
|
||||
return self.instance_port
|
||||
if key == 2:
|
||||
return self.protocol
|
||||
if key == 4:
|
||||
return self.instance_protocol
|
||||
raise KeyError
|
||||
363
awx/lib/site-packages/boto/ec2/elb/loadbalancer.py
Normal file
363
awx/lib/site-packages/boto/ec2/elb/loadbalancer.py
Normal file
@@ -0,0 +1,363 @@
|
||||
# Copyright (c) 2006-2012 Mitch Garnaat http://garnaat.org/
|
||||
# Copyright (c) 2012 Amazon.com, Inc. or its affiliates. All Rights Reserved
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
from boto.ec2.elb.healthcheck import HealthCheck
|
||||
from boto.ec2.elb.listener import Listener
|
||||
from boto.ec2.elb.listelement import ListElement
|
||||
from boto.ec2.elb.policies import Policies, OtherPolicy
|
||||
from boto.ec2.elb.securitygroup import SecurityGroup
|
||||
from boto.ec2.instanceinfo import InstanceInfo
|
||||
from boto.resultset import ResultSet
|
||||
|
||||
|
||||
class Backend(object):
|
||||
"""Backend server description"""
|
||||
|
||||
def __init__(self, connection=None):
|
||||
self.connection = connection
|
||||
self.instance_port = None
|
||||
self.policies = None
|
||||
|
||||
def __repr__(self):
|
||||
return 'Backend(%r:%r)' % (self.instance_port, self.policies)
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'PolicyNames':
|
||||
self.policies = ResultSet([('member', OtherPolicy)])
|
||||
return self.policies
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'InstancePort':
|
||||
self.instance_port = int(value)
|
||||
return
|
||||
|
||||
|
||||
class LoadBalancerZones(object):
|
||||
"""
|
||||
Used to collect the zones for a Load Balancer when enable_zones
|
||||
or disable_zones are called.
|
||||
"""
|
||||
def __init__(self, connection=None):
|
||||
self.connection = connection
|
||||
self.zones = ListElement()
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'AvailabilityZones':
|
||||
return self.zones
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
pass
|
||||
|
||||
class LoadBalancer(object):
|
||||
"""
|
||||
Represents an EC2 Load Balancer.
|
||||
"""
|
||||
|
||||
def __init__(self, connection=None, name=None, endpoints=None):
|
||||
"""
|
||||
:ivar boto.ec2.elb.ELBConnection connection: The connection this load
|
||||
balancer was instance was instantiated from.
|
||||
:ivar list listeners: A list of tuples in the form of
|
||||
``(<Inbound port>, <Outbound port>, <Protocol>)``
|
||||
:ivar boto.ec2.elb.healthcheck.HealthCheck health_check: The health
|
||||
check policy for this load balancer.
|
||||
:ivar boto.ec2.elb.policies.Policies policies: Cookie stickiness and
|
||||
other policies.
|
||||
:ivar str dns_name: The external DNS name for the balancer.
|
||||
:ivar str created_time: A date+time string showing when the
|
||||
load balancer was created.
|
||||
:ivar list instances: A list of :py:class:`boto.ec2.instanceinfo.InstanceInfo`
|
||||
instances, representing the EC2 instances this load balancer is
|
||||
distributing requests to.
|
||||
:ivar list availability_zones: The availability zones this balancer
|
||||
covers.
|
||||
:ivar str canonical_hosted_zone_name: Current CNAME for the balancer.
|
||||
:ivar str canonical_hosted_zone_name_id: The Route 53 hosted zone
|
||||
ID of this balancer. Needed when creating an Alias record in a
|
||||
Route 53 hosted zone.
|
||||
:ivar boto.ec2.elb.securitygroup.SecurityGroup source_security_group:
|
||||
The security group that you can use as part of your inbound rules
|
||||
for your load balancer back-end instances to disallow traffic
|
||||
from sources other than your load balancer.
|
||||
:ivar list subnets: A list of subnets this balancer is on.
|
||||
:ivar list security_groups: A list of additional security groups that
|
||||
have been applied.
|
||||
:ivar str vpc_id: The ID of the VPC that this ELB resides within.
|
||||
:ivar list backends: A list of :py:class:`boto.ec2.elb.loadbalancer.Backend
|
||||
back-end server descriptions.
|
||||
"""
|
||||
self.connection = connection
|
||||
self.name = name
|
||||
self.listeners = None
|
||||
self.health_check = None
|
||||
self.policies = None
|
||||
self.dns_name = None
|
||||
self.created_time = None
|
||||
self.instances = None
|
||||
self.availability_zones = ListElement()
|
||||
self.canonical_hosted_zone_name = None
|
||||
self.canonical_hosted_zone_name_id = None
|
||||
self.source_security_group = None
|
||||
self.subnets = ListElement()
|
||||
self.security_groups = ListElement()
|
||||
self.vpc_id = None
|
||||
self.scheme = None
|
||||
self.backends = None
|
||||
|
||||
def __repr__(self):
|
||||
return 'LoadBalancer:%s' % self.name
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'HealthCheck':
|
||||
self.health_check = HealthCheck(self)
|
||||
return self.health_check
|
||||
elif name == 'ListenerDescriptions':
|
||||
self.listeners = ResultSet([('member', Listener)])
|
||||
return self.listeners
|
||||
elif name == 'AvailabilityZones':
|
||||
return self.availability_zones
|
||||
elif name == 'Instances':
|
||||
self.instances = ResultSet([('member', InstanceInfo)])
|
||||
return self.instances
|
||||
elif name == 'Policies':
|
||||
self.policies = Policies(self)
|
||||
return self.policies
|
||||
elif name == 'SourceSecurityGroup':
|
||||
self.source_security_group = SecurityGroup()
|
||||
return self.source_security_group
|
||||
elif name == 'Subnets':
|
||||
return self.subnets
|
||||
elif name == 'SecurityGroups':
|
||||
return self.security_groups
|
||||
elif name == 'VPCId':
|
||||
pass
|
||||
elif name == "BackendServerDescriptions":
|
||||
self.backends = ResultSet([('member', Backend)])
|
||||
return self.backends
|
||||
else:
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'LoadBalancerName':
|
||||
self.name = value
|
||||
elif name == 'DNSName':
|
||||
self.dns_name = value
|
||||
elif name == 'CreatedTime':
|
||||
self.created_time = value
|
||||
elif name == 'InstanceId':
|
||||
self.instances.append(value)
|
||||
elif name == 'CanonicalHostedZoneName':
|
||||
self.canonical_hosted_zone_name = value
|
||||
elif name == 'CanonicalHostedZoneNameID':
|
||||
self.canonical_hosted_zone_name_id = value
|
||||
elif name == 'VPCId':
|
||||
self.vpc_id = value
|
||||
elif name == 'Scheme':
|
||||
self.scheme = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
def enable_zones(self, zones):
|
||||
"""
|
||||
Enable availability zones to this Access Point.
|
||||
All zones must be in the same region as the Access Point.
|
||||
|
||||
:type zones: string or List of strings
|
||||
:param zones: The name of the zone(s) to add.
|
||||
|
||||
"""
|
||||
if isinstance(zones, str) or isinstance(zones, unicode):
|
||||
zones = [zones]
|
||||
new_zones = self.connection.enable_availability_zones(self.name, zones)
|
||||
self.availability_zones = new_zones
|
||||
|
||||
def disable_zones(self, zones):
|
||||
"""
|
||||
Disable availability zones from this Access Point.
|
||||
|
||||
:type zones: string or List of strings
|
||||
:param zones: The name of the zone(s) to add.
|
||||
|
||||
"""
|
||||
if isinstance(zones, str) or isinstance(zones, unicode):
|
||||
zones = [zones]
|
||||
new_zones = self.connection.disable_availability_zones(self.name, zones)
|
||||
self.availability_zones = new_zones
|
||||
|
||||
def register_instances(self, instances):
|
||||
"""
|
||||
Adds instances to this load balancer. All instances must be in the same
|
||||
region as the load balancer. Adding endpoints that are already
|
||||
registered with the load balancer has no effect.
|
||||
|
||||
:param list instances: List of instance IDs (strings) that you'd like
|
||||
to add to this load balancer.
|
||||
|
||||
"""
|
||||
if isinstance(instances, str) or isinstance(instances, unicode):
|
||||
instances = [instances]
|
||||
new_instances = self.connection.register_instances(self.name,
|
||||
instances)
|
||||
self.instances = new_instances
|
||||
|
||||
def deregister_instances(self, instances):
|
||||
"""
|
||||
Remove instances from this load balancer. Removing instances that are
|
||||
not registered with the load balancer has no effect.
|
||||
|
||||
:param list instances: List of instance IDs (strings) that you'd like
|
||||
to remove from this load balancer.
|
||||
|
||||
"""
|
||||
if isinstance(instances, str) or isinstance(instances, unicode):
|
||||
instances = [instances]
|
||||
new_instances = self.connection.deregister_instances(self.name,
|
||||
instances)
|
||||
self.instances = new_instances
|
||||
|
||||
def delete(self):
|
||||
"""
|
||||
Delete this load balancer.
|
||||
"""
|
||||
return self.connection.delete_load_balancer(self.name)
|
||||
|
||||
def configure_health_check(self, health_check):
|
||||
"""
|
||||
Configures the health check behavior for the instances behind this
|
||||
load balancer. See :ref:`elb-configuring-a-health-check` for a
|
||||
walkthrough.
|
||||
|
||||
:param boto.ec2.elb.healthcheck.HealthCheck health_check: A
|
||||
HealthCheck instance that tells the load balancer how to check
|
||||
its instances for health.
|
||||
"""
|
||||
return self.connection.configure_health_check(self.name, health_check)
|
||||
|
||||
def get_instance_health(self, instances=None):
|
||||
"""
|
||||
Returns a list of :py:class:`boto.ec2.elb.instancestate.InstanceState`
|
||||
objects, which show the health of the instances attached to this
|
||||
load balancer.
|
||||
|
||||
:rtype: list
|
||||
:returns: A list of
|
||||
:py:class:`InstanceState <boto.ec2.elb.instancestate.InstanceState>`
|
||||
instances, representing the instances
|
||||
attached to this load balancer.
|
||||
"""
|
||||
return self.connection.describe_instance_health(self.name, instances)
|
||||
|
||||
def create_listeners(self, listeners):
|
||||
return self.connection.create_load_balancer_listeners(self.name,
|
||||
listeners)
|
||||
|
||||
def create_listener(self, inPort, outPort=None, proto="tcp"):
|
||||
if outPort == None:
|
||||
outPort = inPort
|
||||
return self.create_listeners([(inPort, outPort, proto)])
|
||||
|
||||
def delete_listeners(self, listeners):
|
||||
return self.connection.delete_load_balancer_listeners(self.name,
|
||||
listeners)
|
||||
|
||||
def delete_listener(self, inPort):
|
||||
return self.delete_listeners([inPort])
|
||||
|
||||
def delete_policy(self, policy_name):
|
||||
"""
|
||||
Deletes a policy from the LoadBalancer. The specified policy must not
|
||||
be enabled for any listeners.
|
||||
"""
|
||||
return self.connection.delete_lb_policy(self.name, policy_name)
|
||||
|
||||
def set_policies_of_listener(self, lb_port, policies):
|
||||
return self.connection.set_lb_policies_of_listener(self.name,
|
||||
lb_port,
|
||||
policies)
|
||||
|
||||
def set_policies_of_backend_server(self, instance_port, policies):
|
||||
return self.connection.set_lb_policies_of_backend_server(self.name,
|
||||
instance_port,
|
||||
policies)
|
||||
|
||||
|
||||
def create_cookie_stickiness_policy(self, cookie_expiration_period,
|
||||
policy_name):
|
||||
return self.connection.create_lb_cookie_stickiness_policy(cookie_expiration_period, self.name, policy_name)
|
||||
|
||||
def create_app_cookie_stickiness_policy(self, name, policy_name):
|
||||
return self.connection.create_app_cookie_stickiness_policy(name,
|
||||
self.name,
|
||||
policy_name)
|
||||
|
||||
def set_listener_SSL_certificate(self, lb_port, ssl_certificate_id):
|
||||
return self.connection.set_lb_listener_SSL_certificate(self.name,
|
||||
lb_port,
|
||||
ssl_certificate_id)
|
||||
|
||||
def create_lb_policy(self, policy_name, policy_type, policy_attribute):
|
||||
return self.connection.create_lb_policy(self.name, policy_name, policy_type, policy_attribute)
|
||||
|
||||
def attach_subnets(self, subnets):
|
||||
"""
|
||||
Attaches load balancer to one or more subnets.
|
||||
Attaching subnets that are already registered with the
|
||||
Load Balancer has no effect.
|
||||
|
||||
:type subnets: string or List of strings
|
||||
:param subnets: The name of the subnet(s) to add.
|
||||
|
||||
"""
|
||||
if isinstance(subnets, str) or isinstance(subnets, unicode):
|
||||
subnets = [subnets]
|
||||
new_subnets = self.connection.attach_lb_to_subnets(self.name, subnets)
|
||||
self.subnets = new_subnets
|
||||
|
||||
def detach_subnets(self, subnets):
|
||||
"""
|
||||
Detaches load balancer from one or more subnets.
|
||||
|
||||
:type subnets: string or List of strings
|
||||
:param subnets: The name of the subnet(s) to detach.
|
||||
|
||||
"""
|
||||
if isinstance(subnets, str) or isinstance(subnets, unicode):
|
||||
subnets = [subnets]
|
||||
new_subnets = self.connection.detach_lb_to_subnets(self.name, subnets)
|
||||
self.subnets = new_subnets
|
||||
|
||||
def apply_security_groups(self, security_groups):
|
||||
"""
|
||||
Applies security groups to the load balancer.
|
||||
Applying security groups that are already registered with the
|
||||
Load Balancer has no effect.
|
||||
|
||||
:type security_groups: string or List of strings
|
||||
:param security_groups: The name of the security group(s) to add.
|
||||
|
||||
"""
|
||||
if isinstance(security_groups, str) or \
|
||||
isinstance(security_groups, unicode):
|
||||
security_groups = [security_groups]
|
||||
new_sgs = self.connection.apply_security_groups_to_lb(
|
||||
self.name, security_groups)
|
||||
self.security_groups = new_sgs
|
||||
109
awx/lib/site-packages/boto/ec2/elb/policies.py
Normal file
109
awx/lib/site-packages/boto/ec2/elb/policies.py
Normal file
@@ -0,0 +1,109 @@
|
||||
# Copyright (c) 2010 Reza Lotun http://reza.lotun.name
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
from boto.resultset import ResultSet
|
||||
|
||||
|
||||
class AppCookieStickinessPolicy(object):
|
||||
def __init__(self, connection=None):
|
||||
self.cookie_name = None
|
||||
self.policy_name = None
|
||||
|
||||
def __repr__(self):
|
||||
return 'AppCookieStickiness(%s, %s)' % (self.policy_name,
|
||||
self.cookie_name)
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
pass
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'CookieName':
|
||||
self.cookie_name = value
|
||||
elif name == 'PolicyName':
|
||||
self.policy_name = value
|
||||
|
||||
|
||||
class LBCookieStickinessPolicy(object):
|
||||
def __init__(self, connection=None):
|
||||
self.policy_name = None
|
||||
self.cookie_expiration_period = None
|
||||
|
||||
def __repr__(self):
|
||||
return 'LBCookieStickiness(%s, %s)' % (self.policy_name,
|
||||
self.cookie_expiration_period)
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
pass
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'CookieExpirationPeriod':
|
||||
self.cookie_expiration_period = value
|
||||
elif name == 'PolicyName':
|
||||
self.policy_name = value
|
||||
|
||||
|
||||
class OtherPolicy(object):
|
||||
def __init__(self, connection=None):
|
||||
self.policy_name = None
|
||||
|
||||
def __repr__(self):
|
||||
return 'OtherPolicy(%s)' % (self.policy_name)
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
pass
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
self.policy_name = value
|
||||
|
||||
|
||||
class Policies(object):
|
||||
"""
|
||||
ELB Policies
|
||||
"""
|
||||
def __init__(self, connection=None):
|
||||
self.connection = connection
|
||||
self.app_cookie_stickiness_policies = None
|
||||
self.lb_cookie_stickiness_policies = None
|
||||
self.other_policies = None
|
||||
|
||||
def __repr__(self):
|
||||
app = 'AppCookieStickiness%s' % self.app_cookie_stickiness_policies
|
||||
lb = 'LBCookieStickiness%s' % self.lb_cookie_stickiness_policies
|
||||
other = 'Other%s' % self.other_policies
|
||||
return 'Policies(%s,%s,%s)' % (app, lb, other)
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'AppCookieStickinessPolicies':
|
||||
rs = ResultSet([('member', AppCookieStickinessPolicy)])
|
||||
self.app_cookie_stickiness_policies = rs
|
||||
return rs
|
||||
elif name == 'LBCookieStickinessPolicies':
|
||||
rs = ResultSet([('member', LBCookieStickinessPolicy)])
|
||||
self.lb_cookie_stickiness_policies = rs
|
||||
return rs
|
||||
elif name == 'OtherPolicies':
|
||||
rs = ResultSet([('member', OtherPolicy)])
|
||||
self.other_policies = rs
|
||||
return rs
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
return
|
||||
|
||||
38
awx/lib/site-packages/boto/ec2/elb/securitygroup.py
Normal file
38
awx/lib/site-packages/boto/ec2/elb/securitygroup.py
Normal file
@@ -0,0 +1,38 @@
|
||||
# Copyright (c) 2010 Reza Lotun http://reza.lotun.name
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
class SecurityGroup(object):
|
||||
def __init__(self, connection=None):
|
||||
self.name = None
|
||||
self.owner_alias = None
|
||||
|
||||
def __repr__(self):
|
||||
return 'SecurityGroup(%s, %s)' % (self.name, self.owner_alias)
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
pass
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'GroupName':
|
||||
self.name = value
|
||||
elif name == 'OwnerAlias':
|
||||
self.owner_alias = value
|
||||
|
||||
39
awx/lib/site-packages/boto/ec2/group.py
Normal file
39
awx/lib/site-packages/boto/ec2/group.py
Normal file
@@ -0,0 +1,39 @@
|
||||
# Copyright (c) 2006-2010 Mitch Garnaat http://garnaat.org/
|
||||
# Copyright (c) 2010, Eucalyptus Systems, Inc.
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
class Group:
|
||||
|
||||
def __init__(self, parent=None):
|
||||
self.id = None
|
||||
self.name = None
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'groupId':
|
||||
self.id = value
|
||||
elif name == 'groupName':
|
||||
self.name = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
421
awx/lib/site-packages/boto/ec2/image.py
Normal file
421
awx/lib/site-packages/boto/ec2/image.py
Normal file
@@ -0,0 +1,421 @@
|
||||
# Copyright (c) 2006-2010 Mitch Garnaat http://garnaat.org/
|
||||
# Copyright (c) 2010, Eucalyptus Systems, Inc.
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
from boto.ec2.ec2object import EC2Object, TaggedEC2Object
|
||||
from boto.ec2.blockdevicemapping import BlockDeviceMapping
|
||||
|
||||
class ProductCodes(list):
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
pass
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'productCode':
|
||||
self.append(value)
|
||||
|
||||
class BillingProducts(list):
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
pass
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'billingProduct':
|
||||
self.append(value)
|
||||
|
||||
class Image(TaggedEC2Object):
|
||||
"""
|
||||
Represents an EC2 Image
|
||||
"""
|
||||
|
||||
def __init__(self, connection=None):
|
||||
TaggedEC2Object.__init__(self, connection)
|
||||
self.id = None
|
||||
self.location = None
|
||||
self.state = None
|
||||
self.ownerId = None # for backwards compatibility
|
||||
self.owner_id = None
|
||||
self.owner_alias = None
|
||||
self.is_public = False
|
||||
self.architecture = None
|
||||
self.platform = None
|
||||
self.type = None
|
||||
self.kernel_id = None
|
||||
self.ramdisk_id = None
|
||||
self.name = None
|
||||
self.description = None
|
||||
self.product_codes = ProductCodes()
|
||||
self.billing_products = BillingProducts()
|
||||
self.block_device_mapping = None
|
||||
self.root_device_type = None
|
||||
self.root_device_name = None
|
||||
self.virtualization_type = None
|
||||
self.hypervisor = None
|
||||
self.instance_lifecycle = None
|
||||
|
||||
def __repr__(self):
|
||||
return 'Image:%s' % self.id
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
retval = TaggedEC2Object.startElement(self, name, attrs, connection)
|
||||
if retval is not None:
|
||||
return retval
|
||||
if name == 'blockDeviceMapping':
|
||||
self.block_device_mapping = BlockDeviceMapping()
|
||||
return self.block_device_mapping
|
||||
elif name == 'productCodes':
|
||||
return self.product_codes
|
||||
elif name == 'billingProducts':
|
||||
return self.billing_products
|
||||
else:
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'imageId':
|
||||
self.id = value
|
||||
elif name == 'imageLocation':
|
||||
self.location = value
|
||||
elif name == 'imageState':
|
||||
self.state = value
|
||||
elif name == 'imageOwnerId':
|
||||
self.ownerId = value # for backwards compatibility
|
||||
self.owner_id = value
|
||||
elif name == 'isPublic':
|
||||
if value == 'false':
|
||||
self.is_public = False
|
||||
elif value == 'true':
|
||||
self.is_public = True
|
||||
else:
|
||||
raise Exception(
|
||||
'Unexpected value of isPublic %s for image %s'%(
|
||||
value,
|
||||
self.id
|
||||
)
|
||||
)
|
||||
elif name == 'architecture':
|
||||
self.architecture = value
|
||||
elif name == 'imageType':
|
||||
self.type = value
|
||||
elif name == 'kernelId':
|
||||
self.kernel_id = value
|
||||
elif name == 'ramdiskId':
|
||||
self.ramdisk_id = value
|
||||
elif name == 'imageOwnerAlias':
|
||||
self.owner_alias = value
|
||||
elif name == 'platform':
|
||||
self.platform = value
|
||||
elif name == 'name':
|
||||
self.name = value
|
||||
elif name == 'description':
|
||||
self.description = value
|
||||
elif name == 'rootDeviceType':
|
||||
self.root_device_type = value
|
||||
elif name == 'rootDeviceName':
|
||||
self.root_device_name = value
|
||||
elif name == 'virtualizationType':
|
||||
self.virtualization_type = value
|
||||
elif name == 'hypervisor':
|
||||
self.hypervisor = value
|
||||
elif name == 'instanceLifecycle':
|
||||
self.instance_lifecycle = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
def _update(self, updated):
|
||||
self.__dict__.update(updated.__dict__)
|
||||
|
||||
def update(self, validate=False, dry_run=False):
|
||||
"""
|
||||
Update the image's state information by making a call to fetch
|
||||
the current image attributes from the service.
|
||||
|
||||
:type validate: bool
|
||||
:param validate: By default, if EC2 returns no data about the
|
||||
image the update method returns quietly. If
|
||||
the validate param is True, however, it will
|
||||
raise a ValueError exception if no data is
|
||||
returned from EC2.
|
||||
"""
|
||||
rs = self.connection.get_all_images([self.id], dry_run=dry_run)
|
||||
if len(rs) > 0:
|
||||
img = rs[0]
|
||||
if img.id == self.id:
|
||||
self._update(img)
|
||||
elif validate:
|
||||
raise ValueError('%s is not a valid Image ID' % self.id)
|
||||
return self.state
|
||||
|
||||
def run(self, min_count=1, max_count=1, key_name=None,
|
||||
security_groups=None, user_data=None,
|
||||
addressing_type=None, instance_type='m1.small', placement=None,
|
||||
kernel_id=None, ramdisk_id=None,
|
||||
monitoring_enabled=False, subnet_id=None,
|
||||
block_device_map=None,
|
||||
disable_api_termination=False,
|
||||
instance_initiated_shutdown_behavior=None,
|
||||
private_ip_address=None,
|
||||
placement_group=None, security_group_ids=None,
|
||||
additional_info=None, instance_profile_name=None,
|
||||
instance_profile_arn=None, tenancy=None, dry_run=False):
|
||||
|
||||
"""
|
||||
Runs this instance.
|
||||
|
||||
:type min_count: int
|
||||
:param min_count: The minimum number of instances to start
|
||||
|
||||
:type max_count: int
|
||||
:param max_count: The maximum number of instances to start
|
||||
|
||||
:type key_name: string
|
||||
:param key_name: The name of the key pair with which to
|
||||
launch instances.
|
||||
|
||||
:type security_groups: list of strings
|
||||
:param security_groups: The names of the security groups with which to
|
||||
associate instances.
|
||||
|
||||
:type user_data: string
|
||||
:param user_data: The Base64-encoded MIME user data to be made
|
||||
available to the instance(s) in this reservation.
|
||||
|
||||
:type instance_type: string
|
||||
:param instance_type: The type of instance to run:
|
||||
|
||||
* t1.micro
|
||||
* m1.small
|
||||
* m1.medium
|
||||
* m1.large
|
||||
* m1.xlarge
|
||||
* m3.xlarge
|
||||
* m3.2xlarge
|
||||
* c1.medium
|
||||
* c1.xlarge
|
||||
* m2.xlarge
|
||||
* m2.2xlarge
|
||||
* m2.4xlarge
|
||||
* cr1.8xlarge
|
||||
* hi1.4xlarge
|
||||
* hs1.8xlarge
|
||||
* cc1.4xlarge
|
||||
* cg1.4xlarge
|
||||
* cc2.8xlarge
|
||||
|
||||
:type placement: string
|
||||
:param placement: The Availability Zone to launch the instance into.
|
||||
|
||||
:type kernel_id: string
|
||||
:param kernel_id: The ID of the kernel with which to launch the
|
||||
instances.
|
||||
|
||||
:type ramdisk_id: string
|
||||
:param ramdisk_id: The ID of the RAM disk with which to launch the
|
||||
instances.
|
||||
|
||||
:type monitoring_enabled: bool
|
||||
:param monitoring_enabled: Enable CloudWatch monitoring on
|
||||
the instance.
|
||||
|
||||
:type subnet_id: string
|
||||
:param subnet_id: The subnet ID within which to launch the instances
|
||||
for VPC.
|
||||
|
||||
:type private_ip_address: string
|
||||
:param private_ip_address: If you're using VPC, you can
|
||||
optionally use this parameter to assign the instance a
|
||||
specific available IP address from the subnet (e.g.,
|
||||
10.0.0.25).
|
||||
|
||||
:type block_device_map: :class:`boto.ec2.blockdevicemapping.BlockDeviceMapping`
|
||||
:param block_device_map: A BlockDeviceMapping data structure
|
||||
describing the EBS volumes associated with the Image.
|
||||
|
||||
:type disable_api_termination: bool
|
||||
:param disable_api_termination: If True, the instances will be locked
|
||||
and will not be able to be terminated via the API.
|
||||
|
||||
:type instance_initiated_shutdown_behavior: string
|
||||
:param instance_initiated_shutdown_behavior: Specifies whether the
|
||||
instance stops or terminates on instance-initiated shutdown.
|
||||
Valid values are:
|
||||
|
||||
* stop
|
||||
* terminate
|
||||
|
||||
:type placement_group: string
|
||||
:param placement_group: If specified, this is the name of the placement
|
||||
group in which the instance(s) will be launched.
|
||||
|
||||
:type additional_info: string
|
||||
:param additional_info: Specifies additional information to make
|
||||
available to the instance(s).
|
||||
|
||||
:type security_group_ids: list of strings
|
||||
:param security_group_ids: The ID of the VPC security groups with
|
||||
which to associate instances.
|
||||
|
||||
:type instance_profile_name: string
|
||||
:param instance_profile_name: The name of
|
||||
the IAM Instance Profile (IIP) to associate with the instances.
|
||||
|
||||
:type instance_profile_arn: string
|
||||
:param instance_profile_arn: The Amazon resource name (ARN) of
|
||||
the IAM Instance Profile (IIP) to associate with the instances.
|
||||
|
||||
:type tenancy: string
|
||||
:param tenancy: The tenancy of the instance you want to
|
||||
launch. An instance with a tenancy of 'dedicated' runs on
|
||||
single-tenant hardware and can only be launched into a
|
||||
VPC. Valid values are:"default" or "dedicated".
|
||||
NOTE: To use dedicated tenancy you MUST specify a VPC
|
||||
subnet-ID as well.
|
||||
|
||||
:rtype: Reservation
|
||||
:return: The :class:`boto.ec2.instance.Reservation` associated with
|
||||
the request for machines
|
||||
|
||||
"""
|
||||
|
||||
return self.connection.run_instances(self.id, min_count, max_count,
|
||||
key_name, security_groups,
|
||||
user_data, addressing_type,
|
||||
instance_type, placement,
|
||||
kernel_id, ramdisk_id,
|
||||
monitoring_enabled, subnet_id,
|
||||
block_device_map, disable_api_termination,
|
||||
instance_initiated_shutdown_behavior,
|
||||
private_ip_address, placement_group,
|
||||
security_group_ids=security_group_ids,
|
||||
additional_info=additional_info,
|
||||
instance_profile_name=instance_profile_name,
|
||||
instance_profile_arn=instance_profile_arn,
|
||||
tenancy=tenancy, dry_run=dry_run)
|
||||
|
||||
def deregister(self, delete_snapshot=False, dry_run=False):
|
||||
return self.connection.deregister_image(
|
||||
self.id,
|
||||
delete_snapshot,
|
||||
dry_run=dry_run
|
||||
)
|
||||
|
||||
def get_launch_permissions(self, dry_run=False):
|
||||
img_attrs = self.connection.get_image_attribute(
|
||||
self.id,
|
||||
'launchPermission',
|
||||
dry_run=dry_run
|
||||
)
|
||||
return img_attrs.attrs
|
||||
|
||||
def set_launch_permissions(self, user_ids=None, group_names=None,
|
||||
dry_run=False):
|
||||
return self.connection.modify_image_attribute(self.id,
|
||||
'launchPermission',
|
||||
'add',
|
||||
user_ids,
|
||||
group_names,
|
||||
dry_run=dry_run)
|
||||
|
||||
def remove_launch_permissions(self, user_ids=None, group_names=None,
|
||||
dry_run=False):
|
||||
return self.connection.modify_image_attribute(self.id,
|
||||
'launchPermission',
|
||||
'remove',
|
||||
user_ids,
|
||||
group_names,
|
||||
dry_run=dry_run)
|
||||
|
||||
def reset_launch_attributes(self, dry_run=False):
|
||||
return self.connection.reset_image_attribute(
|
||||
self.id,
|
||||
'launchPermission',
|
||||
dry_run=dry_run
|
||||
)
|
||||
|
||||
def get_kernel(self, dry_run=False):
|
||||
img_attrs =self.connection.get_image_attribute(
|
||||
self.id,
|
||||
'kernel',
|
||||
dry_run=dry_run
|
||||
)
|
||||
return img_attrs.kernel
|
||||
|
||||
def get_ramdisk(self, dry_run=False):
|
||||
img_attrs = self.connection.get_image_attribute(
|
||||
self.id,
|
||||
'ramdisk',
|
||||
dry_run=dry_run
|
||||
)
|
||||
return img_attrs.ramdisk
|
||||
|
||||
class ImageAttribute:
|
||||
|
||||
def __init__(self, parent=None):
|
||||
self.name = None
|
||||
self.kernel = None
|
||||
self.ramdisk = None
|
||||
self.attrs = {}
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'blockDeviceMapping':
|
||||
self.attrs['block_device_mapping'] = BlockDeviceMapping()
|
||||
return self.attrs['block_device_mapping']
|
||||
else:
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'launchPermission':
|
||||
self.name = 'launch_permission'
|
||||
elif name == 'group':
|
||||
if 'groups' in self.attrs:
|
||||
self.attrs['groups'].append(value)
|
||||
else:
|
||||
self.attrs['groups'] = [value]
|
||||
elif name == 'userId':
|
||||
if 'user_ids' in self.attrs:
|
||||
self.attrs['user_ids'].append(value)
|
||||
else:
|
||||
self.attrs['user_ids'] = [value]
|
||||
elif name == 'productCode':
|
||||
if 'product_codes' in self.attrs:
|
||||
self.attrs['product_codes'].append(value)
|
||||
else:
|
||||
self.attrs['product_codes'] = [value]
|
||||
elif name == 'imageId':
|
||||
self.image_id = value
|
||||
elif name == 'kernel':
|
||||
self.kernel = value
|
||||
elif name == 'ramdisk':
|
||||
self.ramdisk = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
|
||||
class CopyImage(object):
|
||||
def __init__(self, parent=None):
|
||||
self._parent = parent
|
||||
self.image_id = None
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
pass
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'imageId':
|
||||
self.image_id = value
|
||||
689
awx/lib/site-packages/boto/ec2/instance.py
Normal file
689
awx/lib/site-packages/boto/ec2/instance.py
Normal file
@@ -0,0 +1,689 @@
|
||||
# Copyright (c) 2006-2012 Mitch Garnaat http://garnaat.org/
|
||||
# Copyright (c) 2010, Eucalyptus Systems, Inc.
|
||||
# Copyright (c) 2012 Amazon.com, Inc. or its affiliates. All Rights Reserved
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
"""
|
||||
Represents an EC2 Instance
|
||||
"""
|
||||
import boto
|
||||
from boto.ec2.ec2object import EC2Object, TaggedEC2Object
|
||||
from boto.resultset import ResultSet
|
||||
from boto.ec2.address import Address
|
||||
from boto.ec2.blockdevicemapping import BlockDeviceMapping
|
||||
from boto.ec2.image import ProductCodes
|
||||
from boto.ec2.networkinterface import NetworkInterface
|
||||
from boto.ec2.group import Group
|
||||
import base64
|
||||
|
||||
|
||||
class InstanceState(object):
|
||||
"""
|
||||
The state of the instance.
|
||||
|
||||
:ivar code: The low byte represents the state. The high byte is an
|
||||
opaque internal value and should be ignored. Valid values:
|
||||
|
||||
* 0 (pending)
|
||||
* 16 (running)
|
||||
* 32 (shutting-down)
|
||||
* 48 (terminated)
|
||||
* 64 (stopping)
|
||||
* 80 (stopped)
|
||||
|
||||
:ivar name: The name of the state of the instance. Valid values:
|
||||
|
||||
* "pending"
|
||||
* "running"
|
||||
* "shutting-down"
|
||||
* "terminated"
|
||||
* "stopping"
|
||||
* "stopped"
|
||||
"""
|
||||
def __init__(self, code=0, name=None):
|
||||
self.code = code
|
||||
self.name = name
|
||||
|
||||
def __repr__(self):
|
||||
return '%s(%d)' % (self.name, self.code)
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
pass
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'code':
|
||||
self.code = int(value)
|
||||
elif name == 'name':
|
||||
self.name = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
|
||||
class InstancePlacement(object):
|
||||
"""
|
||||
The location where the instance launched.
|
||||
|
||||
:ivar zone: The Availability Zone of the instance.
|
||||
:ivar group_name: The name of the placement group the instance is
|
||||
in (for cluster compute instances).
|
||||
:ivar tenancy: The tenancy of the instance (if the instance is
|
||||
running within a VPC). An instance with a tenancy of dedicated
|
||||
runs on single-tenant hardware.
|
||||
"""
|
||||
def __init__(self, zone=None, group_name=None, tenancy=None):
|
||||
self.zone = zone
|
||||
self.group_name = group_name
|
||||
self.tenancy = tenancy
|
||||
|
||||
def __repr__(self):
|
||||
return self.zone
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
pass
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'availabilityZone':
|
||||
self.zone = value
|
||||
elif name == 'groupName':
|
||||
self.group_name = value
|
||||
elif name == 'tenancy':
|
||||
self.tenancy = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
|
||||
class Reservation(EC2Object):
|
||||
"""
|
||||
Represents a Reservation response object.
|
||||
|
||||
:ivar id: The unique ID of the Reservation.
|
||||
:ivar owner_id: The unique ID of the owner of the Reservation.
|
||||
:ivar groups: A list of Group objects representing the security
|
||||
groups associated with launched instances.
|
||||
:ivar instances: A list of Instance objects launched in this
|
||||
Reservation.
|
||||
"""
|
||||
def __init__(self, connection=None):
|
||||
EC2Object.__init__(self, connection)
|
||||
self.id = None
|
||||
self.owner_id = None
|
||||
self.groups = []
|
||||
self.instances = []
|
||||
|
||||
def __repr__(self):
|
||||
return 'Reservation:%s' % self.id
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'instancesSet':
|
||||
self.instances = ResultSet([('item', Instance)])
|
||||
return self.instances
|
||||
elif name == 'groupSet':
|
||||
self.groups = ResultSet([('item', Group)])
|
||||
return self.groups
|
||||
else:
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'reservationId':
|
||||
self.id = value
|
||||
elif name == 'ownerId':
|
||||
self.owner_id = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
def stop_all(self, dry_run=False):
|
||||
for instance in self.instances:
|
||||
instance.stop(dry_run=dry_run)
|
||||
|
||||
|
||||
class Instance(TaggedEC2Object):
|
||||
"""
|
||||
Represents an instance.
|
||||
|
||||
:ivar id: The unique ID of the Instance.
|
||||
:ivar groups: A list of Group objects representing the security
|
||||
groups associated with the instance.
|
||||
:ivar public_dns_name: The public dns name of the instance.
|
||||
:ivar private_dns_name: The private dns name of the instance.
|
||||
:ivar state: The string representation of the instance's current state.
|
||||
:ivar state_code: An integer representation of the instance's
|
||||
current state.
|
||||
:ivar previous_state: The string representation of the instance's
|
||||
previous state.
|
||||
:ivar previous_state_code: An integer representation of the
|
||||
instance's current state.
|
||||
:ivar key_name: The name of the SSH key associated with the instance.
|
||||
:ivar instance_type: The type of instance (e.g. m1.small).
|
||||
:ivar launch_time: The time the instance was launched.
|
||||
:ivar image_id: The ID of the AMI used to launch this instance.
|
||||
:ivar placement: The availability zone in which the instance is running.
|
||||
:ivar placement_group: The name of the placement group the instance
|
||||
is in (for cluster compute instances).
|
||||
:ivar placement_tenancy: The tenancy of the instance, if the instance
|
||||
is running within a VPC. An instance with a tenancy of dedicated
|
||||
runs on a single-tenant hardware.
|
||||
:ivar kernel: The kernel associated with the instance.
|
||||
:ivar ramdisk: The ramdisk associated with the instance.
|
||||
:ivar architecture: The architecture of the image (i386|x86_64).
|
||||
:ivar hypervisor: The hypervisor used.
|
||||
:ivar virtualization_type: The type of virtualization used.
|
||||
:ivar product_codes: A list of product codes associated with this instance.
|
||||
:ivar ami_launch_index: This instances position within it's launch group.
|
||||
:ivar monitored: A boolean indicating whether monitoring is enabled or not.
|
||||
:ivar monitoring_state: A string value that contains the actual value
|
||||
of the monitoring element returned by EC2.
|
||||
:ivar spot_instance_request_id: The ID of the spot instance request
|
||||
if this is a spot instance.
|
||||
:ivar subnet_id: The VPC Subnet ID, if running in VPC.
|
||||
:ivar vpc_id: The VPC ID, if running in VPC.
|
||||
:ivar private_ip_address: The private IP address of the instance.
|
||||
:ivar ip_address: The public IP address of the instance.
|
||||
:ivar platform: Platform of the instance (e.g. Windows)
|
||||
:ivar root_device_name: The name of the root device.
|
||||
:ivar root_device_type: The root device type (ebs|instance-store).
|
||||
:ivar block_device_mapping: The Block Device Mapping for the instance.
|
||||
:ivar state_reason: The reason for the most recent state transition.
|
||||
:ivar groups: List of security Groups associated with the instance.
|
||||
:ivar interfaces: List of Elastic Network Interfaces associated with
|
||||
this instance.
|
||||
:ivar ebs_optimized: Whether instance is using optimized EBS volumes
|
||||
or not.
|
||||
:ivar instance_profile: A Python dict containing the instance
|
||||
profile id and arn associated with this instance.
|
||||
"""
|
||||
|
||||
def __init__(self, connection=None):
|
||||
TaggedEC2Object.__init__(self, connection)
|
||||
self.id = None
|
||||
self.dns_name = None
|
||||
self.public_dns_name = None
|
||||
self.private_dns_name = None
|
||||
self.key_name = None
|
||||
self.instance_type = None
|
||||
self.launch_time = None
|
||||
self.image_id = None
|
||||
self.kernel = None
|
||||
self.ramdisk = None
|
||||
self.product_codes = ProductCodes()
|
||||
self.ami_launch_index = None
|
||||
self.monitored = False
|
||||
self.monitoring_state = None
|
||||
self.spot_instance_request_id = None
|
||||
self.subnet_id = None
|
||||
self.vpc_id = None
|
||||
self.private_ip_address = None
|
||||
self.ip_address = None
|
||||
self.requester_id = None
|
||||
self._in_monitoring_element = False
|
||||
self.persistent = False
|
||||
self.root_device_name = None
|
||||
self.root_device_type = None
|
||||
self.block_device_mapping = None
|
||||
self.state_reason = None
|
||||
self.group_name = None
|
||||
self.client_token = None
|
||||
self.eventsSet = None
|
||||
self.groups = []
|
||||
self.platform = None
|
||||
self.interfaces = []
|
||||
self.hypervisor = None
|
||||
self.virtualization_type = None
|
||||
self.architecture = None
|
||||
self.instance_profile = None
|
||||
self._previous_state = None
|
||||
self._state = InstanceState()
|
||||
self._placement = InstancePlacement()
|
||||
|
||||
def __repr__(self):
|
||||
return 'Instance:%s' % self.id
|
||||
|
||||
@property
|
||||
def state(self):
|
||||
return self._state.name
|
||||
|
||||
@property
|
||||
def state_code(self):
|
||||
return self._state.code
|
||||
|
||||
@property
|
||||
def previous_state(self):
|
||||
if self._previous_state:
|
||||
return self._previous_state.name
|
||||
return None
|
||||
|
||||
@property
|
||||
def previous_state_code(self):
|
||||
if self._previous_state:
|
||||
return self._previous_state.code
|
||||
return 0
|
||||
|
||||
@property
|
||||
def placement(self):
|
||||
return self._placement.zone
|
||||
|
||||
@property
|
||||
def placement_group(self):
|
||||
return self._placement.group_name
|
||||
|
||||
@property
|
||||
def placement_tenancy(self):
|
||||
return self._placement.tenancy
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
retval = TaggedEC2Object.startElement(self, name, attrs, connection)
|
||||
if retval is not None:
|
||||
return retval
|
||||
if name == 'monitoring':
|
||||
self._in_monitoring_element = True
|
||||
elif name == 'blockDeviceMapping':
|
||||
self.block_device_mapping = BlockDeviceMapping()
|
||||
return self.block_device_mapping
|
||||
elif name == 'productCodes':
|
||||
return self.product_codes
|
||||
elif name == 'stateReason':
|
||||
self.state_reason = SubParse('stateReason')
|
||||
return self.state_reason
|
||||
elif name == 'groupSet':
|
||||
self.groups = ResultSet([('item', Group)])
|
||||
return self.groups
|
||||
elif name == "eventsSet":
|
||||
self.eventsSet = SubParse('eventsSet')
|
||||
return self.eventsSet
|
||||
elif name == 'networkInterfaceSet':
|
||||
self.interfaces = ResultSet([('item', NetworkInterface)])
|
||||
return self.interfaces
|
||||
elif name == 'iamInstanceProfile':
|
||||
self.instance_profile = SubParse('iamInstanceProfile')
|
||||
return self.instance_profile
|
||||
elif name == 'currentState':
|
||||
return self._state
|
||||
elif name == 'previousState':
|
||||
self._previous_state = InstanceState()
|
||||
return self._previous_state
|
||||
elif name == 'instanceState':
|
||||
return self._state
|
||||
elif name == 'placement':
|
||||
return self._placement
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'instanceId':
|
||||
self.id = value
|
||||
elif name == 'imageId':
|
||||
self.image_id = value
|
||||
elif name == 'dnsName' or name == 'publicDnsName':
|
||||
self.dns_name = value # backwards compatibility
|
||||
self.public_dns_name = value
|
||||
elif name == 'privateDnsName':
|
||||
self.private_dns_name = value
|
||||
elif name == 'keyName':
|
||||
self.key_name = value
|
||||
elif name == 'amiLaunchIndex':
|
||||
self.ami_launch_index = value
|
||||
elif name == 'previousState':
|
||||
self.previous_state = value
|
||||
elif name == 'name':
|
||||
self.state = value
|
||||
elif name == 'code':
|
||||
try:
|
||||
self.state_code = int(value)
|
||||
except ValueError:
|
||||
boto.log.warning('Error converting code (%s) to int' % value)
|
||||
self.state_code = value
|
||||
elif name == 'instanceType':
|
||||
self.instance_type = value
|
||||
elif name == 'rootDeviceName':
|
||||
self.root_device_name = value
|
||||
elif name == 'rootDeviceType':
|
||||
self.root_device_type = value
|
||||
elif name == 'launchTime':
|
||||
self.launch_time = value
|
||||
elif name == 'platform':
|
||||
self.platform = value
|
||||
elif name == 'kernelId':
|
||||
self.kernel = value
|
||||
elif name == 'ramdiskId':
|
||||
self.ramdisk = value
|
||||
elif name == 'state':
|
||||
if self._in_monitoring_element:
|
||||
self.monitoring_state = value
|
||||
if value == 'enabled':
|
||||
self.monitored = True
|
||||
self._in_monitoring_element = False
|
||||
elif name == 'spotInstanceRequestId':
|
||||
self.spot_instance_request_id = value
|
||||
elif name == 'subnetId':
|
||||
self.subnet_id = value
|
||||
elif name == 'vpcId':
|
||||
self.vpc_id = value
|
||||
elif name == 'privateIpAddress':
|
||||
self.private_ip_address = value
|
||||
elif name == 'ipAddress':
|
||||
self.ip_address = value
|
||||
elif name == 'requesterId':
|
||||
self.requester_id = value
|
||||
elif name == 'persistent':
|
||||
if value == 'true':
|
||||
self.persistent = True
|
||||
else:
|
||||
self.persistent = False
|
||||
elif name == 'groupName':
|
||||
if self._in_monitoring_element:
|
||||
self.group_name = value
|
||||
elif name == 'clientToken':
|
||||
self.client_token = value
|
||||
elif name == "eventsSet":
|
||||
self.events = value
|
||||
elif name == 'hypervisor':
|
||||
self.hypervisor = value
|
||||
elif name == 'virtualizationType':
|
||||
self.virtualization_type = value
|
||||
elif name == 'architecture':
|
||||
self.architecture = value
|
||||
elif name == 'ebsOptimized':
|
||||
self.ebs_optimized = (value == 'true')
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
def _update(self, updated):
|
||||
self.__dict__.update(updated.__dict__)
|
||||
|
||||
def update(self, validate=False, dry_run=False):
|
||||
"""
|
||||
Update the instance's state information by making a call to fetch
|
||||
the current instance attributes from the service.
|
||||
|
||||
:type validate: bool
|
||||
:param validate: By default, if EC2 returns no data about the
|
||||
instance the update method returns quietly. If
|
||||
the validate param is True, however, it will
|
||||
raise a ValueError exception if no data is
|
||||
returned from EC2.
|
||||
"""
|
||||
rs = self.connection.get_all_reservations([self.id], dry_run=dry_run)
|
||||
if len(rs) > 0:
|
||||
r = rs[0]
|
||||
for i in r.instances:
|
||||
if i.id == self.id:
|
||||
self._update(i)
|
||||
elif validate:
|
||||
raise ValueError('%s is not a valid Instance ID' % self.id)
|
||||
return self.state
|
||||
|
||||
def terminate(self, dry_run=False):
|
||||
"""
|
||||
Terminate the instance
|
||||
"""
|
||||
rs = self.connection.terminate_instances([self.id], dry_run=dry_run)
|
||||
if len(rs) > 0:
|
||||
self._update(rs[0])
|
||||
|
||||
def stop(self, force=False, dry_run=False):
|
||||
"""
|
||||
Stop the instance
|
||||
|
||||
:type force: bool
|
||||
:param force: Forces the instance to stop
|
||||
|
||||
:rtype: list
|
||||
:return: A list of the instances stopped
|
||||
"""
|
||||
rs = self.connection.stop_instances([self.id], force, dry_run=dry_run)
|
||||
if len(rs) > 0:
|
||||
self._update(rs[0])
|
||||
|
||||
def start(self, dry_run=False):
|
||||
"""
|
||||
Start the instance.
|
||||
"""
|
||||
rs = self.connection.start_instances([self.id], dry_run=dry_run)
|
||||
if len(rs) > 0:
|
||||
self._update(rs[0])
|
||||
|
||||
def reboot(self, dry_run=False):
|
||||
return self.connection.reboot_instances([self.id], dry_run=dry_run)
|
||||
|
||||
def get_console_output(self, dry_run=False):
|
||||
"""
|
||||
Retrieves the console output for the instance.
|
||||
|
||||
:rtype: :class:`boto.ec2.instance.ConsoleOutput`
|
||||
:return: The console output as a ConsoleOutput object
|
||||
"""
|
||||
return self.connection.get_console_output(self.id, dry_run=dry_run)
|
||||
|
||||
def confirm_product(self, product_code, dry_run=False):
|
||||
return self.connection.confirm_product_instance(
|
||||
self.id,
|
||||
product_code,
|
||||
dry_run=dry_run
|
||||
)
|
||||
|
||||
def use_ip(self, ip_address, dry_run=False):
|
||||
"""
|
||||
Associates an Elastic IP to the instance.
|
||||
|
||||
:type ip_address: Either an instance of
|
||||
:class:`boto.ec2.address.Address` or a string.
|
||||
:param ip_address: The IP address to associate
|
||||
with the instance.
|
||||
|
||||
:rtype: bool
|
||||
:return: True if successful
|
||||
"""
|
||||
|
||||
if isinstance(ip_address, Address):
|
||||
ip_address = ip_address.public_ip
|
||||
return self.connection.associate_address(
|
||||
self.id,
|
||||
ip_address,
|
||||
dry_run=dry_run
|
||||
)
|
||||
|
||||
def monitor(self, dry_run=False):
|
||||
return self.connection.monitor_instance(self.id, dry_run=dry_run)
|
||||
|
||||
def unmonitor(self, dry_run=False):
|
||||
return self.connection.unmonitor_instance(self.id, dry_run=dry_run)
|
||||
|
||||
def get_attribute(self, attribute, dry_run=False):
|
||||
"""
|
||||
Gets an attribute from this instance.
|
||||
|
||||
:type attribute: string
|
||||
:param attribute: The attribute you need information about
|
||||
Valid choices are:
|
||||
|
||||
* instanceType
|
||||
* kernel
|
||||
* ramdisk
|
||||
* userData
|
||||
* disableApiTermination
|
||||
* instanceInitiatedShutdownBehavior
|
||||
* rootDeviceName
|
||||
* blockDeviceMapping
|
||||
* productCodes
|
||||
* sourceDestCheck
|
||||
* groupSet
|
||||
* ebsOptimized
|
||||
|
||||
:rtype: :class:`boto.ec2.image.InstanceAttribute`
|
||||
:return: An InstanceAttribute object representing the value of the
|
||||
attribute requested
|
||||
"""
|
||||
return self.connection.get_instance_attribute(
|
||||
self.id,
|
||||
attribute,
|
||||
dry_run=dry_run
|
||||
)
|
||||
|
||||
def modify_attribute(self, attribute, value, dry_run=False):
|
||||
"""
|
||||
Changes an attribute of this instance
|
||||
|
||||
:type attribute: string
|
||||
:param attribute: The attribute you wish to change.
|
||||
|
||||
* instanceType - A valid instance type (m1.small)
|
||||
* kernel - Kernel ID (None)
|
||||
* ramdisk - Ramdisk ID (None)
|
||||
* userData - Base64 encoded String (None)
|
||||
* disableApiTermination - Boolean (true)
|
||||
* instanceInitiatedShutdownBehavior - stop|terminate
|
||||
* sourceDestCheck - Boolean (true)
|
||||
* groupSet - Set of Security Groups or IDs
|
||||
* ebsOptimized - Boolean (false)
|
||||
|
||||
:type value: string
|
||||
:param value: The new value for the attribute
|
||||
|
||||
:rtype: bool
|
||||
:return: Whether the operation succeeded or not
|
||||
"""
|
||||
return self.connection.modify_instance_attribute(
|
||||
self.id,
|
||||
attribute,
|
||||
value,
|
||||
dry_run=dry_run
|
||||
)
|
||||
|
||||
def reset_attribute(self, attribute, dry_run=False):
|
||||
"""
|
||||
Resets an attribute of this instance to its default value.
|
||||
|
||||
:type attribute: string
|
||||
:param attribute: The attribute to reset. Valid values are:
|
||||
kernel|ramdisk
|
||||
|
||||
:rtype: bool
|
||||
:return: Whether the operation succeeded or not
|
||||
"""
|
||||
return self.connection.reset_instance_attribute(
|
||||
self.id,
|
||||
attribute,
|
||||
dry_run=dry_run
|
||||
)
|
||||
|
||||
def create_image(self, name, description=None, no_reboot=False,
|
||||
dry_run=False):
|
||||
"""
|
||||
Will create an AMI from the instance in the running or stopped
|
||||
state.
|
||||
|
||||
:type name: string
|
||||
:param name: The name of the new image
|
||||
|
||||
:type description: string
|
||||
:param description: An optional human-readable string describing
|
||||
the contents and purpose of the AMI.
|
||||
|
||||
:type no_reboot: bool
|
||||
:param no_reboot: An optional flag indicating that the bundling process
|
||||
should not attempt to shutdown the instance before
|
||||
bundling. If this flag is True, the responsibility
|
||||
of maintaining file system integrity is left to the
|
||||
owner of the instance.
|
||||
|
||||
:rtype: string
|
||||
:return: The new image id
|
||||
"""
|
||||
return self.connection.create_image(
|
||||
self.id,
|
||||
name,
|
||||
description,
|
||||
no_reboot,
|
||||
dry_run=dry_run
|
||||
)
|
||||
|
||||
|
||||
class ConsoleOutput:
|
||||
|
||||
def __init__(self, parent=None):
|
||||
self.parent = parent
|
||||
self.instance_id = None
|
||||
self.timestamp = None
|
||||
self.output = None
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'instanceId':
|
||||
self.instance_id = value
|
||||
elif name == 'timestamp':
|
||||
self.timestamp = value
|
||||
elif name == 'output':
|
||||
self.output = base64.b64decode(value)
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
|
||||
class InstanceAttribute(dict):
|
||||
|
||||
ValidValues = ['instanceType', 'kernel', 'ramdisk', 'userData',
|
||||
'disableApiTermination',
|
||||
'instanceInitiatedShutdownBehavior',
|
||||
'rootDeviceName', 'blockDeviceMapping', 'sourceDestCheck',
|
||||
'groupSet']
|
||||
|
||||
def __init__(self, parent=None):
|
||||
dict.__init__(self)
|
||||
self.instance_id = None
|
||||
self.request_id = None
|
||||
self._current_value = None
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'blockDeviceMapping':
|
||||
self[name] = BlockDeviceMapping()
|
||||
return self[name]
|
||||
elif name == 'groupSet':
|
||||
self[name] = ResultSet([('item', Group)])
|
||||
return self[name]
|
||||
else:
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'instanceId':
|
||||
self.instance_id = value
|
||||
elif name == 'requestId':
|
||||
self.request_id = value
|
||||
elif name == 'value':
|
||||
if value == 'true':
|
||||
value = True
|
||||
elif value == 'false':
|
||||
value = False
|
||||
self._current_value = value
|
||||
elif name in self.ValidValues:
|
||||
self[name] = self._current_value
|
||||
|
||||
|
||||
class SubParse(dict):
|
||||
|
||||
def __init__(self, section, parent=None):
|
||||
dict.__init__(self)
|
||||
self.section = section
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name != self.section:
|
||||
self[name] = value
|
||||
51
awx/lib/site-packages/boto/ec2/instanceinfo.py
Normal file
51
awx/lib/site-packages/boto/ec2/instanceinfo.py
Normal file
@@ -0,0 +1,51 @@
|
||||
# Copyright (c) 2006-2008 Mitch Garnaat http://garnaat.org/
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
class InstanceInfo(object):
|
||||
"""
|
||||
Represents an EC2 Instance status response from CloudWatch
|
||||
"""
|
||||
|
||||
def __init__(self, connection=None, id=None, state=None):
|
||||
"""
|
||||
:ivar str id: The instance's EC2 ID.
|
||||
:ivar str state: Specifies the current status of the instance.
|
||||
"""
|
||||
self.connection = connection
|
||||
self.id = id
|
||||
self.state = state
|
||||
|
||||
def __repr__(self):
|
||||
return 'InstanceInfo:%s' % self.id
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'instanceId' or name == 'InstanceId':
|
||||
self.id = value
|
||||
elif name == 'state':
|
||||
self.state = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
|
||||
|
||||
212
awx/lib/site-packages/boto/ec2/instancestatus.py
Normal file
212
awx/lib/site-packages/boto/ec2/instancestatus.py
Normal file
@@ -0,0 +1,212 @@
|
||||
# Copyright (c) 2012 Mitch Garnaat http://garnaat.org/
|
||||
# Copyright (c) 2012 Amazon.com, Inc. or its affiliates.
|
||||
# All Rights Reserved
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
|
||||
class Details(dict):
|
||||
"""
|
||||
A dict object that contains name/value pairs which provide
|
||||
more detailed information about the status of the system
|
||||
or the instance.
|
||||
"""
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'name':
|
||||
self._name = value
|
||||
elif name == 'status':
|
||||
self[self._name] = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
|
||||
class Event(object):
|
||||
"""
|
||||
A status event for an instance.
|
||||
|
||||
:ivar code: A string indicating the event type.
|
||||
:ivar description: A string describing the reason for the event.
|
||||
:ivar not_before: A datestring describing the earliest time for
|
||||
the event.
|
||||
:ivar not_after: A datestring describing the latest time for
|
||||
the event.
|
||||
"""
|
||||
|
||||
def __init__(self, code=None, description=None,
|
||||
not_before=None, not_after=None):
|
||||
self.code = code
|
||||
self.description = description
|
||||
self.not_before = not_before
|
||||
self.not_after = not_after
|
||||
|
||||
def __repr__(self):
|
||||
return 'Event:%s' % self.code
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'code':
|
||||
self.code = value
|
||||
elif name == 'description':
|
||||
self.description = value
|
||||
elif name == 'notBefore':
|
||||
self.not_before = value
|
||||
elif name == 'notAfter':
|
||||
self.not_after = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
|
||||
class Status(object):
|
||||
"""
|
||||
A generic Status object used for system status and instance status.
|
||||
|
||||
:ivar status: A string indicating overall status.
|
||||
:ivar details: A dict containing name-value pairs which provide
|
||||
more details about the current status.
|
||||
"""
|
||||
|
||||
def __init__(self, status=None, details=None):
|
||||
self.status = status
|
||||
if not details:
|
||||
details = Details()
|
||||
self.details = details
|
||||
|
||||
def __repr__(self):
|
||||
return 'Status:%s' % self.status
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'details':
|
||||
return self.details
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'status':
|
||||
self.status = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
|
||||
class EventSet(list):
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'item':
|
||||
event = Event()
|
||||
self.append(event)
|
||||
return event
|
||||
else:
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
setattr(self, name, value)
|
||||
|
||||
|
||||
class InstanceStatus(object):
|
||||
"""
|
||||
Represents an EC2 Instance status as reported by
|
||||
DescribeInstanceStatus request.
|
||||
|
||||
:ivar id: The instance identifier.
|
||||
:ivar zone: The availability zone of the instance.
|
||||
:ivar events: A list of events relevant to the instance.
|
||||
:ivar state_code: An integer representing the current state
|
||||
of the instance.
|
||||
:ivar state_name: A string describing the current state
|
||||
of the instance.
|
||||
:ivar system_status: A Status object that reports impaired
|
||||
functionality that stems from issues related to the systems
|
||||
that support an instance, such as such as hardware failures
|
||||
and network connectivity problems.
|
||||
:ivar instance_status: A Status object that reports impaired
|
||||
functionality that arises from problems internal to the instance.
|
||||
"""
|
||||
|
||||
def __init__(self, id=None, zone=None, events=None,
|
||||
state_code=None, state_name=None):
|
||||
self.id = id
|
||||
self.zone = zone
|
||||
self.events = events
|
||||
self.state_code = state_code
|
||||
self.state_name = state_name
|
||||
self.system_status = Status()
|
||||
self.instance_status = Status()
|
||||
|
||||
def __repr__(self):
|
||||
return 'InstanceStatus:%s' % self.id
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'eventsSet':
|
||||
self.events = EventSet()
|
||||
return self.events
|
||||
elif name == 'systemStatus':
|
||||
return self.system_status
|
||||
elif name == 'instanceStatus':
|
||||
return self.instance_status
|
||||
else:
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'instanceId':
|
||||
self.id = value
|
||||
elif name == 'availabilityZone':
|
||||
self.zone = value
|
||||
elif name == 'code':
|
||||
self.state_code = int(value)
|
||||
elif name == 'name':
|
||||
self.state_name = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
|
||||
class InstanceStatusSet(list):
|
||||
"""
|
||||
A list object that contains the results of a call to
|
||||
DescribeInstanceStatus request. Each element of the
|
||||
list will be an InstanceStatus object.
|
||||
|
||||
:ivar next_token: If the response was truncated by
|
||||
the EC2 service, the next_token attribute of the
|
||||
object will contain the string that needs to be
|
||||
passed in to the next request to retrieve the next
|
||||
set of results.
|
||||
"""
|
||||
|
||||
def __init__(self, connection=None):
|
||||
list.__init__(self)
|
||||
self.connection = connection
|
||||
self.next_token = None
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'item':
|
||||
status = InstanceStatus()
|
||||
self.append(status)
|
||||
return status
|
||||
else:
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'nextToken':
|
||||
self.next_token = value
|
||||
setattr(self, name, value)
|
||||
113
awx/lib/site-packages/boto/ec2/keypair.py
Normal file
113
awx/lib/site-packages/boto/ec2/keypair.py
Normal file
@@ -0,0 +1,113 @@
|
||||
# Copyright (c) 2006,2007 Mitch Garnaat http://garnaat.org/
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
"""
|
||||
Represents an EC2 Keypair
|
||||
"""
|
||||
|
||||
import os
|
||||
from boto.ec2.ec2object import EC2Object
|
||||
from boto.exception import BotoClientError
|
||||
|
||||
class KeyPair(EC2Object):
|
||||
|
||||
def __init__(self, connection=None):
|
||||
EC2Object.__init__(self, connection)
|
||||
self.name = None
|
||||
self.fingerprint = None
|
||||
self.material = None
|
||||
|
||||
def __repr__(self):
|
||||
return 'KeyPair:%s' % self.name
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'keyName':
|
||||
self.name = value
|
||||
elif name == 'keyFingerprint':
|
||||
self.fingerprint = value
|
||||
elif name == 'keyMaterial':
|
||||
self.material = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
def delete(self, dry_run=False):
|
||||
"""
|
||||
Delete the KeyPair.
|
||||
|
||||
:rtype: bool
|
||||
:return: True if successful, otherwise False.
|
||||
"""
|
||||
return self.connection.delete_key_pair(self.name, dry_run=dry_run)
|
||||
|
||||
def save(self, directory_path):
|
||||
"""
|
||||
Save the material (the unencrypted PEM encoded RSA private key)
|
||||
of a newly created KeyPair to a local file.
|
||||
|
||||
:type directory_path: string
|
||||
:param directory_path: The fully qualified path to the directory
|
||||
in which the keypair will be saved. The
|
||||
keypair file will be named using the name
|
||||
of the keypair as the base name and .pem
|
||||
for the file extension. If a file of that
|
||||
name already exists in the directory, an
|
||||
exception will be raised and the old file
|
||||
will not be overwritten.
|
||||
|
||||
:rtype: bool
|
||||
:return: True if successful.
|
||||
"""
|
||||
if self.material:
|
||||
directory_path = os.path.expanduser(directory_path)
|
||||
file_path = os.path.join(directory_path, '%s.pem' % self.name)
|
||||
if os.path.exists(file_path):
|
||||
raise BotoClientError('%s already exists, it will not be overwritten' % file_path)
|
||||
fp = open(file_path, 'wb')
|
||||
fp.write(self.material)
|
||||
fp.close()
|
||||
os.chmod(file_path, 0600)
|
||||
return True
|
||||
else:
|
||||
raise BotoClientError('KeyPair contains no material')
|
||||
|
||||
def copy_to_region(self, region, dry_run=False):
|
||||
"""
|
||||
Create a new key pair of the same new in another region.
|
||||
Note that the new key pair will use a different ssh
|
||||
cert than the this key pair. After doing the copy,
|
||||
you will need to save the material associated with the
|
||||
new key pair (use the save method) to a local file.
|
||||
|
||||
:type region: :class:`boto.ec2.regioninfo.RegionInfo`
|
||||
:param region: The region to which this security group will be copied.
|
||||
|
||||
:rtype: :class:`boto.ec2.keypair.KeyPair`
|
||||
:return: The new key pair
|
||||
"""
|
||||
if region.name == self.region:
|
||||
raise BotoClientError('Unable to copy to the same Region')
|
||||
conn_params = self.connection.get_params()
|
||||
rconn = region.connect(**conn_params)
|
||||
kp = rconn.create_key_pair(self.name, dry_run=dry_run)
|
||||
return kp
|
||||
|
||||
|
||||
|
||||
105
awx/lib/site-packages/boto/ec2/launchspecification.py
Normal file
105
awx/lib/site-packages/boto/ec2/launchspecification.py
Normal file
@@ -0,0 +1,105 @@
|
||||
# Copyright (c) 2006-2012 Mitch Garnaat http://garnaat.org/
|
||||
# Copyright (c) 2012 Amazon.com, Inc. or its affiliates. All Rights Reserved
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
"""
|
||||
Represents a launch specification for Spot instances.
|
||||
"""
|
||||
|
||||
from boto.ec2.ec2object import EC2Object
|
||||
from boto.resultset import ResultSet
|
||||
from boto.ec2.blockdevicemapping import BlockDeviceMapping
|
||||
from boto.ec2.group import Group
|
||||
from boto.ec2.instance import SubParse
|
||||
|
||||
|
||||
class GroupList(list):
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
pass
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'groupId':
|
||||
self.append(value)
|
||||
|
||||
|
||||
class LaunchSpecification(EC2Object):
|
||||
|
||||
def __init__(self, connection=None):
|
||||
EC2Object.__init__(self, connection)
|
||||
self.key_name = None
|
||||
self.instance_type = None
|
||||
self.image_id = None
|
||||
self.groups = []
|
||||
self.placement = None
|
||||
self.kernel = None
|
||||
self.ramdisk = None
|
||||
self.monitored = False
|
||||
self.subnet_id = None
|
||||
self._in_monitoring_element = False
|
||||
self.block_device_mapping = None
|
||||
self.instance_profile = None
|
||||
self.ebs_optimized = False
|
||||
|
||||
def __repr__(self):
|
||||
return 'LaunchSpecification(%s)' % self.image_id
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'groupSet':
|
||||
self.groups = ResultSet([('item', Group)])
|
||||
return self.groups
|
||||
elif name == 'monitoring':
|
||||
self._in_monitoring_element = True
|
||||
elif name == 'blockDeviceMapping':
|
||||
self.block_device_mapping = BlockDeviceMapping()
|
||||
return self.block_device_mapping
|
||||
elif name == 'iamInstanceProfile':
|
||||
self.instance_profile = SubParse('iamInstanceProfile')
|
||||
return self.instance_profile
|
||||
else:
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'imageId':
|
||||
self.image_id = value
|
||||
elif name == 'keyName':
|
||||
self.key_name = value
|
||||
elif name == 'instanceType':
|
||||
self.instance_type = value
|
||||
elif name == 'availabilityZone':
|
||||
self.placement = value
|
||||
elif name == 'placement':
|
||||
pass
|
||||
elif name == 'kernelId':
|
||||
self.kernel = value
|
||||
elif name == 'ramdiskId':
|
||||
self.ramdisk = value
|
||||
elif name == 'subnetId':
|
||||
self.subnet_id = value
|
||||
elif name == 'state':
|
||||
if self._in_monitoring_element:
|
||||
if value == 'enabled':
|
||||
self.monitored = True
|
||||
self._in_monitoring_element = False
|
||||
elif name == 'ebsOptimized':
|
||||
self.ebs_optimized = (value == 'true')
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
287
awx/lib/site-packages/boto/ec2/networkinterface.py
Normal file
287
awx/lib/site-packages/boto/ec2/networkinterface.py
Normal file
@@ -0,0 +1,287 @@
|
||||
# Copyright (c) 2011 Mitch Garnaat http://garnaat.org/
|
||||
# Copyright (c) 2012 Amazon.com, Inc. or its affiliates. All Rights Reserved
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
"""
|
||||
Represents an EC2 Elastic Network Interface
|
||||
"""
|
||||
from boto.exception import BotoClientError
|
||||
from boto.ec2.ec2object import TaggedEC2Object
|
||||
from boto.resultset import ResultSet
|
||||
from boto.ec2.group import Group
|
||||
|
||||
|
||||
class Attachment(object):
|
||||
"""
|
||||
:ivar id: The ID of the attachment.
|
||||
:ivar instance_id: The ID of the instance.
|
||||
:ivar device_index: The index of this device.
|
||||
:ivar status: The status of the device.
|
||||
:ivar attach_time: The time the device was attached.
|
||||
:ivar delete_on_termination: Whether the device will be deleted
|
||||
when the instance is terminated.
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
self.id = None
|
||||
self.instance_id = None
|
||||
self.instance_owner_id = None
|
||||
self.device_index = 0
|
||||
self.status = None
|
||||
self.attach_time = None
|
||||
self.delete_on_termination = False
|
||||
|
||||
def __repr__(self):
|
||||
return 'Attachment:%s' % self.id
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'attachmentId':
|
||||
self.id = value
|
||||
elif name == 'instanceId':
|
||||
self.instance_id = value
|
||||
elif name == 'deviceIndex':
|
||||
self.device_index = int(value)
|
||||
elif name == 'instanceOwnerId':
|
||||
self.instance_owner_id = value
|
||||
elif name == 'status':
|
||||
self.status = value
|
||||
elif name == 'attachTime':
|
||||
self.attach_time = value
|
||||
elif name == 'deleteOnTermination':
|
||||
if value.lower() == 'true':
|
||||
self.delete_on_termination = True
|
||||
else:
|
||||
self.delete_on_termination = False
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
|
||||
class NetworkInterface(TaggedEC2Object):
|
||||
"""
|
||||
An Elastic Network Interface.
|
||||
|
||||
:ivar id: The ID of the ENI.
|
||||
:ivar subnet_id: The ID of the VPC subnet.
|
||||
:ivar vpc_id: The ID of the VPC.
|
||||
:ivar description: The description.
|
||||
:ivar owner_id: The ID of the owner of the ENI.
|
||||
:ivar requester_managed:
|
||||
:ivar status: The interface's status (available|in-use).
|
||||
:ivar mac_address: The MAC address of the interface.
|
||||
:ivar private_ip_address: The IP address of the interface within
|
||||
the subnet.
|
||||
:ivar source_dest_check: Flag to indicate whether to validate
|
||||
network traffic to or from this network interface.
|
||||
:ivar groups: List of security groups associated with the interface.
|
||||
:ivar attachment: The attachment object.
|
||||
:ivar private_ip_addresses: A list of PrivateIPAddress objects.
|
||||
"""
|
||||
|
||||
def __init__(self, connection=None):
|
||||
TaggedEC2Object.__init__(self, connection)
|
||||
self.id = None
|
||||
self.subnet_id = None
|
||||
self.vpc_id = None
|
||||
self.availability_zone = None
|
||||
self.description = None
|
||||
self.owner_id = None
|
||||
self.requester_managed = False
|
||||
self.status = None
|
||||
self.mac_address = None
|
||||
self.private_ip_address = None
|
||||
self.source_dest_check = None
|
||||
self.groups = []
|
||||
self.attachment = None
|
||||
self.private_ip_addresses = []
|
||||
|
||||
def __repr__(self):
|
||||
return 'NetworkInterface:%s' % self.id
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
retval = TaggedEC2Object.startElement(self, name, attrs, connection)
|
||||
if retval is not None:
|
||||
return retval
|
||||
if name == 'groupSet':
|
||||
self.groups = ResultSet([('item', Group)])
|
||||
return self.groups
|
||||
elif name == 'attachment':
|
||||
self.attachment = Attachment()
|
||||
return self.attachment
|
||||
elif name == 'privateIpAddressesSet':
|
||||
self.private_ip_addresses = ResultSet([('item', PrivateIPAddress)])
|
||||
return self.private_ip_addresses
|
||||
else:
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'networkInterfaceId':
|
||||
self.id = value
|
||||
elif name == 'subnetId':
|
||||
self.subnet_id = value
|
||||
elif name == 'vpcId':
|
||||
self.vpc_id = value
|
||||
elif name == 'availabilityZone':
|
||||
self.availability_zone = value
|
||||
elif name == 'description':
|
||||
self.description = value
|
||||
elif name == 'ownerId':
|
||||
self.owner_id = value
|
||||
elif name == 'requesterManaged':
|
||||
if value.lower() == 'true':
|
||||
self.requester_managed = True
|
||||
else:
|
||||
self.requester_managed = False
|
||||
elif name == 'status':
|
||||
self.status = value
|
||||
elif name == 'macAddress':
|
||||
self.mac_address = value
|
||||
elif name == 'privateIpAddress':
|
||||
self.private_ip_address = value
|
||||
elif name == 'sourceDestCheck':
|
||||
if value.lower() == 'true':
|
||||
self.source_dest_check = True
|
||||
else:
|
||||
self.source_dest_check = False
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
def delete(self, dry_run=False):
|
||||
return self.connection.delete_network_interface(
|
||||
self.id,
|
||||
dry_run=dry_run
|
||||
)
|
||||
|
||||
|
||||
class PrivateIPAddress(object):
|
||||
def __init__(self, connection=None, private_ip_address=None,
|
||||
primary=None):
|
||||
self.connection = connection
|
||||
self.private_ip_address = private_ip_address
|
||||
self.primary = primary
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
pass
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'privateIpAddress':
|
||||
self.private_ip_address = value
|
||||
elif name == 'primary':
|
||||
self.primary = True if value.lower() == 'true' else False
|
||||
|
||||
def __repr__(self):
|
||||
return "PrivateIPAddress(%s, primary=%s)" % (self.private_ip_address,
|
||||
self.primary)
|
||||
|
||||
|
||||
class NetworkInterfaceCollection(list):
|
||||
def __init__(self, *interfaces):
|
||||
self.extend(interfaces)
|
||||
|
||||
def build_list_params(self, params, prefix=''):
|
||||
for i, spec in enumerate(self):
|
||||
full_prefix = '%sNetworkInterface.%s.' % (prefix, i)
|
||||
if spec.network_interface_id is not None:
|
||||
params[full_prefix + 'NetworkInterfaceId'] = \
|
||||
str(spec.network_interface_id)
|
||||
if spec.device_index is not None:
|
||||
params[full_prefix + 'DeviceIndex'] = \
|
||||
str(spec.device_index)
|
||||
else:
|
||||
params[full_prefix + 'DeviceIndex'] = 0
|
||||
if spec.subnet_id is not None:
|
||||
params[full_prefix + 'SubnetId'] = str(spec.subnet_id)
|
||||
if spec.description is not None:
|
||||
params[full_prefix + 'Description'] = str(spec.description)
|
||||
if spec.delete_on_termination is not None:
|
||||
params[full_prefix + 'DeleteOnTermination'] = \
|
||||
'true' if spec.delete_on_termination else 'false'
|
||||
if spec.secondary_private_ip_address_count is not None:
|
||||
params[full_prefix + 'SecondaryPrivateIpAddressCount'] = \
|
||||
str(spec.secondary_private_ip_address_count)
|
||||
if spec.private_ip_address is not None:
|
||||
params[full_prefix + 'PrivateIpAddress'] = \
|
||||
str(spec.private_ip_address)
|
||||
if spec.groups is not None:
|
||||
for j, group_id in enumerate(spec.groups):
|
||||
query_param_key = '%sSecurityGroupId.%s' % (full_prefix, j)
|
||||
params[query_param_key] = str(group_id)
|
||||
if spec.private_ip_addresses is not None:
|
||||
for k, ip_addr in enumerate(spec.private_ip_addresses):
|
||||
query_param_key_prefix = (
|
||||
'%sPrivateIpAddresses.%s' % (full_prefix, k))
|
||||
params[query_param_key_prefix + '.PrivateIpAddress'] = \
|
||||
str(ip_addr.private_ip_address)
|
||||
if ip_addr.primary is not None:
|
||||
params[query_param_key_prefix + '.Primary'] = \
|
||||
'true' if ip_addr.primary else 'false'
|
||||
|
||||
# Associating Public IPs have special logic around them:
|
||||
#
|
||||
# * Only assignable on an device_index of ``0``
|
||||
# * Only on one interface
|
||||
# * Only if there are no other interfaces being created
|
||||
# * Only if it's a new interface (which we can't really guard
|
||||
# against)
|
||||
#
|
||||
# More details on http://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-RunInstances.html
|
||||
if spec.associate_public_ip_address is not None:
|
||||
if not params[full_prefix + 'DeviceIndex'] in (0, '0'):
|
||||
raise BotoClientError(
|
||||
"Only the interface with device index of 0 can " + \
|
||||
"be provided when using " + \
|
||||
"'associate_public_ip_address'."
|
||||
)
|
||||
|
||||
if len(self) > 1:
|
||||
raise BotoClientError(
|
||||
"Only one interface can be provided when using " + \
|
||||
"'associate_public_ip_address'."
|
||||
)
|
||||
|
||||
key = full_prefix + 'AssociatePublicIpAddress'
|
||||
|
||||
if spec.associate_public_ip_address:
|
||||
params[key] = 'true'
|
||||
else:
|
||||
params[key] = 'false'
|
||||
|
||||
|
||||
class NetworkInterfaceSpecification(object):
|
||||
def __init__(self, network_interface_id=None, device_index=None,
|
||||
subnet_id=None, description=None, private_ip_address=None,
|
||||
groups=None, delete_on_termination=None,
|
||||
private_ip_addresses=None,
|
||||
secondary_private_ip_address_count=None,
|
||||
associate_public_ip_address=None):
|
||||
self.network_interface_id = network_interface_id
|
||||
self.device_index = device_index
|
||||
self.subnet_id = subnet_id
|
||||
self.description = description
|
||||
self.private_ip_address = private_ip_address
|
||||
self.groups = groups
|
||||
self.delete_on_termination = delete_on_termination
|
||||
self.private_ip_addresses = private_ip_addresses
|
||||
self.secondary_private_ip_address_count = \
|
||||
secondary_private_ip_address_count
|
||||
self.associate_public_ip_address = associate_public_ip_address
|
||||
54
awx/lib/site-packages/boto/ec2/placementgroup.py
Normal file
54
awx/lib/site-packages/boto/ec2/placementgroup.py
Normal file
@@ -0,0 +1,54 @@
|
||||
# Copyright (c) 2010 Mitch Garnaat http://garnaat.org/
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
"""
|
||||
Represents an EC2 Placement Group
|
||||
"""
|
||||
from boto.ec2.ec2object import EC2Object
|
||||
from boto.exception import BotoClientError
|
||||
|
||||
class PlacementGroup(EC2Object):
|
||||
|
||||
def __init__(self, connection=None, name=None, strategy=None, state=None):
|
||||
EC2Object.__init__(self, connection)
|
||||
self.name = name
|
||||
self.strategy = strategy
|
||||
self.state = state
|
||||
|
||||
def __repr__(self):
|
||||
return 'PlacementGroup:%s' % self.name
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'groupName':
|
||||
self.name = value
|
||||
elif name == 'strategy':
|
||||
self.strategy = value
|
||||
elif name == 'state':
|
||||
self.state = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
def delete(self, dry_run=False):
|
||||
return self.connection.delete_placement_group(
|
||||
self.name,
|
||||
dry_run=dry_run
|
||||
)
|
||||
|
||||
|
||||
34
awx/lib/site-packages/boto/ec2/regioninfo.py
Normal file
34
awx/lib/site-packages/boto/ec2/regioninfo.py
Normal file
@@ -0,0 +1,34 @@
|
||||
# Copyright (c) 2006-2010 Mitch Garnaat http://garnaat.org/
|
||||
# Copyright (c) 2010, Eucalyptus Systems, Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
from boto.regioninfo import RegionInfo
|
||||
|
||||
class EC2RegionInfo(RegionInfo):
|
||||
"""
|
||||
Represents an EC2 Region
|
||||
"""
|
||||
|
||||
def __init__(self, connection=None, name=None, endpoint=None):
|
||||
from boto.ec2.connection import EC2Connection
|
||||
RegionInfo.__init__(self, connection, name, endpoint,
|
||||
EC2Connection)
|
||||
342
awx/lib/site-packages/boto/ec2/reservedinstance.py
Normal file
342
awx/lib/site-packages/boto/ec2/reservedinstance.py
Normal file
@@ -0,0 +1,342 @@
|
||||
# Copyright (c) 2006-2009 Mitch Garnaat http://garnaat.org/
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
from boto.resultset import ResultSet
|
||||
from boto.ec2.ec2object import EC2Object
|
||||
from boto.utils import parse_ts
|
||||
|
||||
|
||||
class ReservedInstancesOffering(EC2Object):
|
||||
|
||||
def __init__(self, connection=None, id=None, instance_type=None,
|
||||
availability_zone=None, duration=None, fixed_price=None,
|
||||
usage_price=None, description=None, instance_tenancy=None,
|
||||
currency_code=None, offering_type=None,
|
||||
recurring_charges=None, pricing_details=None):
|
||||
EC2Object.__init__(self, connection)
|
||||
self.id = id
|
||||
self.instance_type = instance_type
|
||||
self.availability_zone = availability_zone
|
||||
self.duration = duration
|
||||
self.fixed_price = fixed_price
|
||||
self.usage_price = usage_price
|
||||
self.description = description
|
||||
self.instance_tenancy = instance_tenancy
|
||||
self.currency_code = currency_code
|
||||
self.offering_type = offering_type
|
||||
self.recurring_charges = recurring_charges
|
||||
self.pricing_details = pricing_details
|
||||
|
||||
def __repr__(self):
|
||||
return 'ReservedInstanceOffering:%s' % self.id
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'recurringCharges':
|
||||
self.recurring_charges = ResultSet([('item', RecurringCharge)])
|
||||
return self.recurring_charges
|
||||
elif name == 'pricingDetailsSet':
|
||||
self.pricing_details = ResultSet([('item', PricingDetail)])
|
||||
return self.pricing_details
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'reservedInstancesOfferingId':
|
||||
self.id = value
|
||||
elif name == 'instanceType':
|
||||
self.instance_type = value
|
||||
elif name == 'availabilityZone':
|
||||
self.availability_zone = value
|
||||
elif name == 'duration':
|
||||
self.duration = int(value)
|
||||
elif name == 'fixedPrice':
|
||||
self.fixed_price = value
|
||||
elif name == 'usagePrice':
|
||||
self.usage_price = value
|
||||
elif name == 'productDescription':
|
||||
self.description = value
|
||||
elif name == 'instanceTenancy':
|
||||
self.instance_tenancy = value
|
||||
elif name == 'currencyCode':
|
||||
self.currency_code = value
|
||||
elif name == 'offeringType':
|
||||
self.offering_type = value
|
||||
elif name == 'marketplace':
|
||||
self.marketplace = True if value == 'true' else False
|
||||
|
||||
def describe(self):
|
||||
print 'ID=%s' % self.id
|
||||
print '\tInstance Type=%s' % self.instance_type
|
||||
print '\tZone=%s' % self.availability_zone
|
||||
print '\tDuration=%s' % self.duration
|
||||
print '\tFixed Price=%s' % self.fixed_price
|
||||
print '\tUsage Price=%s' % self.usage_price
|
||||
print '\tDescription=%s' % self.description
|
||||
|
||||
def purchase(self, instance_count=1, dry_run=False):
|
||||
return self.connection.purchase_reserved_instance_offering(
|
||||
self.id,
|
||||
instance_count,
|
||||
dry_run=dry_run
|
||||
)
|
||||
|
||||
|
||||
class RecurringCharge(object):
|
||||
def __init__(self, connection=None, frequency=None, amount=None):
|
||||
self.frequency = frequency
|
||||
self.amount = amount
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
setattr(self, name, value)
|
||||
|
||||
|
||||
class PricingDetail(object):
|
||||
def __init__(self, connection=None, price=None, count=None):
|
||||
self.price = price
|
||||
self.count = count
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
setattr(self, name, value)
|
||||
|
||||
|
||||
class ReservedInstance(ReservedInstancesOffering):
|
||||
|
||||
def __init__(self, connection=None, id=None, instance_type=None,
|
||||
availability_zone=None, duration=None, fixed_price=None,
|
||||
usage_price=None, description=None,
|
||||
instance_count=None, state=None):
|
||||
ReservedInstancesOffering.__init__(self, connection, id, instance_type,
|
||||
availability_zone, duration, fixed_price,
|
||||
usage_price, description)
|
||||
self.instance_count = instance_count
|
||||
self.state = state
|
||||
self.start = None
|
||||
|
||||
def __repr__(self):
|
||||
return 'ReservedInstance:%s' % self.id
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'reservedInstancesId':
|
||||
self.id = value
|
||||
if name == 'instanceCount':
|
||||
self.instance_count = int(value)
|
||||
elif name == 'state':
|
||||
self.state = value
|
||||
elif name == 'start':
|
||||
self.start = value
|
||||
else:
|
||||
ReservedInstancesOffering.endElement(self, name, value, connection)
|
||||
|
||||
|
||||
class ReservedInstanceListing(EC2Object):
|
||||
def __init__(self, connection=None, listing_id=None, id=None,
|
||||
create_date=None, update_date=None,
|
||||
status=None, status_message=None, client_token=None):
|
||||
self.connection = connection
|
||||
self.listing_id = listing_id
|
||||
self.id = id
|
||||
self.create_date = create_date
|
||||
self.update_date = update_date
|
||||
self.status = status
|
||||
self.status_message = status_message
|
||||
self.client_token = client_token
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'instanceCounts':
|
||||
self.instance_counts = ResultSet([('item', InstanceCount)])
|
||||
return self.instance_counts
|
||||
elif name == 'priceSchedules':
|
||||
self.price_schedules = ResultSet([('item', PriceSchedule)])
|
||||
return self.price_schedules
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'reservedInstancesListingId':
|
||||
self.listing_id = value
|
||||
elif name == 'reservedInstancesId':
|
||||
self.id = value
|
||||
elif name == 'createDate':
|
||||
self.create_date = value
|
||||
elif name == 'updateDate':
|
||||
self.update_date = value
|
||||
elif name == 'status':
|
||||
self.status = value
|
||||
elif name == 'statusMessage':
|
||||
self.status_message = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
|
||||
class InstanceCount(object):
|
||||
def __init__(self, connection=None, state=None, instance_count=None):
|
||||
self.state = state
|
||||
self.instance_count = instance_count
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'state':
|
||||
self.state = value
|
||||
elif name == 'instanceCount':
|
||||
self.instance_count = int(value)
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
|
||||
class PriceSchedule(object):
|
||||
def __init__(self, connection=None, term=None, price=None,
|
||||
currency_code=None, active=None):
|
||||
self.connection = connection
|
||||
self.term = term
|
||||
self.price = price
|
||||
self.currency_code = currency_code
|
||||
self.active = active
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'term':
|
||||
self.term = int(value)
|
||||
elif name == 'price':
|
||||
self.price = value
|
||||
elif name == 'currencyCode':
|
||||
self.currency_code = value
|
||||
elif name == 'active':
|
||||
self.active = True if value == 'true' else False
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
|
||||
class ReservedInstancesConfiguration(object):
|
||||
def __init__(self, connection=None, availability_zone=None, platform=None,
|
||||
instance_count=None):
|
||||
self.connection = connection
|
||||
self.availability_zone = availability_zone
|
||||
self.platform = platform
|
||||
self.instance_count = instance_count
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'availabilityZone':
|
||||
self.availability_zone = value
|
||||
elif name == 'platform':
|
||||
self.platform = value
|
||||
elif name == 'instanceCount':
|
||||
self.instance_count = int(value)
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
|
||||
class ModifyReservedInstancesResult(object):
|
||||
def __init__(self, connection=None, modification_id=None):
|
||||
self.connection = connection
|
||||
self.modification_id = modification_id
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'reservedInstancesModificationId':
|
||||
self.modification_id = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
|
||||
class ModificationResult(object):
|
||||
def __init__(self, connection=None, modification_id=None,
|
||||
availability_zone=None, platform=None, instance_count=None):
|
||||
self.connection = connection
|
||||
self.modification_id = modification_id
|
||||
self.availability_zone = availability_zone
|
||||
self.platform = platform
|
||||
self.instance_count = instance_count
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'reservedInstancesModificationId':
|
||||
self.modification_id = value
|
||||
elif name == 'availabilityZone':
|
||||
self.availability_zone = value
|
||||
elif name == 'platform':
|
||||
self.platform = value
|
||||
elif name == 'instanceCount':
|
||||
self.instance_count = int(value)
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
|
||||
class ReservedInstancesModification(object):
|
||||
def __init__(self, connection=None, modification_id=None,
|
||||
reserved_instances=None, modification_results=None,
|
||||
create_date=None, update_date=None, effective_date=None,
|
||||
status=None, status_message=None, client_token=None):
|
||||
self.connection = connection
|
||||
self.modification_id = modification_id
|
||||
self.reserved_instances = reserved_instances
|
||||
self.modification_results = modification_results
|
||||
self.create_date = create_date
|
||||
self.update_date = update_date
|
||||
self.effective_date = effective_date
|
||||
self.status = status
|
||||
self.status_message = status_message
|
||||
self.client_token = client_token
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'reservedInstancesSet':
|
||||
self.reserved_instances = ResultSet([
|
||||
('item', ReservedInstance)
|
||||
])
|
||||
return self.reserved_instances
|
||||
elif name == 'modificationResultSet':
|
||||
self.modification_results = ResultSet([
|
||||
('item', ModificationResult)
|
||||
])
|
||||
return self.modification_results
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'reservedInstancesModificationId':
|
||||
self.modification_id = value
|
||||
elif name == 'createDate':
|
||||
self.create_date = parse_ts(value)
|
||||
elif name == 'updateDate':
|
||||
self.update_date = parse_ts(value)
|
||||
elif name == 'effectiveDate':
|
||||
self.effective_date = parse_ts(value)
|
||||
elif name == 'status':
|
||||
self.status = value
|
||||
elif name == 'statusMessage':
|
||||
self.status_message = value
|
||||
elif name == 'clientToken':
|
||||
self.client_token = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
389
awx/lib/site-packages/boto/ec2/securitygroup.py
Normal file
389
awx/lib/site-packages/boto/ec2/securitygroup.py
Normal file
@@ -0,0 +1,389 @@
|
||||
# Copyright (c) 2006-2011 Mitch Garnaat http://garnaat.org/
|
||||
# Copyright (c) 2011, Eucalyptus Systems, Inc.
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
"""
|
||||
Represents an EC2 Security Group
|
||||
"""
|
||||
from boto.ec2.ec2object import TaggedEC2Object
|
||||
from boto.exception import BotoClientError
|
||||
|
||||
|
||||
class SecurityGroup(TaggedEC2Object):
|
||||
|
||||
def __init__(self, connection=None, owner_id=None,
|
||||
name=None, description=None, id=None):
|
||||
TaggedEC2Object.__init__(self, connection)
|
||||
self.id = id
|
||||
self.owner_id = owner_id
|
||||
self.name = name
|
||||
self.description = description
|
||||
self.vpc_id = None
|
||||
self.rules = IPPermissionsList()
|
||||
self.rules_egress = IPPermissionsList()
|
||||
|
||||
def __repr__(self):
|
||||
return 'SecurityGroup:%s' % self.name
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
retval = TaggedEC2Object.startElement(self, name, attrs, connection)
|
||||
if retval is not None:
|
||||
return retval
|
||||
if name == 'ipPermissions':
|
||||
return self.rules
|
||||
elif name == 'ipPermissionsEgress':
|
||||
return self.rules_egress
|
||||
else:
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'ownerId':
|
||||
self.owner_id = value
|
||||
elif name == 'groupId':
|
||||
self.id = value
|
||||
elif name == 'groupName':
|
||||
self.name = value
|
||||
elif name == 'vpcId':
|
||||
self.vpc_id = value
|
||||
elif name == 'groupDescription':
|
||||
self.description = value
|
||||
elif name == 'ipRanges':
|
||||
pass
|
||||
elif name == 'return':
|
||||
if value == 'false':
|
||||
self.status = False
|
||||
elif value == 'true':
|
||||
self.status = True
|
||||
else:
|
||||
raise Exception(
|
||||
'Unexpected value of status %s for group %s' % (
|
||||
value,
|
||||
self.name
|
||||
)
|
||||
)
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
def delete(self, dry_run=False):
|
||||
if self.vpc_id:
|
||||
return self.connection.delete_security_group(
|
||||
group_id=self.id,
|
||||
dry_run=dry_run
|
||||
)
|
||||
else:
|
||||
return self.connection.delete_security_group(
|
||||
self.name,
|
||||
dry_run=dry_run
|
||||
)
|
||||
|
||||
def add_rule(self, ip_protocol, from_port, to_port,
|
||||
src_group_name, src_group_owner_id, cidr_ip,
|
||||
src_group_group_id, dry_run=False):
|
||||
"""
|
||||
Add a rule to the SecurityGroup object. Note that this method
|
||||
only changes the local version of the object. No information
|
||||
is sent to EC2.
|
||||
"""
|
||||
rule = IPPermissions(self)
|
||||
rule.ip_protocol = ip_protocol
|
||||
rule.from_port = from_port
|
||||
rule.to_port = to_port
|
||||
self.rules.append(rule)
|
||||
rule.add_grant(
|
||||
src_group_name,
|
||||
src_group_owner_id,
|
||||
cidr_ip,
|
||||
src_group_group_id,
|
||||
dry_run=dry_run
|
||||
)
|
||||
|
||||
def remove_rule(self, ip_protocol, from_port, to_port,
|
||||
src_group_name, src_group_owner_id, cidr_ip,
|
||||
src_group_group_id, dry_run=False):
|
||||
"""
|
||||
Remove a rule to the SecurityGroup object. Note that this method
|
||||
only changes the local version of the object. No information
|
||||
is sent to EC2.
|
||||
"""
|
||||
target_rule = None
|
||||
for rule in self.rules:
|
||||
if rule.ip_protocol == ip_protocol:
|
||||
if rule.from_port == from_port:
|
||||
if rule.to_port == to_port:
|
||||
target_rule = rule
|
||||
target_grant = None
|
||||
for grant in rule.grants:
|
||||
if grant.name == src_group_name or grant.group_id == src_group_group_id:
|
||||
if grant.owner_id == src_group_owner_id:
|
||||
if grant.cidr_ip == cidr_ip:
|
||||
target_grant = grant
|
||||
if target_grant:
|
||||
rule.grants.remove(target_grant, dry_run=dry_run)
|
||||
if len(rule.grants) == 0:
|
||||
self.rules.remove(target_rule, dry_run=dry_run)
|
||||
|
||||
def authorize(self, ip_protocol=None, from_port=None, to_port=None,
|
||||
cidr_ip=None, src_group=None, dry_run=False):
|
||||
"""
|
||||
Add a new rule to this security group.
|
||||
You need to pass in either src_group_name
|
||||
OR ip_protocol, from_port, to_port,
|
||||
and cidr_ip. In other words, either you are authorizing another
|
||||
group or you are authorizing some ip-based rule.
|
||||
|
||||
:type ip_protocol: string
|
||||
:param ip_protocol: Either tcp | udp | icmp
|
||||
|
||||
:type from_port: int
|
||||
:param from_port: The beginning port number you are enabling
|
||||
|
||||
:type to_port: int
|
||||
:param to_port: The ending port number you are enabling
|
||||
|
||||
:type cidr_ip: string or list of strings
|
||||
:param cidr_ip: The CIDR block you are providing access to.
|
||||
See http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing
|
||||
|
||||
:type src_group: :class:`boto.ec2.securitygroup.SecurityGroup` or
|
||||
:class:`boto.ec2.securitygroup.GroupOrCIDR`
|
||||
:param src_group: The Security Group you are granting access to.
|
||||
|
||||
:rtype: bool
|
||||
:return: True if successful.
|
||||
"""
|
||||
group_name = None
|
||||
if not self.vpc_id:
|
||||
group_name = self.name
|
||||
group_id = None
|
||||
if self.vpc_id:
|
||||
group_id = self.id
|
||||
src_group_name = None
|
||||
src_group_owner_id = None
|
||||
src_group_group_id = None
|
||||
if src_group:
|
||||
cidr_ip = None
|
||||
src_group_owner_id = src_group.owner_id
|
||||
if not self.vpc_id:
|
||||
src_group_name = src_group.name
|
||||
else:
|
||||
if hasattr(src_group, 'group_id'):
|
||||
src_group_group_id = src_group.group_id
|
||||
else:
|
||||
src_group_group_id = src_group.id
|
||||
status = self.connection.authorize_security_group(group_name,
|
||||
src_group_name,
|
||||
src_group_owner_id,
|
||||
ip_protocol,
|
||||
from_port,
|
||||
to_port,
|
||||
cidr_ip,
|
||||
group_id,
|
||||
src_group_group_id,
|
||||
dry_run=dry_run)
|
||||
if status:
|
||||
if not isinstance(cidr_ip, list):
|
||||
cidr_ip = [cidr_ip]
|
||||
for single_cidr_ip in cidr_ip:
|
||||
self.add_rule(ip_protocol, from_port, to_port, src_group_name,
|
||||
src_group_owner_id, single_cidr_ip,
|
||||
src_group_group_id, dry_run=dry_run)
|
||||
return status
|
||||
|
||||
def revoke(self, ip_protocol=None, from_port=None, to_port=None,
|
||||
cidr_ip=None, src_group=None, dry_run=False):
|
||||
group_name = None
|
||||
if not self.vpc_id:
|
||||
group_name = self.name
|
||||
group_id = None
|
||||
if self.vpc_id:
|
||||
group_id = self.id
|
||||
src_group_name = None
|
||||
src_group_owner_id = None
|
||||
src_group_group_id = None
|
||||
if src_group:
|
||||
cidr_ip = None
|
||||
src_group_owner_id = src_group.owner_id
|
||||
if not self.vpc_id:
|
||||
src_group_name = src_group.name
|
||||
else:
|
||||
if hasattr(src_group, 'group_id'):
|
||||
src_group_group_id = src_group.group_id
|
||||
else:
|
||||
src_group_group_id = src_group.id
|
||||
status = self.connection.revoke_security_group(group_name,
|
||||
src_group_name,
|
||||
src_group_owner_id,
|
||||
ip_protocol,
|
||||
from_port,
|
||||
to_port,
|
||||
cidr_ip,
|
||||
group_id,
|
||||
src_group_group_id,
|
||||
dry_run=dry_run)
|
||||
if status:
|
||||
self.remove_rule(ip_protocol, from_port, to_port, src_group_name,
|
||||
src_group_owner_id, cidr_ip, src_group_group_id,
|
||||
dry_run=dry_run)
|
||||
return status
|
||||
|
||||
def copy_to_region(self, region, name=None, dry_run=False):
|
||||
"""
|
||||
Create a copy of this security group in another region.
|
||||
Note that the new security group will be a separate entity
|
||||
and will not stay in sync automatically after the copy
|
||||
operation.
|
||||
|
||||
:type region: :class:`boto.ec2.regioninfo.RegionInfo`
|
||||
:param region: The region to which this security group will be copied.
|
||||
|
||||
:type name: string
|
||||
:param name: The name of the copy. If not supplied, the copy
|
||||
will have the same name as this security group.
|
||||
|
||||
:rtype: :class:`boto.ec2.securitygroup.SecurityGroup`
|
||||
:return: The new security group.
|
||||
"""
|
||||
if region.name == self.region:
|
||||
raise BotoClientError('Unable to copy to the same Region')
|
||||
conn_params = self.connection.get_params()
|
||||
rconn = region.connect(**conn_params)
|
||||
sg = rconn.create_security_group(
|
||||
name or self.name,
|
||||
self.description,
|
||||
dry_run=dry_run
|
||||
)
|
||||
source_groups = []
|
||||
for rule in self.rules:
|
||||
for grant in rule.grants:
|
||||
grant_nom = grant.name or grant.group_id
|
||||
if grant_nom:
|
||||
if grant_nom not in source_groups:
|
||||
source_groups.append(grant_nom)
|
||||
sg.authorize(None, None, None, None, grant,
|
||||
dry_run=dry_run)
|
||||
else:
|
||||
sg.authorize(rule.ip_protocol, rule.from_port, rule.to_port,
|
||||
grant.cidr_ip, dry_run=dry_run)
|
||||
return sg
|
||||
|
||||
def instances(self, dry_run=False):
|
||||
"""
|
||||
Find all of the current instances that are running within this
|
||||
security group.
|
||||
|
||||
:rtype: list of :class:`boto.ec2.instance.Instance`
|
||||
:return: A list of Instance objects
|
||||
"""
|
||||
rs = []
|
||||
if self.vpc_id:
|
||||
rs.extend(self.connection.get_all_reservations(
|
||||
filters={'instance.group-id': self.id},
|
||||
dry_run=dry_run
|
||||
))
|
||||
else:
|
||||
rs.extend(self.connection.get_all_reservations(
|
||||
filters={'group-id': self.id},
|
||||
dry_run=dry_run
|
||||
))
|
||||
instances = [i for r in rs for i in r.instances]
|
||||
return instances
|
||||
|
||||
|
||||
class IPPermissionsList(list):
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'item':
|
||||
self.append(IPPermissions(self))
|
||||
return self[-1]
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
pass
|
||||
|
||||
|
||||
class IPPermissions(object):
|
||||
|
||||
def __init__(self, parent=None):
|
||||
self.parent = parent
|
||||
self.ip_protocol = None
|
||||
self.from_port = None
|
||||
self.to_port = None
|
||||
self.grants = []
|
||||
|
||||
def __repr__(self):
|
||||
return 'IPPermissions:%s(%s-%s)' % (self.ip_protocol,
|
||||
self.from_port, self.to_port)
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'item':
|
||||
self.grants.append(GroupOrCIDR(self))
|
||||
return self.grants[-1]
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'ipProtocol':
|
||||
self.ip_protocol = value
|
||||
elif name == 'fromPort':
|
||||
self.from_port = value
|
||||
elif name == 'toPort':
|
||||
self.to_port = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
def add_grant(self, name=None, owner_id=None, cidr_ip=None, group_id=None,
|
||||
dry_run=False):
|
||||
grant = GroupOrCIDR(self)
|
||||
grant.owner_id = owner_id
|
||||
grant.group_id = group_id
|
||||
grant.name = name
|
||||
grant.cidr_ip = cidr_ip
|
||||
self.grants.append(grant)
|
||||
return grant
|
||||
|
||||
|
||||
class GroupOrCIDR(object):
|
||||
|
||||
def __init__(self, parent=None):
|
||||
self.owner_id = None
|
||||
self.group_id = None
|
||||
self.name = None
|
||||
self.cidr_ip = None
|
||||
|
||||
def __repr__(self):
|
||||
if self.cidr_ip:
|
||||
return '%s' % self.cidr_ip
|
||||
else:
|
||||
return '%s-%s' % (self.name or self.group_id, self.owner_id)
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'userId':
|
||||
self.owner_id = value
|
||||
elif name == 'groupId':
|
||||
self.group_id = value
|
||||
elif name == 'groupName':
|
||||
self.name = value
|
||||
if name == 'cidrIp':
|
||||
self.cidr_ip = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
187
awx/lib/site-packages/boto/ec2/snapshot.py
Normal file
187
awx/lib/site-packages/boto/ec2/snapshot.py
Normal file
@@ -0,0 +1,187 @@
|
||||
# Copyright (c) 2006-2010 Mitch Garnaat http://garnaat.org/
|
||||
# Copyright (c) 2010, Eucalyptus Systems, Inc.
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
"""
|
||||
Represents an EC2 Elastic Block Store Snapshot
|
||||
"""
|
||||
from boto.ec2.ec2object import TaggedEC2Object
|
||||
from boto.ec2.zone import Zone
|
||||
|
||||
class Snapshot(TaggedEC2Object):
|
||||
|
||||
AttrName = 'createVolumePermission'
|
||||
|
||||
def __init__(self, connection=None):
|
||||
TaggedEC2Object.__init__(self, connection)
|
||||
self.id = None
|
||||
self.volume_id = None
|
||||
self.status = None
|
||||
self.progress = None
|
||||
self.start_time = None
|
||||
self.owner_id = None
|
||||
self.owner_alias = None
|
||||
self.volume_size = None
|
||||
self.description = None
|
||||
|
||||
def __repr__(self):
|
||||
return 'Snapshot:%s' % self.id
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'snapshotId':
|
||||
self.id = value
|
||||
elif name == 'volumeId':
|
||||
self.volume_id = value
|
||||
elif name == 'status':
|
||||
self.status = value
|
||||
elif name == 'startTime':
|
||||
self.start_time = value
|
||||
elif name == 'ownerId':
|
||||
self.owner_id = value
|
||||
elif name == 'ownerAlias':
|
||||
self.owner_alias = value
|
||||
elif name == 'volumeSize':
|
||||
try:
|
||||
self.volume_size = int(value)
|
||||
except:
|
||||
self.volume_size = value
|
||||
elif name == 'description':
|
||||
self.description = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
def _update(self, updated):
|
||||
self.progress = updated.progress
|
||||
self.status = updated.status
|
||||
|
||||
def update(self, validate=False, dry_run=False):
|
||||
"""
|
||||
Update the data associated with this snapshot by querying EC2.
|
||||
|
||||
:type validate: bool
|
||||
:param validate: By default, if EC2 returns no data about the
|
||||
snapshot the update method returns quietly. If
|
||||
the validate param is True, however, it will
|
||||
raise a ValueError exception if no data is
|
||||
returned from EC2.
|
||||
"""
|
||||
rs = self.connection.get_all_snapshots([self.id], dry_run=dry_run)
|
||||
if len(rs) > 0:
|
||||
self._update(rs[0])
|
||||
elif validate:
|
||||
raise ValueError('%s is not a valid Snapshot ID' % self.id)
|
||||
return self.progress
|
||||
|
||||
def delete(self, dry_run=False):
|
||||
return self.connection.delete_snapshot(self.id, dry_run=dry_run)
|
||||
|
||||
def get_permissions(self, dry_run=False):
|
||||
attrs = self.connection.get_snapshot_attribute(
|
||||
self.id,
|
||||
self.AttrName,
|
||||
dry_run=dry_run
|
||||
)
|
||||
return attrs.attrs
|
||||
|
||||
def share(self, user_ids=None, groups=None, dry_run=False):
|
||||
return self.connection.modify_snapshot_attribute(self.id,
|
||||
self.AttrName,
|
||||
'add',
|
||||
user_ids,
|
||||
groups,
|
||||
dry_run=dry_run)
|
||||
|
||||
def unshare(self, user_ids=None, groups=None, dry_run=False):
|
||||
return self.connection.modify_snapshot_attribute(self.id,
|
||||
self.AttrName,
|
||||
'remove',
|
||||
user_ids,
|
||||
groups,
|
||||
dry_run=dry_run)
|
||||
|
||||
def reset_permissions(self, dry_run=False):
|
||||
return self.connection.reset_snapshot_attribute(
|
||||
self.id,
|
||||
self.AttrName,
|
||||
dry_run=dry_run
|
||||
)
|
||||
|
||||
def create_volume(self, zone, size=None, volume_type=None, iops=None,
|
||||
dry_run=False):
|
||||
"""
|
||||
Create a new EBS Volume from this Snapshot
|
||||
|
||||
:type zone: string or :class:`boto.ec2.zone.Zone`
|
||||
:param zone: The availability zone in which the Volume will be created.
|
||||
|
||||
:type size: int
|
||||
:param size: The size of the new volume, in GiB. (optional). Defaults to
|
||||
the size of the snapshot.
|
||||
|
||||
:type volume_type: string
|
||||
:param volume_type: The type of the volume. (optional). Valid
|
||||
values are: standard | io1.
|
||||
|
||||
:type iops: int
|
||||
:param iops: The provisioned IOPs you want to associate with
|
||||
this volume. (optional)
|
||||
"""
|
||||
if isinstance(zone, Zone):
|
||||
zone = zone.name
|
||||
return self.connection.create_volume(
|
||||
size,
|
||||
zone,
|
||||
self.id,
|
||||
volume_type,
|
||||
iops,
|
||||
dry_run=dry_run
|
||||
)
|
||||
|
||||
|
||||
class SnapshotAttribute:
|
||||
|
||||
def __init__(self, parent=None):
|
||||
self.snapshot_id = None
|
||||
self.attrs = {}
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'createVolumePermission':
|
||||
self.name = 'create_volume_permission'
|
||||
elif name == 'group':
|
||||
if 'groups' in self.attrs:
|
||||
self.attrs['groups'].append(value)
|
||||
else:
|
||||
self.attrs['groups'] = [value]
|
||||
elif name == 'userId':
|
||||
if 'user_ids' in self.attrs:
|
||||
self.attrs['user_ids'].append(value)
|
||||
else:
|
||||
self.attrs['user_ids'] = [value]
|
||||
elif name == 'snapshotId':
|
||||
self.snapshot_id = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
|
||||
|
||||
65
awx/lib/site-packages/boto/ec2/spotdatafeedsubscription.py
Normal file
65
awx/lib/site-packages/boto/ec2/spotdatafeedsubscription.py
Normal file
@@ -0,0 +1,65 @@
|
||||
# Copyright (c) 2006-2009 Mitch Garnaat http://garnaat.org/
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
"""
|
||||
Represents an EC2 Spot Instance Datafeed Subscription
|
||||
"""
|
||||
from boto.ec2.ec2object import EC2Object
|
||||
from boto.ec2.spotinstancerequest import SpotInstanceStateFault
|
||||
|
||||
class SpotDatafeedSubscription(EC2Object):
|
||||
|
||||
def __init__(self, connection=None, owner_id=None,
|
||||
bucket=None, prefix=None, state=None,fault=None):
|
||||
EC2Object.__init__(self, connection)
|
||||
self.owner_id = owner_id
|
||||
self.bucket = bucket
|
||||
self.prefix = prefix
|
||||
self.state = state
|
||||
self.fault = fault
|
||||
|
||||
def __repr__(self):
|
||||
return 'SpotDatafeedSubscription:%s' % self.bucket
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'fault':
|
||||
self.fault = SpotInstanceStateFault()
|
||||
return self.fault
|
||||
else:
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'ownerId':
|
||||
self.owner_id = value
|
||||
elif name == 'bucket':
|
||||
self.bucket = value
|
||||
elif name == 'prefix':
|
||||
self.prefix = value
|
||||
elif name == 'state':
|
||||
self.state = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
def delete(self, dry_run=False):
|
||||
return self.connection.delete_spot_datafeed_subscription(
|
||||
dry_run=dry_run
|
||||
)
|
||||
|
||||
191
awx/lib/site-packages/boto/ec2/spotinstancerequest.py
Normal file
191
awx/lib/site-packages/boto/ec2/spotinstancerequest.py
Normal file
@@ -0,0 +1,191 @@
|
||||
# Copyright (c) 2006-2010 Mitch Garnaat http://garnaat.org/
|
||||
# Copyright (c) 2010, Eucalyptus Systems, Inc.
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
"""
|
||||
Represents an EC2 Spot Instance Request
|
||||
"""
|
||||
|
||||
from boto.ec2.ec2object import TaggedEC2Object
|
||||
from boto.ec2.launchspecification import LaunchSpecification
|
||||
|
||||
|
||||
class SpotInstanceStateFault(object):
|
||||
"""
|
||||
The fault codes for the Spot Instance request, if any.
|
||||
|
||||
:ivar code: The reason code for the Spot Instance state change.
|
||||
:ivar message: The message for the Spot Instance state change.
|
||||
"""
|
||||
|
||||
def __init__(self, code=None, message=None):
|
||||
self.code = code
|
||||
self.message = message
|
||||
|
||||
def __repr__(self):
|
||||
return '(%s, %s)' % (self.code, self.message)
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'code':
|
||||
self.code = value
|
||||
elif name == 'message':
|
||||
self.message = value
|
||||
setattr(self, name, value)
|
||||
|
||||
|
||||
class SpotInstanceStatus(object):
|
||||
"""
|
||||
Contains the status of a Spot Instance Request.
|
||||
|
||||
:ivar code: Status code of the request.
|
||||
:ivar message: The description for the status code for the Spot request.
|
||||
:ivar update_time: Time the status was stated.
|
||||
"""
|
||||
|
||||
def __init__(self, code=None, update_time=None, message=None):
|
||||
self.code = code
|
||||
self.update_time = update_time
|
||||
self.message = message
|
||||
|
||||
def __repr__(self):
|
||||
return '<Status: %s>' % self.code
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'code':
|
||||
self.code = value
|
||||
elif name == 'message':
|
||||
self.message = value
|
||||
elif name == 'updateTime':
|
||||
self.update_time = value
|
||||
|
||||
|
||||
class SpotInstanceRequest(TaggedEC2Object):
|
||||
"""
|
||||
|
||||
:ivar id: The ID of the Spot Instance Request.
|
||||
:ivar price: The maximum hourly price for any Spot Instance launched to
|
||||
fulfill the request.
|
||||
:ivar type: The Spot Instance request type.
|
||||
:ivar state: The state of the Spot Instance request.
|
||||
:ivar fault: The fault codes for the Spot Instance request, if any.
|
||||
:ivar valid_from: The start date of the request. If this is a one-time
|
||||
request, the request becomes active at this date and time and remains
|
||||
active until all instances launch, the request expires, or the request is
|
||||
canceled. If the request is persistent, the request becomes active at this
|
||||
date and time and remains active until it expires or is canceled.
|
||||
:ivar valid_until: The end date of the request. If this is a one-time
|
||||
request, the request remains active until all instances launch, the request
|
||||
is canceled, or this date is reached. If the request is persistent, it
|
||||
remains active until it is canceled or this date is reached.
|
||||
:ivar launch_group: The instance launch group. Launch groups are Spot
|
||||
Instances that launch together and terminate together.
|
||||
:ivar launched_availability_zone: foo
|
||||
:ivar product_description: The Availability Zone in which the bid is
|
||||
launched.
|
||||
:ivar availability_zone_group: The Availability Zone group. If you specify
|
||||
the same Availability Zone group for all Spot Instance requests, all Spot
|
||||
Instances are launched in the same Availability Zone.
|
||||
:ivar create_time: The time stamp when the Spot Instance request was
|
||||
created.
|
||||
:ivar launch_specification: Additional information for launching instances.
|
||||
:ivar instance_id: The instance ID, if an instance has been launched to
|
||||
fulfill the Spot Instance request.
|
||||
:ivar status: The status code and status message describing the Spot
|
||||
Instance request.
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, connection=None):
|
||||
TaggedEC2Object.__init__(self, connection)
|
||||
self.id = None
|
||||
self.price = None
|
||||
self.type = None
|
||||
self.state = None
|
||||
self.fault = None
|
||||
self.valid_from = None
|
||||
self.valid_until = None
|
||||
self.launch_group = None
|
||||
self.launched_availability_zone = None
|
||||
self.product_description = None
|
||||
self.availability_zone_group = None
|
||||
self.create_time = None
|
||||
self.launch_specification = None
|
||||
self.instance_id = None
|
||||
self.status = None
|
||||
|
||||
def __repr__(self):
|
||||
return 'SpotInstanceRequest:%s' % self.id
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
retval = TaggedEC2Object.startElement(self, name, attrs, connection)
|
||||
if retval is not None:
|
||||
return retval
|
||||
if name == 'launchSpecification':
|
||||
self.launch_specification = LaunchSpecification(connection)
|
||||
return self.launch_specification
|
||||
elif name == 'fault':
|
||||
self.fault = SpotInstanceStateFault()
|
||||
return self.fault
|
||||
elif name == 'status':
|
||||
self.status = SpotInstanceStatus()
|
||||
return self.status
|
||||
else:
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'spotInstanceRequestId':
|
||||
self.id = value
|
||||
elif name == 'spotPrice':
|
||||
self.price = float(value)
|
||||
elif name == 'type':
|
||||
self.type = value
|
||||
elif name == 'state':
|
||||
self.state = value
|
||||
elif name == 'validFrom':
|
||||
self.valid_from = value
|
||||
elif name == 'validUntil':
|
||||
self.valid_until = value
|
||||
elif name == 'launchGroup':
|
||||
self.launch_group = value
|
||||
elif name == 'availabilityZoneGroup':
|
||||
self.availability_zone_group = value
|
||||
elif name == 'launchedAvailabilityZone':
|
||||
self.launched_availability_zone = value
|
||||
elif name == 'instanceId':
|
||||
self.instance_id = value
|
||||
elif name == 'createTime':
|
||||
self.create_time = value
|
||||
elif name == 'productDescription':
|
||||
self.product_description = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
def cancel(self, dry_run=False):
|
||||
self.connection.cancel_spot_instance_requests(
|
||||
[self.id],
|
||||
dry_run=dry_run
|
||||
)
|
||||
55
awx/lib/site-packages/boto/ec2/spotpricehistory.py
Normal file
55
awx/lib/site-packages/boto/ec2/spotpricehistory.py
Normal file
@@ -0,0 +1,55 @@
|
||||
# Copyright (c) 2006-2009 Mitch Garnaat http://garnaat.org/
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
"""
|
||||
Represents an EC2 Spot Instance Request
|
||||
"""
|
||||
|
||||
from boto.ec2.ec2object import EC2Object
|
||||
|
||||
class SpotPriceHistory(EC2Object):
|
||||
|
||||
def __init__(self, connection=None):
|
||||
EC2Object.__init__(self, connection)
|
||||
self.price = 0.0
|
||||
self.instance_type = None
|
||||
self.product_description = None
|
||||
self.timestamp = None
|
||||
self.availability_zone = None
|
||||
|
||||
def __repr__(self):
|
||||
return 'SpotPriceHistory(%s):%2f' % (self.instance_type, self.price)
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'instanceType':
|
||||
self.instance_type = value
|
||||
elif name == 'spotPrice':
|
||||
self.price = float(value)
|
||||
elif name == 'productDescription':
|
||||
self.product_description = value
|
||||
elif name == 'timestamp':
|
||||
self.timestamp = value
|
||||
elif name == 'availabilityZone':
|
||||
self.availability_zone = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
|
||||
84
awx/lib/site-packages/boto/ec2/tag.py
Normal file
84
awx/lib/site-packages/boto/ec2/tag.py
Normal file
@@ -0,0 +1,84 @@
|
||||
# Copyright (c) 2010 Mitch Garnaat http://garnaat.org/
|
||||
# Copyright (c) 2010, Eucalyptus Systems, Inc.
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
|
||||
class TagSet(dict):
|
||||
"""
|
||||
A TagSet is used to collect the tags associated with a particular
|
||||
EC2 resource. Not all resources can be tagged but for those that
|
||||
can, this dict object will be used to collect those values. See
|
||||
:class:`boto.ec2.ec2object.TaggedEC2Object` for more details.
|
||||
"""
|
||||
|
||||
def __init__(self, connection=None):
|
||||
self.connection = connection
|
||||
self._current_key = None
|
||||
self._current_value = None
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'item':
|
||||
self._current_key = None
|
||||
self._current_value = None
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'key':
|
||||
self._current_key = value
|
||||
elif name == 'value':
|
||||
self._current_value = value
|
||||
elif name == 'item':
|
||||
self[self._current_key] = self._current_value
|
||||
|
||||
|
||||
class Tag(object):
|
||||
"""
|
||||
A Tag is used when creating or listing all tags related to
|
||||
an AWS account. It records not only the key and value but
|
||||
also the ID of the resource to which the tag is attached
|
||||
as well as the type of the resource.
|
||||
"""
|
||||
|
||||
def __init__(self, connection=None, res_id=None, res_type=None,
|
||||
name=None, value=None):
|
||||
self.connection = connection
|
||||
self.res_id = res_id
|
||||
self.res_type = res_type
|
||||
self.name = name
|
||||
self.value = value
|
||||
|
||||
def __repr__(self):
|
||||
return 'Tag:%s' % self.name
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'resourceId':
|
||||
self.res_id = value
|
||||
elif name == 'resourceType':
|
||||
self.res_type = value
|
||||
elif name == 'key':
|
||||
self.name = value
|
||||
elif name == 'value':
|
||||
self.value = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
59
awx/lib/site-packages/boto/ec2/vmtype.py
Normal file
59
awx/lib/site-packages/boto/ec2/vmtype.py
Normal file
@@ -0,0 +1,59 @@
|
||||
# Copyright (c) 2006-2009 Mitch Garnaat http://garnaat.org/
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
|
||||
from boto.ec2.ec2object import EC2Object
|
||||
|
||||
|
||||
class VmType(EC2Object):
|
||||
"""
|
||||
Represents an EC2 VM Type
|
||||
|
||||
:ivar name: The name of the vm type
|
||||
:ivar cores: The number of cpu cores for this vm type
|
||||
:ivar memory: The amount of memory in megabytes for this vm type
|
||||
:ivar disk: The amount of disk space in gigabytes for this vm type
|
||||
"""
|
||||
|
||||
def __init__(self, connection=None, name=None, cores=None,
|
||||
memory=None, disk=None):
|
||||
EC2Object.__init__(self, connection)
|
||||
self.connection = connection
|
||||
self.name = name
|
||||
self.cores = cores
|
||||
self.memory = memory
|
||||
self.disk = disk
|
||||
|
||||
def __repr__(self):
|
||||
return 'VmType:%s-%s,%s,%s' % (self.name, self.cores,
|
||||
self.memory, self.disk)
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'euca:name':
|
||||
self.name = value
|
||||
elif name == 'euca:cpu':
|
||||
self.cores = value
|
||||
elif name == 'euca:disk':
|
||||
self.disk = value
|
||||
elif name == 'euca:memory':
|
||||
self.memory = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
313
awx/lib/site-packages/boto/ec2/volume.py
Normal file
313
awx/lib/site-packages/boto/ec2/volume.py
Normal file
@@ -0,0 +1,313 @@
|
||||
# Copyright (c) 2006-2012 Mitch Garnaat http://garnaat.org/
|
||||
# Copyright (c) 2010, Eucalyptus Systems, Inc.
|
||||
# Copyright (c) 2012 Amazon.com, Inc. or its affiliates. All Rights Reserved
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
"""
|
||||
Represents an EC2 Elastic Block Storage Volume
|
||||
"""
|
||||
from boto.resultset import ResultSet
|
||||
from boto.ec2.tag import Tag
|
||||
from boto.ec2.ec2object import TaggedEC2Object
|
||||
|
||||
|
||||
class Volume(TaggedEC2Object):
|
||||
"""
|
||||
Represents an EBS volume.
|
||||
|
||||
:ivar id: The unique ID of the volume.
|
||||
:ivar create_time: The timestamp of when the volume was created.
|
||||
:ivar status: The status of the volume.
|
||||
:ivar size: The size (in GB) of the volume.
|
||||
:ivar snapshot_id: The ID of the snapshot this volume was created
|
||||
from, if applicable.
|
||||
:ivar attach_data: An AttachmentSet object.
|
||||
:ivar zone: The availability zone this volume is in.
|
||||
:ivar type: The type of volume (standard or consistent-iops)
|
||||
:ivar iops: If this volume is of type consistent-iops, this is
|
||||
the number of IOPS provisioned (10-300).
|
||||
"""
|
||||
|
||||
def __init__(self, connection=None):
|
||||
TaggedEC2Object.__init__(self, connection)
|
||||
self.id = None
|
||||
self.create_time = None
|
||||
self.status = None
|
||||
self.size = None
|
||||
self.snapshot_id = None
|
||||
self.attach_data = None
|
||||
self.zone = None
|
||||
self.type = None
|
||||
self.iops = None
|
||||
|
||||
def __repr__(self):
|
||||
return 'Volume:%s' % self.id
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
retval = TaggedEC2Object.startElement(self, name, attrs, connection)
|
||||
if retval is not None:
|
||||
return retval
|
||||
if name == 'attachmentSet':
|
||||
self.attach_data = AttachmentSet()
|
||||
return self.attach_data
|
||||
elif name == 'tagSet':
|
||||
self.tags = ResultSet([('item', Tag)])
|
||||
return self.tags
|
||||
else:
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'volumeId':
|
||||
self.id = value
|
||||
elif name == 'createTime':
|
||||
self.create_time = value
|
||||
elif name == 'status':
|
||||
if value != '':
|
||||
self.status = value
|
||||
elif name == 'size':
|
||||
self.size = int(value)
|
||||
elif name == 'snapshotId':
|
||||
self.snapshot_id = value
|
||||
elif name == 'availabilityZone':
|
||||
self.zone = value
|
||||
elif name == 'volumeType':
|
||||
self.type = value
|
||||
elif name == 'iops':
|
||||
self.iops = int(value)
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
def _update(self, updated):
|
||||
self.__dict__.update(updated.__dict__)
|
||||
|
||||
def update(self, validate=False, dry_run=False):
|
||||
"""
|
||||
Update the data associated with this volume by querying EC2.
|
||||
|
||||
:type validate: bool
|
||||
:param validate: By default, if EC2 returns no data about the
|
||||
volume the update method returns quietly. If
|
||||
the validate param is True, however, it will
|
||||
raise a ValueError exception if no data is
|
||||
returned from EC2.
|
||||
"""
|
||||
# Check the resultset since Eucalyptus ignores the volumeId param
|
||||
unfiltered_rs = self.connection.get_all_volumes(
|
||||
[self.id],
|
||||
dry_run=dry_run
|
||||
)
|
||||
rs = [x for x in unfiltered_rs if x.id == self.id]
|
||||
if len(rs) > 0:
|
||||
self._update(rs[0])
|
||||
elif validate:
|
||||
raise ValueError('%s is not a valid Volume ID' % self.id)
|
||||
return self.status
|
||||
|
||||
def delete(self, dry_run=False):
|
||||
"""
|
||||
Delete this EBS volume.
|
||||
|
||||
:rtype: bool
|
||||
:return: True if successful
|
||||
"""
|
||||
return self.connection.delete_volume(self.id, dry_run=dry_run)
|
||||
|
||||
def attach(self, instance_id, device, dry_run=False):
|
||||
"""
|
||||
Attach this EBS volume to an EC2 instance.
|
||||
|
||||
:type instance_id: str
|
||||
:param instance_id: The ID of the EC2 instance to which it will
|
||||
be attached.
|
||||
|
||||
:type device: str
|
||||
:param device: The device on the instance through which the
|
||||
volume will be exposed (e.g. /dev/sdh)
|
||||
|
||||
:rtype: bool
|
||||
:return: True if successful
|
||||
"""
|
||||
return self.connection.attach_volume(
|
||||
self.id,
|
||||
instance_id,
|
||||
device,
|
||||
dry_run=dry_run
|
||||
)
|
||||
|
||||
def detach(self, force=False, dry_run=False):
|
||||
"""
|
||||
Detach this EBS volume from an EC2 instance.
|
||||
|
||||
:type force: bool
|
||||
:param force: Forces detachment if the previous detachment
|
||||
attempt did not occur cleanly. This option can lead to
|
||||
data loss or a corrupted file system. Use this option only
|
||||
as a last resort to detach a volume from a failed
|
||||
instance. The instance will not have an opportunity to
|
||||
flush file system caches nor file system meta data. If you
|
||||
use this option, you must perform file system check and
|
||||
repair procedures.
|
||||
|
||||
:rtype: bool
|
||||
:return: True if successful
|
||||
"""
|
||||
instance_id = None
|
||||
if self.attach_data:
|
||||
instance_id = self.attach_data.instance_id
|
||||
device = None
|
||||
if self.attach_data:
|
||||
device = self.attach_data.device
|
||||
return self.connection.detach_volume(
|
||||
self.id,
|
||||
instance_id,
|
||||
device,
|
||||
force,
|
||||
dry_run=dry_run
|
||||
)
|
||||
|
||||
def create_snapshot(self, description=None, dry_run=False):
|
||||
"""
|
||||
Create a snapshot of this EBS Volume.
|
||||
|
||||
:type description: str
|
||||
:param description: A description of the snapshot.
|
||||
Limited to 256 characters.
|
||||
|
||||
:rtype: :class:`boto.ec2.snapshot.Snapshot`
|
||||
:return: The created Snapshot object
|
||||
"""
|
||||
return self.connection.create_snapshot(
|
||||
self.id,
|
||||
description,
|
||||
dry_run=dry_run
|
||||
)
|
||||
|
||||
def volume_state(self):
|
||||
"""
|
||||
Returns the state of the volume. Same value as the status attribute.
|
||||
"""
|
||||
return self.status
|
||||
|
||||
def attachment_state(self):
|
||||
"""
|
||||
Get the attachment state.
|
||||
"""
|
||||
state = None
|
||||
if self.attach_data:
|
||||
state = self.attach_data.status
|
||||
return state
|
||||
|
||||
def snapshots(self, owner=None, restorable_by=None, dry_run=False):
|
||||
"""
|
||||
Get all snapshots related to this volume. Note that this requires
|
||||
that all available snapshots for the account be retrieved from EC2
|
||||
first and then the list is filtered client-side to contain only
|
||||
those for this volume.
|
||||
|
||||
:type owner: str
|
||||
:param owner: If present, only the snapshots owned by the
|
||||
specified user will be returned. Valid values are:
|
||||
|
||||
* self
|
||||
* amazon
|
||||
* AWS Account ID
|
||||
|
||||
:type restorable_by: str
|
||||
:param restorable_by: If present, only the snapshots that
|
||||
are restorable by the specified account id will be returned.
|
||||
|
||||
:rtype: list of L{boto.ec2.snapshot.Snapshot}
|
||||
:return: The requested Snapshot objects
|
||||
|
||||
"""
|
||||
rs = self.connection.get_all_snapshots(
|
||||
owner=owner,
|
||||
restorable_by=restorable_by,
|
||||
dry_run=dry_run
|
||||
)
|
||||
mine = []
|
||||
for snap in rs:
|
||||
if snap.volume_id == self.id:
|
||||
mine.append(snap)
|
||||
return mine
|
||||
|
||||
|
||||
class AttachmentSet(object):
|
||||
"""
|
||||
Represents an EBS attachmentset.
|
||||
|
||||
:ivar id: The unique ID of the volume.
|
||||
:ivar instance_id: The unique ID of the attached instance
|
||||
:ivar status: The status of the attachment
|
||||
:ivar attach_time: Attached since
|
||||
:ivar device: The device the instance has mapped
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
self.id = None
|
||||
self.instance_id = None
|
||||
self.status = None
|
||||
self.attach_time = None
|
||||
self.device = None
|
||||
|
||||
def __repr__(self):
|
||||
return 'AttachmentSet:%s' % self.id
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
pass
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'volumeId':
|
||||
self.id = value
|
||||
elif name == 'instanceId':
|
||||
self.instance_id = value
|
||||
elif name == 'status':
|
||||
self.status = value
|
||||
elif name == 'attachTime':
|
||||
self.attach_time = value
|
||||
elif name == 'device':
|
||||
self.device = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
|
||||
class VolumeAttribute:
|
||||
|
||||
def __init__(self, parent=None):
|
||||
self.id = None
|
||||
self._key_name = None
|
||||
self.attrs = {}
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'autoEnableIO':
|
||||
self._key_name = name
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'value':
|
||||
if value.lower() == 'true':
|
||||
self.attrs[self._key_name] = True
|
||||
else:
|
||||
self.attrs[self._key_name] = False
|
||||
elif name == 'volumeId':
|
||||
self.id = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
205
awx/lib/site-packages/boto/ec2/volumestatus.py
Normal file
205
awx/lib/site-packages/boto/ec2/volumestatus.py
Normal file
@@ -0,0 +1,205 @@
|
||||
# Copyright (c) 2012 Mitch Garnaat http://garnaat.org/
|
||||
# Copyright (c) 2012 Amazon.com, Inc. or its affiliates.
|
||||
# All Rights Reserved
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
from boto.ec2.instancestatus import Status, Details
|
||||
|
||||
|
||||
class Event(object):
|
||||
"""
|
||||
A status event for an instance.
|
||||
|
||||
:ivar type: The type of the event.
|
||||
:ivar id: The ID of the event.
|
||||
:ivar description: A string describing the reason for the event.
|
||||
:ivar not_before: A datestring describing the earliest time for
|
||||
the event.
|
||||
:ivar not_after: A datestring describing the latest time for
|
||||
the event.
|
||||
"""
|
||||
|
||||
def __init__(self, type=None, id=None, description=None,
|
||||
not_before=None, not_after=None):
|
||||
self.type = type
|
||||
self.id = id
|
||||
self.description = description
|
||||
self.not_before = not_before
|
||||
self.not_after = not_after
|
||||
|
||||
def __repr__(self):
|
||||
return 'Event:%s' % self.type
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'eventType':
|
||||
self.type = value
|
||||
elif name == 'eventId':
|
||||
self.id = value
|
||||
elif name == 'description':
|
||||
self.description = value
|
||||
elif name == 'notBefore':
|
||||
self.not_before = value
|
||||
elif name == 'notAfter':
|
||||
self.not_after = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
|
||||
class EventSet(list):
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'item':
|
||||
event = Event()
|
||||
self.append(event)
|
||||
return event
|
||||
else:
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
setattr(self, name, value)
|
||||
|
||||
|
||||
class Action(object):
|
||||
"""
|
||||
An action for an instance.
|
||||
|
||||
:ivar code: The code for the type of the action.
|
||||
:ivar id: The ID of the event.
|
||||
:ivar type: The type of the event.
|
||||
:ivar description: A description of the action.
|
||||
"""
|
||||
|
||||
def __init__(self, code=None, id=None, description=None, type=None):
|
||||
self.code = code
|
||||
self.id = id
|
||||
self.type = type
|
||||
self.description = description
|
||||
|
||||
def __repr__(self):
|
||||
return 'Action:%s' % self.code
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'eventType':
|
||||
self.type = value
|
||||
elif name == 'eventId':
|
||||
self.id = value
|
||||
elif name == 'description':
|
||||
self.description = value
|
||||
elif name == 'code':
|
||||
self.code = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
|
||||
class ActionSet(list):
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'item':
|
||||
action = Action()
|
||||
self.append(action)
|
||||
return action
|
||||
else:
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
setattr(self, name, value)
|
||||
|
||||
|
||||
class VolumeStatus(object):
|
||||
"""
|
||||
Represents an EC2 Volume status as reported by
|
||||
DescribeVolumeStatus request.
|
||||
|
||||
:ivar id: The volume identifier.
|
||||
:ivar zone: The availability zone of the volume
|
||||
:ivar volume_status: A Status object that reports impaired
|
||||
functionality that arises from problems internal to the instance.
|
||||
:ivar events: A list of events relevant to the instance.
|
||||
:ivar actions: A list of events relevant to the instance.
|
||||
"""
|
||||
|
||||
def __init__(self, id=None, zone=None):
|
||||
self.id = id
|
||||
self.zone = zone
|
||||
self.volume_status = Status()
|
||||
self.events = None
|
||||
self.actions = None
|
||||
|
||||
def __repr__(self):
|
||||
return 'VolumeStatus:%s' % self.id
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'eventsSet':
|
||||
self.events = EventSet()
|
||||
return self.events
|
||||
elif name == 'actionsSet':
|
||||
self.actions = ActionSet()
|
||||
return self.actions
|
||||
elif name == 'volumeStatus':
|
||||
return self.volume_status
|
||||
else:
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'volumeId':
|
||||
self.id = value
|
||||
elif name == 'availabilityZone':
|
||||
self.zone = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
|
||||
class VolumeStatusSet(list):
|
||||
"""
|
||||
A list object that contains the results of a call to
|
||||
DescribeVolumeStatus request. Each element of the
|
||||
list will be an VolumeStatus object.
|
||||
|
||||
:ivar next_token: If the response was truncated by
|
||||
the EC2 service, the next_token attribute of the
|
||||
object will contain the string that needs to be
|
||||
passed in to the next request to retrieve the next
|
||||
set of results.
|
||||
"""
|
||||
|
||||
def __init__(self, connection=None):
|
||||
list.__init__(self)
|
||||
self.connection = connection
|
||||
self.next_token = None
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'item':
|
||||
status = VolumeStatus()
|
||||
self.append(status)
|
||||
return status
|
||||
else:
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'NextToken':
|
||||
self.next_token = value
|
||||
setattr(self, name, value)
|
||||
80
awx/lib/site-packages/boto/ec2/zone.py
Normal file
80
awx/lib/site-packages/boto/ec2/zone.py
Normal file
@@ -0,0 +1,80 @@
|
||||
# Copyright (c) 2006-2008 Mitch Garnaat http://garnaat.org/
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the
|
||||
# "Software"), to deal in the Software without restriction, including
|
||||
# without limitation the rights to use, copy, modify, merge, publish, dis-
|
||||
# tribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
# persons to whom the Software is furnished to do so, subject to the fol-
|
||||
# lowing conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
# IN THE SOFTWARE.
|
||||
|
||||
"""
|
||||
Represents an EC2 Availability Zone
|
||||
"""
|
||||
from boto.ec2.ec2object import EC2Object
|
||||
|
||||
class MessageSet(list):
|
||||
"""
|
||||
A list object that contains messages associated with
|
||||
an availability zone.
|
||||
"""
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'message':
|
||||
self.append(value)
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
class Zone(EC2Object):
|
||||
"""
|
||||
Represents an Availability Zone.
|
||||
|
||||
:ivar name: The name of the zone.
|
||||
:ivar state: The current state of the zone.
|
||||
:ivar region_name: The name of the region the zone is associated with.
|
||||
:ivar messages: A list of messages related to the zone.
|
||||
"""
|
||||
|
||||
def __init__(self, connection=None):
|
||||
EC2Object.__init__(self, connection)
|
||||
self.name = None
|
||||
self.state = None
|
||||
self.region_name = None
|
||||
self.messages = None
|
||||
|
||||
def __repr__(self):
|
||||
return 'Zone:%s' % self.name
|
||||
|
||||
def startElement(self, name, attrs, connection):
|
||||
if name == 'messageSet':
|
||||
self.messages = MessageSet()
|
||||
return self.messages
|
||||
return None
|
||||
|
||||
def endElement(self, name, value, connection):
|
||||
if name == 'zoneName':
|
||||
self.name = value
|
||||
elif name == 'zoneState':
|
||||
self.state = value
|
||||
elif name == 'regionName':
|
||||
self.region_name = value
|
||||
else:
|
||||
setattr(self, name, value)
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user