예제 #1
0
class RemoveTag(Action):
    """Remove tags from ec2 resources.
    """

    deprecations = (
        deprecated.alias('unmark'),
        deprecated.alias('untag'),
    )

    batch_size = 100
    concurrency = 2

    schema = utils.type_schema('remove-tag',
                               aliases=('unmark', 'untag', 'remove-tag'),
                               tags={
                                   'type': 'array',
                                   'items': {
                                       'type': 'string'
                                   }
                               })
    schema_alias = True
    permissions = ('ec2:DeleteTags', )

    def process(self, resources):
        self.id_key = self.manager.get_model().id

        tags = self.data.get('tags', [DEFAULT_TAG])
        batch_size = self.data.get('batch_size', self.batch_size)

        client = self.get_client()
        _common_tag_processer(self.executor_factory, batch_size,
                              self.concurrency, client,
                              self.process_resource_set, self.id_key,
                              resources, tags, self.log)

    def process_resource_set(self, client, resource_set, tag_keys):
        return self.manager.retry(
            client.delete_tags,
            Resources=[v[self.id_key] for v in resource_set],
            Tags=[{
                'Key': k
            } for k in tag_keys],
            DryRun=self.manager.config.dryrun)

    def get_client(self):
        return utils.local_session(self.manager.session_factory).client(
            self.manager.resource_type.service)
예제 #2
0
class Tag(Action):
    """Tag an ec2 resource.
    """

    batch_size = 25
    concurrency = 2

    deprecations = (deprecated.alias('mark'), )

    schema = utils.type_schema(
        'tag',
        aliases=('mark', ),
        tags={'type': 'object'},
        key={'type': 'string'},
        value={'type': 'string'},
        tag={'type': 'string'},
    )
    schema_alias = True
    permissions = ('ec2:CreateTags', )
    id_key = None

    def validate(self):
        if self.data.get('key') and self.data.get('tag'):
            raise PolicyValidationError(
                "Can't specify both key and tag, choose one in %s" %
                (self.manager.data, ))
        return self

    def process(self, resources):
        # Legacy
        msg = self.data.get('msg')
        msg = self.data.get('value') or msg

        tag = self.data.get('tag', DEFAULT_TAG)
        tag = self.data.get('key') or tag

        # Support setting multiple tags in a single go with a mapping
        tags = self.data.get('tags')

        if tags is None:
            tags = []
        else:
            tags = [{'Key': k, 'Value': v} for k, v in tags.items()]

        if msg:
            tags.append({'Key': tag, 'Value': msg})

        self.interpolate_values(tags)

        batch_size = self.data.get('batch_size', self.batch_size)

        client = self.get_client()
        _common_tag_processer(self.executor_factory, batch_size,
                              self.concurrency, client,
                              self.process_resource_set, self.id_key,
                              resources, tags, self.log)

    def process_resource_set(self, client, resource_set, tags):
        mid = self.manager.get_model().id
        self.manager.retry(client.create_tags,
                           Resources=[v[mid] for v in resource_set],
                           Tags=tags,
                           DryRun=self.manager.config.dryrun)

    def interpolate_values(self, tags):
        params = {
            'account_id': self.manager.config.account_id,
            'now': utils.FormatDate.utcnow(),
            'region': self.manager.config.region
        }
        for t in tags:
            t['Value'] = t['Value'].format(**params)

    def get_client(self):
        return utils.local_session(self.manager.session_factory).client(
            self.manager.resource_type.service)