2014-03-23 23:12:07 +01:00
|
|
|
from bootstrapvz.base import Task
|
|
|
|
from bootstrapvz.common import phases
|
2018-02-12 04:17:53 +00:00
|
|
|
from . import host
|
2013-05-02 19:13:35 +02:00
|
|
|
|
|
|
|
|
2015-05-03 12:31:44 +02:00
|
|
|
class SilenceBotoDebug(Task):
|
2016-06-04 11:35:59 +02:00
|
|
|
description = 'Silence boto debug logging'
|
|
|
|
phase = phases.preparation
|
2015-05-03 12:31:44 +02:00
|
|
|
|
2016-06-04 11:35:59 +02:00
|
|
|
@classmethod
|
|
|
|
def run(cls, info):
|
|
|
|
# Regardless of of loglevel, we don't want boto debug stuff, it's very noisy
|
|
|
|
import logging
|
|
|
|
logging.getLogger('boto').setLevel(logging.INFO)
|
2018-07-19 13:01:35 +02:00
|
|
|
logging.getLogger('boto3').setLevel(logging.INFO)
|
2015-05-03 12:31:44 +02:00
|
|
|
|
|
|
|
|
2013-05-02 19:13:35 +02:00
|
|
|
class GetCredentials(Task):
|
2016-06-04 11:35:59 +02:00
|
|
|
description = 'Getting AWS credentials'
|
|
|
|
phase = phases.preparation
|
|
|
|
successors = [SilenceBotoDebug]
|
2013-06-09 20:29:54 +02:00
|
|
|
|
2016-06-04 11:35:59 +02:00
|
|
|
@classmethod
|
|
|
|
def run(cls, info):
|
|
|
|
keys = ['access-key', 'secret-key']
|
|
|
|
if info.manifest.volume['backing'] == 's3':
|
|
|
|
keys.extend(['certificate', 'private-key', 'user-id'])
|
|
|
|
info.credentials = cls.get_credentials(info.manifest, keys)
|
2013-05-02 19:13:35 +02:00
|
|
|
|
2016-06-04 11:35:59 +02:00
|
|
|
@classmethod
|
|
|
|
def get_credentials(cls, manifest, keys):
|
|
|
|
from os import getenv
|
|
|
|
creds = {}
|
|
|
|
if 'credentials' in manifest.provider:
|
|
|
|
if all(key in manifest.provider['credentials'] for key in keys):
|
|
|
|
for key in keys:
|
|
|
|
creds[key] = manifest.provider['credentials'][key]
|
|
|
|
return creds
|
2013-11-04 17:31:32 +01:00
|
|
|
|
2016-06-04 11:35:59 +02:00
|
|
|
def env_key(key):
|
|
|
|
return ('aws-' + key).upper().replace('-', '_')
|
2017-01-20 13:50:54 +00:00
|
|
|
|
2016-06-04 11:35:59 +02:00
|
|
|
if all(getenv(env_key(key)) is not None for key in keys):
|
|
|
|
for key in keys:
|
|
|
|
creds[key] = getenv(env_key(key))
|
|
|
|
return creds
|
2014-06-30 20:23:44 +02:00
|
|
|
|
2016-06-04 11:35:59 +02:00
|
|
|
def provider_key(key):
|
|
|
|
return key.replace('-', '_')
|
2017-01-20 13:50:54 +00:00
|
|
|
|
2017-12-20 23:47:05 -08:00
|
|
|
provider_args = {
|
|
|
|
'profile_name': manifest.provider.get('profile', None)}
|
|
|
|
|
|
|
|
from boto3 import Session
|
|
|
|
if provider_args.get('profile_name', None):
|
|
|
|
if provider_args.get('profile_name') not in Session().available_profiles:
|
|
|
|
raise RuntimeError((
|
|
|
|
'Profile specified was not found: {}'.format(provider_args.get('profile_name'))))
|
2018-07-10 15:05:09 +02:00
|
|
|
provider = Session(**provider_args).get_credentials()
|
|
|
|
if provider is not None:
|
|
|
|
provider = provider.get_frozen_credentials()
|
|
|
|
if all(getattr(provider, provider_key(key), None) is not None for key in keys):
|
2016-06-04 11:35:59 +02:00
|
|
|
for key in keys:
|
|
|
|
creds[key] = getattr(provider, provider_key(key))
|
2017-12-20 23:47:05 -08:00
|
|
|
if hasattr(provider, 'token'):
|
|
|
|
creds['security-token'] = provider.token
|
2016-06-04 11:35:59 +02:00
|
|
|
return creds
|
|
|
|
raise RuntimeError(('No ec2 credentials found, they must all be specified '
|
|
|
|
'exclusively via environment variables or through the manifest.'))
|
2013-05-02 19:13:35 +02:00
|
|
|
|
|
|
|
|
|
|
|
class Connect(Task):
|
2016-06-04 11:35:59 +02:00
|
|
|
description = 'Connecting to EC2'
|
|
|
|
phase = phases.preparation
|
|
|
|
predecessors = [GetCredentials, host.GetInstanceMetadata, host.SetRegion]
|
2013-06-26 20:14:37 +02:00
|
|
|
|
2016-06-04 11:35:59 +02:00
|
|
|
@classmethod
|
|
|
|
def run(cls, info):
|
2016-11-12 19:58:51 +00:00
|
|
|
import boto3
|
2016-06-04 11:35:59 +02:00
|
|
|
connect_args = {
|
|
|
|
'aws_access_key_id': info.credentials['access-key'],
|
|
|
|
'aws_secret_access_key': info.credentials['secret-key']
|
|
|
|
}
|
2016-04-14 19:28:44 -04:00
|
|
|
|
2017-12-20 23:47:05 -08:00
|
|
|
connect_args['aws_session_token'] = info.credentials.get('security-token', None)
|
2016-04-14 19:28:44 -04:00
|
|
|
|
2017-12-20 23:47:05 -08:00
|
|
|
info._ec2['connection'] = boto3.client('ec2', region_name=info._ec2['region'], **connect_args)
|