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)
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)