ebcli/objects/environment.py (158 lines of code) (raw):
# Copyright 2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"). You
# may not use this file except in compliance with the License. A copy of
# the License is located at
#
# http://aws.amazon.com/apache2.0/
#
# or in the "license" file accompanying this file. This file 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.
import time
import re
from ebcli.objects.solutionstack import SolutionStack
from ebcli.objects.tier import Tier
from ebcli.objects.platform import PlatformVersion
from ebcli.objects.exceptions import WorkerQueueNotFound
class Environment(object):
ARN_PATTERN = re.compile(
r'^arn:aws(?:-cn)*:elasticbeanstalk:[\w\-]+:\d+:environment/[^/]+/.*$'
)
def __init__(self, version_label=None, status=None, app_name=None,
health=None, id=None, date_updated=None,
platform=None, description=None,
name=None, date_created=None, tier=None,
cname=None, option_settings=None, is_abortable=False,
environment_links=None, environment_arn=None):
self.version_label = version_label
self.status = status
self.app_name = app_name
self.health = health
self.id = id
self.date_updated = date_updated
self.platform = platform
self.description = description
self.name = name
self.date_created = date_created
self.tier = tier
self.cname = cname
self.option_settings = option_settings
self.is_abortable = is_abortable
self.environment_links = environment_links
self.environment_arn = environment_arn
def __str__(self):
return self.name
@classmethod
def is_valid_arn(cls, candidate):
return not not re.search(cls.ARN_PATTERN, candidate)
@classmethod
def json_to_environment_object(
cls,
environment_json,
want_solution_stack=False
):
platform_name = cls.__get_platform_name(environment_json, want_solution_stack)
tier = environment_json['Tier']
tier = Tier(tier['Name'], tier['Type'], tier['Version'])
environment = Environment(
version_label=environment_json.get('VersionLabel'),
status=environment_json.get('Status'),
app_name=environment_json.get('ApplicationName'),
health=environment_json.get('Health'),
id=environment_json.get('EnvironmentId'),
date_updated=environment_json.get('DateUpdated'),
platform=platform_name,
description=environment_json.get('Description'),
name=environment_json.get('EnvironmentName'),
date_created=environment_json.get('DateCreated'),
tier=tier,
cname=environment_json.get('CNAME', 'UNKNOWN'),
option_settings=environment_json.get('OptionSettings'),
is_abortable=environment_json.get('AbortableOperationInProgress', False),
environment_links=environment_json.get('EnvironmentLinks'),
environment_arn=environment_json.get('EnvironmentArn')
)
return environment
@classmethod
def json_to_environment_objects_array(
cls,
json,
want_solution_stack=False
):
environments = []
for environment_json in json:
environments.append(
Environment.json_to_environment_object(environment_json, want_solution_stack)
)
return environments
@classmethod
def __get_platform_name(cls, environment, want_solution_stack=False):
try:
if want_solution_stack or environment['SolutionStackName'] == 'custom':
solution_stack_name = environment['SolutionStackName']
platform_name = SolutionStack(solution_stack_name)
else:
platform_arn = environment['PlatformArn']
platform_name = PlatformVersion(platform_arn)
except KeyError:
platform_name = SolutionStack(environment['SolutionStackName'])
return platform_name
def print_env_details(
self,
echo_method,
get_environments_callback,
get_environment_resources_callback,
health=True
):
echo_method('Environment details for:', self.name)
echo_method(' Application name:', self.app_name)
echo_method(' Region:', self.__region_from_environment_arn())
echo_method(' Deployed Version:', self.version_label)
echo_method(' Environment ID:', self.id)
echo_method(' Platform:', self.platform)
echo_method(' Tier:', self.tier)
echo_method(' CNAME:', self.cname)
echo_method(' Updated:', self.date_updated)
self.print_env_links(
echo_method,
get_environments_callback,
get_environment_resources_callback
)
if health:
echo_method(' Status:', self.status)
echo_method(' Health:', self.health)
def print_env_links(
self,
echo_method,
get_environments_callback,
get_environment_resources_callback
):
if self.environment_links and len(self.environment_links) > 0:
links = {}
linked_envs = []
for link in self.environment_links:
link_data = dict(link_name=link['LinkName'], env_name=link['EnvironmentName'])
links[link_data['env_name']] = link_data
linked_envs.append(link_data['env_name'])
linked_env_descriptions = get_environments_callback(linked_envs)
for linked_environment in linked_env_descriptions:
if linked_environment.tier.name == 'WebServer':
links[linked_environment.name]['value'] = linked_environment.cname
elif linked_environment.tier.name == 'Worker':
links[linked_environment.name]['value'] = self.get_worker_sqs_url(
get_environment_resources_callback
)
time.sleep(.5)
echo_method(' Environment Links:')
for link in links.values():
echo_method(' {}:'.format(link['env_name']))
echo_method(
' {}: {}'.format(
link['link_name'],
link['value']
)
)
def get_worker_sqs_url(self, get_environment_resources_callback):
resources = get_environment_resources_callback(self.name)['EnvironmentResources']
queues = resources['Queues']
worker_queue = None
for queue in queues:
if queue['Name'] == 'WorkerQueue':
worker_queue = queue
if worker_queue is None:
raise WorkerQueueNotFound
return worker_queue['URL']
def __region_from_environment_arn(self):
environment_arn_regex = re.compile(r'arn:aws.*:elasticbeanstalk:(.*):\d+:environment/.*/.*$')
matches = re.match(environment_arn_regex, self.environment_arn)
return matches.groups(0)[0]