Source code for c7n.resources.elasticbeanstalk

# Copyright 2015-2017 Capital One Services, LLC
#
# 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.

import logging

from c7n.manager import resources
from c7n.query import QueryResourceManager
from c7n import utils
from c7n import tags
from c7n.utils import local_session, type_schema
from c7n.actions import BaseAction

log = logging.getLogger('custodian.elasticbeanstalk')


[docs]@resources.register('elasticbeanstalk') class ElasticBeanstalk(QueryResourceManager):
[docs] class resource_type(object): service = 'elasticbeanstalk' enum_spec = ('describe_applications', 'Applications', None) name = "ApplicationName" id = "ApplicationName" arn = "ApplicationArn" dimension = None default_report_fields = ( 'ApplicationName', 'DateCreated', 'DateUpdated' ) filter_name = 'ApplicationNames' filter_type = 'list'
[docs]@resources.register('elasticbeanstalk-environment') class ElasticBeanstalkEnvironment(QueryResourceManager): """ Resource manager for Elasticbeanstalk Environments """
[docs] class resource_type(object): service = 'elasticbeanstalk' enum_spec = ('describe_environments', 'Environments', None) name = id = "EnvironmentName" dimension = None arn = "EnvironmentArn" default_report_fields = ( 'EnvironmentName', 'DateCreated', 'DateUpdated', ) filter_name = 'EnvironmentNames' filter_type = 'list'
permissions = ('elasticbeanstalk:ListTagsForResource',)
[docs] def augment(self, envs): return _eb_env_tags(envs, self.session_factory, self.retry)
ElasticBeanstalkEnvironment.filter_registry.register( 'tag-count', tags.TagCountFilter) ElasticBeanstalkEnvironment.filter_registry.register( 'marked-for-op', tags.TagActionFilter) def _eb_env_tags(envs, session_factory, retry): """Augment ElasticBeanstalk Environments with their tags.""" client = local_session(session_factory).client('elasticbeanstalk') def process_tags(eb_env): try: eb_env['Tags'] = retry( client.list_tags_for_resource, ResourceArn=eb_env['EnvironmentArn'])['ResourceTags'] except client.exceptions.ResourceNotFoundException: return return eb_env # Handle API rate-limiting, which is a problem for accounts with many # EB Environments return list(map(process_tags, envs))
[docs]@ElasticBeanstalkEnvironment.action_registry.register('mark-for-op') class TagDelayedAction(tags.TagDelayedAction): """Mark an ElasticBeanstalk Environment for specific custodian action Note that this will cause an update to the environment to deploy the tag changes to all resources. :example: .. code-block:: yaml policies: - name: mark-for-delete resource: elasticbeanstalk-environment filters: - type: value key: CNAME op: regex value: .*inactive.* actions: - type: mark-for-op op: terminate days: 7 """
[docs]@ElasticBeanstalkEnvironment.action_registry.register('tag') class Tag(tags.Tag): """Tag an ElasticBeanstalk Environment with a key/value Note that this will cause an update to the environment to deploy the tag changes to all resources. :example: .. code-block:: yaml policies: - name: eb-env-tag-owner-tag resource: elasticbeanstalk-environment filters: - "tag:OwnerName": absent actions: - type: tag key: OwnerName value: OwnerName """ batch_size = 5 permissions = ('elasticbeanstalk:UpdateTagsForResource',)
[docs] def process_resource_set(self, client, envs, ts): for env in envs: client.update_tags_for_resource( ResourceArn=env['EnvironmentArn'], TagsToAdd=ts)
[docs]@ElasticBeanstalkEnvironment.action_registry.register('remove-tag') class RemoveTag(tags.RemoveTag): """Removes a tag or set of tags from ElasticBeanstalk Environments Note that this will cause an update to the environment to deploy the tag changes to all resources. :example: .. code-block:: yaml policies: - name: eb-env-unmark resource: elasticbeanstalk-environment filters: - "tag:ExpiredTag": present actions: - type: remove-tag tags: ["ExpiredTag"] """ batch_size = 5 permissions = ('elasticbeanstalk:UpdateTagsForResource',)
[docs] def process_resource_set(self, client, envs, tag_keys): for env in envs: client.update_tags_for_resource( ResourceArn=env['EnvironmentArn'], TagsToRemove=tag_keys)
[docs]@ElasticBeanstalkEnvironment.action_registry.register('terminate') class Terminate(BaseAction): """ Terminate an ElasticBeanstalk Environment. :Example: .. code-block:: yaml policies: - name: eb-env-termination resource: elasticbeanstalk-environment filters: - type: marked-for-op op: terminate actions: - terminate """ schema = type_schema( 'terminate', force={'type': 'boolean', 'default': False}, terminate_resources={'type': 'boolean', 'default': True} ) permissions = ("elasticbeanstalk:TerminateEnvironment",)
[docs] def process(self, envs): force_terminate = self.data.get('force', False) terminate_resources = self.data.get('terminate_resources', True) client = utils.local_session( self.manager.session_factory).client('elasticbeanstalk') for e in envs: client.terminate_environment( EnvironmentName=e["EnvironmentName"], TerminateResources=terminate_resources, ForceTerminate=force_terminate )