def test_delete_tag_using_tags(): svc = TaggingService() tags = [{"Key": "key_key", "Value": "value_value"}] svc.tag_resource("arn", tags) svc.untag_resource_using_tags("arn", tags) result = svc.list_tags_for_resource("arn") {"Tags": []}.should.be.equal(result)
class CloudTrailBackend(BaseBackend): """Implementation of CloudTrail APIs.""" def __init__(self, region_name): self.region_name = region_name self.trails = dict() self.tagging_service = TaggingService(tag_name="TagsList") def create_trail( self, name, bucket_name, s3_key_prefix, sns_topic_name, is_global, is_multi_region, log_validation, is_org_trail, cw_log_group_arn, cw_role_arn, kms_key_id, tags_list, ): trail = Trail( self.region_name, name, bucket_name, s3_key_prefix, sns_topic_name, is_global, is_multi_region, log_validation, is_org_trail, cw_log_group_arn, cw_role_arn, kms_key_id, ) self.trails[name] = trail self.tagging_service.tag_resource(trail.arn, tags_list) return trail def get_trail(self, name_or_arn): if len(name_or_arn) < 3: raise TrailNameTooShort(actual_length=len(name_or_arn)) if name_or_arn in self.trails: return self.trails[name_or_arn] for trail in self.trails.values(): if trail.arn == name_or_arn: return trail raise TrailNotFoundException(name_or_arn) def get_trail_status(self, name): if len(name) < 3: raise TrailNameTooShort(actual_length=len(name)) trail_name = next( (trail.trail_name for trail in self.trails.values() if trail.trail_name == name or trail.arn == name), None, ) if not trail_name: # This particular method returns the ARN as part of the error message arn = ( f"arn:aws:cloudtrail:{self.region_name}:{get_account_id()}:trail/{name}" ) raise TrailNotFoundException(name=arn) trail = self.trails[trail_name] return trail.status def describe_trails(self, include_shadow_trails): all_trails = [] if include_shadow_trails: for backend in cloudtrail_backends.values(): all_trails.extend(backend.trails.values()) else: all_trails.extend(self.trails.values()) return all_trails def list_trails(self): return self.describe_trails(include_shadow_trails=True) def start_logging(self, name): trail = self.trails[name] trail.start_logging() def stop_logging(self, name): trail = self.trails[name] trail.stop_logging() def delete_trail(self, name): if name in self.trails: del self.trails[name] def update_trail( self, name, s3_bucket_name, s3_key_prefix, sns_topic_name, include_global_service_events, is_multi_region_trail, enable_log_file_validation, is_organization_trail, cw_log_group_arn, cw_role_arn, kms_key_id, ): trail = self.get_trail(name_or_arn=name) trail.update( s3_bucket_name=s3_bucket_name, s3_key_prefix=s3_key_prefix, sns_topic_name=sns_topic_name, include_global_service_events=include_global_service_events, is_multi_region_trail=is_multi_region_trail, enable_log_file_validation=enable_log_file_validation, is_organization_trail=is_organization_trail, cw_log_group_arn=cw_log_group_arn, cw_role_arn=cw_role_arn, kms_key_id=kms_key_id, ) return trail def reset(self): """Re-initialize all attributes for this instance.""" region_name = self.region_name self.__dict__ = {} self.__init__(region_name) def put_event_selectors(self, trail_name, event_selectors, advanced_event_selectors): trail = self.get_trail(trail_name) trail.put_event_selectors(event_selectors, advanced_event_selectors) trail_arn = trail.arn return trail_arn, event_selectors, advanced_event_selectors def get_event_selectors(self, trail_name): trail = self.get_trail(trail_name) event_selectors, advanced_event_selectors = trail.get_event_selectors() return trail.arn, event_selectors, advanced_event_selectors def add_tags(self, resource_id, tags_list): self.tagging_service.tag_resource(resource_id, tags_list) def remove_tags(self, resource_id, tags_list): self.tagging_service.untag_resource_using_tags(resource_id, tags_list) def list_tags(self, resource_id_list): """ Pagination is not yet implemented """ resp = [{"ResourceId": r_id} for r_id in resource_id_list] for item in resp: item["TagsList"] = self.tagging_service.list_tags_for_resource( item["ResourceId"])["TagsList"] return resp def put_insight_selectors(self, trail_name, insight_selectors): trail = self.get_trail(trail_name) trail.put_insight_selectors(insight_selectors) return trail.arn, insight_selectors def get_insight_selectors(self, trail_name): trail = self.get_trail(trail_name) return trail.arn, trail.get_insight_selectors()