use utils.boto in asg, and ec2

This commit is contained in:
Matthew Williams 2015-04-13 20:09:03 +00:00
parent 00f170bfb4
commit 0249e84d37
4 changed files with 37 additions and 176 deletions

View File

@ -33,11 +33,14 @@ Connection module for Amazon Autoscale Groups
:depends: boto :depends: boto
''' '''
# keep lint from choking on _get_conn and _cache_id
#pylint disable=F821
# Import Python libs # Import Python libs
from __future__ import absolute_import from __future__ import absolute_import
import logging import logging
import json import json
import sys
import email.mime.multipart import email.mime.multipart
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -66,6 +69,10 @@ def __virtual__():
''' '''
if not HAS_BOTO: if not HAS_BOTO:
return False return False
__utils__['boto.assign_funcs'](__name__, 'asg', module='ec2.autoscale')
setattr(sys.modules[__name__], '_get_ec2_conn',
__utils__['boto.get_connection_func']('ec2'))
return True return True
@ -77,9 +84,7 @@ def exists(name, region=None, key=None, keyid=None, profile=None):
salt myminion boto_asg.exists myasg region=us-east-1 salt myminion boto_asg.exists myasg region=us-east-1
''' '''
conn = _get_conn(region, key, keyid, profile) conn = _get_conn(region=region, key=key, keyid=keyid, profile=profile)
if not conn:
return False
try: try:
_conn = conn.get_all_groups(names=[name]) _conn = conn.get_all_groups(names=[name])
if _conn: if _conn:
@ -101,9 +106,7 @@ def get_config(name, region=None, key=None, keyid=None, profile=None):
salt myminion boto_asg.get_config myasg region=us-east-1 salt myminion boto_asg.get_config myasg region=us-east-1
''' '''
conn = _get_conn(region, key, keyid, profile) conn = _get_conn(region=region, key=key, keyid=keyid, profile=profile)
if not conn:
return None
try: try:
asg = conn.get_all_groups(names=[name]) asg = conn.get_all_groups(names=[name])
if asg: if asg:
@ -173,9 +176,7 @@ def create(name, launch_config_name, availability_zones, min_size, max_size,
salt myminion boto_asg.create myasg mylc '["us-east-1a", "us-east-1e"]' 1 10 load_balancers='["myelb", "myelb2"]' tags='[{"key": "Name", value="myasg", "propagate_at_launch": True}]' salt myminion boto_asg.create myasg mylc '["us-east-1a", "us-east-1e"]' 1 10 load_balancers='["myelb", "myelb2"]' tags='[{"key": "Name", value="myasg", "propagate_at_launch": True}]'
''' '''
conn = _get_conn(region, key, keyid, profile) conn = _get_conn(region=region, key=key, keyid=keyid, profile=profile)
if not conn:
return False
if isinstance(availability_zones, six.string_types): if isinstance(availability_zones, six.string_types):
availability_zones = json.loads(availability_zones) availability_zones = json.loads(availability_zones)
if isinstance(load_balancers, six.string_types): if isinstance(load_balancers, six.string_types):
@ -250,7 +251,7 @@ def update(name, launch_config_name, availability_zones, min_size, max_size,
salt myminion boto_asg.update myasg mylc '["us-east-1a", "us-east-1e"]' 1 10 load_balancers='["myelb", "myelb2"]' tags='[{"key": "Name", value="myasg", "propagate_at_launch": True}]' salt myminion boto_asg.update myasg mylc '["us-east-1a", "us-east-1e"]' 1 10 load_balancers='["myelb", "myelb2"]' tags='[{"key": "Name", value="myasg", "propagate_at_launch": True}]'
''' '''
conn = _get_conn(region, key, keyid, profile) conn = _get_conn(region=region, key=key, keyid=keyid, profile=profile)
if not conn: if not conn:
return False, "failed to connect to AWS" return False, "failed to connect to AWS"
if isinstance(availability_zones, six.string_types): if isinstance(availability_zones, six.string_types):
@ -346,9 +347,7 @@ def delete(name, force=False, region=None, key=None, keyid=None, profile=None):
salt myminion boto_asg.delete myasg region=us-east-1 salt myminion boto_asg.delete myasg region=us-east-1
''' '''
conn = _get_conn(region, key, keyid, profile) conn = _get_conn(region=region, key=key, keyid=keyid, profile=profile)
if not conn:
return False
try: try:
conn.delete_auto_scaling_group(name, force) conn.delete_auto_scaling_group(name, force)
msg = 'Deleted autoscale group {0}.'.format(name) msg = 'Deleted autoscale group {0}.'.format(name)
@ -404,9 +403,7 @@ def launch_configuration_exists(name, region=None, key=None, keyid=None,
salt myminion boto_asg.launch_configuration_exists mylc salt myminion boto_asg.launch_configuration_exists mylc
''' '''
conn = _get_conn(region, key, keyid, profile) conn = _get_conn(region=region, key=key, keyid=keyid, profile=profile)
if not conn:
return False
try: try:
lc = conn.get_all_launch_configurations(names=[name]) lc = conn.get_all_launch_configurations(names=[name])
if lc: if lc:
@ -439,9 +436,7 @@ def create_launch_configuration(name, image_id, key_name=None,
salt myminion boto_asg.create_launch_configuration mylc image_id=ami-0b9c9f62 key_name='mykey' security_groups='["mygroup"]' instance_type='c3.2xlarge' salt myminion boto_asg.create_launch_configuration mylc image_id=ami-0b9c9f62 key_name='mykey' security_groups='["mygroup"]' instance_type='c3.2xlarge'
''' '''
conn = _get_conn(region, key, keyid, profile) conn = _get_conn(region=region, key=key, keyid=keyid, profile=profile)
if not conn:
return False
if isinstance(security_groups, six.string_types): if isinstance(security_groups, six.string_types):
security_groups = json.loads(security_groups) security_groups = json.loads(security_groups)
if isinstance(block_device_mappings, six.string_types): if isinstance(block_device_mappings, six.string_types):
@ -488,9 +483,7 @@ def delete_launch_configuration(name, region=None, key=None, keyid=None,
salt myminion boto_asg.delete_launch_configuration mylc salt myminion boto_asg.delete_launch_configuration mylc
''' '''
conn = _get_conn(region, key, keyid, profile) conn = _get_conn(region=region, key=key, keyid=keyid, profile=profile)
if not conn:
return False
try: try:
conn.delete_launch_configuration(name) conn.delete_launch_configuration(name)
log.info('Deleted LC {0}'.format(name)) log.info('Deleted LC {0}'.format(name))
@ -513,7 +506,7 @@ def get_scaling_policy_arn(as_group, scaling_policy_name, region=None,
salt '*' boto_asg.get_scaling_policy_arn mygroup mypolicy salt '*' boto_asg.get_scaling_policy_arn mygroup mypolicy
''' '''
conn = _get_conn(region, key, keyid, profile) conn = _get_conn(region=region, key=key, keyid=keyid, profile=profile)
policies = conn.get_all_policies(as_group=as_group) policies = conn.get_all_policies(as_group=as_group)
for policy in policies: for policy in policies:
if policy.name == scaling_policy_name: if policy.name == scaling_policy_name:
@ -522,74 +515,6 @@ def get_scaling_policy_arn(as_group, scaling_policy_name, region=None,
return None return None
def _get_conn(region, key, keyid, profile):
'''
Get a boto connection to autoscale.
'''
if profile:
if isinstance(profile, six.string_types):
_profile = __salt__['config.option'](profile)
elif isinstance(profile, dict):
_profile = profile
key = _profile.get('key', None)
keyid = _profile.get('keyid', None)
region = _profile.get('region', None)
if not region and __salt__['config.option']('asg.region'):
region = __salt__['config.option']('asg.region')
if not region:
region = 'us-east-1'
if not key and __salt__['config.option']('asg.key'):
key = __salt__['config.option']('asg.key')
if not keyid and __salt__['config.option']('asg.keyid'):
keyid = __salt__['config.option']('asg.keyid')
try:
conn = autoscale.connect_to_region(region, aws_access_key_id=keyid,
aws_secret_access_key=key)
except boto.exception.NoAuthHandlerFound:
log.error('No authentication credentials found when attempting to'
' make boto autoscale connection.')
return None
return conn
def _get_ec2_conn(region, key, keyid, profile):
'''
Get a boto connection to ec2. Needed for get_instances
'''
if profile:
if isinstance(profile, six.string_types):
_profile = __salt__['config.option'](profile)
elif isinstance(profile, dict):
_profile = profile
key = _profile.get('key', None)
keyid = _profile.get('keyid', None)
region = _profile.get('region', None)
if not region and __salt__['config.option']('secgroup.region'):
region = __salt__['config.option']('secgroup.region')
if not region:
region = 'us-east-1'
if not key and __salt__['config.option']('secgroup.key'):
key = __salt__['config.option']('secgroup.key')
if not keyid and __salt__['config.option']('secgroup.keyid'):
keyid = __salt__['config.option']('secgroup.keyid')
try:
conn = boto.ec2.connect_to_region(region, aws_access_key_id=keyid,
aws_secret_access_key=key)
except boto.exception.NoAuthHandlerFound:
log.error('No authentication credentials found when attempting to'
' make ec2 connection for security groups.')
return None
return conn
def get_instances(name, lifecycle_state="InService", health_status="Healthy", attribute="private_ip_address", region=None, key=None, keyid=None, profile=None): def get_instances(name, lifecycle_state="InService", health_status="Healthy", attribute="private_ip_address", region=None, key=None, keyid=None, profile=None):
"""return attribute of all instances in the named autoscale group. """return attribute of all instances in the named autoscale group.
@ -598,10 +523,8 @@ def get_instances(name, lifecycle_state="InService", health_status="Healthy", at
salt-call boto_asg.get_instances my_autoscale_group_name salt-call boto_asg.get_instances my_autoscale_group_name
""" """
conn = _get_conn(region, key, keyid, profile) conn = _get_conn(region=region, key=key, keyid=keyid, profile=profile)
ec2_conn = _get_ec2_conn(region, key, keyid, profile) ec2_conn = _get_ec2_conn(region=region, key=key, keyid=keyid, profile=profile)
if not conn or not ec2_conn:
return False
try: try:
asgs = conn.get_all_groups(names=[name]) asgs = conn.get_all_groups(names=[name])
except boto.exception.BotoServerError as e: except boto.exception.BotoServerError as e:

View File

@ -34,10 +34,11 @@ Connection module for Amazon EC2
:depends: boto :depends: boto
''' '''
# keep lint from choking on _get_conn and _cache_id
#pylint disable=F821
# Import Python libs # Import Python libs
from __future__ import absolute_import from __future__ import absolute_import
import hashlib
import logging import logging
import time import time
from distutils.version import LooseVersion as _LooseVersion # pylint: disable=import-error,no-name-in-module from distutils.version import LooseVersion as _LooseVersion # pylint: disable=import-error,no-name-in-module
@ -74,6 +75,7 @@ def __virtual__():
elif _LooseVersion(boto.__version__) < _LooseVersion(required_boto_version): elif _LooseVersion(boto.__version__) < _LooseVersion(required_boto_version):
return False return False
else: else:
__utils__['boto.assign_funcs'](__name__, 'ec2')
return True return True
@ -86,9 +88,7 @@ def get_zones(region=None, key=None, keyid=None, profile=None):
salt myminion boto_ec2.get_zones salt myminion boto_ec2.get_zones
''' '''
conn = _get_conn(region, key, keyid, profile) conn = _get_conn(region=region, key=key, keyid=keyid, profile=profile)
if not conn:
return False
return [z.name for z in conn.get_all_zones()] return [z.name for z in conn.get_all_zones()]
@ -107,9 +107,7 @@ def find_instances(instance_id=None, name=None, tags=None, region=None,
salt myminion boto_ec2.find_instances tags='{"mytag": "value"}' salt myminion boto_ec2.find_instances tags='{"mytag": "value"}'
''' '''
conn = _get_conn(region, key, keyid, profile) conn = _get_conn(region=region, key=key, keyid=keyid, profile=profile)
if not conn:
return False
try: try:
filter_parameters = {'filters': {}} filter_parameters = {'filters': {}}
@ -179,10 +177,6 @@ def get_id(name=None, tags=None, region=None, key=None,
salt myminion boto_ec2.get_id myinstance salt myminion boto_ec2.get_id myinstance
''' '''
conn = _get_conn(region, key, keyid, profile)
if not conn:
return None
instance_ids = find_instances(name=name, tags=tags, region=region, key=key, instance_ids = find_instances(name=name, tags=tags, region=region, key=key,
keyid=keyid, profile=profile) keyid=keyid, profile=profile)
if instance_ids: if instance_ids:
@ -211,10 +205,6 @@ def exists(instance_id=None, name=None, tags=None, region=None, key=None,
salt myminion boto_ec2.exists myinstance salt myminion boto_ec2.exists myinstance
''' '''
conn = _get_conn(region, key, keyid, profile)
if not conn:
return False
instances = find_instances(instance_id=instance_id, name=name, tags=tags) instances = find_instances(instance_id=instance_id, name=name, tags=tags)
if instances: if instances:
log.info('instance exists.') log.info('instance exists.')
@ -241,9 +231,7 @@ def run(image_id, name=None, tags=None, instance_type='m1.small',
''' '''
#TODO: support multi-instance reservations #TODO: support multi-instance reservations
conn = _get_conn(region, key, keyid, profile) conn = _get_conn(region=region, key=key, keyid=keyid, profile=profile)
if not conn:
return False
reservation = conn.run_instances(image_id, instance_type=instance_type, reservation = conn.run_instances(image_id, instance_type=instance_type,
key_name=key_name, key_name=key_name,
@ -279,9 +267,7 @@ def get_key(key_name, region=None, key=None, keyid=None, profile=None):
salt myminion boto_ec2.get_key mykey salt myminion boto_ec2.get_key mykey
''' '''
conn = _get_conn(region, key, keyid, profile) conn = _get_conn(region=region, key=key, keyid=keyid, profile=profile)
if not conn:
return False
try: try:
key = conn.get_key_pair(key_name) key = conn.get_key_pair(key_name)
@ -303,9 +289,8 @@ def create_key(key_name, save_path, region=None, key=None, keyid=None,
salt myminion boto_ec2.create mykey /root/ salt myminion boto_ec2.create mykey /root/
''' '''
conn = _get_conn(region, key, keyid, profile) conn = _get_conn(region=region, key=key, keyid=keyid, profile=profile)
if not conn:
return False
try: try:
key = conn.create_key_pair(key_name) key = conn.create_key_pair(key_name)
log.debug("the key to return is : {0}".format(key)) log.debug("the key to return is : {0}".format(key))
@ -330,9 +315,8 @@ def import_key(key_name, public_key_material, region=None, key=None,
salt myminion boto_ec2.import mykey publickey salt myminion boto_ec2.import mykey publickey
''' '''
conn = _get_conn(region, key, keyid, profile) conn = _get_conn(region=region, key=key, keyid=keyid, profile=profile)
if not conn:
return False
try: try:
key = conn.import_key_pair(key_name, public_key_material) key = conn.import_key_pair(key_name, public_key_material)
log.debug("the key to return is : {0}".format(key)) log.debug("the key to return is : {0}".format(key))
@ -349,9 +333,8 @@ def delete_key(key_name, region=None, key=None, keyid=None, profile=None):
salt myminion boto_ec2.delete_key mykey salt myminion boto_ec2.delete_key mykey
''' '''
conn = _get_conn(region, key, keyid, profile) conn = _get_conn(region=region, key=key, keyid=keyid, profile=profile)
if not conn:
return False
try: try:
key = conn.delete_key_pair(key_name) key = conn.delete_key_pair(key_name)
log.debug("the key to return is : {0}".format(key)) log.debug("the key to return is : {0}".format(key))
@ -376,9 +359,8 @@ def get_keys(keynames=None, filters=None, region=None, key=None,
salt myminion boto_ec2.get_keys salt myminion boto_ec2.get_keys
''' '''
conn = _get_conn(region, key, keyid, profile) conn = _get_conn(region=region, key=key, keyid=keyid, profile=profile)
if not conn:
return False
try: try:
keys = conn.get_all_key_pairs(keynames, filters) keys = conn.get_all_key_pairs(keynames, filters)
log.debug("the key to return is : {0}".format(keys)) log.debug("the key to return is : {0}".format(keys))
@ -390,47 +372,3 @@ def get_keys(keynames=None, filters=None, region=None, key=None,
except boto.exception.BotoServerError as e: except boto.exception.BotoServerError as e:
log.debug(e) log.debug(e)
return False return False
def _get_conn(region, key, keyid, profile):
'''
Get a boto connection to ec2.
'''
if profile:
if isinstance(profile, six.string_types):
_profile = __salt__['config.option'](profile)
elif isinstance(profile, dict):
_profile = profile
key = _profile.get('key', None)
keyid = _profile.get('keyid', None)
region = _profile.get('region', None)
if not region and __salt__['config.option']('ec2.region'):
region = __salt__['config.option']('ec2.region')
if not region:
region = 'us-east-1'
if not key and __salt__['config.option']('ec2.key'):
key = __salt__['config.option']('ec2.key')
if not keyid and __salt__['config.option']('ec2.keyid'):
keyid = __salt__['config.option']('ec2.keyid')
# avoid repeatedly creating new connections
if keyid:
cxkey = 'boto_ec2:' + hashlib.md5(region + keyid + key).hexdigest()
else:
cxkey = 'boto_ec2:' + region
if cxkey in __context__:
return __context__[cxkey]
try:
conn = boto.ec2.connect_to_region(region, aws_access_key_id=keyid,
aws_secret_access_key=key)
except boto.exception.NoAuthHandlerFound:
log.error('No authentication credentials found when attempting to'
' make boto ec2 connection.')
return None
__context__[cxkey] = conn
return conn

View File

@ -34,7 +34,7 @@ Connection module for Amazon VPC
:depends: boto :depends: boto
''' '''
# keep linter from choking on _get_conn and _cache_id # keep lint from choking on _get_conn and _cache_id
#pylint disable=F821 #pylint disable=F821
# Import Python libs # Import Python libs

View File

@ -220,7 +220,7 @@ def get_exception(e):
return CommandExecutionError(message) return CommandExecutionError(message)
def assign_funcs(module, service): def assign_funcs(modname, service, module=None):
''' '''
Assign _get_conn and _cache_id functions to the named module. Assign _get_conn and _cache_id functions to the named module.
@ -228,6 +228,6 @@ def assign_funcs(module, service):
_utils__['boto.assign_partials'](__name__, 'ec2') _utils__['boto.assign_partials'](__name__, 'ec2')
''' '''
mod = sys.modules[module] mod = sys.modules[modname]
setattr(mod, '_get_conn', get_connection_func(service)) setattr(mod, '_get_conn', get_connection_func(service, module=module))
setattr(mod, '_cache_id', cache_id_func(service)) setattr(mod, '_cache_id', cache_id_func(service))