syndicate/connection/elastic_beanstalk_connection.py (102 lines of code) (raw):
"""
Copyright 2018 EPAM Systems, Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
"""
from boto3 import client
from botocore.exceptions import ClientError
from syndicate.commons.log_helper import get_logger
from syndicate.connection.helper import apply_methods_decorator, retry
_LOG = get_logger(__name__)
@apply_methods_decorator(retry())
class BeanstalkConnection(object):
""" Elastic Beanstalk connection class."""
def __init__(self, region=None, aws_access_key_id=None,
aws_secret_access_key=None, aws_session_token=None):
self.client = client('elasticbeanstalk', region,
aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key,
aws_session_token=aws_session_token)
_LOG.debug('Opened new Elastic beanstalk connection.')
def create_application(self, app_name, description='', tags=None):
params = dict(
ApplicationName=app_name,
Description=description
)
if tags:
params['Tags'] = tags
self.client.create_application(**params)
def remove_app(self, app_name, terminate_env_force=True,
log_not_found_error=True):
"""
log_not_found_error parameter is needed for proper log handling in the
retry decorator
"""
return self.client.delete_application(
ApplicationName=app_name,
TerminateEnvByForce=terminate_env_force
)
def create_environment(self, app_name, env_name, group_name=None,
description=None, cname_prefix=None, tier=None,
tags=None, version_label=None, template_name=None,
solution_stack_name=None, option_settings=None,
options_to_remove=None):
"""
http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/command-options-general.html
:type app_name: str
:type env_name: str
:type group_name: str
:type description: str
:type cname_prefix: str
:type tier: dict
:param tier: { 'Name': 'string',
'Type': 'string',
'Version': 'string' }
:type tags: list of dicts
:param tags: [{ 'Key': 'string', 'Value': 'string' }]
:type version_label: str
:type template_name: str
:type solution_stack_name: str
:type option_settings: list of dicts
:param option_settings: [{
'ResourceName': 'string',
'Namespace': 'string',
'OptionName': 'string',
'Value': 'string'
}]
:type options_to_remove: list of dicts
:param options_to_remove: [{
'ResourceName': 'string',
'Namespace': 'string',
'OptionName': 'string'
}]
"""
params = dict(ApplicationName=app_name, EnvironmentName=env_name)
if group_name:
params['GroupName'] = group_name
if description:
params['Description'] = description
if cname_prefix:
params['CNAMEPrefix'] = cname_prefix
if tier:
params['Tier'] = tier
if tags:
params['Tags'] = tags
if version_label:
params['VersionLabel'] = version_label
if template_name:
params['TemplateName'] = template_name
if solution_stack_name:
params['SolutionStackName'] = solution_stack_name
if option_settings:
params['OptionSettings'] = option_settings
if options_to_remove:
params['OptionsToRemove'] = options_to_remove
return self.client.create_environment(**params)
def get_settings(self, app_name, template_name=None, env_name=None):
""" You must specify either template_name or a env_name.
:type app_name: str
:type template_name: str
:type env_name: str
:return: response
"""
params = dict(ApplicationName=app_name)
if template_name:
params['TemplateName'] = template_name
if env_name:
params['EnvironmentName'] = env_name
return self.client.describe_configuration_settings(**params)
def create_app_version(self, app_name, version_label, s3_bucket, s3_key,
tags):
params = dict(
ApplicationName=app_name,
VersionLabel=version_label,
SourceBundle={
'S3Bucket': s3_bucket,
'S3Key': s3_key
}
)
if tags:
params['Tags'] = tags
return self.client.create_application_version(**params)
def describe_applications(self, app_names=None):
"""
:type app_names: list
:return:
"""
try:
if app_names is None:
app_names = []
return self.client.describe_applications(
ApplicationNames=app_names).get('Applications')
except ClientError as e:
if 'ResourceNotFoundException' in str(e):
pass # valid exception
else:
raise e
def describe_environment_health(self, env_name, env_id=None,
attr_names=None):
"""
:type env_name: str
:type env_id: str
:type attr_names: list
:param attr_names: 'Status' | 'Color' | 'Causes' | 'ApplicationMetrics'
| 'InstancesHealth' | 'All' | 'HealthStatus' | 'RefreshedAt'
:return: response
"""
params = dict(EnvironmentName=env_name)
if env_id:
params['EnvironmentId'] = env_id
if attr_names:
params['AttributeNames'] = attr_names
return self.client.describe_environment_health(**params)
def deploy_env_version(self, app_name, env_name, version_label):
return self.client.update_environment(ApplicationName=app_name,
EnvironmentName=env_name,
VersionLabel=version_label)
def describe_available_solutions_stack_names(self):
solution_stacks = self.client.list_available_solution_stacks()
if solution_stacks:
return solution_stacks['SolutionStacks']