diff --git a/pkg/pip_requirements.txt b/pkg/pip_requirements.txt index 15b749d..af87710 100644 --- a/pkg/pip_requirements.txt +++ b/pkg/pip_requirements.txt @@ -1,2 +1,3 @@ spaceone-api -boto3==1.35.76 \ No newline at end of file +boto3==1.35.76 +schematics \ No newline at end of file diff --git a/src/plugin/conf/cloud_service_conf.py b/src/plugin/conf/cloud_service_conf.py index 20979d2..617e9da 100644 --- a/src/plugin/conf/cloud_service_conf.py +++ b/src/plugin/conf/cloud_service_conf.py @@ -1,3 +1,4 @@ +MAX_WORKERS = 20 SUPPORTED_FEATURES = ["garbage_collection"] SUPPORTED_RESOURCE_TYPE = [ "inventory.CloudService", @@ -13,58 +14,29 @@ ASSET_URL = "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/cloud-services/aws" -RESOURCES = [ - "cloudformation", - "cloudwatch", - "dynamodb", - "ec2", - "glacier", - "iam", - "opsworks", - "s3", - "sns", - "sqs", -] - PAGINATOR_MAX_ITEMS = 10000 PAGINATOR_PAGE_SIZE = 50 DEFAULT_API_RETRIES = 10 -# CLOUD_SERVICE_GROUP_MAP = { -# 'IAM': IAMManager, -# 'DynamoDB': DynamoDBManager, -# 'Lambda': LambdaManager, -# 'CloudFront': CloudFrontManager, -# 'RDS': RDSManager, -# 'Route53': Route53Manager, -# 'S3': S3Manager, -# 'AutoScalingGroup': AutoScalingManager, -# 'ElastiCache': ElastiCacheManager, -# 'APIGateway': APIGatewayManager, -# 'DirectConnect': DirectConnectManager, -# 'EFS': EFSManager, -# 'DocumentDB': DocumentDBManager, -# 'ECS': ECSManager, -# 'Redshift': RedshiftManager, -# 'EKS': EKSManager, -# 'SQS': SQSManager, -# 'KMS': KMSManager, -# 'ECR': ECRManager, -# 'CloudTrail': CloudTrailManager, -# 'SNS': SNSManager, -# 'SecretsManager': SecretsManagerManager, -# 'ELB': ELBManager, -# 'EIP': EIPManager, -# 'EBS': EBSManager, -# 'VPC': VPCManager, -# 'EC2': EC2Manager, -# 'ACM': ACMManager, -# 'KinesisDataStream': KinesisDataStreamManager, -# 'MSK': MSKManager, -# 'KinesisFirehose': KinesisFirehoseManager, -# 'Lightsail': LightsailManager -# } +METRIC_SERVICES = [ + "CertificateManager", # "ACM", + "CloudFront", + "CloudTrail", + "DocumentDB", + "EC2", + "ECR", + "EFS", + "EKS", + "ELB", + "IAM", + "KMS", + "Lambda", + "Route53", + "S3", + "TrustedAdvisor", + "PersonalHealthDashboard", +] REGION_INFO = { "us-east-1": { @@ -328,24 +300,24 @@ "tags": { "latitude": "3.1390", "longitude": "101.6869", - "continent": "asia_pacific" - } + "continent": "asia_pacific", + }, }, "mx-central-1": { "name": "Mexico (Central)", "tags": { "latitude": "20.5888", "longitude": "-100.3899", - "continent": "north_america" - } + "continent": "north_america", + }, }, "ap-southeast-6": { "name": "Asia Pacific (Thailand)", "tags": { "latitude": "13.7563", "longitude": "100.5018", - "continent": "asia_pacific" - } + "continent": "asia_pacific", + }, }, "global": {"name": "Global"}, } @@ -364,3 +336,393 @@ "SecurityGroups", "Tags", ] + +# 글로벌 서비스 목록 (정확한 기준으로 관리) +GLOBAL_SERVICES = { + "IAM", + "Route53", + "CloudFront", + "S3", + "ACM", + "CloudTrail", + "TrustedAdvisor", + "PersonalHealthDashboard", +} + +SERVICE_NAME_MAP = { + "ACM": "acm", + "EC2": "ec2", + "AutoScaling": "autoscaling", + "DynamoDB": "dynamodb", + "DocumentDB": "docdb", + "DirectConnect": "directconnect", + "CloudTrail": "cloudtrail", + "CloudFront": "cloudfront", + "APIGateway": "apigateway", + "CertificateManager": "acm", + "ECR": "ecr", + "EFS": "efs", + "EKS": "eks", + "ELB": "elb", + "IAM": "iam", + "KMS": "kms", + "Lambda": "lambda_model", + "Route53": "route53", + "S3": "s3", + "MSK": "kafka", + "RDS": "rds", + "Redshift": "redshift", + "ElastiCache": "elasticache", + "SNS": "sns", + "SQS": "sqs", + "SecretsManager": "secretsmanager", + "KinesisDataStream": "kinesis", + "KinesisFirehose": "firehose", + "LightSail": "lightsail", + "VPC": "vpc", + "EIP": "eip", + "TrustedAdvisor": "support", + "PersonalHealthDashboard": "health", +} + +CLOUDWATCH_CONFIG = { + "ACM": { + "namespace": "AWS/CertificateManager", + "dimension_name": "CertificateArn", + }, + "APIGateway": { + "namespace": "AWS/ApiGateway", + "dimension_name": "ApiName", + }, + "CloudFront": { + "namespace": "AWS/CloudFront", + "dimension_name": "DistributionId", + }, + "CloudTrail": { + "namespace": "CloudTrailMetrics", + "dimension_name": None, + }, + "CloudWatch": { + "namespace": "CloudWatchMetrics", + "dimension_name": None, + }, + "DirectConnect": { + "namespace": "AWS/DX", + "dimension_name": "ConnectionId", + }, + "DocumentDB": { + "namespace": "AWS/DocDB", + "dimension_name": "DBClusterIdentifier", + }, + "DynamoDB": { + "namespace": "AWS/DynamoDB", + "dimension_name": "TableName", + }, + "EC2": { + "namespace": "AWS/EC2", + "dimension_name": "InstanceId", + }, + "ECR": { + "namespace": "AWS/ECR", + "dimension_name": "RepositoryName", + }, + "ECS": { + "namespace": "AWS/ECS", + "dimension_name": "ClusterName", + }, + "EFS": { + "namespace": "AWS/EFS", + "dimension_name": "FileSystemId", + }, + "EIP": { + "namespace": "AWS/EC2", + "dimension_name": "AllocationId", + }, + "EKS": { + "namespace": "AWS/EKS", + "dimension_name": "ClusterName", + }, + "ELB": { + "namespace": "AWS/ELB", + "dimension_name": "LoadBalancerName", + }, + "ElastiCache": { + "namespace": "AWS/ElastiCache", + "dimension_name": "CacheClusterId", + }, + "IAM": { + "namespace": "AWS/IAM", + "dimension_name": None, + }, + "KMS": { + "namespace": "AWS/KMS", + "dimension_name": "KeyId", + }, + "Kinesis": { + "namespace": "AWS/Kinesis", + "dimension_name": "StreamName", + }, + "Lambda": { + "namespace": "AWS/Lambda", + "dimension_name": "FunctionName", + }, + "Lightsail": { + "namespace": "AWS/LightSail", + "dimension_name": "InstanceName", + }, + "MSK": { + "namespace": "AWS/Kafka", + "dimension_name": "Cluster Name", + }, + "RDS": { + "namespace": "AWS/RDS", + "dimension_name": "DBInstanceIdentifier", + }, + "Redshift": { + "namespace": "AWS/Redshift", + "dimension_name": "ClusterIdentifier", + }, + "Route53": { + "namespace": "AWS/Route53", + "dimension_name": "HostedZoneId", + }, + "S3": { + "namespace": "AWS/S3", + "dimension_name": "BucketName", + }, + "SNS": { + "namespace": "AWS/SNS", + "dimension_name": "TopicName", + }, + "SQS": { + "namespace": "AWS/SQS", + "dimension_name": "QueueName", + }, + "SecretsManager": { + "namespace": "AWS/SecretsManager", + "dimension_name": "SecretName", + }, + "VPC": { + "namespace": "AWS/VPC", + "dimension_name": "VpcId", + }, + "CustomerGateway": { + "namespace": "AWS/VPC", + "dimension_name": "CustomerGatewayId", + }, + "EgressOnlyInternetGateway": { + "namespace": "AWS/VPC", + "dimension_name": "EgressOnlyInternetGatewayId", + }, + "Endpoint": { + "namespace": "AWS/VPC", + "dimension_name": "VpcEndpointId", + }, + "InternetGateway": { + "namespace": "AWS/VPC", + "dimension_name": "InternetGatewayId", + }, + "NatGateway": { + "namespace": "AWS/VPC", + "dimension_name": "NatGatewayId", + }, + "NetworkAcl": { + "namespace": "AWS/VPC", + "dimension_name": "NetworkAclId", + }, + "PeeringConnection": { + "namespace": "AWS/VPC", + "dimension_name": "VpcPeeringConnectionId", + }, + "RouteTable": { + "namespace": "AWS/VPC", + "dimension_name": "RouteTableId", + }, + "Subnet": { + "namespace": "AWS/VPC", + "dimension_name": "SubnetId", + }, + "TransitGateway": { + "namespace": "AWS/VPC", + "dimension_name": "TransitGatewayId", + }, + "VpnConnection": { + "namespace": "AWS/VPC", + "dimension_name": "VpnConnectionId", + }, + "VpnGateway": { + "namespace": "AWS/VPC", + "dimension_name": "VpnGatewayId", + }, +} + +CLOUDTRAIL_CONFIG = { + "ACM": { + "resource_type": "AWS::CertificateManager::Certificate", + "lookup_attribute": "ResourceName", + }, + "APIGateway": { + "resource_type": "AWS::ApiGateway::RestApi", + "lookup_attribute": "ResourceName", + }, + "CloudFront": { + "resource_type": "AWS::CloudFront::Distribution", + "lookup_attribute": "ResourceName", + }, + "CloudTrail": { + "resource_type": "AWS::CloudTrail::Trail", + "lookup_attribute": "ResourceName", + }, + "CloudWatch": { + "resource_type": "AWS::CloudWatch::Alarm", + "lookup_attribute": "ResourceName", + }, + "DirectConnect": { + "resource_type": "AWS::DirectConnect::Connection", + "lookup_attribute": "ResourceName", + }, + "DocumentDB": { + "resource_type": "AWS::DocDB::DBCluster", + "lookup_attribute": "ResourceName", + }, + "DynamoDB": { + "resource_type": "AWS::DynamoDB::Table", + "lookup_attribute": "ResourceName", + }, + "EC2": { + "resource_type": "AWS::EC2::Instance", + "lookup_attribute": "ResourceName", + }, + "ECR": { + "resource_type": "AWS::ECR::Repository", + "lookup_attribute": "ResourceName", + }, + "ECS": { + "resource_type": "AWS::ECS::Cluster", + "lookup_attribute": "ResourceName", + }, + "EFS": { + "resource_type": "AWS::EFS::FileSystem", + "lookup_attribute": "ResourceName", + }, + "EIP": { + "resource_type": "AWS::EC2::EIP", + "lookup_attribute": "ResourceName", + }, + "EKS": { + "resource_type": "AWS::EKS::Cluster", + "lookup_attribute": "ResourceName", + }, + "ELB": { + "resource_type": "AWS::ElasticLoadBalancing::LoadBalancer", + "lookup_attribute": "ResourceName", + }, + "ElastiCache": { + "resource_type": "AWS::ElastiCache::CacheCluster", + "lookup_attribute": "ResourceName", + }, + "IAM": { + "resource_type": "AWS::IAM::User", + "lookup_attribute": "ResourceName", + }, + "KMS": { + "resource_type": "AWS::KMS::Key", + "lookup_attribute": "ResourceName", + }, + "Kinesis": { + "resource_type": "AWS::Kinesis::Stream", + "lookup_attribute": "ResourceName", + }, + "Lambda": { + "resource_type": "AWS::Lambda::Function", + "lookup_attribute": "ResourceName", + }, + "Lightsail": { + "resource_type": "AWS::Lightsail::Instance", + "lookup_attribute": "ResourceName", + }, + "MSK": { + "resource_type": "AWS::MSK::Cluster", + "lookup_attribute": "ResourceName", + }, + "RDS": { + "resource_type": "AWS::RDS::DBInstance", + "lookup_attribute": "ResourceName", + }, + "Redshift": { + "resource_type": "AWS::Redshift::Cluster", + "lookup_attribute": "ResourceName", + }, + "Route53": { + "resource_type": "AWS::Route53::HostedZone", + "lookup_attribute": "ResourceName", + }, + "S3": { + "resource_type": "AWS::S3::Bucket", + "lookup_attribute": "ResourceName", + }, + "SNS": { + "resource_type": "AWS::SNS::Topic", + "lookup_attribute": "ResourceName", + }, + "SQS": { + "resource_type": "AWS::SQS::Queue", + "lookup_attribute": "ResourceName", + }, + "SecretsManager": { + "resource_type": "AWS::SecretsManager::Secret", + "lookup_attribute": "ResourceName", + }, + "VPC": { + "resource_type": "AWS::EC2::VPC", + "lookup_attribute": "ResourceName", + }, + "CustomerGateway": { + "resource_type": "AWS::EC2::CustomerGateway", + "lookup_attribute": "ResourceName", + }, + "EgressOnlyInternetGateway": { + "resource_type": "AWS::EC2::EgressOnlyInternetGateway", + "lookup_attribute": "ResourceName", + }, + "Endpoint": { + "resource_type": "AWS::EC2::VPCEndpoint", + "lookup_attribute": "ResourceName", + }, + "InternetGateway": { + "resource_type": "AWS::EC2::InternetGateway", + "lookup_attribute": "ResourceName", + }, + "NatGateway": { + "resource_type": "AWS::EC2::NatGateway", + "lookup_attribute": "ResourceName", + }, + "NetworkAcl": { + "resource_type": "AWS::EC2::NetworkAcl", + "lookup_attribute": "ResourceName", + }, + "PeeringConnection": { + "resource_type": "AWS::EC2::VPCPeeringConnection", + "lookup_attribute": "ResourceName", + }, + "RouteTable": { + "resource_type": "AWS::EC2::RouteTable", + "lookup_attribute": "ResourceName", + }, + "Subnet": { + "resource_type": "AWS::EC2::Subnet", + "lookup_attribute": "ResourceName", + }, + "TransitGateway": { + "resource_type": "AWS::EC2::TransitGateway", + "lookup_attribute": "ResourceName", + }, + "VpnConnection": { + "resource_type": "AWS::EC2::VPNConnection", + "lookup_attribute": "ResourceName", + }, + "VpnGateway": { + "resource_type": "AWS::EC2::VPNGateway", + "lookup_attribute": "ResourceName", + }, +} diff --git a/src/plugin/connector/__init__.py b/src/plugin/connector/__init__.py index c798366..ff5e03e 100644 --- a/src/plugin/connector/__init__.py +++ b/src/plugin/connector/__init__.py @@ -1,10 +1,33 @@ -# from .acm import * - -# from .api_gateway import * -# from .cloud_front import * -# from .cloud_trail import * -# from .direct_connect import * -# from .documentdb import * -# from .dynamodb import * - +from .acm import * +from .api_gateway import * +from .cloudfront import * +from .cloudtrail import * +from .cloudwatch import * +from .direct_connect import * +from .documentdb import * +from .dynamodb import * from .ec2 import * +from .ecr import * +from .ecs import * +from .efs import * +from .eks import * +from .elasticache import * +from .elb import * +from .iam import * +from .kinesis_data_stream import * +from .kinesis_firehose import * +from .kms import * +from .lightsail import * +from .msk import * +from .rds import * +from .redshift import * +from .route53 import * +from .s3 import * +from .secrets_manager import * +from .sns import * +from .sqs import * +from .vpc import * + +# Not Used +# from .eip import * +# from .ebs import * diff --git a/src/plugin/connector/acm/certificate_connector.py b/src/plugin/connector/acm/certificate_connector.py index a871878..0321004 100644 --- a/src/plugin/connector/acm/certificate_connector.py +++ b/src/plugin/connector/acm/certificate_connector.py @@ -3,14 +3,14 @@ class CertificateConnector(ResourceConnector): service_name = "acm" - cloud_service_group = "CertificateManager" + cloud_service_group = "ACM" cloud_service_type = "Certificate" def __init__(self, secret_data, region_name): super().__init__(secret_data, region_name) self.service_name = "acm" self.cloud_service_type = "Certificate" - self.cloud_service_group = "CertificateManager" + self.cloud_service_group = "ACM" self.rest_service_name = "acm" def get_certificates(self): diff --git a/src/plugin/connector/base.py b/src/plugin/connector/base.py index f979ea9..1e96954 100644 --- a/src/plugin/connector/base.py +++ b/src/plugin/connector/base.py @@ -109,57 +109,6 @@ def __init__( self.filter = filter self.region_names = kwargs.get("regions", []) - def reset_region(self, region_name): - self.region_name = region_name - self._client = None - self._session = None - - def set_client(self, service_name): - self.service_name = service_name - self._client = self.session.client( - self.service_name, - verify=BOTO3_HTTPS_VERIFIED, - config=Config(retries={"max_attempts": 10}), - ) - return self._client - - def get_account_id(self): - return self.account_id - - def load_account_id(self, account_id): - self.account_id = account_id - - def set_account_id(self): - sts_client = self.session.client( - "sts", - verify=BOTO3_HTTPS_VERIFIED, - config=Config(retries={"max_attempts": 10}), - ) - self.account_id = sts_client.get_caller_identity()["Account"] - - def set_cloud_service_types(self): - if "service_code_mappers" in self.options: - svc_code_maps = self.options["service_code_mappers"] - - for cst in self.cloud_service_types: - if ( - getattr(cst.resource, "service_code") - and cst.resource.service_code in svc_code_maps - ): - cst.resource.service_code = svc_code_maps[cst.resource.service_code] - - if "custom_asset_url" in self.options: - for cst in self.cloud_service_types: - _tags = cst.resource.tags - - if "spaceone:icon" in _tags: - _icon = _tags["spaceone:icon"] - _tags["spaceone:icon"] = ( - f'{self.options["custom_asset_url"]}/{_icon.split("/")[-1]}' - ) - - return self.cloud_service_types - @property def session(self): return self.init_property( @@ -201,3 +150,8 @@ def get_regions(cls, secret_data): ec2_client.describe_regions().get("Regions"), ) ) + + @classmethod + def get_available_regions(cls, secret_data, service_name): + _session = get_session(secret_data, DEFAULT_REGION) + return _session.get_available_regions(service_name) diff --git a/src/plugin/connector/cloud_front/__init__.py b/src/plugin/connector/cloudfront/__init__.py similarity index 100% rename from src/plugin/connector/cloud_front/__init__.py rename to src/plugin/connector/cloudfront/__init__.py diff --git a/src/plugin/connector/cloud_front/distribution_connector.py b/src/plugin/connector/cloudfront/distribution_connector.py similarity index 100% rename from src/plugin/connector/cloud_front/distribution_connector.py rename to src/plugin/connector/cloudfront/distribution_connector.py diff --git a/src/plugin/connector/cloud_trail/__init__.py b/src/plugin/connector/cloudtrail/__init__.py similarity index 100% rename from src/plugin/connector/cloud_trail/__init__.py rename to src/plugin/connector/cloudtrail/__init__.py diff --git a/src/plugin/connector/cloud_trail/trails_connector.py b/src/plugin/connector/cloudtrail/trails_connector.py similarity index 100% rename from src/plugin/connector/cloud_trail/trails_connector.py rename to src/plugin/connector/cloudtrail/trails_connector.py diff --git a/src/plugin/connector/cloudwatch/__init__.py b/src/plugin/connector/cloudwatch/__init__.py new file mode 100644 index 0000000..456aebb --- /dev/null +++ b/src/plugin/connector/cloudwatch/__init__.py @@ -0,0 +1 @@ +from .alarms_connector import AlarmsConnector diff --git a/src/plugin/connector/cloudwatch/alarms_connector.py b/src/plugin/connector/cloudwatch/alarms_connector.py new file mode 100644 index 0000000..8445192 --- /dev/null +++ b/src/plugin/connector/cloudwatch/alarms_connector.py @@ -0,0 +1,48 @@ +from datetime import datetime +from dateutil.relativedelta import relativedelta + +from plugin.connector.base import ResourceConnector + + +class AlarmsConnector(ResourceConnector): + service_name = "cloudwatch" + cloud_service_group = "CloudWatch" + cloud_service_type = "Alarm" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "cloudwatch" + self.cloud_service_type = "Alarm" + self.rest_service_name = "cloudwatch" + + def get_alarms(self): + paginator = self.client.get_paginator("describe_alarms") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxRecords": 100, + } + ) + + for data in response_iterator: + # Only MetricAlarms are returned temporarily, CompositeAlarms must be applied later. + for raw in data.get("MetricAlarms", []): + yield raw + + def get_alarm_tags(self, alarm_arn): + return self.client.list_tags_for_resource(ResourceARN=alarm_arn) + + def get_alarm_history(self, alarm_name): + paginator = self.client.get_paginator("describe_alarm_history") + end_date = datetime.now() - relativedelta(months=1) + response_iterator = paginator.paginate( + PaginationConfig={ + "AlarmName": alarm_name, + "MaxItems": 100, + "EndDate": end_date, + "ScanBy": "TimestampDescending", + } + ) + + for data in response_iterator: + for raw in data.get("AlarmHistoryItems", []): + yield raw diff --git a/src/plugin/connector/ebs/__init__.py b/src/plugin/connector/ebs/__init__.py new file mode 100644 index 0000000..ab8280e --- /dev/null +++ b/src/plugin/connector/ebs/__init__.py @@ -0,0 +1,2 @@ +from .snapshot_connector import SnapshotConnector +from .volume_connector import VolumeConnector diff --git a/src/plugin/connector/ebs/snapshot_connector.py b/src/plugin/connector/ebs/snapshot_connector.py new file mode 100644 index 0000000..2cad997 --- /dev/null +++ b/src/plugin/connector/ebs/snapshot_connector.py @@ -0,0 +1,25 @@ +from plugin.connector.base import ResourceConnector + + +class SnapshotConnector(ResourceConnector): + service_name = "ec2" + cloud_service_group = "EC2" + cloud_service_type = "Snapshot" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "ec2" + self.cloud_service_group = "EC2" + self.cloud_service_type = "Snapshot" + self.rest_service_name = "ec2" + + def get_snapshots(self, owner_ids): + paginator = self.client.get_paginator("describe_snapshots") + response_iterator = paginator.paginate( + OwnerIds=owner_ids, + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + }, + ) + return response_iterator diff --git a/src/plugin/connector/ebs/volume_connector.py b/src/plugin/connector/ebs/volume_connector.py new file mode 100644 index 0000000..cf262c4 --- /dev/null +++ b/src/plugin/connector/ebs/volume_connector.py @@ -0,0 +1,29 @@ +from plugin.connector.base import ResourceConnector + + +class VolumeConnector(ResourceConnector): + service_name = "ec2" + cloud_service_group = "EC2" + cloud_service_type = "Volume" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "ec2" + self.cloud_service_group = "EC2" + self.cloud_service_type = "Volume" + self.rest_service_name = "ec2" + + def get_volumes(self): + paginator = self.client.get_paginator("describe_volumes") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def get_volume_attribute(self, volume_id, attribute): + return self.client.describe_volume_attribute( + Attribute=attribute, VolumeId=volume_id + ) diff --git a/src/plugin/connector/ecr/__init__.py b/src/plugin/connector/ecr/__init__.py index e69de29..b739c7b 100644 --- a/src/plugin/connector/ecr/__init__.py +++ b/src/plugin/connector/ecr/__init__.py @@ -0,0 +1 @@ +from .repository_connector import RepositoryConnector diff --git a/src/plugin/connector/ecr/repository_connector.py b/src/plugin/connector/ecr/repository_connector.py new file mode 100644 index 0000000..3feb203 --- /dev/null +++ b/src/plugin/connector/ecr/repository_connector.py @@ -0,0 +1,39 @@ +from plugin.connector.base import ResourceConnector + + +class RepositoryConnector(ResourceConnector): + service_name = "ecr" + cloud_service_group = "ECR" + cloud_service_type = "Repository" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "ecr" + self.cloud_service_group = "ECR" + self.cloud_service_type = "Repository" + self.rest_service_name = "ecr" + + def describe_repositories(self): + paginator = self.client.get_paginator("describe_repositories") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def describe_images(self, repository_name): + paginator = self.client.get_paginator("describe_images") + response_iterator = paginator.paginate( + repositoryName=repository_name, + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + }, + ) + return response_iterator + + def list_tags_for_resource(self, resource_arn): + response = self.client.list_tags_for_resource(resourceArn=resource_arn) + return response.get("tags", []) diff --git a/src/plugin/connector/ecs/__init__.py b/src/plugin/connector/ecs/__init__.py index e69de29..1d1139f 100644 --- a/src/plugin/connector/ecs/__init__.py +++ b/src/plugin/connector/ecs/__init__.py @@ -0,0 +1 @@ +from .cluster_connector import ClusterConnector diff --git a/src/plugin/connector/ecs/cluster_connector.py b/src/plugin/connector/ecs/cluster_connector.py new file mode 100644 index 0000000..fda67bf --- /dev/null +++ b/src/plugin/connector/ecs/cluster_connector.py @@ -0,0 +1,61 @@ +from plugin.connector.base import ResourceConnector + + +class ClusterConnector(ResourceConnector): + service_name = "ecs" + cloud_service_group = "ECS" + cloud_service_type = "Cluster" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "ecs" + self.cloud_service_group = "ECS" + self.cloud_service_type = "Cluster" + self.rest_service_name = "ecs" + + def list_clusters(self): + paginator = self.client.get_paginator("list_clusters") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def describe_clusters(self, cluster_arns): + response = self.client.describe_clusters(clusters=cluster_arns) + return response.get("clusters", []) + + def list_services(self, cluster_arn): + paginator = self.client.get_paginator("list_services") + response_iterator = paginator.paginate( + cluster=cluster_arn, + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + }, + ) + return response_iterator + + def list_tasks(self, cluster_arn): + paginator = self.client.get_paginator("list_tasks") + response_iterator = paginator.paginate( + cluster=cluster_arn, + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + }, + ) + return response_iterator + + def list_container_instances(self, cluster_arn): + paginator = self.client.get_paginator("list_container_instances") + response_iterator = paginator.paginate( + cluster=cluster_arn, + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + }, + ) + return response_iterator diff --git a/src/plugin/connector/efs/__init__.py b/src/plugin/connector/efs/__init__.py index e69de29..f1c8cfe 100644 --- a/src/plugin/connector/efs/__init__.py +++ b/src/plugin/connector/efs/__init__.py @@ -0,0 +1 @@ +from .file_system_connector import FileSystemConnector diff --git a/src/plugin/connector/efs/file_system_connector.py b/src/plugin/connector/efs/file_system_connector.py new file mode 100644 index 0000000..792f8ea --- /dev/null +++ b/src/plugin/connector/efs/file_system_connector.py @@ -0,0 +1,45 @@ +from plugin.connector.base import ResourceConnector + + +class FileSystemConnector(ResourceConnector): + service_name = "efs" + cloud_service_group = "EFS" + cloud_service_type = "FileSystem" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "efs" + self.cloud_service_group = "EFS" + self.cloud_service_type = "FileSystem" + self.rest_service_name = "efs" + + def describe_file_systems(self): + paginator = self.client.get_paginator("describe_file_systems") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def describe_lifecycle_configuration(self, file_system_id): + response = self.client.describe_lifecycle_configuration( + FileSystemId=file_system_id + ) + return response.get("LifecyclePolicies", []) + + def describe_mount_targets(self, file_system_id): + paginator = self.client.get_paginator("describe_mount_targets") + response_iterator = paginator.paginate( + FileSystemId=file_system_id, + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + }, + ) + return response_iterator + + def describe_tags(self, file_system_id): + response = self.client.describe_tags(FileSystemId=file_system_id) + return response.get("Tags", []) diff --git a/src/plugin/connector/eip/__init__.py b/src/plugin/connector/eip/__init__.py index e69de29..312f234 100644 --- a/src/plugin/connector/eip/__init__.py +++ b/src/plugin/connector/eip/__init__.py @@ -0,0 +1 @@ +from .eip_connector import EIPConnector diff --git a/src/plugin/connector/eip/eip_connector.py b/src/plugin/connector/eip/eip_connector.py new file mode 100644 index 0000000..4a5866d --- /dev/null +++ b/src/plugin/connector/eip/eip_connector.py @@ -0,0 +1,36 @@ +from plugin.connector.base import ResourceConnector + + +class EIPConnector(ResourceConnector): + service_name = "ec2" + cloud_service_group = "EC2" + cloud_service_type = "EIP" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "ec2" + self.cloud_service_group = "EC2" + self.cloud_service_type = "EIP" + self.rest_service_name = "ec2" + + def describe_addresses(self): + response = self.client.describe_addresses() + return response.get("Addresses", []) + + def describe_nat_gateways(self): + paginator = self.client.get_paginator("describe_nat_gateways") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def describe_network_interfaces(self, network_interface_ids): + if network_interface_ids: + response = self.client.describe_network_interfaces( + NetworkInterfaceIds=network_interface_ids + ) + return response.get("NetworkInterfaces", []) + return [] diff --git a/src/plugin/connector/eks/__init__.py b/src/plugin/connector/eks/__init__.py index e69de29..68717a6 100644 --- a/src/plugin/connector/eks/__init__.py +++ b/src/plugin/connector/eks/__init__.py @@ -0,0 +1,2 @@ +from .cluster_connector import ClusterConnector +from .node_group_connector import NodeGroupConnector diff --git a/src/plugin/connector/eks/cluster_connector.py b/src/plugin/connector/eks/cluster_connector.py new file mode 100644 index 0000000..a9bb4e6 --- /dev/null +++ b/src/plugin/connector/eks/cluster_connector.py @@ -0,0 +1,28 @@ +from plugin.connector.base import ResourceConnector + + +class ClusterConnector(ResourceConnector): + service_name = "eks" + cloud_service_group = "EKS" + cloud_service_type = "Cluster" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "eks" + self.cloud_service_group = "EKS" + self.cloud_service_type = "Cluster" + self.rest_service_name = "eks" + + def list_clusters(self): + paginator = self.client.get_paginator("list_clusters") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def describe_cluster(self, cluster_name): + response = self.client.describe_cluster(name=cluster_name) + return response.get("cluster", {}) diff --git a/src/plugin/connector/eks/node_group_connector.py b/src/plugin/connector/eks/node_group_connector.py new file mode 100644 index 0000000..33cef6b --- /dev/null +++ b/src/plugin/connector/eks/node_group_connector.py @@ -0,0 +1,31 @@ +from plugin.connector.base import ResourceConnector + + +class NodeGroupConnector(ResourceConnector): + service_name = "eks" + cloud_service_group = "EKS" + cloud_service_type = "NodeGroup" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "eks" + self.cloud_service_group = "EKS" + self.cloud_service_type = "NodeGroup" + self.rest_service_name = "eks" + + def list_nodegroups(self, cluster_name): + paginator = self.client.get_paginator("list_nodegroups") + response_iterator = paginator.paginate( + clusterName=cluster_name, + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + }, + ) + return response_iterator + + def describe_nodegroup(self, cluster_name, nodegroup_name): + response = self.client.describe_nodegroup( + clusterName=cluster_name, nodegroupName=nodegroup_name + ) + return response.get("nodegroup", {}) diff --git a/src/plugin/connector/elasticache/__init__.py b/src/plugin/connector/elasticache/__init__.py index e69de29..d45cbf9 100644 --- a/src/plugin/connector/elasticache/__init__.py +++ b/src/plugin/connector/elasticache/__init__.py @@ -0,0 +1,2 @@ +from .memcached_connector import MemcachedConnector +from .redis_connector import RedisConnector diff --git a/src/plugin/connector/elasticache/memcached_connector.py b/src/plugin/connector/elasticache/memcached_connector.py new file mode 100644 index 0000000..6afbb3e --- /dev/null +++ b/src/plugin/connector/elasticache/memcached_connector.py @@ -0,0 +1,29 @@ +from plugin.connector.base import ResourceConnector + + +class MemcachedConnector(ResourceConnector): + service_name = "elasticache" + cloud_service_group = "ElastiCache" + cloud_service_type = "Memcached" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "elasticache" + self.cloud_service_group = "ElastiCache" + self.cloud_service_type = "Memcached" + self.rest_service_name = "elasticache" + + def describe_cache_clusters(self): + paginator = self.client.get_paginator("describe_cache_clusters") + response_iterator = paginator.paginate( + ShowCacheNodeInfo=True, + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + }, + ) + return response_iterator + + def list_tags_for_resource(self, resource_name): + response = self.client.list_tags_for_resource(ResourceName=resource_name) + return response.get("TagList", []) diff --git a/src/plugin/connector/elasticache/redis_connector.py b/src/plugin/connector/elasticache/redis_connector.py new file mode 100644 index 0000000..e875fe8 --- /dev/null +++ b/src/plugin/connector/elasticache/redis_connector.py @@ -0,0 +1,39 @@ +from plugin.connector.base import ResourceConnector + + +class RedisConnector(ResourceConnector): + service_name = "elasticache" + cloud_service_group = "ElastiCache" + cloud_service_type = "Redis" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "elasticache" + self.cloud_service_group = "ElastiCache" + self.cloud_service_type = "Redis" + self.rest_service_name = "elasticache" + + def describe_cache_clusters(self): + paginator = self.client.get_paginator("describe_cache_clusters") + response_iterator = paginator.paginate( + ShowCacheNodeInfo=True, + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + }, + ) + return response_iterator + + def describe_replication_groups(self): + paginator = self.client.get_paginator("describe_replication_groups") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def list_tags_for_resource(self, resource_name): + response = self.client.list_tags_for_resource(ResourceName=resource_name) + return response.get("TagList", []) diff --git a/src/plugin/connector/elb/__init__.py b/src/plugin/connector/elb/__init__.py index e69de29..7499e6c 100644 --- a/src/plugin/connector/elb/__init__.py +++ b/src/plugin/connector/elb/__init__.py @@ -0,0 +1,2 @@ +from .loadbalancer_connector import LoadBalancerConnector +from .target_group_connector import TargetGroupConnector diff --git a/src/plugin/connector/elb/loadbalancer_connector.py b/src/plugin/connector/elb/loadbalancer_connector.py new file mode 100644 index 0000000..e9c8125 --- /dev/null +++ b/src/plugin/connector/elb/loadbalancer_connector.py @@ -0,0 +1,41 @@ +from plugin.connector.base import ResourceConnector + + +class LoadBalancerConnector(ResourceConnector): + service_name = "elbv2" + cloud_service_group = "ELB" + cloud_service_type = "LoadBalancer" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "elbv2" + self.cloud_service_group = "ELB" + self.cloud_service_type = "LoadBalancer" + self.rest_service_name = "elbv2" + + def describe_load_balancers(self): + paginator = self.client.get_paginator("describe_load_balancers") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def describe_load_balancer_attributes(self, load_balancer_arn): + response = self.client.describe_load_balancer_attributes( + LoadBalancerArn=load_balancer_arn + ) + return response.get("Attributes", []) + + def describe_listeners(self, load_balancer_arn): + paginator = self.client.get_paginator("describe_listeners") + response_iterator = paginator.paginate( + LoadBalancerArn=load_balancer_arn, + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + }, + ) + return response_iterator diff --git a/src/plugin/connector/elb/target_group_connector.py b/src/plugin/connector/elb/target_group_connector.py new file mode 100644 index 0000000..d9e2239 --- /dev/null +++ b/src/plugin/connector/elb/target_group_connector.py @@ -0,0 +1,34 @@ +from plugin.connector.base import ResourceConnector + + +class TargetGroupConnector(ResourceConnector): + service_name = "elbv2" + cloud_service_group = "ELB" + cloud_service_type = "TargetGroup" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "elbv2" + self.cloud_service_group = "ELB" + self.cloud_service_type = "TargetGroup" + self.rest_service_name = "elbv2" + + def describe_target_groups(self): + paginator = self.client.get_paginator("describe_target_groups") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def describe_target_group_attributes(self, target_group_arn): + response = self.client.describe_target_group_attributes( + TargetGroupArn=target_group_arn + ) + return response.get("Attributes", []) + + def describe_target_health(self, target_group_arn): + response = self.client.describe_target_health(TargetGroupArn=target_group_arn) + return response.get("TargetHealthDescriptions", []) diff --git a/src/plugin/connector/iam/__init__.py b/src/plugin/connector/iam/__init__.py index e69de29..313b556 100644 --- a/src/plugin/connector/iam/__init__.py +++ b/src/plugin/connector/iam/__init__.py @@ -0,0 +1,6 @@ +from .access_key_connector import AccessKeyConnector +from .group_connector import GroupConnector +from .identity_provider_connector import IdentityProviderConnector +from .policy_connector import PolicyConnector +from .role_connector import RoleConnector +from .user_connector import UserConnector diff --git a/src/plugin/connector/iam/access_key_connector.py b/src/plugin/connector/iam/access_key_connector.py new file mode 100644 index 0000000..2237c5f --- /dev/null +++ b/src/plugin/connector/iam/access_key_connector.py @@ -0,0 +1,29 @@ +from plugin.connector.base import ResourceConnector + + +class AccessKeyConnector(ResourceConnector): + service_name = "iam" + cloud_service_group = "IAM" + cloud_service_type = "AccessKey" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "iam" + self.cloud_service_group = "IAM" + self.cloud_service_type = "AccessKey" + self.rest_service_name = "iam" + + def list_access_keys(self, user_name): + paginator = self.client.get_paginator("list_access_keys") + response_iterator = paginator.paginate( + UserName=user_name, + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + }, + ) + return response_iterator + + def get_access_key_last_used(self, access_key_id): + response = self.client.get_access_key_last_used(AccessKeyId=access_key_id) + return response.get("AccessKeyLastUsed", {}) diff --git a/src/plugin/connector/iam/group_connector.py b/src/plugin/connector/iam/group_connector.py new file mode 100644 index 0000000..2347278 --- /dev/null +++ b/src/plugin/connector/iam/group_connector.py @@ -0,0 +1,54 @@ +from plugin.connector.base import ResourceConnector + + +class GroupConnector(ResourceConnector): + service_name = "iam" + cloud_service_group = "IAM" + cloud_service_type = "Group" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "iam" + self.cloud_service_group = "IAM" + self.cloud_service_type = "Group" + self.rest_service_name = "iam" + + def list_groups(self): + paginator = self.client.get_paginator("list_groups") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def get_group(self, group_name): + response = self.client.get_group(GroupName=group_name) + return response.get("Group", {}) + + def list_users_in_group(self, group_name): + paginator = self.client.get_paginator("get_group") + response_iterator = paginator.paginate( + GroupName=group_name, + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + }, + ) + return response_iterator + + def list_attached_group_policies(self, group_name): + paginator = self.client.get_paginator("list_attached_group_policies") + response_iterator = paginator.paginate( + GroupName=group_name, + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + }, + ) + return response_iterator + + def list_group_policies(self, group_name): + response = self.client.list_group_policies(GroupName=group_name) + return response.get("PolicyNames", []) diff --git a/src/plugin/connector/iam/identity_provider_connector.py b/src/plugin/connector/iam/identity_provider_connector.py new file mode 100644 index 0000000..ce8506c --- /dev/null +++ b/src/plugin/connector/iam/identity_provider_connector.py @@ -0,0 +1,32 @@ +from plugin.connector.base import ResourceConnector + + +class IdentityProviderConnector(ResourceConnector): + service_name = "iam" + cloud_service_group = "IAM" + cloud_service_type = "IdentityProvider" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "iam" + self.cloud_service_group = "IAM" + self.cloud_service_type = "IdentityProvider" + self.rest_service_name = "iam" + + def list_open_id_connect_providers(self): + response = self.client.list_open_id_connect_providers() + return response.get("OpenIDConnectProviderList", []) + + def get_open_id_connect_provider(self, open_id_connect_provider_arn): + response = self.client.get_open_id_connect_provider( + OpenIDConnectProviderArn=open_id_connect_provider_arn + ) + return response + + def list_saml_providers(self): + response = self.client.list_saml_providers() + return response.get("SAMLProviderList", []) + + def get_saml_provider(self, saml_provider_arn): + response = self.client.get_saml_provider(SAMLProviderArn=saml_provider_arn) + return response diff --git a/src/plugin/connector/iam/policy_connector.py b/src/plugin/connector/iam/policy_connector.py new file mode 100644 index 0000000..596a6cf --- /dev/null +++ b/src/plugin/connector/iam/policy_connector.py @@ -0,0 +1,56 @@ +from plugin.connector.base import ResourceConnector + + +class PolicyConnector(ResourceConnector): + service_name = "iam" + cloud_service_group = "IAM" + cloud_service_type = "Policy" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "iam" + self.cloud_service_group = "IAM" + self.cloud_service_type = "Policy" + self.rest_service_name = "iam" + + def list_policies(self): + paginator = self.client.get_paginator("list_policies") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def get_policy(self, policy_arn): + response = self.client.get_policy(PolicyArn=policy_arn) + return response.get("Policy", {}) + + def list_policy_versions(self, policy_arn): + paginator = self.client.get_paginator("list_policy_versions") + response_iterator = paginator.paginate( + PolicyArn=policy_arn, + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + }, + ) + return response_iterator + + def get_policy_version(self, policy_arn, version_id): + response = self.client.get_policy_version( + PolicyArn=policy_arn, VersionId=version_id + ) + return response.get("PolicyVersion", {}) + + def list_entities_for_policy(self, policy_arn): + paginator = self.client.get_paginator("list_entities_for_policy") + response_iterator = paginator.paginate( + PolicyArn=policy_arn, + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + }, + ) + return response_iterator diff --git a/src/plugin/connector/iam/role_connector.py b/src/plugin/connector/iam/role_connector.py new file mode 100644 index 0000000..3836484 --- /dev/null +++ b/src/plugin/connector/iam/role_connector.py @@ -0,0 +1,49 @@ +from plugin.connector.base import ResourceConnector + + +class RoleConnector(ResourceConnector): + service_name = "iam" + cloud_service_group = "IAM" + cloud_service_type = "Role" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "iam" + self.cloud_service_group = "IAM" + self.cloud_service_type = "Role" + self.rest_service_name = "iam" + + def list_roles(self): + paginator = self.client.get_paginator("list_roles") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def get_role(self, role_name): + response = self.client.get_role(RoleName=role_name) + return response.get("Role", {}) + + def list_attached_role_policies(self, role_name): + paginator = self.client.get_paginator("list_attached_role_policies") + response_iterator = paginator.paginate( + RoleName=role_name, + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + }, + ) + return response_iterator + + def list_role_policies(self, role_name): + response = self.client.list_role_policies(RoleName=role_name) + return response.get("PolicyNames", []) + + def get_role_policy(self, role_name, policy_name): + response = self.client.get_role_policy( + RoleName=role_name, PolicyName=policy_name + ) + return response.get("PolicyDocument", {}) diff --git a/src/plugin/connector/iam/user_connector.py b/src/plugin/connector/iam/user_connector.py new file mode 100644 index 0000000..8cd84a7 --- /dev/null +++ b/src/plugin/connector/iam/user_connector.py @@ -0,0 +1,51 @@ +from plugin.connector.base import ResourceConnector + + +class UserConnector(ResourceConnector): + service_name = "iam" + cloud_service_group = "IAM" + cloud_service_type = "User" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "iam" + self.cloud_service_group = "IAM" + self.cloud_service_type = "User" + self.rest_service_name = "iam" + + def list_users(self): + paginator = self.client.get_paginator("list_users") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def get_user(self, user_name): + response = self.client.get_user(UserName=user_name) + return response.get("User", {}) + + def list_mfa_devices(self, user_name): + response = self.client.list_mfa_devices(UserName=user_name) + return response.get("MFADevices", []) + + def list_groups_for_user(self, user_name): + paginator = self.client.get_paginator("list_groups_for_user") + response_iterator = paginator.paginate( + UserName=user_name, + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + }, + ) + return response_iterator + + def list_attached_user_policies(self, user_name): + response = self.client.list_attached_user_policies(UserName=user_name) + return response.get("AttachedPolicies", []) + + def list_user_policies(self, user_name): + response = self.client.list_user_policies(UserName=user_name) + return response.get("PolicyNames", []) diff --git a/src/plugin/connector/kinesis_data_stream/__init__.py b/src/plugin/connector/kinesis_data_stream/__init__.py index e69de29..ebabeff 100644 --- a/src/plugin/connector/kinesis_data_stream/__init__.py +++ b/src/plugin/connector/kinesis_data_stream/__init__.py @@ -0,0 +1 @@ +from .data_stream_connector import DataStreamConnector diff --git a/src/plugin/connector/kinesis_data_stream/data_stream_connector.py b/src/plugin/connector/kinesis_data_stream/data_stream_connector.py new file mode 100644 index 0000000..e7212ce --- /dev/null +++ b/src/plugin/connector/kinesis_data_stream/data_stream_connector.py @@ -0,0 +1,43 @@ +from plugin.connector.base import ResourceConnector + + +class DataStreamConnector(ResourceConnector): + service_name = "kinesis" + cloud_service_group = "KinesisDataStream" + cloud_service_type = "DataStream" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "kinesis" + self.cloud_service_group = "KinesisDataStream" + self.cloud_service_type = "DataStream" + self.rest_service_name = "kinesis" + + def list_streams(self): + paginator = self.client.get_paginator("list_streams") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def describe_stream(self, stream_name): + response = self.client.describe_stream(StreamName=stream_name) + return response.get("StreamDescription", {}) + + def list_tags_for_stream(self, stream_name): + response = self.client.list_tags_for_stream(StreamName=stream_name) + return response.get("Tags", []) + + def list_stream_consumers(self, stream_arn): + paginator = self.client.get_paginator("list_stream_consumers") + response_iterator = paginator.paginate( + StreamARN=stream_arn, + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + }, + ) + return response_iterator diff --git a/src/plugin/connector/kinesis_firehose/__init__.py b/src/plugin/connector/kinesis_firehose/__init__.py index e69de29..33cce66 100644 --- a/src/plugin/connector/kinesis_firehose/__init__.py +++ b/src/plugin/connector/kinesis_firehose/__init__.py @@ -0,0 +1 @@ +from .delivery_stream_connector import DeliveryStreamConnector diff --git a/src/plugin/connector/kinesis_firehose/delivery_stream_connector.py b/src/plugin/connector/kinesis_firehose/delivery_stream_connector.py new file mode 100644 index 0000000..810a13d --- /dev/null +++ b/src/plugin/connector/kinesis_firehose/delivery_stream_connector.py @@ -0,0 +1,28 @@ +from plugin.connector.base import ResourceConnector + + +class DeliveryStreamConnector(ResourceConnector): + service_name = "firehose" + cloud_service_group = "KinesisFirehose" + cloud_service_type = "DeliveryStream" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "firehose" + self.cloud_service_group = "KinesisFirehose" + self.cloud_service_type = "DeliveryStream" + self.rest_service_name = "firehose" + + def list_delivery_streams(self): + response = self.client.list_delivery_streams() + return response.get("DeliveryStreamNames", []) + + def describe_delivery_stream(self, stream_name): + response = self.client.describe_delivery_stream(DeliveryStreamName=stream_name) + return response.get("DeliveryStreamDescription", {}) + + def get_delivery_stream_tags(self, stream_name): + response = self.client.list_tags_for_delivery_stream( + DeliveryStreamName=stream_name + ) + return response.get("Tags", []) diff --git a/src/plugin/connector/kms/__init__.py b/src/plugin/connector/kms/__init__.py index e69de29..642cdb6 100644 --- a/src/plugin/connector/kms/__init__.py +++ b/src/plugin/connector/kms/__init__.py @@ -0,0 +1 @@ +from .key_connector import KeyConnector diff --git a/src/plugin/connector/kms/key_connector.py b/src/plugin/connector/kms/key_connector.py new file mode 100644 index 0000000..12d6c92 --- /dev/null +++ b/src/plugin/connector/kms/key_connector.py @@ -0,0 +1,42 @@ +from plugin.connector.base import ResourceConnector + + +class KeyConnector(ResourceConnector): + service_name = "kms" + cloud_service_group = "KMS" + cloud_service_type = "Key" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "kms" + self.cloud_service_group = "KMS" + self.cloud_service_type = "Key" + self.rest_service_name = "kms" + + def list_keys(self): + paginator = self.client.get_paginator("list_keys") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def describe_key(self, key_id): + response = self.client.describe_key(KeyId=key_id) + return response.get("KeyMetadata", {}) + + def list_aliases(self): + paginator = self.client.get_paginator("list_aliases") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def list_resource_tags(self, key_id): + response = self.client.list_resource_tags(KeyId=key_id) + return response.get("Tags", []) diff --git a/src/plugin/connector/lambda/__init__.py b/src/plugin/connector/lambda/__init__.py index e69de29..9e5c54d 100644 --- a/src/plugin/connector/lambda/__init__.py +++ b/src/plugin/connector/lambda/__init__.py @@ -0,0 +1,2 @@ +from .function_connector import FunctionConnector +from .layer_connector import LayerConnector diff --git a/src/plugin/connector/lambda/function_connector.py b/src/plugin/connector/lambda/function_connector.py new file mode 100644 index 0000000..9ac615f --- /dev/null +++ b/src/plugin/connector/lambda/function_connector.py @@ -0,0 +1,47 @@ +from plugin.connector.base import ResourceConnector + + +class FunctionConnector(ResourceConnector): + service_name = "lambda_model" + cloud_service_group = "Lambda" + cloud_service_type = "Function" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "lambda_model" + self.cloud_service_group = "Lambda" + self.cloud_service_type = "Function" + self.rest_service_name = "lambda_model" + + def list_functions(self): + paginator = self.client.get_paginator("list_functions") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def get_function(self, function_name): + response = self.client.get_function(FunctionName=function_name) + return response + + def get_function_tags(self, function_name): + response = self.client.list_tags(Resource=function_name) + return response.get("Tags", {}) + + def get_function_policy(self, function_name): + response = self.client.get_policy(FunctionName=function_name) + return response.get("Policy", "") + + def list_function_versions(self, function_name): + paginator = self.client.get_paginator("list_versions_by_function") + response_iterator = paginator.paginate( + FunctionName=function_name, + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + }, + ) + return response_iterator diff --git a/src/plugin/connector/lambda/layer_connector.py b/src/plugin/connector/lambda/layer_connector.py new file mode 100644 index 0000000..d395836 --- /dev/null +++ b/src/plugin/connector/lambda/layer_connector.py @@ -0,0 +1,44 @@ +from plugin.connector.base import ResourceConnector + + +class LayerConnector(ResourceConnector): + service_name = "lambda_model" + cloud_service_group = "Lambda" + cloud_service_type = "Layer" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "lambda_model" + self.cloud_service_group = "Lambda" + self.cloud_service_type = "Layer" + self.rest_service_name = "lambda_model" + + def list_layers(self): + paginator = self.client.get_paginator("list_layers") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def get_layer(self, layer_name, version_number=None): + if version_number: + response = self.client.get_layer_version( + LayerName=layer_name, VersionNumber=version_number + ) + else: + response = self.client.get_layer_version(LayerName=layer_name) + return response + + def list_layer_versions(self, layer_name): + paginator = self.client.get_paginator("list_layer_versions") + response_iterator = paginator.paginate( + LayerName=layer_name, + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + }, + ) + return response_iterator diff --git a/src/plugin/connector/lightsail/__init__.py b/src/plugin/connector/lightsail/__init__.py index e69de29..98a7750 100644 --- a/src/plugin/connector/lightsail/__init__.py +++ b/src/plugin/connector/lightsail/__init__.py @@ -0,0 +1,10 @@ +from .bucket_connector import BucketConnector +from .container_connector import ContainerConnector +from .database_connector import DatabaseConnector +from .disk_connector import DiskConnector +from .distribution_connector import DistributionConnector +from .domain_connector import DomainConnector +from .instance_connector import InstanceConnector +from .loadbalancer_connector import LoadBalancerConnector +from .snapshot_connector import SnapshotConnector +from .static_ip_connector import StaticIPConnector diff --git a/src/plugin/connector/lightsail/bucket_connector.py b/src/plugin/connector/lightsail/bucket_connector.py new file mode 100644 index 0000000..42ee523 --- /dev/null +++ b/src/plugin/connector/lightsail/bucket_connector.py @@ -0,0 +1,35 @@ +from plugin.connector.base import ResourceConnector + + +class BucketConnector(ResourceConnector): + service_name = "lightsail" + cloud_service_group = "Lightsail" + cloud_service_type = "Bucket" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "lightsail" + self.cloud_service_group = "Lightsail" + self.cloud_service_type = "Bucket" + self.rest_service_name = "lightsail" + + def get_buckets(self): + response = self.client.get_buckets() + return response.get("buckets", []) + + def get_bucket(self, bucket_name): + response = self.client.get_bucket(bucketName=bucket_name) + return response.get("bucket", {}) + + def get_bucket_access_keys(self, bucket_name): + response = self.client.get_bucket_access_keys(bucketName=bucket_name) + return response.get("accessKeys", []) + + def get_bucket_metric_data(self, bucket_name, metric_name, start_time, end_time): + response = self.client.get_bucket_metric_data( + bucketName=bucket_name, + metricName=metric_name, + startTime=start_time, + endTime=end_time, + ) + return response.get("metricData", []) diff --git a/src/plugin/connector/lightsail/container_connector.py b/src/plugin/connector/lightsail/container_connector.py new file mode 100644 index 0000000..af726f1 --- /dev/null +++ b/src/plugin/connector/lightsail/container_connector.py @@ -0,0 +1,28 @@ +from plugin.connector.base import ResourceConnector + + +class ContainerConnector(ResourceConnector): + service_name = "lightsail" + cloud_service_group = "Lightsail" + cloud_service_type = "Container" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "lightsail" + self.cloud_service_group = "Lightsail" + self.cloud_service_type = "Container" + self.rest_service_name = "lightsail" + + def get_container_services(self): + response = self.client.get_container_services() + return response.get("containerServices", []) + + def get_container_service(self, service_name): + response = self.client.get_container_service(serviceName=service_name) + return response.get("containerService", {}) + + def get_container_service_deployments(self, service_name): + response = self.client.get_container_service_deployments( + serviceName=service_name + ) + return response.get("deployments", []) diff --git a/src/plugin/connector/lightsail/database_connector.py b/src/plugin/connector/lightsail/database_connector.py new file mode 100644 index 0000000..94997bc --- /dev/null +++ b/src/plugin/connector/lightsail/database_connector.py @@ -0,0 +1,36 @@ +from plugin.connector.base import ResourceConnector + + +class DatabaseConnector(ResourceConnector): + service_name = "lightsail" + cloud_service_group = "Lightsail" + cloud_service_type = "Database" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "lightsail" + self.cloud_service_group = "Lightsail" + self.cloud_service_type = "Database" + self.rest_service_name = "lightsail" + + def get_relational_databases(self): + paginator = self.client.get_paginator("get_relational_databases") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def get_relational_database(self, relational_database_name): + response = self.client.get_relational_database( + relationalDatabaseName=relational_database_name + ) + return response.get("relationalDatabase", {}) + + def get_relational_database_parameters(self, relational_database_name): + response = self.client.get_relational_database_parameters( + relationalDatabaseName=relational_database_name + ) + return response.get("parameters", []) diff --git a/src/plugin/connector/lightsail/disk_connector.py b/src/plugin/connector/lightsail/disk_connector.py new file mode 100644 index 0000000..a526cd1 --- /dev/null +++ b/src/plugin/connector/lightsail/disk_connector.py @@ -0,0 +1,32 @@ +from plugin.connector.base import ResourceConnector + + +class DiskConnector(ResourceConnector): + service_name = "lightsail" + cloud_service_group = "Lightsail" + cloud_service_type = "Disk" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "lightsail" + self.cloud_service_group = "Lightsail" + self.cloud_service_type = "Disk" + self.rest_service_name = "lightsail" + + def get_disks(self): + paginator = self.client.get_paginator("get_disks") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def get_disk(self, disk_name): + response = self.client.get_disk(diskName=disk_name) + return response.get("disk", {}) + + def get_disk_snapshot(self, disk_snapshot_name): + response = self.client.get_disk_snapshot(diskSnapshotName=disk_snapshot_name) + return response.get("diskSnapshot", {}) diff --git a/src/plugin/connector/lightsail/distribution_connector.py b/src/plugin/connector/lightsail/distribution_connector.py new file mode 100644 index 0000000..70493c0 --- /dev/null +++ b/src/plugin/connector/lightsail/distribution_connector.py @@ -0,0 +1,28 @@ +from plugin.connector.base import ResourceConnector + + +class DistributionConnector(ResourceConnector): + service_name = "lightsail" + cloud_service_group = "Lightsail" + cloud_service_type = "Distribution" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "lightsail" + self.cloud_service_group = "Lightsail" + self.cloud_service_type = "Distribution" + self.rest_service_name = "lightsail" + + def get_distributions(self): + response = self.client.get_distributions() + return response.get("distributions", []) + + def get_distribution(self, distribution_name): + response = self.client.get_distribution(distributionName=distribution_name) + return response.get("distribution", {}) + + def get_distribution_latest_cache_reset(self, distribution_name): + response = self.client.get_distribution_latest_cache_reset( + distributionName=distribution_name + ) + return response.get("createTime", {}) diff --git a/src/plugin/connector/lightsail/domain_connector.py b/src/plugin/connector/lightsail/domain_connector.py new file mode 100644 index 0000000..635978c --- /dev/null +++ b/src/plugin/connector/lightsail/domain_connector.py @@ -0,0 +1,28 @@ +from plugin.connector.base import ResourceConnector + + +class DomainConnector(ResourceConnector): + service_name = "lightsail" + cloud_service_group = "Lightsail" + cloud_service_type = "Domain" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "lightsail" + self.cloud_service_group = "Lightsail" + self.cloud_service_type = "Domain" + self.rest_service_name = "lightsail" + + def get_domains(self): + paginator = self.client.get_paginator("get_domains") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def get_domain(self, domain_name): + response = self.client.get_domain(domainName=domain_name) + return response.get("domain", {}) diff --git a/src/plugin/connector/lightsail/instance_connector.py b/src/plugin/connector/lightsail/instance_connector.py new file mode 100644 index 0000000..6514dec --- /dev/null +++ b/src/plugin/connector/lightsail/instance_connector.py @@ -0,0 +1,34 @@ +from plugin.connector.base import ResourceConnector + + +class InstanceConnector(ResourceConnector): + service_name = "lightsail" + cloud_service_group = "Lightsail" + cloud_service_type = "Instance" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "lightsail" + self.cloud_service_group = "Lightsail" + self.cloud_service_type = "Instance" + self.rest_service_name = "lightsail" + + def get_instances(self): + paginator = self.client.get_paginator("get_instances") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def get_instance(self, instance_name): + response = self.client.get_instance(instanceName=instance_name) + return response.get("instance", {}) + + def get_instance_access_details(self, instance_name, protocol): + response = self.client.get_instance_access_details( + instanceName=instance_name, protocol=protocol + ) + return response diff --git a/src/plugin/connector/lightsail/loadbalancer_connector.py b/src/plugin/connector/lightsail/loadbalancer_connector.py new file mode 100644 index 0000000..97a5770 --- /dev/null +++ b/src/plugin/connector/lightsail/loadbalancer_connector.py @@ -0,0 +1,39 @@ +from plugin.connector.base import ResourceConnector + + +class LoadBalancerConnector(ResourceConnector): + service_name = "lightsail" + cloud_service_group = "Lightsail" + cloud_service_type = "LoadBalancer" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "lightsail" + self.cloud_service_group = "Lightsail" + self.cloud_service_type = "LoadBalancer" + self.rest_service_name = "lightsail" + + def get_load_balancers(self): + paginator = self.client.get_paginator("get_load_balancers") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def get_load_balancer(self, load_balancer_name): + response = self.client.get_load_balancer(loadBalancerName=load_balancer_name) + return response.get("loadBalancer", {}) + + def get_load_balancer_metric_data( + self, load_balancer_name, metric_name, start_time, end_time + ): + response = self.client.get_load_balancer_metric_data( + loadBalancerName=load_balancer_name, + metricName=metric_name, + startTime=start_time, + endTime=end_time, + ) + return response.get("metricData", []) diff --git a/src/plugin/connector/lightsail/snapshot_connector.py b/src/plugin/connector/lightsail/snapshot_connector.py new file mode 100644 index 0000000..bf53a71 --- /dev/null +++ b/src/plugin/connector/lightsail/snapshot_connector.py @@ -0,0 +1,38 @@ +from plugin.connector.base import ResourceConnector + + +class SnapshotConnector(ResourceConnector): + service_name = "lightsail" + cloud_service_group = "Lightsail" + cloud_service_type = "Snapshot" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "lightsail" + self.cloud_service_group = "Lightsail" + self.cloud_service_type = "Snapshot" + self.rest_service_name = "lightsail" + + def get_disk_snapshots(self): + paginator = self.client.get_paginator("get_disk_snapshots") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def get_disk_snapshot(self, disk_snapshot_name): + response = self.client.get_disk_snapshot(diskSnapshotName=disk_snapshot_name) + return response.get("diskSnapshot", {}) + + def get_instance_snapshots(self): + paginator = self.client.get_paginator("get_instance_snapshots") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator diff --git a/src/plugin/connector/lightsail/static_ip_connector.py b/src/plugin/connector/lightsail/static_ip_connector.py new file mode 100644 index 0000000..644d13c --- /dev/null +++ b/src/plugin/connector/lightsail/static_ip_connector.py @@ -0,0 +1,28 @@ +from plugin.connector.base import ResourceConnector + + +class StaticIPConnector(ResourceConnector): + service_name = "lightsail" + cloud_service_group = "Lightsail" + cloud_service_type = "StaticIP" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "lightsail" + self.cloud_service_group = "Lightsail" + self.cloud_service_type = "StaticIP" + self.rest_service_name = "lightsail" + + def get_static_ips(self): + paginator = self.client.get_paginator("get_static_ips") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def get_static_ip(self, static_ip_name): + response = self.client.get_static_ip(staticIpName=static_ip_name) + return response.get("staticIp", {}) diff --git a/src/plugin/connector/msk/__init__.py b/src/plugin/connector/msk/__init__.py index e69de29..7362c6e 100644 --- a/src/plugin/connector/msk/__init__.py +++ b/src/plugin/connector/msk/__init__.py @@ -0,0 +1,2 @@ +from .cluster_configuration_connector import ClusterConfigurationConnector +from .cluster_connector import ClusterConnector diff --git a/src/plugin/connector/msk/cluster_configuration_connector.py b/src/plugin/connector/msk/cluster_configuration_connector.py new file mode 100644 index 0000000..e70f05c --- /dev/null +++ b/src/plugin/connector/msk/cluster_configuration_connector.py @@ -0,0 +1,38 @@ +from plugin.connector.base import ResourceConnector + + +class ClusterConfigurationConnector(ResourceConnector): + service_name = "kafka" + cloud_service_group = "MSK" + cloud_service_type = "ClusterConfiguration" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "kafka" + self.cloud_service_group = "MSK" + self.cloud_service_type = "ClusterConfiguration" + self.rest_service_name = "kafka" + + def list_configurations(self): + paginator = self.client.get_paginator("list_configurations") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def describe_configuration(self, arn): + response = self.client.describe_configuration(Arn=arn) + return response.get("LatestRevision", {}) + + def list_configuration_revisions(self, arn): + response = self.client.list_configuration_revisions(Arn=arn) + return response.get("Revisions", []) + + def describe_configuration_revision(self, arn, revision): + response = self.client.describe_configuration_revision( + Arn=arn, Revision=revision + ) + return response diff --git a/src/plugin/connector/msk/cluster_connector.py b/src/plugin/connector/msk/cluster_connector.py new file mode 100644 index 0000000..fdb7c8a --- /dev/null +++ b/src/plugin/connector/msk/cluster_connector.py @@ -0,0 +1,36 @@ +from plugin.connector.base import ResourceConnector + + +class ClusterConnector(ResourceConnector): + service_name = "kafka" + cloud_service_group = "MSK" + cloud_service_type = "Cluster" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "kafka" + self.cloud_service_group = "MSK" + self.cloud_service_type = "Cluster" + self.rest_service_name = "kafka" + + def list_clusters(self): + paginator = self.client.get_paginator("list_clusters") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def describe_cluster(self, cluster_arn): + response = self.client.describe_cluster(ClusterArn=cluster_arn) + return response.get("ClusterInfo", {}) + + def list_nodes(self, cluster_arn): + response = self.client.list_nodes(ClusterArn=cluster_arn) + return response.get("NodeInfoList", []) + + def list_configurations(self): + response = self.client.list_configurations() + return response.get("Configurations", []) diff --git a/src/plugin/connector/rds/__init__.py b/src/plugin/connector/rds/__init__.py index e69de29..9215e09 100644 --- a/src/plugin/connector/rds/__init__.py +++ b/src/plugin/connector/rds/__init__.py @@ -0,0 +1,6 @@ +from .database_connector import DatabaseConnector +from .instance_connector import InstanceConnector +from .option_group_connector import OptionGroupConnector +from .parameter_group_connector import ParameterGroupConnector +from .snapshot_connector import SnapshotConnector +from .subnet_group_connector import SubnetGroupConnector diff --git a/src/plugin/connector/rds/database_connector.py b/src/plugin/connector/rds/database_connector.py new file mode 100644 index 0000000..896c4f7 --- /dev/null +++ b/src/plugin/connector/rds/database_connector.py @@ -0,0 +1,38 @@ +from plugin.connector.base import ResourceConnector + + +class DatabaseConnector(ResourceConnector): + service_name = "rds" + cloud_service_group = "RDS" + cloud_service_type = "Database" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "rds" + self.cloud_service_group = "RDS" + self.cloud_service_type = "Database" + self.rest_service_name = "rds" + + def describe_db_clusters(self): + paginator = self.client.get_paginator("describe_db_clusters") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def describe_db_instances(self): + paginator = self.client.get_paginator("describe_db_instances") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def list_tags_for_resource(self, resource_arn): + response = self.client.list_tags_for_resource(ResourceName=resource_arn) + return response.get("TagList", []) diff --git a/src/plugin/connector/rds/instance_connector.py b/src/plugin/connector/rds/instance_connector.py new file mode 100644 index 0000000..5e9ef00 --- /dev/null +++ b/src/plugin/connector/rds/instance_connector.py @@ -0,0 +1,38 @@ +from plugin.connector.base import ResourceConnector + + +class InstanceConnector(ResourceConnector): + service_name = "rds" + cloud_service_group = "RDS" + cloud_service_type = "Instance" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "rds" + self.cloud_service_group = "RDS" + self.cloud_service_type = "Instance" + self.rest_service_name = "rds" + + def describe_db_instances(self): + paginator = self.client.get_paginator("describe_db_instances") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def describe_db_clusters(self): + paginator = self.client.get_paginator("describe_db_clusters") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def list_tags_for_resource(self, resource_arn): + response = self.client.list_tags_for_resource(ResourceName=resource_arn) + return response.get("TagList", []) diff --git a/src/plugin/connector/rds/option_group_connector.py b/src/plugin/connector/rds/option_group_connector.py new file mode 100644 index 0000000..b2f438b --- /dev/null +++ b/src/plugin/connector/rds/option_group_connector.py @@ -0,0 +1,39 @@ +from plugin.connector.base import ResourceConnector + + +class OptionGroupConnector(ResourceConnector): + service_name = "rds" + cloud_service_group = "RDS" + cloud_service_type = "OptionGroup" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "rds" + self.cloud_service_group = "RDS" + self.cloud_service_type = "OptionGroup" + self.rest_service_name = "rds" + + def describe_option_groups(self): + paginator = self.client.get_paginator("describe_option_groups") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def describe_option_group_options(self, engine_name): + paginator = self.client.get_paginator("describe_option_group_options") + response_iterator = paginator.paginate( + EngineName=engine_name, + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + }, + ) + return response_iterator + + def list_tags_for_resource(self, resource_arn): + response = self.client.list_tags_for_resource(ResourceName=resource_arn) + return response.get("TagList", []) diff --git a/src/plugin/connector/rds/parameter_group_connector.py b/src/plugin/connector/rds/parameter_group_connector.py new file mode 100644 index 0000000..4aa789b --- /dev/null +++ b/src/plugin/connector/rds/parameter_group_connector.py @@ -0,0 +1,39 @@ +from plugin.connector.base import ResourceConnector + + +class ParameterGroupConnector(ResourceConnector): + service_name = "rds" + cloud_service_group = "RDS" + cloud_service_type = "ParameterGroup" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "rds" + self.cloud_service_group = "RDS" + self.cloud_service_type = "ParameterGroup" + self.rest_service_name = "rds" + + def describe_db_parameter_groups(self): + paginator = self.client.get_paginator("describe_db_parameter_groups") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def describe_db_parameters(self, db_parameter_group_name): + paginator = self.client.get_paginator("describe_db_parameters") + response_iterator = paginator.paginate( + DBParameterGroupName=db_parameter_group_name, + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + }, + ) + return response_iterator + + def list_tags_for_resource(self, resource_arn): + response = self.client.list_tags_for_resource(ResourceName=resource_arn) + return response.get("TagList", []) diff --git a/src/plugin/connector/rds/snapshot_connector.py b/src/plugin/connector/rds/snapshot_connector.py new file mode 100644 index 0000000..ed42d78 --- /dev/null +++ b/src/plugin/connector/rds/snapshot_connector.py @@ -0,0 +1,38 @@ +from plugin.connector.base import ResourceConnector + + +class SnapshotConnector(ResourceConnector): + service_name = "rds" + cloud_service_group = "RDS" + cloud_service_type = "Snapshot" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "rds" + self.cloud_service_group = "RDS" + self.cloud_service_type = "Snapshot" + self.rest_service_name = "rds" + + def describe_db_snapshots(self): + paginator = self.client.get_paginator("describe_db_snapshots") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def describe_db_cluster_snapshots(self): + paginator = self.client.get_paginator("describe_db_cluster_snapshots") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def list_tags_for_resource(self, resource_arn): + response = self.client.list_tags_for_resource(ResourceName=resource_arn) + return response.get("TagList", []) diff --git a/src/plugin/connector/rds/subnet_group_connector.py b/src/plugin/connector/rds/subnet_group_connector.py new file mode 100644 index 0000000..7454dc3 --- /dev/null +++ b/src/plugin/connector/rds/subnet_group_connector.py @@ -0,0 +1,28 @@ +from plugin.connector.base import ResourceConnector + + +class SubnetGroupConnector(ResourceConnector): + service_name = "rds" + cloud_service_group = "RDS" + cloud_service_type = "SubnetGroup" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "rds" + self.cloud_service_group = "RDS" + self.cloud_service_type = "SubnetGroup" + self.rest_service_name = "rds" + + def describe_db_subnet_groups(self): + paginator = self.client.get_paginator("describe_db_subnet_groups") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def list_tags_for_resource(self, resource_arn): + response = self.client.list_tags_for_resource(ResourceName=resource_arn) + return response.get("TagList", []) diff --git a/src/plugin/connector/redshift/__init__.py b/src/plugin/connector/redshift/__init__.py index e69de29..1d1139f 100644 --- a/src/plugin/connector/redshift/__init__.py +++ b/src/plugin/connector/redshift/__init__.py @@ -0,0 +1 @@ +from .cluster_connector import ClusterConnector diff --git a/src/plugin/connector/redshift/cluster_connector.py b/src/plugin/connector/redshift/cluster_connector.py new file mode 100644 index 0000000..955891d --- /dev/null +++ b/src/plugin/connector/redshift/cluster_connector.py @@ -0,0 +1,32 @@ +from plugin.connector.base import ResourceConnector + + +class ClusterConnector(ResourceConnector): + service_name = "redshift" + cloud_service_group = "Redshift" + cloud_service_type = "Cluster" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "redshift" + self.cloud_service_group = "Redshift" + self.cloud_service_type = "Cluster" + self.rest_service_name = "redshift" + + def describe_clusters(self): + paginator = self.client.get_paginator("describe_clusters") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def describe_cluster(self, cluster_identifier): + response = self.client.describe_clusters(ClusterIdentifier=cluster_identifier) + return response.get("Clusters", [{}])[0] + + def list_tags_for_resource(self, resource_name): + response = self.client.list_tags_for_resource(ResourceName=resource_name) + return response.get("TagList", []) diff --git a/src/plugin/connector/route53/__init__.py b/src/plugin/connector/route53/__init__.py index e69de29..a841dd8 100644 --- a/src/plugin/connector/route53/__init__.py +++ b/src/plugin/connector/route53/__init__.py @@ -0,0 +1 @@ +from .hosted_zone_connector import HostedZoneConnector diff --git a/src/plugin/connector/route53/hosted_zone_connector.py b/src/plugin/connector/route53/hosted_zone_connector.py new file mode 100644 index 0000000..fcfc311 --- /dev/null +++ b/src/plugin/connector/route53/hosted_zone_connector.py @@ -0,0 +1,45 @@ +from plugin.connector.base import ResourceConnector + + +class HostedZoneConnector(ResourceConnector): + service_name = "route53" + cloud_service_group = "Route53" + cloud_service_type = "HostedZone" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "route53" + self.cloud_service_group = "Route53" + self.cloud_service_type = "HostedZone" + self.rest_service_name = "route53" + + def list_hosted_zones(self): + paginator = self.client.get_paginator("list_hosted_zones") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def get_hosted_zone(self, hosted_zone_id): + response = self.client.get_hosted_zone(Id=hosted_zone_id) + return response + + def list_resource_record_sets(self, hosted_zone_id): + paginator = self.client.get_paginator("list_resource_record_sets") + response_iterator = paginator.paginate( + HostedZoneId=hosted_zone_id, + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + }, + ) + return response_iterator + + def list_tags_for_resource(self, resource_type, resource_id): + response = self.client.list_tags_for_resource( + ResourceType=resource_type, ResourceId=resource_id + ) + return response.get("ResourceTagSet", {}).get("Tags", []) diff --git a/src/plugin/connector/s3/__init__.py b/src/plugin/connector/s3/__init__.py index e69de29..5f5d8bc 100644 --- a/src/plugin/connector/s3/__init__.py +++ b/src/plugin/connector/s3/__init__.py @@ -0,0 +1 @@ +from .bucket_connector import BucketConnector diff --git a/src/plugin/connector/s3/bucket_connector.py b/src/plugin/connector/s3/bucket_connector.py new file mode 100644 index 0000000..2c64154 --- /dev/null +++ b/src/plugin/connector/s3/bucket_connector.py @@ -0,0 +1,46 @@ +from plugin.connector.base import ResourceConnector + + +class BucketConnector(ResourceConnector): + service_name = "s3" + cloud_service_group = "S3" + cloud_service_type = "Bucket" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "s3" + self.cloud_service_group = "S3" + self.cloud_service_type = "Bucket" + self.rest_service_name = "s3" + + def list_buckets(self): + response = self.client.list_buckets() + return response.get("Buckets", []) + + def get_bucket_location(self, bucket_name): + response = self.client.get_bucket_location(Bucket=bucket_name) + return response.get("LocationConstraint", "us-east-1") + + def get_bucket_tags(self, bucket_name): + response = self.client.get_bucket_tagging(Bucket=bucket_name) + return response.get("TagSet", []) + + def get_bucket_policy(self, bucket_name): + response = self.client.get_bucket_policy(Bucket=bucket_name) + return response.get("Policy", "") + + def get_bucket_versioning(self, bucket_name): + response = self.client.get_bucket_versioning(Bucket=bucket_name) + return response + + def get_bucket_encryption(self, bucket_name): + response = self.client.get_bucket_encryption(Bucket=bucket_name) + return response.get("ServerSideEncryptionConfiguration", {}) + + def get_bucket_acl(self, bucket_name): + response = self.client.get_bucket_acl(Bucket=bucket_name) + return response + + def get_bucket_lifecycle(self, bucket_name): + response = self.client.get_bucket_lifecycle_configuration(Bucket=bucket_name) + return response.get("Rules", []) diff --git a/src/plugin/connector/secrets_manager/__init__.py b/src/plugin/connector/secrets_manager/__init__.py index e69de29..80c4671 100644 --- a/src/plugin/connector/secrets_manager/__init__.py +++ b/src/plugin/connector/secrets_manager/__init__.py @@ -0,0 +1 @@ +from .secret_connector import SecretConnector diff --git a/src/plugin/connector/secrets_manager/secret_connector.py b/src/plugin/connector/secrets_manager/secret_connector.py new file mode 100644 index 0000000..a2903de --- /dev/null +++ b/src/plugin/connector/secrets_manager/secret_connector.py @@ -0,0 +1,32 @@ +from plugin.connector.base import ResourceConnector + + +class SecretConnector(ResourceConnector): + service_name = "secretsmanager" + cloud_service_group = "SecretsManager" + cloud_service_type = "Secret" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "secretsmanager" + self.cloud_service_group = "SecretsManager" + self.cloud_service_type = "Secret" + self.rest_service_name = "secretsmanager" + + def list_secrets(self): + paginator = self.client.get_paginator("list_secrets") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def describe_secret(self, secret_id): + response = self.client.describe_secret(SecretId=secret_id) + return response + + def get_secret_value(self, secret_id): + response = self.client.get_secret_value(SecretId=secret_id) + return response diff --git a/src/plugin/connector/sns/__init__.py b/src/plugin/connector/sns/__init__.py index e69de29..74bbb9a 100644 --- a/src/plugin/connector/sns/__init__.py +++ b/src/plugin/connector/sns/__init__.py @@ -0,0 +1 @@ +from .topic_connector import TopicConnector diff --git a/src/plugin/connector/sns/topic_connector.py b/src/plugin/connector/sns/topic_connector.py new file mode 100644 index 0000000..af0dcc0 --- /dev/null +++ b/src/plugin/connector/sns/topic_connector.py @@ -0,0 +1,36 @@ +from plugin.connector.base import ResourceConnector + + +class TopicConnector(ResourceConnector): + service_name = "sns" + cloud_service_group = "SNS" + cloud_service_type = "Topic" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "sns" + self.cloud_service_group = "SNS" + self.cloud_service_type = "Topic" + self.rest_service_name = "sns" + + def list_topics(self): + paginator = self.client.get_paginator("list_topics") + response_iterator = paginator.paginate( + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + } + ) + return response_iterator + + def get_topic_attributes(self, topic_arn): + response = self.client.get_topic_attributes(TopicArn=topic_arn) + return response.get("Attributes", {}) + + def list_subscriptions_by_topic(self, topic_arn): + response = self.client.list_subscriptions_by_topic(TopicArn=topic_arn) + return response.get("Subscriptions", []) + + def list_tags_for_resource(self, resource_arn): + response = self.client.list_tags_for_resource(ResourceArn=resource_arn) + return response.get("Tags", []) diff --git a/src/plugin/connector/sqs/__init__.py b/src/plugin/connector/sqs/__init__.py index e69de29..d12c467 100644 --- a/src/plugin/connector/sqs/__init__.py +++ b/src/plugin/connector/sqs/__init__.py @@ -0,0 +1 @@ +from .queue_connector import QueueConnector diff --git a/src/plugin/connector/sqs/queue_connector.py b/src/plugin/connector/sqs/queue_connector.py new file mode 100644 index 0000000..8d0b152 --- /dev/null +++ b/src/plugin/connector/sqs/queue_connector.py @@ -0,0 +1,28 @@ +from plugin.connector.base import ResourceConnector + + +class QueueConnector(ResourceConnector): + service_name = "sqs" + cloud_service_group = "SQS" + cloud_service_type = "Queue" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "sqs" + self.cloud_service_group = "SQS" + self.cloud_service_type = "Queue" + self.rest_service_name = "sqs" + + def list_queues(self): + response = self.client.list_queues() + return response.get("QueueUrls", []) + + def get_queue_attributes(self, queue_url): + response = self.client.get_queue_attributes( + QueueUrl=queue_url, AttributeNames=["All"] + ) + return response.get("Attributes", {}) + + def list_queue_tags(self, queue_url): + response = self.client.list_queue_tags(QueueUrl=queue_url) + return response.get("Tags", {}) diff --git a/src/plugin/connector/vpc/__init__.py b/src/plugin/connector/vpc/__init__.py index e69de29..9d0ed46 100644 --- a/src/plugin/connector/vpc/__init__.py +++ b/src/plugin/connector/vpc/__init__.py @@ -0,0 +1,13 @@ +from .customer_gateway_connector import CustomerGatewayConnector +from .egress_only_internet_gateway_connector import EgressOnlyInternetGatewayConnector +from .endpoint_connector import EndpointConnector +from .internet_gateway_connector import InternetGatewayConnector +from .nat_gateway_connector import NATGatewayConnector +from .network_acl_connector import NetworkACLConnector +from .peering_connection_connector import PeeringConnectionConnector +from .route_table_connector import RouteTableConnector +from .subnet_connector import SubnetConnector +from .transit_gateway_connector import TransitGatewayConnector +from .vpc_connector import VPCConnector +from .vpn_connection_connector import VPNConnectionConnector +from .vpn_gateway_connector import VPNGatewayConnector diff --git a/src/plugin/connector/vpc/customer_gateway_connector.py b/src/plugin/connector/vpc/customer_gateway_connector.py new file mode 100644 index 0000000..d47a45b --- /dev/null +++ b/src/plugin/connector/vpc/customer_gateway_connector.py @@ -0,0 +1,20 @@ +from plugin.connector.base import ResourceConnector + + +class CustomerGatewayConnector(ResourceConnector): + service_name = "ec2" + cloud_service_group = "VPC" + cloud_service_type = "CustomerGateway" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "ec2" + self.cloud_service_group = "VPC" + self.cloud_service_type = "CustomerGateway" + self.rest_service_name = "ec2" + + def describe_customer_gateways(self, filters=None): + if filters is None: + filters = [] + response = self.client.describe_customer_gateways(Filters=filters) + return response.get("CustomerGateways", []) diff --git a/src/plugin/connector/vpc/egress_only_internet_gateway_connector.py b/src/plugin/connector/vpc/egress_only_internet_gateway_connector.py new file mode 100644 index 0000000..8dde46a --- /dev/null +++ b/src/plugin/connector/vpc/egress_only_internet_gateway_connector.py @@ -0,0 +1,20 @@ +from plugin.connector.base import ResourceConnector + + +class EgressOnlyInternetGatewayConnector(ResourceConnector): + service_name = "ec2" + cloud_service_group = "VPC" + cloud_service_type = "EgressOnlyInternetGateway" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "ec2" + self.cloud_service_group = "VPC" + self.cloud_service_type = "EgressOnlyInternetGateway" + self.rest_service_name = "ec2" + + def describe_egress_only_internet_gateways(self, filters=None): + if filters is None: + filters = [] + response = self.client.describe_egress_only_internet_gateways(Filters=filters) + return response.get("EgressOnlyInternetGateways", []) diff --git a/src/plugin/connector/vpc/endpoint_connector.py b/src/plugin/connector/vpc/endpoint_connector.py new file mode 100644 index 0000000..2400964 --- /dev/null +++ b/src/plugin/connector/vpc/endpoint_connector.py @@ -0,0 +1,26 @@ +from plugin.connector.base import ResourceConnector + + +class EndpointConnector(ResourceConnector): + service_name = "ec2" + cloud_service_group = "VPC" + cloud_service_type = "Endpoint" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "ec2" + self.cloud_service_group = "VPC" + self.cloud_service_type = "Endpoint" + self.rest_service_name = "ec2" + + def describe_vpc_endpoints(self, filters=None): + if filters is None: + filters = [] + response = self.client.describe_vpc_endpoints(Filters=filters) + return response.get("VpcEndpoints", []) + + def describe_vpc_endpoint_services(self, filters=None): + if filters is None: + filters = [] + response = self.client.describe_vpc_endpoint_services(Filters=filters) + return response.get("ServiceDetails", []) diff --git a/src/plugin/connector/vpc/internet_gateway_connector.py b/src/plugin/connector/vpc/internet_gateway_connector.py new file mode 100644 index 0000000..f8e49b6 --- /dev/null +++ b/src/plugin/connector/vpc/internet_gateway_connector.py @@ -0,0 +1,26 @@ +from plugin.connector.base import ResourceConnector + + +class InternetGatewayConnector(ResourceConnector): + service_name = "ec2" + cloud_service_group = "VPC" + cloud_service_type = "InternetGateway" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "ec2" + self.cloud_service_group = "VPC" + self.cloud_service_type = "InternetGateway" + self.rest_service_name = "ec2" + + def describe_internet_gateways(self, filters=None): + if filters is None: + filters = [] + response = self.client.describe_internet_gateways(Filters=filters) + return response.get("InternetGateways", []) + + def describe_internet_gateway_attribute(self, internet_gateway_id, attribute): + response = self.client.describe_internet_gateway_attribute( + InternetGatewayId=internet_gateway_id, Attribute=attribute + ) + return response diff --git a/src/plugin/connector/vpc/nat_gateway_connector.py b/src/plugin/connector/vpc/nat_gateway_connector.py new file mode 100644 index 0000000..7ea053f --- /dev/null +++ b/src/plugin/connector/vpc/nat_gateway_connector.py @@ -0,0 +1,20 @@ +from plugin.connector.base import ResourceConnector + + +class NATGatewayConnector(ResourceConnector): + service_name = "ec2" + cloud_service_group = "VPC" + cloud_service_type = "NATGateway" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "ec2" + self.cloud_service_group = "VPC" + self.cloud_service_type = "NATGateway" + self.rest_service_name = "ec2" + + def describe_nat_gateways(self, filters=None): + if filters is None: + filters = [] + response = self.client.describe_nat_gateways(Filters=filters) + return response.get("NatGateways", []) diff --git a/src/plugin/connector/vpc/network_acl_connector.py b/src/plugin/connector/vpc/network_acl_connector.py new file mode 100644 index 0000000..c9721ad --- /dev/null +++ b/src/plugin/connector/vpc/network_acl_connector.py @@ -0,0 +1,26 @@ +from plugin.connector.base import ResourceConnector + + +class NetworkACLConnector(ResourceConnector): + service_name = "ec2" + cloud_service_group = "VPC" + cloud_service_type = "NetworkACL" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "ec2" + self.cloud_service_group = "VPC" + self.cloud_service_type = "NetworkACL" + self.rest_service_name = "ec2" + + def describe_network_acls(self, filters=None): + if filters is None: + filters = [] + response = self.client.describe_network_acls(Filters=filters) + return response.get("NetworkAcls", []) + + def describe_network_acl_attribute(self, network_acl_id, attribute): + response = self.client.describe_network_acl_attribute( + NetworkAclId=network_acl_id, Attribute=attribute + ) + return response diff --git a/src/plugin/connector/vpc/peering_connection_connector.py b/src/plugin/connector/vpc/peering_connection_connector.py new file mode 100644 index 0000000..dcf3190 --- /dev/null +++ b/src/plugin/connector/vpc/peering_connection_connector.py @@ -0,0 +1,28 @@ +from plugin.connector.base import ResourceConnector + + +class PeeringConnectionConnector(ResourceConnector): + service_name = "ec2" + cloud_service_group = "VPC" + cloud_service_type = "PeeringConnection" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "ec2" + self.cloud_service_group = "VPC" + self.cloud_service_type = "PeeringConnection" + self.rest_service_name = "ec2" + + def describe_vpc_peering_connections(self, filters=None): + if filters is None: + filters = [] + response = self.client.describe_vpc_peering_connections(Filters=filters) + return response.get("VpcPeeringConnections", []) + + def describe_vpc_peering_connection_attribute( + self, vpc_peering_connection_id, attribute + ): + response = self.client.describe_vpc_peering_connection_attribute( + VpcPeeringConnectionId=vpc_peering_connection_id, Attribute=attribute + ) + return response diff --git a/src/plugin/connector/vpc/route_table_connector.py b/src/plugin/connector/vpc/route_table_connector.py new file mode 100644 index 0000000..b14958b --- /dev/null +++ b/src/plugin/connector/vpc/route_table_connector.py @@ -0,0 +1,26 @@ +from plugin.connector.base import ResourceConnector + + +class RouteTableConnector(ResourceConnector): + service_name = "ec2" + cloud_service_group = "VPC" + cloud_service_type = "RouteTable" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "ec2" + self.cloud_service_group = "VPC" + self.cloud_service_type = "RouteTable" + self.rest_service_name = "ec2" + + def describe_route_tables(self, filters=None): + if filters is None: + filters = [] + response = self.client.describe_route_tables(Filters=filters) + return response.get("RouteTables", []) + + def describe_route_table_attribute(self, route_table_id, attribute): + response = self.client.describe_route_table_attribute( + RouteTableId=route_table_id, Attribute=attribute + ) + return response diff --git a/src/plugin/connector/vpc/subnet_connector.py b/src/plugin/connector/vpc/subnet_connector.py new file mode 100644 index 0000000..c1e1e34 --- /dev/null +++ b/src/plugin/connector/vpc/subnet_connector.py @@ -0,0 +1,26 @@ +from plugin.connector.base import ResourceConnector + + +class SubnetConnector(ResourceConnector): + service_name = "ec2" + cloud_service_group = "VPC" + cloud_service_type = "Subnet" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "ec2" + self.cloud_service_group = "VPC" + self.cloud_service_type = "Subnet" + self.rest_service_name = "ec2" + + def describe_subnets(self, filters=None): + if filters is None: + filters = [] + response = self.client.describe_subnets(Filters=filters) + return response.get("Subnets", []) + + def describe_subnet_attribute(self, subnet_id, attribute): + response = self.client.describe_subnet_attribute( + SubnetId=subnet_id, Attribute=attribute + ) + return response diff --git a/src/plugin/connector/vpc/transit_gateway_connector.py b/src/plugin/connector/vpc/transit_gateway_connector.py new file mode 100644 index 0000000..a6ffd4f --- /dev/null +++ b/src/plugin/connector/vpc/transit_gateway_connector.py @@ -0,0 +1,39 @@ +from plugin.connector.base import ResourceConnector + + +class TransitGatewayConnector(ResourceConnector): + service_name = "ec2" + cloud_service_group = "VPC" + cloud_service_type = "TransitGateway" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "ec2" + self.cloud_service_group = "VPC" + self.cloud_service_type = "TransitGateway" + self.rest_service_name = "ec2" + + def describe_transit_gateways(self, filters=None): + if filters is None: + filters = [] + response = self.client.describe_transit_gateways(Filters=filters) + return response.get("TransitGateways", []) + + def describe_transit_gateway_attachments(self, filters=None): + if filters is None: + filters = [] + paginator = self.client.get_paginator("describe_transit_gateway_attachments") + response_iterator = paginator.paginate( + Filters=filters, + PaginationConfig={ + "MaxItems": 10000, + "PageSize": 50, + }, + ) + return response_iterator + + def describe_transit_gateway_route_tables(self, filters=None): + if filters is None: + filters = [] + response = self.client.describe_transit_gateway_route_tables(Filters=filters) + return response.get("TransitGatewayRouteTables", []) diff --git a/src/plugin/connector/vpc/vpc_connector.py b/src/plugin/connector/vpc/vpc_connector.py new file mode 100644 index 0000000..3a60b1e --- /dev/null +++ b/src/plugin/connector/vpc/vpc_connector.py @@ -0,0 +1,30 @@ +from plugin.connector.base import ResourceConnector + + +class VPCConnector(ResourceConnector): + service_name = "ec2" + cloud_service_group = "VPC" + cloud_service_type = "VPC" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "ec2" + self.cloud_service_group = "VPC" + self.cloud_service_type = "VPC" + self.rest_service_name = "ec2" + + def list_vpcs(self, include_default=False): + _filter_value = ["false"] + if include_default: + _filter_value.append("true") + + paginator = self.client.get_paginator("describe_vpcs") + response_iterator = paginator.paginate( + Filters=[{"Name": "isDefault", "Values": _filter_value}], + PaginationConfig={"MaxItems": 10000}, + ) + return response_iterator + + def describe_vpc_attribute(self, vpc_id, attribute): + response = self.client.describe_vpc_attribute(VpcId=vpc_id, Attribute=attribute) + return response diff --git a/src/plugin/connector/vpc/vpn_connection_connector.py b/src/plugin/connector/vpc/vpn_connection_connector.py new file mode 100644 index 0000000..8fa5b8b --- /dev/null +++ b/src/plugin/connector/vpc/vpn_connection_connector.py @@ -0,0 +1,26 @@ +from plugin.connector.base import ResourceConnector + + +class VPNConnectionConnector(ResourceConnector): + service_name = "ec2" + cloud_service_group = "VPC" + cloud_service_type = "VPNConnection" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "ec2" + self.cloud_service_group = "VPC" + self.cloud_service_type = "VPNConnection" + self.rest_service_name = "ec2" + + def describe_vpn_connections(self, filters=None): + if filters is None: + filters = [] + response = self.client.describe_vpn_connections(Filters=filters) + return response.get("VpnConnections", []) + + def describe_vpn_connection_attribute(self, vpn_connection_id, attribute): + response = self.client.describe_vpn_connection_attribute( + VpnConnectionId=vpn_connection_id, Attribute=attribute + ) + return response diff --git a/src/plugin/connector/vpc/vpn_gateway_connector.py b/src/plugin/connector/vpc/vpn_gateway_connector.py new file mode 100644 index 0000000..acc4898 --- /dev/null +++ b/src/plugin/connector/vpc/vpn_gateway_connector.py @@ -0,0 +1,26 @@ +from plugin.connector.base import ResourceConnector + + +class VPNGatewayConnector(ResourceConnector): + service_name = "ec2" + cloud_service_group = "VPC" + cloud_service_type = "VPNGateway" + + def __init__(self, secret_data, region_name): + super().__init__(secret_data, region_name) + self.service_name = "ec2" + self.cloud_service_group = "VPC" + self.cloud_service_type = "VPNGateway" + self.rest_service_name = "ec2" + + def describe_vpn_gateways(self, filters=None): + if filters is None: + filters = [] + response = self.client.describe_vpn_gateways(Filters=filters) + return response.get("VpnGateways", []) + + def describe_vpn_gateway_attribute(self, vpn_gateway_id, attribute): + response = self.client.describe_vpn_gateway_attribute( + VpnGatewayId=vpn_gateway_id, Attribute=attribute + ) + return response diff --git a/src/plugin/main.py b/src/plugin/main.py index c9718c2..8319ca0 100644 --- a/src/plugin/main.py +++ b/src/plugin/main.py @@ -1,9 +1,13 @@ import logging +import concurrent.futures from spaceone.inventory.plugin.collector.lib.server import CollectorPluginServer +from spaceone.inventory.plugin.collector.lib import make_error_response -from .conf.cloud_service_conf import DEFAULT_VULNERABLE_PORTS from .manager.base import ResourceManager +from .manager.job_manager import JobManager + +from .conf.cloud_service_conf import MAX_WORKERS _LOGGER = logging.getLogger("spaceone") @@ -25,7 +29,17 @@ def collector_init(params: dict) -> dict: 'metadata': 'dict' } """ - return _create_init_metadata() + + return { + "metadata": { + "supported_resource_type": [ + "inventory.CloudService", + "inventory.CloudServiceType", + "inventory.Region", + "inventory.ErrorResource", + ], + } + } @app.route("Collector.verify") @@ -46,6 +60,30 @@ def collector_verify(params: dict) -> None: pass +@app.route("Job.get_tasks") +def job_get_tasks(params: dict) -> dict: + """Get job tasks + + Args: + params (JobGetTaskRequest): { + 'options': 'dict', # Required + 'secret_data': 'dict', # Required + 'domain_id': 'str' + } + + Returns: + TasksResponse: { + 'tasks': 'list' + } + + """ + options = params.get("options", {}) + secret_data = params.get("secret_data", {}) + + job_mgr = JobManager(options, secret_data) + return job_mgr.get_tasks() + + @app.route("Collector.collect") def collector_collect(params): """Collect external data @@ -115,34 +153,48 @@ def collector_collect(params): options = params["options"] secret_data = params["secret_data"] schema = params.get("schema") - task_options = params.get("task_options") or {} + task_options = params.get("task_options", {}) resource_type = task_options.get("resource_type") if resource_type == "inventory.CloudServiceType": services = task_options.get("services") for service in services: - resource_mgrs = ResourceManager.get_manager_by_service(service) - for resource_mgr in resource_mgrs: - results = resource_mgr().collect_cloud_service_types() - for result in results: - yield result + for manager_class in ResourceManager.get_manager_by_service(service): + manager = manager_class() + yield from manager.collect_cloudn_service_types() elif resource_type == "inventory.CloudService": service = task_options.get("service") region = task_options.get("region") - resource_mgrs = ResourceManager.get_manager_by_service(service) account_id = ResourceManager.get_account_id(secret_data, region) options["account_id"] = account_id - for resource_mgr in resource_mgrs: - results = resource_mgr().collect_resources( - region, options, secret_data, schema - ) - for result in results: - # print( - # "-------------------------RESULTS--------------------------------" - # ) - # print(result) - yield result + + with concurrent.futures.ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor: + manager_classes = list(ResourceManager.get_manager_by_service(service)) + + futures = [] + for manager_class in manager_classes: + future = executor.submit( + lambda mc: list( + mc().collect_resources(region, options, secret_data, schema) + ), + manager_class, + ) + futures.append(future) + + for future in concurrent.futures.as_completed(futures): + try: + result = future.result() + for item in result: + yield item + except Exception as e: + _LOGGER.error(f"Error collecting resources: {e}") + yield make_error_response( + error=e, + provider="aws", + cloud_service_group=service, + cloud_service_type="", + ) elif resource_type == "inventory.Region": regions = task_options.get("regions") @@ -153,166 +205,3 @@ def collector_collect(params): services = task_options.get("services") for service in services: yield from ResourceManager.collect_metrics(service) - - -@app.route("Job.get_tasks") -def job_get_tasks(params: dict) -> dict: - """Get job tasks - - Args: - params (JobGetTaskRequest): { - 'options': 'dict', # Required - 'secret_data': 'dict', # Required - 'domain_id': 'str' - } - - Returns: - TasksResponse: { - 'tasks': 'list' - } - - """ - tasks = [] - options = params.get("options", {}) - secret_data = params.get("secret_data", {}) - - services = _set_service_filter(options) - regions = _set_region_filter(options, secret_data) - - # create task 1: task for collecting only cloud service type metadata - tasks.extend(_add_cloud_service_type_tasks(services)) - - # create task 2: task for collecting only cloud service region metadata - tasks.extend(_add_cloud_service_region_tasks(regions)) - - # create task 3: task for collecting only metrics - tasks.extend(_add_metric_tasks(services)) - - # create task 4: task for collecting only cloud service group metadata - tasks.extend(_add_cloud_service_group_tasks(services, regions)) - - return {"tasks": tasks} - - -def _set_service_filter(options): - """ - 1. service_filter type check (is it an array?) - 2. service_filter 내용물 자체 check (it could have sth that is not valid, like ECD instead of EC2 - """ - - available_services = ResourceManager.get_service_names() - - if service_filter := options.get("service_filter"): - _validate_service_filter(service_filter, available_services) - return service_filter - else: - return available_services - - -def _validate_service_filter(service_filter, available_services): - if not isinstance(service_filter, list): - raise ValueError( - f"Services input is supposed to be a list type! Your input is {service_filter}." - ) - for each_service in service_filter: - if each_service not in available_services: - raise ValueError("Not a valid service!") - - -def _set_region_filter(options, secret_data): - available_regions = ResourceManager.get_region_names(secret_data) - - if region_filter := options.get("region_filter"): - _validate_region_filter(region_filter, available_regions) - return region_filter - else: - return available_regions - - -def _validate_region_filter(region_filter, available_regions): - if not isinstance(region_filter, list): - raise ValueError( - f"Regions input is supposed to be a list type! Your input is {region_filter}." - ) - for each_region in region_filter: - if each_region not in available_regions: - raise ValueError("Not a valid region!") - - -def _add_cloud_service_type_tasks(services: list) -> list: - return [ - _make_task_wrapper( - resource_type="inventory.CloudServiceType", services=services - ) - ] - - -def _add_metric_tasks(services: list) -> list: - # Specific cloud_service_group list. - metric_services = [ - "CertificateManager", # "ACM", - "CloudFront", - "CloudTrail", - "DocumentDB", - "EC2", - "ECR", - "EFS", - "EKS", - "ELB", - "IAM", - "KMS", - "Lambda", - "Route53", - "S3", - "TrustedAdvisor", - "PersonalHealthDashboard", - ] - return [ - _make_task_wrapper( - resource_type="inventory.Metric", - services=metric_services, - # resource_type="inventory.Metric", services = services # origin - ) - ] - - -def _add_cloud_service_region_tasks(regions: list) -> list: - return [_make_task_wrapper(resource_type="inventory.Region", regions=regions)] - - -def _add_cloud_service_group_tasks(services, regions): - tasks = [] - """ - TODO: Certain services are not available in certain regions. - - """ - for service in services: - for region in regions: - tasks.append( - _make_task_wrapper( - resource_type="inventory.CloudService", - service=service, - region=region, - ) - ) - return tasks - - -def _make_task_wrapper(**kwargs) -> dict: - task_options = {"task_options": {}} - for key, value in kwargs.items(): - task_options["task_options"][key] = value - return task_options - - -def _create_init_metadata(): - return { - "metadata": { - "supported_resource_type": [ - "inventory.CloudService", - "inventory.CloudServiceType", - "inventory.Region", - "inventory.ErrorResource", - ], - } - } diff --git a/src/plugin/manager/__init__.py b/src/plugin/manager/__init__.py index 2b7e1b1..6e60c51 100644 --- a/src/plugin/manager/__init__.py +++ b/src/plugin/manager/__init__.py @@ -1,9 +1,34 @@ -# from .acm import * - -# from .api_gateway import * -# from .cloud_front import * -# from .cloud_trail import * -# from .direct_connect import * -# from .documentdb import * -# from .dynamodb import * +from .acm import * +from .api_gateway import * +from .cloudfront import * +from .cloudtrail import * +from .cloudwatch import * +from .direct_connect import * +from .documentdb import * +from .dynamodb import * from .ec2 import * +from .ec2_server import * +from .ecr import * +from .ecs import * +from .efs import * +from .eks import * +from .elasticache import * +from .elb import * +from .iam import * +from .kinesis_data_stream import * +from .kinesis_firehose import * +from .kms import * +from .lightsail import * +from .msk import * +from .rds import * +from .redshift import * +from .route53 import * +from .s3 import * +from .secrets_manager import * +from .sns import * +from .sqs import * +from .vpc import * + +# Not Used +# from .eip import * +# from .ebs import * diff --git a/src/plugin/manager/acm/certificate_manager.py b/src/plugin/manager/acm/certificate_manager.py index 7749fba..05d7617 100644 --- a/src/plugin/manager/acm/certificate_manager.py +++ b/src/plugin/manager/acm/certificate_manager.py @@ -3,14 +3,16 @@ from ...conf.cloud_service_conf import * from spaceone.inventory.plugin.collector.lib import * +from ...model.acm import Certificate + class CertificateManager(ResourceManager): - cloud_service_group = "CertificateManager" + cloud_service_group = "ACM" cloud_service_type = "Certificate" def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.cloud_service_group = "CertificateManager" + self.cloud_service_group = "ACM" self.cloud_service_type = "Certificate" self.metadata_path = "metadata/acm/certificate.yaml" @@ -30,12 +32,11 @@ def create_cloud_service_type(self) -> List[dict]: def create_cloud_service( self, region: str, options: dict, secret_data: dict, schema: str ) -> List[dict]: - cloudwatch_namespace = "AWS/CertificateManager" - cloudwatch_dimension_name = "CertificateArn" - cloudtrail_resource_type = "AWS::ACM::Certificate" - self.connector.set_account_id() + yield from self._collect_certificates(options, region) + + def _collect_certificates(self, options: dict, region: str) -> List[dict]: results = self.connector.get_certificates() - account_id = self.connector.get_account_id() + for data in results: for raw in data.get("CertificateSummaryList", []): try: @@ -62,39 +63,35 @@ def create_cloud_service( certificate_info.get("InUseBy") ), "cloudwatch": self.set_cloudwatch( - cloudwatch_namespace, - cloudwatch_dimension_name, + self.cloud_service_group, certificate_info.get("CertificateArn"), region, ), "cloudtrail": self.set_cloudtrail( - region, - cloudtrail_resource_type, + self.cloud_service_group, raw["CertificateArn"], - ), - "launched_at": self.datetime_to_iso8601( - certificate_info.get("CreatedAt") + region, ), } ) - link = f"https://console.aws.amazon.com/acm/home?region={region}#/?id={certificate_info.get('identifier')}" - reference = self.get_reference( - certificate_info.get("CertificateArn"), link - ) - # Converting datetime type attributes to ISO8601 format needed to meet protobuf format self._update_times(certificate_info) - certificate_vo = certificate_info + certificate_vo = Certificate(certificate_info, strict=False) + + certificate_arn = certificate_vo.certificate_arn + link = f"https://console.aws.amazon.com/acm/home?region={region}#/?id={certificate_info.get('identifier')}" + reference = self.get_reference(certificate_arn, link) + cloud_service = make_cloud_service( - name=certificate_vo.get("DomainName", ""), + name=certificate_vo.domain_name, cloud_service_type=self.cloud_service_type, cloud_service_group=self.cloud_service_group, provider=self.provider, - data=certificate_vo, - account=account_id, + data=certificate_vo.to_primitive(), + account=options.get("account_id"), reference=reference, - tags=self.get_tags(certificate_vo.get("CertificateArn", "")), + tags=self.get_tags(certificate_arn), region_code=region, ) yield cloud_service diff --git a/src/plugin/manager/api_gateway/api_gateway_manager.py b/src/plugin/manager/api_gateway/api_gateway_manager.py index 9d9ba1c..faaa328 100644 --- a/src/plugin/manager/api_gateway/api_gateway_manager.py +++ b/src/plugin/manager/api_gateway/api_gateway_manager.py @@ -4,6 +4,8 @@ from spaceone.core.utils import * from spaceone.inventory.plugin.collector.lib import * +from ...model.api_gateway.api_gateway import RestAPI, HTTPWebsocket + class ApiGatewayManager(ResourceManager): cloud_service_group = "APIGateway" @@ -31,21 +33,11 @@ def create_cloud_service_type(self) -> List[dict]: def create_cloud_service( self, region: str, options: dict, secret_data: dict, schema: str ) -> List[dict]: - collect_list = [ - self._collect_rest_apis, - self._collect_websockets, - ] - self.connector.set_account_id() - for pre_collect in collect_list: - yield from pre_collect(region) - - def _collect_rest_apis(self, region: str) -> List[dict]: - cloudwatch_namespace = "AWS/ApiGateway" - cloudwatch_dimension_name = "ApiName" - cloudtrail_resource_type = "AWS::ApiGateway::RestApi" + yield from self._collect_rest_apis(options, region) + yield from self._collect_websockets(options, region) + def _collect_rest_apis(self, options: dict, region: str) -> List[dict]: results = self.connector.get_rest_apis() - account_id = self.connector.get_account_id() for data in results: for raw in data.get("items", []): try: @@ -75,16 +67,12 @@ def _collect_rest_apis(self, region: str) -> List[dict]: resource_id=f"{raw.get('id')}/*", ), "cloudwatch": self.set_cloudwatch( - cloudwatch_namespace, - cloudwatch_dimension_name, + self.cloud_service_group, raw.get("id"), region, ), "cloudtrail": self.set_cloudtrail( - region, cloudtrail_resource_type, raw["id"] - ), - "launched_at": self.datetime_to_iso8601( - raw.get("createdDate") + self.cloud_service_group, raw["id"], region ), } ) @@ -94,15 +82,15 @@ def _collect_rest_apis(self, region: str) -> List[dict]: # Converting datetime type attributes to ISO8601 format needed to meet protobuf format self._update_times(raw) - rest_api_vo = raw + rest_api_vo = RestAPI(raw, strict=False) cloud_service = make_cloud_service( name=rest_api_vo.get("name", ""), cloud_service_type=self.cloud_service_type, cloud_service_group=self.cloud_service_group, provider=self.provider, - data=rest_api_vo, + data=rest_api_vo.to_primitive(), instance_type=rest_api_vo.get("protocol"), - account=account_id, + account=options.get("account_id"), reference=reference, tags=raw.get("tags", {}), region_code=region, @@ -118,10 +106,8 @@ def _collect_rest_apis(self, region: str) -> List[dict]: region_name=region, ) - def _collect_websockets(self, region: str) -> List[dict]: - cloudtrail_resource_type = "AWS::ApiGateway::RestApi" + def _collect_websockets(self, options: dict, region: str) -> List[dict]: results = self.connector.get_apis() - account_id = self.connector.get_account_id() for data in results: for raw in data.get("Items", []): try: @@ -137,10 +123,7 @@ def _collect_websockets(self, region: str) -> List[dict]: resource_id=raw.get("ApiId"), ), "cloudtrail": self.set_cloudtrail( - region, cloudtrail_resource_type, raw["ApiId"] - ), - "launched_at": self.datetime_to_iso8601( - raw.get("CreatedDate") + self.cloud_service_group, raw["ApiId"], region ), } ) @@ -150,15 +133,15 @@ def _collect_websockets(self, region: str) -> List[dict]: # Converting datetime type attributes to ISO8601 format needed to meet protobuf format self._update_times(raw) - http_websocket_vo = raw + http_websocket_vo = HTTPWebsocket(raw, strict=False) cloud_service = make_cloud_service( name=http_websocket_vo.get("Name", ""), cloud_service_type=self.cloud_service_type, cloud_service_group=self.cloud_service_group, provider=self.provider, - data=http_websocket_vo, + data=http_websocket_vo.to_primitive(), instance_type=http_websocket_vo.get("protocol"), - account=account_id, + account=options.get("account_id"), reference=reference, tags=raw.get("Tags", {}), region_code=region, diff --git a/src/plugin/manager/base.py b/src/plugin/manager/base.py index 1698dc3..59b4a3e 100644 --- a/src/plugin/manager/base.py +++ b/src/plugin/manager/base.py @@ -8,7 +8,11 @@ from spaceone.core import utils from spaceone.inventory.plugin.collector.lib import * -from plugin.conf.cloud_service_conf import REGION_INFO +from plugin.conf.cloud_service_conf import ( + REGION_INFO, + CLOUDWATCH_CONFIG, + CLOUDTRAIL_CONFIG, +) from plugin.connector.base import ResourceConnector _LOGGER = logging.getLogger("spaceone") @@ -21,6 +25,18 @@ class ResourceManager(BaseManager): cloud_service_group = None + EXCLUDE_REGION = { + "DocumentDB": [ + "us-west-1", + "af-south-1", + "ap-east-1", + "ap-southeast-3", + "ap-northeast-3", + "eu-north-1", + "me-south-1", + ] + } + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -33,7 +49,7 @@ def collect_resources( self, region: str, options: dict, secret_data: dict, schema: str ) -> List[dict]: _LOGGER.debug( - f"[collect_resources] collect Field resources (options: {options})" + f"[collect_resources] collect Field resources (group: {self.cloud_service_group}, type: {self.cloud_service_type}, region: {region}, options: {options})" ) target_connector = ResourceConnector.get_connector( self.cloud_service_group, self.cloud_service_type @@ -92,7 +108,7 @@ def collect_cloud_service( ) def set_cloudwatch( - self, namespace: str, dimension_name: str, resource_id: str, region_name: str + self, service_group: str, resource_id: str = None, region_name: str = None ) -> dict: """ data.cloudwatch: { @@ -110,14 +126,25 @@ def set_cloudwatch( "region_name": region_name } """ + config = CLOUDWATCH_CONFIG.get(service_group, {}) + + if not config: + return None cloudwatch_data = { "region_name": region_name, "metrics_info": self.set_metrics_info( - namespace, dimension_name, resource_id + config.get("namespace"), config.get("dimension_name"), resource_id ), } + # 추가 namespace들 처리 + for additional_ns in config.get("additional_namespaces", []): + additional_metric_info = self.set_metrics_info( + additional_ns, config.get("dimension_name"), resource_id + ) + cloudwatch_data["metrics_info"].extend(additional_metric_info) + return cloudwatch_data def set_metrics_info( @@ -197,21 +224,27 @@ def get_region_names(cls, secret_data: dict) -> List[str]: @staticmethod def set_cloudtrail( - region_name: str, resource_type: str, resource_name: str + service_group: str, resource_name: str, region_name: str = None ) -> dict: - cloudtrail = { + """ + Global config를 사용한 CloudTrail 설정 + """ + config = CLOUDTRAIL_CONFIG.get(service_group, {}) + + if not config: + return None + + return { "LookupAttributes": [ { - "AttributeKey": "ResourceName", + "AttributeKey": config.get("lookup_attribute"), "AttributeValue": resource_name, } ], "region_name": region_name, - "resource_type": resource_type, + "resource_type": config.get("resource_type"), } - return cloudtrail - @staticmethod def get_reference(resource_id: str, link: str) -> dict: return { @@ -269,3 +302,9 @@ def create_cloud_service_type(self): @abc.abstractmethod def create_cloud_service(self, region, options, secret_data, schema): raise NotImplementedError("method `create_cloud_service` should be implemented") + + @classmethod + def get_available_regions(cls, secret_data, service_name): + return ResourceConnector.get_available_regions( + secret_data=secret_data, service_name=service_name + ) diff --git a/src/plugin/manager/cloud_front/__init__.py b/src/plugin/manager/cloudfront/__init__.py similarity index 100% rename from src/plugin/manager/cloud_front/__init__.py rename to src/plugin/manager/cloudfront/__init__.py diff --git a/src/plugin/manager/cloud_front/distribution_manager.py b/src/plugin/manager/cloudfront/distribution_manager.py similarity index 84% rename from src/plugin/manager/cloud_front/distribution_manager.py rename to src/plugin/manager/cloudfront/distribution_manager.py index d273298..c764adc 100644 --- a/src/plugin/manager/cloud_front/distribution_manager.py +++ b/src/plugin/manager/cloudfront/distribution_manager.py @@ -2,6 +2,7 @@ from spaceone.inventory.plugin.collector.lib import * from ..base import ResourceManager from ...conf.cloud_service_conf import * +from ...model.cloudfront.distribution import DistributionData class DistributionManager(ResourceManager): @@ -28,12 +29,10 @@ def create_cloud_service_type(self) -> List[dict]: ) def create_cloud_service(self, region, options, secret_data, schema): - cloudwatch_namespace = "AWS/CloudFront" - cloudwatch_dimension_name = "DistributionId" - cloudtrail_resource_type = "AWS::CloudFront::Distribution" - self.connector.set_account_id() + yield from self._collect_distributions(options, region) + + def _collect_distributions(self, options, region): results = self.connector.get_distributions() - account_id = self.connector.get_account_id() for data in results: for raw in data.get("DistributionList", {}).get("Items", []): try: @@ -41,30 +40,28 @@ def create_cloud_service(self, region, options, secret_data, schema): { "state_display": self.get_state_display(raw.get("Enabled")), "cloudwatch": self.set_cloudwatch( - cloudwatch_namespace, - cloudwatch_dimension_name, + self.cloud_service_group, raw["Id"], "us-east-1", ), "cloudtrail": self.set_cloudtrail( - "us-east-1", cloudtrail_resource_type, raw["Id"] + self.cloud_service_group, raw["Id"], "us-east-1" ), } ) link = f"https://console.aws.amazon.com/cloudfront/home?#distribution-settings:{raw.get('Id', '')}" reference = self.get_reference(raw.get("ARN", ""), link) - # Converting datetime type attributes to ISO8601 format needed to meet protobuf format self._update_times(raw) - distribution_vo = raw + distribution_vo = DistributionData(raw, strict=False) cloud_service = make_cloud_service( name=distribution_vo.get("DomainName", ""), cloud_service_type=self.cloud_service_type, cloud_service_group=self.cloud_service_group, provider=self.provider, - data=distribution_vo, - account=account_id, + data=distribution_vo.to_primitive(), + account=options.get("account_id"), tags=self.list_tags_for_resource( distribution_vo.get("ARN", "") ), diff --git a/src/plugin/manager/cloud_trail/__init__.py b/src/plugin/manager/cloudtrail/__init__.py similarity index 100% rename from src/plugin/manager/cloud_trail/__init__.py rename to src/plugin/manager/cloudtrail/__init__.py diff --git a/src/plugin/manager/cloud_trail/trail_manager.py b/src/plugin/manager/cloudtrail/trail_manager.py similarity index 75% rename from src/plugin/manager/cloud_trail/trail_manager.py rename to src/plugin/manager/cloudtrail/trail_manager.py index 8e36d95..e0fbd05 100644 --- a/src/plugin/manager/cloud_trail/trail_manager.py +++ b/src/plugin/manager/cloudtrail/trail_manager.py @@ -2,6 +2,9 @@ from ..base import ResourceManager from ...conf.cloud_service_conf import * +from ...model.cloudtrail import Trail +from ...model.cloudtrail.trail import EventSelector, InsightSelector + class TrailManager(ResourceManager): cloud_service_group = "CloudTrail" @@ -27,20 +30,21 @@ def create_cloud_service_type(self): ) def create_cloud_service(self, region, options, secret_data, schema): - cloudwatch_namespace = "CloudTrailMetrics" - cloudtrail_resource_type = "AWS::CloudTrail::Trail" - self.connector.set_account_id() + yield from self._collect_trails(options, region) + + def _collect_trails(self, options, region): results = self.connector.get_trails() - account_id = self.connector.get_account_id() + trails = results.get("trailList", []) - # tags = self._list_tags(trails) for raw in trails: region_name = raw.get("HomeRegion", "") try: raw["event_selectors"] = list( map( - lambda event_selector: event_selector, + lambda event_selector: EventSelector( + event_selector, strict=False + ), self._get_event_selector(raw["TrailARN"]), ) ) @@ -48,31 +52,33 @@ def create_cloud_service(self, region, options, secret_data, schema): if raw["HasInsightSelectors"]: insight_selectors = self._get_insight_selectors(raw.get("Name")) if insight_selectors is not None: - raw["insight_selectors"] = insight_selectors + raw["insight_selectors"] = InsightSelector( + insight_selectors, strict=False + ) raw.update( { "cloudwatch": self.set_cloudwatch( - cloudwatch_namespace, None, None, region_name + self.cloud_service_group, None, region_name ), "cloudtrail": self.set_cloudtrail( - region_name, cloudtrail_resource_type, raw["TrailARN"] + self.cloud_service_group, raw["TrailARN"], region_name ), } ) - trail_vol = raw - trail_arn = trail_vol.get("TrailARN", "") - link = f"https://console.aws.amazon.com/cloudtrail/home?region={trail_vol.get('HomeRegion', '')}#/configuration/{trail_arn.replace('/', '@')}" + trail_vo = Trail(raw, strict=False) + trail_arn = trail_vo.trail_arn + link = f"https://console.aws.amazon.com/cloudtrail/home?region={trail_vo.home_region}#/configuration/{trail_arn.replace('/', '@')}" reference = self.get_reference(trail_arn, link) cloud_service = make_cloud_service( - name=trail_vol.get("Name", ""), + name=trail_vo.name, cloud_service_type=self.cloud_service_type, cloud_service_group=self.cloud_service_group, provider=self.provider, - data=trail_vol, - account=account_id, + data=trail_vo.to_primitive(), + account=options.get("account_id"), reference=reference, region_code=region_name, ) diff --git a/src/plugin/manager/cloudwatch/__init__.py b/src/plugin/manager/cloudwatch/__init__.py new file mode 100644 index 0000000..225cee9 --- /dev/null +++ b/src/plugin/manager/cloudwatch/__init__.py @@ -0,0 +1,2 @@ +from .alarms_manager import AlarmsManager + diff --git a/src/plugin/manager/cloudwatch/alarms_manager.py b/src/plugin/manager/cloudwatch/alarms_manager.py new file mode 100644 index 0000000..213f23a --- /dev/null +++ b/src/plugin/manager/cloudwatch/alarms_manager.py @@ -0,0 +1,177 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.cloudwatch.alarms import Alarms + + +class AlarmsManager(ResourceManager): + cloud_service_group = "CloudWatch" + cloud_service_type = "Alarms" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "CloudWatch" + self.cloud_service_type = "Alarms" + self.metadata_path = "metadata/cloudwatch/alarms.yaml" + + def create_cloud_service_type(self): + result = [] + alarms_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonCloudWatch", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-cloudwatch.svg" + }, + labels=["Management", "Monitoring"], + ) + result.append(alarms_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_alarms(options, region) + + def _collect_alarms(self, options, region): + region_name = region + account_id = options.get("account_id") + + try: + for alarm in self.connector.get_alarms(): + try: + alarm_name = alarm.get("AlarmName") + alarm_arn = alarm.get("AlarmArn") + + self._set_alarm_conditions(alarm) + self._set_alarm_actions(alarm) + self._set_alarm_history(alarm) + + alarm.update( + { + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, None, region_name + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, alarm_arn, region_name + ), + } + ) + + tags = self.connector.get_alarm_tags(alarm_arn) + + link = f"https://{region}.console.aws.amazon.com/cloudwatch/home?region={region}#alarmsV2:alarm/{alarm_name}" + reference = self.get_reference(alarm_arn, link) + + alarm_vo = Alarms(alarm, strict=False) + cloud_service = make_cloud_service( + name=alarm_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=alarm_vo.to_primitive(), + account=account_id, + reference=reference, + tags=tags, + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error(f'[list_alarms] [{alarm.get("AlarmName")}] {e}') + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_alarms] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _set_alarm_conditions(self, alarm): + metric_name = alarm.get("MetricName", "?") + period = alarm.get("Period", None) + evaluation_periods = self._convert_int_type( + alarm.get("EvaluationPeriods", "?") + ) + threshold = self._convert_int_type(alarm.get("Threshold", "?")) + comparison_operator = alarm.get("ComparisonOperator", "?") + + period_minutes = period // 60 if period and isinstance(period, int) else "?" + + comparison_operator_map = { + "GreaterThanOrEqualToThreshold": ">=", + "GreaterThanThreshold": ">", + "LessThanThreshold": "<", + "LessThanOrEqualToThreshold": "<=", + "LessThanLowerOrGreaterThanUpperThreshold": "<>", + "LessThanLowerThreshold": "<", + "GreaterThanUpperThreshold": ">", + } + operator = comparison_operator_map.get(comparison_operator, "?") + + alarm["conditions"] = ( + f"{metric_name} {operator} {threshold} for {evaluation_periods} datapoionts within {period_minutes} minutes" + ) + + def _set_alarm_actions(self, alarm): + alarm["actions"] = [] + actions = alarm["actions"] + + alarm_actions = alarm.get("AlarmActions", []) + ok_actions = alarm.get("OKActions", []) + insufficient_data_actions = alarm.get("InsufficientDataActions", []) + + alarm["actions_enabled"] = ( + "Actions enabled" if alarm.get("ActionsEnabled", False) else "No actions" + ) + + for action in alarm_actions: + actions.append({"type": "AlarmAction", "arn": action}) + + for action in ok_actions: + actions.append({"type": "OKAction", "arn": action}) + + for action in insufficient_data_actions: + actions.append({"type": "InsufficientDataAction", "arn": action}) + + def _set_alarm_history(self, alarm): + alarm["history"] = [] + history = alarm["history"] + + alarm_histories = self.connector.get_alarm_history( + alarm["AlarmName"] + ) + for alarm_history in alarm_histories: + history.append( + { + "date": alarm_history.get("Timestamp"), + "type": alarm_history.get("HistoryItemType"), + "description": alarm_history.get("HistorySummary"), + } + ) + + @staticmethod + def _convert_int_type(value): + if isinstance(value, float) and value.is_integer(): + return int(value) + return value diff --git a/src/plugin/manager/direct_connect/connect_manager.py b/src/plugin/manager/direct_connect/connect_manager.py index 2853994..71305c7 100644 --- a/src/plugin/manager/direct_connect/connect_manager.py +++ b/src/plugin/manager/direct_connect/connect_manager.py @@ -2,6 +2,8 @@ from ..base import ResourceManager from ...conf.cloud_service_conf import * +from ...model.direct_connect import Connection + class ConnectManager(ResourceManager): cloud_service_group = "DirectConnect" @@ -27,10 +29,10 @@ def create_cloud_service_type(self): ) def create_cloud_service(self, region, options, secret_data, schema): - cloudwatch_namespace = "AWS/DX" - cloudwatch_dimension_name = "ConnectionId" + yield from self._collect_connections(options, region) + + def _collect_connections(self, options, region): results = self.connector.get_connections() - account_id = self.connector.get_account_id() for raw in results.get("connections", []): try: bandwidth_size = self.convert_bandwidth_gbps(raw.get("bandwidth", "")) @@ -41,20 +43,19 @@ def create_cloud_service(self, region, options, secret_data, schema): raw.update( { "cloudtrail": self.set_cloudtrail( - region, None, raw["connectionId"] + self.cloud_service_group, raw["connectionId"], region ), "cloudwatch": self.set_cloudwatch( - cloudwatch_namespace, - cloudwatch_dimension_name, + self.cloud_service_group, raw["connectionId"], region, ), } ) self._update_times(raw) - connection_vo = raw - connection_id = connection_vo.get("connectionId", "") - owner_account = connection_vo.get("ownerAccount", "") + connection_vo = Connection(raw, strict=False) + connection_id = connection_vo.connection_id + owner_account = connection_vo.owner_account link = f"https://console.aws.amazon.com/directconnect/v2/home?region={region}#/connections/arn:aws:directconnect:{region}:{owner_account}:{connection_id}" reference = self.get_reference(connection_id, link) @@ -63,8 +64,8 @@ def create_cloud_service(self, region, options, secret_data, schema): cloud_service_type=self.cloud_service_type, cloud_service_group=self.cloud_service_group, provider=self.provider, - data=connection_vo, - account=account_id, + data=connection_vo.to_primitive(), + account=options.get("account_id"), reference=reference, instance_size=bandwidth_size, instance_type=connection_vo.get("location", ""), @@ -74,17 +75,8 @@ def create_cloud_service(self, region, options, secret_data, schema): region_code=region, ) yield cloud_service - # yield { - # 'data': connection_vo, - # 'instance_size': bandwidth_size, - # 'name': connection_vo.connection_name, - # 'instance_type': connection_vo.location, - # 'account': self.account_id, - # 'tags': self.convert_tags_to_dict_type(raw.get('tags', []), key='key', value='value') - # } except Exception as e: - # resource_id = raw.get('connectionId', '') yield make_error_response( error=e, provider=self.provider, diff --git a/src/plugin/manager/direct_connect/direct_connect_gateway_manager.py b/src/plugin/manager/direct_connect/direct_connect_gateway_manager.py index 6a2ff28..1b5cb2e 100644 --- a/src/plugin/manager/direct_connect/direct_connect_gateway_manager.py +++ b/src/plugin/manager/direct_connect/direct_connect_gateway_manager.py @@ -2,6 +2,8 @@ from ..base import ResourceManager from ...conf.cloud_service_conf import * +from ...model.direct_connect import DirectConnectGateway + class DirectConnectGatewayManager(ResourceManager): cloud_service_group = "DirectConnect" @@ -27,18 +29,20 @@ def create_cloud_service_type(self): ) def create_cloud_service(self, region, options, secret_data, schema): + yield from self._collect_direct_connect_gateways(options, region) + + def _collect_direct_connect_gateways(self, options, region): results = self.connector.get_direct_connect_gateways() - account_id = self.connector.get_account_id() for raw in results.get("directConnectGateways", []): try: raw.update( { "cloudtrail": self.set_cloudtrail( - "us-east-1", None, raw["directConnectGatewayId"] + self.cloud_service_group, raw["directConnectGatewayId"], "us-east-1" ) } ) - dc_gw_vo = raw + dc_gw_vo = DirectConnectGateway(raw, strict=False) gateway_id = dc_gw_vo.get("directConnectGatewayId", "") link = f"https://console.aws.amazon.com/directconnect/v2/home?region={region}#/dxgateways/{gateway_id}" reference = self.get_reference(gateway_id, link) @@ -48,20 +52,14 @@ def create_cloud_service(self, region, options, secret_data, schema): cloud_service_type=self.cloud_service_type, cloud_service_group=self.cloud_service_group, provider=self.provider, - data=dc_gw_vo, - account=account_id, + data=dc_gw_vo.to_primitive(), + account=options.get("account_id"), reference=reference, region_code=region, ) yield cloud_service - # yield { - # "data": dc_gw_vo, - # "name": dc_gw_vo.direct_connect_gateway_name, - # "account": self.account_id, - # } except Exception as e: - # resource_id = raw.get('connectionId', '') yield make_error_response( error=e, provider=self.provider, diff --git a/src/plugin/manager/direct_connect/lag_manager.py b/src/plugin/manager/direct_connect/lag_manager.py index 648656c..0693a9a 100644 --- a/src/plugin/manager/direct_connect/lag_manager.py +++ b/src/plugin/manager/direct_connect/lag_manager.py @@ -2,6 +2,8 @@ from ..base import ResourceManager from ...conf.cloud_service_conf import * +from ...model.direct_connect import LAG + class LAGManager(ResourceManager): cloud_service_group = "DirectConnect" @@ -27,12 +29,14 @@ def create_cloud_service_type(self): ) def create_cloud_service(self, region, options, secret_data, schema): + yield from self._collect_lags(options, region) + + def _collect_lags(self, options, region): results = self.connector.get_lags() - account_id = self.connector.get_account_id() for raw in results.get("lags", []): try: raw.update( - {"cloudtrail": self.set_cloudtrail(region, None, raw["lagId"])} + {"cloudtrail": self.set_cloudtrail(self.cloud_service_group, raw["lagId"], region)} ) for lag_connection in raw.get("connections", []): @@ -43,33 +47,25 @@ def create_cloud_service(self, region, options, secret_data, schema): if bandwidth_size: lag_connection.update({"bandwidth_gbps": bandwidth_size}) - lag_vo = raw + lag_vo = LAG(raw, strict=False) lag_id = lag_vo.get("lagId", "") owner_account = lag_vo.get("ownerAccount", "") link = f"https://console.aws.amazon.com/directconnect/v2/home?region={region}#/lags/arn:aws:directconnect:{region}:{owner_account}:{lag_id}" reference = self.get_reference(lag_id, link) - # yield { - # "data": lag_vo, - # "name": lag_vo.lag_name, - # "account": self.account_id, - # "tags": self.convert_tags_to_dict_type( - # raw.get("tags", []), key="key", value="value" - # ), - # } + cloud_service = make_cloud_service( name=lag_vo.get("lagName", ""), cloud_service_type=self.cloud_service_type, cloud_service_group=self.cloud_service_group, provider=self.provider, - data=lag_vo, - account=account_id, + data=lag_vo.to_primitive(), + account=options.get("account_id"), reference=reference, region_code=region, ) yield cloud_service except Exception as e: - # resource_id = raw.get('connectionId', '') yield make_error_response( error=e, provider=self.provider, diff --git a/src/plugin/manager/direct_connect/virtual_private_gateway_manager.py b/src/plugin/manager/direct_connect/virtual_private_gateway_manager.py index ecadf5d..a445786 100644 --- a/src/plugin/manager/direct_connect/virtual_private_gateway_manager.py +++ b/src/plugin/manager/direct_connect/virtual_private_gateway_manager.py @@ -2,6 +2,8 @@ from ..base import ResourceManager from ...conf.cloud_service_conf import * +from ...model.direct_connect import VirtualPrivateGateway + class VirtualPrivateGatewayManager(ResourceManager): cloud_service_group = "DirectConnect" @@ -27,38 +29,38 @@ def create_cloud_service_type(self): ) def create_cloud_service(self, region, options, secret_data, schema): + yield from self._collect_virtual_private_gateways(options, region) + + def _collect_virtual_private_gateways(self, options, region): results = self.connector.get_private_virtual_gateways() - account_id = self.connector.get_account_id() for raw in results.get("virtualGateways", []): try: raw.update( { "cloudtrail": self.set_cloudtrail( - region, None, raw["virtualGatewayId"] + self.cloud_service_group, raw["virtualGatewayId"], region ) } ) - virtual_private_gw_vo = raw + virtual_private_gw_vo = VirtualPrivateGateway(raw, strict=False) gateway_id = virtual_private_gw_vo.get("virtualGatewayId", "") owner_account = virtual_private_gw_vo.get("ownerAccount", "") link = f"https://console.aws.amazon.com/directconnect/v2/home?region={region}#/virtual-gateways/arn:aws:ec2:{region}:{owner_account}:{gateway_id}" reference = self.get_reference(gateway_id, link) - # yield {"data": virtual_private_gw_vo, "account": self.account_id} cloud_service = make_cloud_service( name="VirtualPrivateGateway", cloud_service_type=self.cloud_service_type, cloud_service_group=self.cloud_service_group, provider=self.provider, - data=virtual_private_gw_vo, - account=account_id, + data=virtual_private_gw_vo.to_primitive(), + account=options.get("account_id"), reference=reference, region_code=region, ) yield cloud_service except Exception as e: - # resource_id = raw.get('connectionId', '') yield make_error_response( error=e, provider=self.provider, diff --git a/src/plugin/manager/documentdb/cluster_manager.py b/src/plugin/manager/documentdb/cluster_manager.py index a891797..e00eb10 100644 --- a/src/plugin/manager/documentdb/cluster_manager.py +++ b/src/plugin/manager/documentdb/cluster_manager.py @@ -2,16 +2,7 @@ from ...conf.cloud_service_conf import ASSET_URL from spaceone.inventory.plugin.collector.lib import * - -EXCLUDE_REGION = [ - "us-west-1", - "af-south-1", - "ap-east-1", - "ap-southeast-3", - "ap-northeast-3", - "eu-north-1", - "me-south-1", -] +from ...model.documentdb import Cluster class ClusterManager(ResourceManager): @@ -31,9 +22,6 @@ def __init__(self, *args, **kwargs): self._raw_snapshots = [] def create_cloud_service_type(self): - yield from self._create_parameter_group_type() - yield from self._create_subnet_group_type() - yield make_cloud_service_type( name=self.cloud_service_type, group=self.cloud_service_group, @@ -47,26 +35,19 @@ def create_cloud_service_type(self): ) def create_cloud_service(self, region, options, secret_data, schema): - if region in EXCLUDE_REGION: + if region in self.EXCLUDE_REGION.get(self.cloud_service_group, []): return {} + + yield from self._collect_clusters(options, region) + + def _collect_clusters(self, options, region): self.connector.set_account_id() self.cloud_service_type = "Cluster" - cloudwatch_namespace = "AWS/DocDB" - cloudwatch_dimension_name = "DBClusterIdentifier" - cloudtrail_resource_type = "AWS::RDS::DBCluster" self._raw_instances = self._get_instances() self._raw_snapshots = self._get_snapshots() - pre_collect_list = [ - self._create_parameter_groups, - self._create_subnet_groups, - ] - for pre_collect in pre_collect_list: - yield from pre_collect(region) - results = self.connector.get_db_clusters() - account_id = self.connector.get_account_id() for data in results: for raw in data.get("DBClusters", []): @@ -78,43 +59,33 @@ def create_cloud_service(self, region, options, secret_data, schema): { "instances": instances, "instance_count": len(instances), - "snapshots": self._match_snapshots( + "DBClusterIdentifier": self._match_snapshots( self._raw_snapshots, raw.get("DBClusterIdentifier") ), - "subnet_group": self._match_subnet_group( + "DBSubnetGroup": self._match_subnet_group( raw.get("DBSubnetGroup") ), - "parameter_group": self._match_parameter_group( + "DBClusterParameterGroup": self._match_parameter_group( raw.get("DBClusterParameterGroup") ), "cloudwatch": self.set_cloudwatch( - cloudwatch_namespace, - cloudwatch_dimension_name, + self.cloud_service_group, raw["DBClusterIdentifier"], region, ), "cloudtrail": self.set_cloudtrail( - region, - cloudtrail_resource_type, + self.cloud_service_group, raw["DBClusterIdentifier"], + region, ), } ) - if subnet_group := self._match_subnet_group( - raw.get("DBSubnetGroup") - ): - raw.update({"subnet_group": subnet_group}) - - if parameter_group := self._match_parameter_group( - raw.get("DBClusterParameterGroup") - ): - raw.update({"parameter_group": parameter_group}) + self._update_cluster_times(raw) - cluster_vo = raw - self._update_cluster_times(cluster_vo) - cluster_arn = cluster_vo.get("DBClusterArn", "") - cluster_identifier = cluster_vo.get("DBClusterIdentifier", "") + cluster_vo = Cluster(raw, strict=False) + cluster_arn = cluster_vo.db_cluster_arn + cluster_identifier = cluster_vo.db_cluster_identifier link = f"https://console.aws.amazon.com/docdb/home?region={region}#cluster-details/{cluster_identifier}" reference = self.get_reference(cluster_arn, link) @@ -123,8 +94,8 @@ def create_cloud_service(self, region, options, secret_data, schema): cloud_service_type=self.cloud_service_type, cloud_service_group=self.cloud_service_group, provider=self.provider, - data=cluster_vo, - account=account_id, + data=cluster_vo.to_primitive(), + account=options.get("account_id"), reference=reference, instance_type=cluster_vo.get("EngineVersion", ""), instance_size=float(cluster_vo.get("instance_count", 0)), @@ -143,153 +114,10 @@ def create_cloud_service(self, region, options, secret_data, schema): resource_type="inventory.CloudService", ) - def _create_parameter_group_type(self): - cloud_service_type = "ParameterGroup" - metadata_path = "metadata/documentdb/parameter.yaml" - - yield make_cloud_service_type( - name=cloud_service_type, - group=self.cloud_service_group, - provider=self.provider, - metadata_path=metadata_path, - is_primary=True, - is_major=True, - service_code="AmazonDocDB", - tags={"spaceone:icon": f"{ASSET_URL}/Amazon-DocumentDB.svg"}, - labels=["Database"], - ) - - def _create_subnet_group_type(self): - cloud_service_type = "SubnetGroup" - metadata_path = "metadata/documentdb/subnet.yaml" - - yield make_cloud_service_type( - name=cloud_service_type, - group=self.cloud_service_group, - provider=self.provider, - metadata_path=metadata_path, - is_primary=True, - is_major=True, - service_code="AmazonDocDB", - tags={"spaceone:icon": f"{ASSET_URL}/Amazon-DocumentDB.svg"}, - labels=["Database"], - ) - - def _create_parameter_groups(self, region): - cloud_service_type = "ParameterGroup" - cloudtrail_resource_type = "AWS::RDS::DBClusterParameterGroup" - - res_pgs = self.connector.get_db_cluster_parameter_groups() - account_id = self.connector.get_account_id() - - for pg_data in res_pgs.get("DBClusterParameterGroups", []): - try: - pg_data.update( - { - "cloudtrail": self.set_cloudtrail( - region, - cloudtrail_resource_type, - pg_data["DBClusterParameterGroupName"], - ), - "parameters": self.request_parameter_data( - pg_data["DBClusterParameterGroupName"] - ), - } - ) - param_group_vo = pg_data - parameter_arn = param_group_vo.get("DBClusterParameterGroupArn", "") - parameter_name = param_group_vo.get("DBClusterParameterGroupName", "") - link = f"https://console.aws.amazon.com/docdb/home?region={region}#parameterGroup-details/{parameter_name}" - reference = self.get_reference(parameter_arn, link) - - cloud_service = make_cloud_service( - name=param_group_vo.get("DBClusterParameterGroupName", ""), - cloud_service_type=self.cloud_service_type, - cloud_service_group=self.cloud_service_group, - provider=self.provider, - data=param_group_vo, - account=account_id, - reference=reference, - instance_type=param_group_vo.get("DBParameterGroupFamily", ""), - tags=self.request_tags( - param_group_vo.get("DBClusterParameterGroupArn", "") - ), - region_code=region, - ) - yield cloud_service - - except Exception as e: - yield make_error_response( - error=e, - provider=self.provider, - cloud_service_group=self.cloud_service_group, - cloud_service_type=cloud_service_type, - region_name=region, - resource_type="inventory.CloudService", - ) - - def _create_subnet_groups(self, region): - cloud_service_type = "SubnetGroup" - cloudtrail_resource_type = "AWS::RDS::DBSubnetGroup" - - response = self.connector.get_db_subnet_groups() - account_id = self.connector.get_account_id() - for data in response: - for raw in data.get("DBSubnetGroups", []): - try: - raw.update( - { - "cloudtrail": self.set_cloudtrail( - region, - cloudtrail_resource_type, - raw["DBSubnetGroupName"], - ) - } - ) - subnet_grp_vo = raw - subnet_arn = subnet_grp_vo.get("DBSubnetGroupArn", "") - subnet_name = subnet_grp_vo.get("DBClusterParameterGroupName", "") - link = f"https://console.aws.amazon.com/docdb/home?region={region}#subnetGroup-details/{subnet_name}" - reference = self.get_reference(subnet_arn, link) - - cloud_service = make_cloud_service( - name=subnet_grp_vo.get("DBSubnetGroupName", ""), - cloud_service_type=cloud_service_type, - cloud_service_group=self.cloud_service_group, - provider=self.provider, - data=subnet_grp_vo, - account=account_id, - reference=reference, - tags=self.request_tags( - subnet_grp_vo.get("DBSubnetGroupArn", "") - ), - region_code=region, - ) - yield cloud_service - - except Exception as e: - yield make_error_response( - error=e, - provider=self.provider, - cloud_service_group=self.cloud_service_group, - cloud_service_type=cloud_service_type, - region_name=region, - resource_type="inventory.CloudService", - ) - def request_tags(self, resource_arn): response = self.connector.list_tags_for_resource(resource_arn) return self.convert_tags_to_dict_type(response.get("TagList", [])) - def request_parameter_data(self, pg_name): - res_params = self.connector.describe_db_cluster_parameters(pg_name) - return list( - map( - lambda param: param, - res_params.get("Parameters", []), - ) - ) - def _match_subnet_group(self, subnet_group): for _sg in self._subnet_groups: if _sg.db_subnet_group_name == subnet_group: diff --git a/src/plugin/manager/documentdb/parameter_group_manager.py b/src/plugin/manager/documentdb/parameter_group_manager.py new file mode 100644 index 0000000..b1ab852 --- /dev/null +++ b/src/plugin/manager/documentdb/parameter_group_manager.py @@ -0,0 +1,110 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.documentdb import ParameterGroup + + +class ParameterGroupManager(ResourceManager): + cloud_service_group = "DocumentDB" + cloud_service_type = "ParameterGroup" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "DocumentDB" + self.cloud_service_type = "ParameterGroup" + self.metadata_path = "metadata/documentdb/parameter.yaml" + + def create_cloud_service_type(self): + result = [] + parameter_group_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonDocDB", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-documentdb.svg" + }, + labels=["Database"], + ) + result.append(parameter_group_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + if region in self.EXCLUDE_REGION.get(self.cloud_service_group, []): + return {} + + yield from self._collect_parameter_groups(options, region) + + def _collect_parameter_groups(self, options, region): + res_pgs = self.connector.get_db_cluster_parameter_groups() + + for pg_data in res_pgs.get("DBClusterParameterGroups", []): + try: + pg_data.update( + { + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + pg_data["DBClusterParameterGroupName"], + region, + ), + "parameters": self.request_parameter_data( + pg_data["DBClusterParameterGroupName"] + ), + } + ) + + pg_vo = ParameterGroup( + pg_data, strict=False + ) + parameter_arn = pg_vo.db_cluster_parameter_group_arn + parameter_name = pg_vo.db_cluster_parameter_group_name + link = f"https://console.aws.amazon.com/docdb/home?region={region}#parameterGroup-details/{parameter_name}" + reference = self.get_reference(parameter_arn, link) + + cloud_service = make_cloud_service( + name=parameter_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=pg_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + instance_type=pg_vo.db_parameter_group_family, + tags=self.request_tags(parameter_arn), + region_code=region, + ) + yield cloud_service + + except Exception as e: + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + resource_type="inventory.CloudService", + ) + + def request_tags(self, resource_arn): + response = self.connector.list_tags_for_resource(resource_arn) + return self.convert_tags_to_dict_type(response.get("TagList", [])) + + def request_parameter_data(self, pg_name): + res_params = self.connector.describe_db_cluster_parameters(pg_name) + return list( + map( + lambda param: param, + res_params.get("Parameters", []), + ) + ) diff --git a/src/plugin/manager/documentdb/subnet_group_manager.py b/src/plugin/manager/documentdb/subnet_group_manager.py new file mode 100644 index 0000000..4bf4b96 --- /dev/null +++ b/src/plugin/manager/documentdb/subnet_group_manager.py @@ -0,0 +1,98 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.documentdb import SubnetGroup + + +class SubnetGroupManager(ResourceManager): + cloud_service_group = "DocumentDB" + cloud_service_type = "SubnetGroup" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "DocumentDB" + self.cloud_service_type = "SubnetGroup" + self.metadata_path = "metadata/documentdb/subnet.yaml" + + def create_cloud_service_type(self): + result = [] + subnet_group_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonDocDB", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-documentdb.svg" + }, + labels=["Database"], + ) + result.append(subnet_group_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + if region in self.EXCLUDE_REGION.get(self.cloud_service_group, []): + return {} + + yield from self._collect_subnet_groups(options, region) + + def _collect_subnet_groups(self, options, region): + response = self.connector.get_db_subnet_groups() + for data in response: + for raw in data.get("DBSubnetGroups", []): + try: + raw.update( + { + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + raw["DBSubnetGroupName"], + region, + ) + } + ) + + subnet_group_vo = SubnetGroup(raw, strict=False) + + subnet_arn = subnet_group_vo.db_subnet_group_arn + subnet_name = subnet_group_vo.db_subnet_group_name + link = f"https://console.aws.amazon.com/docdb/home?region={region}#subnetGroup-details/{subnet_name}" + reference = self.get_reference(subnet_arn, link) + + cloud_service = make_cloud_service( + name=subnet_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=subnet_group_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=self.request_tags( + subnet_group_vo.get("DBSubnetGroupArn", "") + ), + region_code=region, + ) + yield cloud_service + + except Exception as e: + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + resource_type="inventory.CloudService", + ) + + def request_tags(self, resource_arn): + response = self.connector.list_tags_for_resource(resource_arn) + return self.convert_tags_to_dict_type(response.get("TagList", [])) diff --git a/src/plugin/manager/dynamodb/table_manager.py b/src/plugin/manager/dynamodb/table_manager.py index 96a8887..54c9b43 100644 --- a/src/plugin/manager/dynamodb/table_manager.py +++ b/src/plugin/manager/dynamodb/table_manager.py @@ -2,6 +2,8 @@ from plugin.manager.base import ResourceManager from plugin.conf.cloud_service_conf import * +from ...model.dynamodb import Table + class TableManager(ResourceManager): cloud_service_group = "DynamoDB" @@ -27,18 +29,15 @@ def create_cloud_service_type(self): ) def create_cloud_service(self, region, options, secret_data, schema): + yield from self._collect_tables(options, region) + + def _collect_tables(self, options, region): _auto_scaling_policies = None - cloudwatch_namespace = "AWS/DynamoDB" - cloudwatch_dimension_name = "TableName" - cloudtrail_resource_type = "AWS::DynamoDB::Table" self.connector.set_account_id() results = self.connector.get_tables() - account_id = self.connector.get_account_id() for data in results: for table_name in data.get("TableNames", []): try: - table = {} - # response = self.client.describe_table(TableName=table_name) response = self.connector.describe_table(table_name) table = response.get("Table") @@ -77,38 +76,37 @@ def create_cloud_service(self, region, options, secret_data, schema): table_name ), "cloudwatch": self.set_cloudwatch( - cloudwatch_namespace, - cloudwatch_dimension_name, + self.cloud_service_group, table["TableName"], region, ), "cloudtrail": self.set_cloudtrail( - region, - cloudtrail_resource_type, + self.cloud_service_group, table["TableName"], + region, ), } ) - table_vo = table - # Converting datetime type attributes to ISO8601 format needed to meet protobuf format - self._update_times(table_vo) + self._update_times(table) + + table_vo = Table(table, strict=False) - table_arn = table_vo.get("TableArn", "") - table_name = table_vo.get("TableName", "") + table_arn = table_vo.table_arn + table_name = table_vo.table_name link = f"https://console.aws.amazon.com/dynamodb/home?region={region}#tables:selected={table_name};tab=overview" reference = self.get_reference(table_arn, link) cloud_service = make_cloud_service( - name=table_vo.get("TableName", ""), + name=table_name, cloud_service_type=self.cloud_service_type, cloud_service_group=self.cloud_service_group, provider=self.provider, - data=table_vo, - account=account_id, + data=table_vo.to_primitive(), + account=options.get("account_id"), reference=reference, - instance_size=float(table_vo.get("TableSizeBytes", 0)), - tags=self.request_tags(table_vo.get("TableArn", "")), + instance_size=float(table_vo.table_size_bytes), + tags=self.request_tags(table_arn), region_code=region, ) yield cloud_service diff --git a/src/plugin/manager/ebs/__init__.py b/src/plugin/manager/ebs/__init__.py new file mode 100644 index 0000000..591aafc --- /dev/null +++ b/src/plugin/manager/ebs/__init__.py @@ -0,0 +1,3 @@ +from .snapshot_manager import SnapshotManager +from .volume_manager import VolumeManager + diff --git a/src/plugin/manager/ebs/snapshot_manager.py b/src/plugin/manager/ebs/snapshot_manager.py new file mode 100644 index 0000000..66c2d47 --- /dev/null +++ b/src/plugin/manager/ebs/snapshot_manager.py @@ -0,0 +1,125 @@ +# from typing import List +# +# from spaceone.inventory.plugin.collector.lib import ( +# make_cloud_service_type, +# make_cloud_service, +# make_error_response, +# ) +# +# from ..base import ResourceManager, _LOGGER +# from ...model.ebs import Snapshot +# +# +# class SnapshotManager(ResourceManager): +# cloud_service_group = "EC2" +# cloud_service_type = "Snapshot" +# +# def __init__(self, *args, **kwargs): +# super().__init__(*args, **kwargs) +# self.cloud_service_group = "EC2" +# self.cloud_service_type = "Snapshot" +# self.metadata_path = "metadata/ebs/snapshot.yaml" +# +# def create_cloud_service_type(self): +# result = [] +# snapshot_cst_result = make_cloud_service_type( +# name=self.cloud_service_type, +# group=self.cloud_service_group, +# provider=self.provider, +# metadata_path=self.metadata_path, +# is_primary=True, +# is_major=True, +# service_code="AmazonEC2", +# tags={ +# "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-ebs.svg" +# }, +# labels=["Storage"], +# ) +# result.append(snapshot_cst_result) +# return result +# +# def create_cloud_service( +# self, region: str, options: dict, secret_data: dict, schema: str +# ): +# yield from self._collect_snapshots(options, region) +# +# def _collect_snapshots(self, options, region): +# cloudtrail_resource_type = 'AWS::EC2::Snapshot' +# +# try: +# snapshots, account_id = self.connector.list_ebs_snapshots() +# +# for snapshot in snapshots: +# try: +# snapshot_id = snapshot.get("SnapshotId") +# +# if name := self._get_name_from_tags(snapshot.get("Tags", [])): +# snapshot['name'] = name +# +# snapshot.update({ +# 'cloudtrail': self.set_cloudtrail(region, cloudtrail_resource_type, snapshot['SnapshotId']), +# 'arn': self.generate_arn(service="ec2", region=region, +# account_id=options.get("account_ud"), resource_type="snapshot", +# resource_id=snapshot.get('SnapshotId')) +# }) +# +# if kms_arn := snapshot.get('KmsKeyId'): +# snapshot.update({ +# 'kms_key_arn': kms_arn, +# 'kms_key_id': self._get_kms_key_id(kms_arn) +# }) +# +# link = f"https://{region}.console.aws.amazon.com/ec2/home?region={region}#Snapshots:search={snapshot_id}" +# resource_id = snapshot_id +# reference = self.get_reference(resource_id, link) +# +# snapshot_vo = Snapshot(snapshot, strict=False) +# cloud_service = make_cloud_service( +# name=snapshot_id, +# cloud_service_type=self.cloud_service_type, +# cloud_service_group=self.cloud_service_group, +# provider=self.provider, +# data=snapshot_vo.to_primitive(), +# account=options.get("account_id"), +# reference=reference, +# tags=snapshot.tags, +# region_code=region, +# ) +# yield cloud_service +# +# except Exception as e: +# _LOGGER.error( +# f'[list_ebs_snapshots] [{snapshot.get("SnapshotId")}] {e}' +# ) +# yield make_error_response( +# error=e, +# provider=self.provider, +# cloud_service_group=self.cloud_service_group, +# cloud_service_type=self.cloud_service_type, +# region_name=region, +# ) +# +# except Exception as e: +# _LOGGER.error(f"[list_ebs_snapshots] [{region_name}] {e}") +# yield make_error_response( +# error=e, +# provider=self.provider, +# cloud_service_group=self.cloud_service_group, +# cloud_service_type=self.cloud_service_type, +# region_name=region, +# ) +# +# @staticmethod +# def _get_name_from_tags(tags): +# for _tag in tags: +# if 'Name' in _tag.get('Key'): +# return _tag.get('Value') +# +# return None +# +# @staticmethod +# def _get_kms_key_id(kms_arn): +# try: +# return kms_arn.split('/')[1] +# except IndexError: +# return '' diff --git a/src/plugin/manager/ebs/volume_manager.py b/src/plugin/manager/ebs/volume_manager.py new file mode 100644 index 0000000..2767359 --- /dev/null +++ b/src/plugin/manager/ebs/volume_manager.py @@ -0,0 +1,149 @@ +# from typing import List +# +# from spaceone.inventory.plugin.collector.lib import ( +# make_cloud_service_type, +# make_cloud_service, +# make_error_response, +# ) +# +# from ..base import ResourceManager, _LOGGER +# from ...model.ebs import Volume +# +# +# class VolumeManager(ResourceManager): +# cloud_service_group = "EBS" +# cloud_service_type = "Volume" +# +# def __init__(self, *args, **kwargs): +# super().__init__(*args, **kwargs) +# self.cloud_service_group = "EBS" +# self.cloud_service_type = "Volume" +# self.metadata_path = "metadata/ebs/volume.yaml" +# +# def create_cloud_service_type(self): +# result = [] +# volume_cst_result = make_cloud_service_type( +# name=self.cloud_service_type, +# group=self.cloud_service_group, +# provider=self.provider, +# metadata_path=self.metadata_path, +# is_primary=True, +# is_major=True, +# service_code="AmazonEC2", +# tags={ +# "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-ebs.svg" +# }, +# labels=["Storage"], +# ) +# result.append(volume_cst_result) +# return result +# +# def create_cloud_service( +# self, region: str, options: dict, secret_data: dict, schema: str +# ): +# yield from self._collect_volumes(options, region) +# +# def _collect_volumes(self, options, region): +# region_name = region +# cloudtrail_resource_type = "AWS::EC2::Volume" +# +# try: +# volumes, account_id = self.connector.list_ebs_volumes() +# +# for volume in volumes: +# try: +# volume_id = volume.get("VolumeId") +# +# # Get volume tags +# tags = self._get_volume_tags(volume_id) +# +# # Get volume attributes +# attributes = self._get_volume_attributes(volume_id) +# +# volume_data = { +# "volume_id": volume_id, +# "size": volume.get("Size", 0), +# "snapshot_id": volume.get("SnapshotId", ""), +# "availability_zone": volume.get("AvailabilityZone", ""), +# "state": volume.get("State", ""), +# "create_time": volume.get("CreateTime"), +# "volume_type": volume.get("VolumeType", ""), +# "iops": volume.get("Iops", 0), +# "encrypted": volume.get("Encrypted", False), +# "kms_key_id": volume.get("KmsKeyId", ""), +# "throughput": volume.get("Throughput", 0), +# "outpost_arn": volume.get("OutpostArn", ""), +# "multi_attach_enabled": volume.get("MultiAttachEnabled", False), +# "fast_restored": volume.get("FastRestored", False), +# "attachments": volume.get("Attachments", []), +# "attributes": attributes, +# } +# +# volume_data.update( +# { +# "region_code": region_name, +# "account": account_id, +# "tags": self.convert_tags(tags), +# } +# ) +# +# link = f"https://{region}.console.aws.amazon.com/ec2/home?region={region}#Volumes:search={volume_id}" +# resource_id = volume_id +# reference = self.get_reference(resource_id, link) +# +# volume_vo = Volume(volume_data, strict=False) +# cloud_service = make_cloud_service( +# name=volume_id, +# cloud_service_type=self.cloud_service_type, +# cloud_service_group=self.cloud_service_group, +# provider=self.provider, +# data=volume_vo.to_primitive(), +# account=options.get("account_id"), +# reference=reference, +# tags=volume_data.get("tags", {}), +# region_code=region, +# ) +# yield cloud_service +# +# except Exception as e: +# _LOGGER.error(f'[list_ebs_volumes] [{volume.get("VolumeId")}] {e}') +# yield make_error_response( +# error=e, +# provider=self.provider, +# cloud_service_group=self.cloud_service_group, +# cloud_service_type=self.cloud_service_type, +# region_name=region, +# ) +# +# except Exception as e: +# _LOGGER.error(f"[list_ebs_volumes] [{region_name}] {e}") +# yield make_error_response( +# error=e, +# provider=self.provider, +# cloud_service_group=self.cloud_service_group, +# cloud_service_type=self.cloud_service_type, +# region_name=region, +# ) +# +# def _get_volume_tags(self, volume_id): +# """Get volume tags""" +# try: +# return self.connector.get_volume_tags(volume_id) +# except Exception as e: +# _LOGGER.warning(f"Failed to get tags for volume {volume_id}: {e}") +# return [] +# +# def _get_volume_attributes(self, volume_id): +# """Get volume attributes""" +# try: +# return self.connector.get_volume_attributes(volume_id) +# except Exception as e: +# _LOGGER.warning(f"Failed to get attributes for volume {volume_id}: {e}") +# return {} +# +# def convert_tags(self, tags): +# """Convert tags to dictionary format""" +# dict_tags = {} +# for tag in tags: +# dict_tags[tag.get("Key")] = tag.get("Value") +# return dict_tags diff --git a/src/plugin/manager/ec2/ami_manager.py b/src/plugin/manager/ec2/ami_manager.py index 7a5e046..67765f2 100644 --- a/src/plugin/manager/ec2/ami_manager.py +++ b/src/plugin/manager/ec2/ami_manager.py @@ -34,8 +34,10 @@ def create_cloud_service_type(self) -> List[dict]: return result def create_cloud_service(self, region, options, secret_data, schema): + yield from self._collect_amis(options, region) + + def _collect_amis(self, options, region): self.cloud_service_type = "AMI" - cloudtrail_resource_type = "AWS::EC2::Ami" results = self.connector.get_ami_images() account_id = options.get("account_id", "") self.connector.load_account_id(account_id) @@ -63,7 +65,7 @@ def create_cloud_service(self, region, options, secret_data, schema): { "Platform": platform if platform else "Other Linux", "Cloudtrail": self.set_cloudtrail( - region, cloudtrail_resource_type, image["ImageId"] + self.cloud_service_group, image["ImageId"], region ), } ) @@ -78,7 +80,7 @@ def create_cloud_service(self, region, options, secret_data, schema): provider=self.provider, data=image_vo, instance_type=image_vo.get("ImageType", ""), - account=account_id, + account=options.get("account_id"), tags=self.convert_tags_to_dict_type(image.get("Tags", [])), reference=reference, region_code=region, diff --git a/src/plugin/manager/ec2/auto_scaling_group_manager.py b/src/plugin/manager/ec2/auto_scaling_group_manager.py index aca7c7c..e4d28e9 100644 --- a/src/plugin/manager/ec2/auto_scaling_group_manager.py +++ b/src/plugin/manager/ec2/auto_scaling_group_manager.py @@ -54,10 +54,10 @@ def create_cloud_service_type(self): return cloud_service_type_results def create_cloud_service(self, region, options, secret_data, schema): + yield from self._collect_auto_scaling_groups(options, region) + + def _collect_auto_scaling_groups(self, options, region): self.cloud_service_type = "AutoScalingGroup" - cloudwatch_namespace = "AWS/AutoScaling" - cloudwatch_dimension_name = "AutoScalingGroupName" - cloudtrail_resource_type = "AWS::AutoScaling::AutoScalingGroup" account_id = options.get("account_id", "") self.connector.load_account_id(account_id) pre_collect_list = [ @@ -129,15 +129,14 @@ def create_cloud_service(self, region, options, secret_data, schema): raw.get("Instances", []) ), "cloudwatch": self.set_cloudwatch( - cloudwatch_namespace, - cloudwatch_dimension_name, + self.cloud_service_group, raw["AutoScalingGroupName"], region, ), "cloudtrail": self.set_cloudtrail( - region, - cloudtrail_resource_type, + self.cloud_service_group, raw["AutoScalingGroupName"], + region, ), } ) @@ -229,7 +228,7 @@ def create_cloud_service(self, region, options, secret_data, schema): cloud_service_group=self.cloud_service_group, provider=self.provider, data=auto_scaling_group_vo, - account=account_id, + account=options.get("account_id"), tags=self.convert_tags_to_dict_type(raw.get("Tags", [])), region_code=region, reference=reference, @@ -449,7 +448,6 @@ def _create_launch_configurations(self, region): response = self.connector.get_launch_configurations() self.connector.set_account_id() - account_id = self.connector.get_account_id() result_list = [] for data in response: for raw in data.get("LaunchConfigurations", []): @@ -457,9 +455,9 @@ def _create_launch_configurations(self, region): raw.update( { "cloudtrail": self.set_cloudtrail( - region, - cloudtrail_resource_type, + self.cloud_service_group, raw["LaunchConfigurationName"], + region, ) } ) @@ -482,7 +480,7 @@ def _create_launch_configurations(self, region): cloud_service_group=self.cloud_service_group, provider=self.provider, data=launch_configuration_vo, - account=account_id, + account=options.get("account_id"), region_code=region, reference=reference, ) @@ -540,9 +538,9 @@ def _create_launch_templates(self, region, account_id): + str(match_lt_version.get("VersionNumber")), ), "cloudtrail": self.set_cloudtrail( - region, - cloudtrail_resource_type, + self.cloud_service_group, raw["LaunchTemplateName"], + region, ), } ) @@ -563,7 +561,7 @@ def _create_launch_templates(self, region, account_id): cloud_service_group=self.cloud_service_group, provider=self.provider, data=launch_template_vo, - account=account_id, + account=options.get("account_id"), tags=self.convert_tags_to_dict_type(raw.get("Tags", [])), region_code=region, reference=reference, diff --git a/src/plugin/manager/ec2/eip_manager.py b/src/plugin/manager/ec2/eip_manager.py index 3f2e0da..2cdf002 100644 --- a/src/plugin/manager/ec2/eip_manager.py +++ b/src/plugin/manager/ec2/eip_manager.py @@ -33,7 +33,9 @@ def create_cloud_service_type(self): return result def create_cloud_service(self, region, options, secret_data, schema): - cloudtrail_resource_type = "AWS::EC2::EIP" + yield from self._collect_eips(options, region) + + def _collect_eips(self, options, region): results = self.connector.get_addresses() account_id = options.get("account_id", "") self.connector.load_account_id(account_id) @@ -71,7 +73,7 @@ def create_cloud_service(self, region, options, secret_data, schema): ), "name": self._get_name_from_tags(_ip.get("Tags", [])), "cloudtrail": self.set_cloudtrail( - region, cloudtrail_resource_type, _ip["AllocationId"] + self.cloud_service_group, _ip["AllocationId"], region ), } ) @@ -88,7 +90,7 @@ def create_cloud_service(self, region, options, secret_data, schema): cloud_service_group=self.cloud_service_group, provider=self.provider, data=eip_vo, - account=account_id, + account=options.get("account_id"), tags=self.convert_tags_to_dict_type(_ip.get("Tags", [])), region_code=region, reference=reference, diff --git a/src/plugin/manager/ec2/instance_manager.py b/src/plugin/manager/ec2/instance_manager.py index 3dcc7e7..c1757c0 100644 --- a/src/plugin/manager/ec2/instance_manager.py +++ b/src/plugin/manager/ec2/instance_manager.py @@ -41,9 +41,11 @@ def create_cloud_service_type(self): def create_cloud_service( self, region: str, options: dict, secret_data: dict, schema: str ): + yield from self._collect_instances(options, region) + + def _collect_instances(self, options, region): # meta_manager: MetadataManager = MetadataManager() region_name = region - cloudtrail_resource_type = "AWS::EC2::Instance" instance_filter = {} # Instance list and account ID @@ -185,11 +187,11 @@ def create_cloud_service( {"ip_addresses": self.merge_ip_addresses(server_data)} ) - server_data["data"]["cloudwatch"] = cw_manager.set_cloudwatch_info( - instance_id, region_name + server_data["data"]["cloudwatch"] = self.set_cloudwatch( + self.cloud_service_group, instance_id, region_name ) server_data["data"]["cloudtrail"] = self.set_cloudtrail( - region_name, cloudtrail_resource_type, instance_id + self.cloud_service_group, instance_id, region_name ) server_data["data"]["compute"]["account"] = account_id server_data["account"] = account_id @@ -205,7 +207,7 @@ def create_cloud_service( provider=self.provider, ip_addresses=server_data["ip_addresses"], data=server_data["data"], - account=account_id, + account=options.get("account_id"), reference=reference, instance_type=server_data.get("instance_type", ""), instance_size=float(server_data.get("instance_size", 0)), diff --git a/src/plugin/manager/ec2/security_group_manager.py b/src/plugin/manager/ec2/security_group_manager.py index 388da2d..cb6db53 100644 --- a/src/plugin/manager/ec2/security_group_manager.py +++ b/src/plugin/manager/ec2/security_group_manager.py @@ -1,7 +1,11 @@ import copy from spaceone.inventory.plugin.collector.lib import * from ..base import ResourceManager -from ...conf.cloud_service_conf import ASSET_URL, INSTANCE_FILTERS, DEFAULT_VULNERABLE_PORTS +from ...conf.cloud_service_conf import ( + ASSET_URL, + INSTANCE_FILTERS, + DEFAULT_VULNERABLE_PORTS, +) from plugin.error.custom import ERROR_VULNERABLE_PORTS @@ -34,8 +38,9 @@ def create_cloud_service_type(self): return result def create_cloud_service(self, region, options, secret_data, schema): - cloudtrail_resource_type = "AWS::EC2::SecurityGroup" + yield from self._collect_security_groups(options, region) + def _collect_security_groups(self, options, region): # If Port Filter Option Exist vulnerable_ports = options.get("vulnerable_ports") @@ -66,7 +71,10 @@ def create_cloud_service(self, region, options, secret_data, schema): in_rule_copy = copy.deepcopy(in_rule) inbound_rules.append( self.custom_security_group_inbound_rule_info( - in_rule_copy, _ip_range, "ip_ranges",vulnerable_ports + in_rule_copy, + _ip_range, + "ip_ranges", + vulnerable_ports, ) ) @@ -85,7 +93,10 @@ def create_cloud_service(self, region, options, secret_data, schema): in_rule_copy = copy.deepcopy(in_rule) inbound_rules.append( self.custom_security_group_inbound_rule_info( - in_rule_copy, _ip_v6_range, "ipv6_ranges",vulnerable_ports + in_rule_copy, + _ip_v6_range, + "ipv6_ranges", + vulnerable_ports, ) ) @@ -93,7 +104,10 @@ def create_cloud_service(self, region, options, secret_data, schema): in_rule_copy = copy.deepcopy(in_rule) inbound_rules.append( self.custom_security_group_inbound_rule_info( - in_rule_copy, prefix_list_id, "prefix_list_ids",vulnerable_ports + in_rule_copy, + prefix_list_id, + "prefix_list_ids", + vulnerable_ports, ) ) @@ -144,7 +158,7 @@ def create_cloud_service(self, region, options, secret_data, schema): "ip_permissions_egress": outbound_rules, "instances": match_instances, "cloudtrail": self.set_cloudtrail( - region, cloudtrail_resource_type, raw["GroupId"] + self.cloud_service_group, raw["GroupId"], region ), "stats": {"instances_count": len(match_instances)}, } @@ -161,7 +175,7 @@ def create_cloud_service(self, region, options, secret_data, schema): cloud_service_group=self.cloud_service_group, provider=self.provider, data=sg_vo, - account=account_id, + account=options.get("account_id"), tags=self.convert_tags_to_dict_type(raw.get("Tags", [])), region_code=region, reference=reference, @@ -184,18 +198,22 @@ def create_cloud_service(self, region, options, secret_data, schema): region_name=region, ) - def custom_security_group_inbound_rule_info(self, raw_rule, remote, remote_type, vulnerable_ports): + def custom_security_group_inbound_rule_info( + self, raw_rule, remote, remote_type, vulnerable_ports + ): raw_rule = self.custom_security_group_rule_info(raw_rule, remote, remote_type) protocol_display = raw_rule.get("protocol_display") if vulnerable_ports: - ports = self._get_vulnerable_ports(protocol_display, raw_rule, vulnerable_ports) + ports = self._get_vulnerable_ports( + protocol_display, raw_rule, vulnerable_ports + ) raw_rule.update( { "vulnerable_ports": ports, - "detected_vulnerable_ports": True if ports else False + "detected_vulnerable_ports": True if ports else False, } ) @@ -331,7 +349,9 @@ def get_instance_name_from_tags(instance): return "" @staticmethod - def _get_vulnerable_ports(protocol_display: str, raw_rule: dict, vulnerable_ports: str): + def _get_vulnerable_ports( + protocol_display: str, raw_rule: dict, vulnerable_ports: str + ): try: ports = [] diff --git a/src/plugin/manager/ec2/snapshot_manager.py b/src/plugin/manager/ec2/snapshot_manager.py index 8d94588..b4f7999 100644 --- a/src/plugin/manager/ec2/snapshot_manager.py +++ b/src/plugin/manager/ec2/snapshot_manager.py @@ -33,7 +33,9 @@ def create_cloud_service_type(self): return result def create_cloud_service(self, region, options, secret_data, schema): - cloudtrail_resource_type = "AWS::EC2::Snapshot" + yield from self._collect_snapshots(options, region) + + def _collect_snapshots(self, options, region): account_id = options.get("account_id", "") self.connector.load_account_id(account_id) results = self.connector.get_snapshots() @@ -46,7 +48,7 @@ def create_cloud_service(self, region, options, secret_data, schema): raw.update( { "cloudtrail": self.set_cloudtrail( - region, cloudtrail_resource_type, raw["SnapshotId"] + self.cloud_service_group, raw["SnapshotId"], region ), "arn": self.generate_arn( service="ec2", @@ -81,7 +83,7 @@ def create_cloud_service(self, region, options, secret_data, schema): instance_size=float(snapshot_vo.get("VolumeSize", 0)), provider=self.provider, data=snapshot_vo, - account=account_id, + account=options.get("account_id"), tags=self.convert_tags_to_dict_type(raw.get("Tags", [])), region_code=region, reference=reference, @@ -130,6 +132,8 @@ def _update_times(self, snapshot_info: dict) -> None: snapshot_info.update( { "StartTime": self.datetime_to_iso8601(snapshot_info.get("StartTime")), - "CompletionTime": self.datetime_to_iso8601(snapshot_info.get("CompletionTime")), + "CompletionTime": self.datetime_to_iso8601( + snapshot_info.get("CompletionTime") + ), } ) diff --git a/src/plugin/manager/ec2/volume_manager.py b/src/plugin/manager/ec2/volume_manager.py index 5c0e55d..ac10d75 100644 --- a/src/plugin/manager/ec2/volume_manager.py +++ b/src/plugin/manager/ec2/volume_manager.py @@ -34,11 +34,11 @@ def create_cloud_service_type(self): return result def create_cloud_service(self, region, options, secret_data, schema): - cloudtrail_resource_type = "AWS::EC2::Volume" + yield from self._collect_volumes(options, region) + + def _collect_volumes(self, options, region): account_id = options.get("account_id", "") self.connector.load_account_id(account_id) - cloudwatch_namespace = "AWS/EBS" - cloudwatch_dimension_name = "VolumeId" results = self.connector.get_volumes() for data in results: @@ -54,13 +54,12 @@ def create_cloud_service(self, region, options, secret_data, schema): { "attribute": attr, "cloudwatch": self.set_cloudwatch( - cloudwatch_namespace, - cloudwatch_dimension_name, + self.cloud_service_group, raw["VolumeId"], region, ), "cloudtrail": self.set_cloudtrail( - region, cloudtrail_resource_type, raw["VolumeId"] + self.cloud_service_group, raw["VolumeId"], region ), "size": self.get_size_gb_to_bytes(raw.get("Size", 0)), "arn": self.generate_arn( @@ -101,7 +100,7 @@ def create_cloud_service(self, region, options, secret_data, schema): instance_size=float(volume_vo.get("size", 0)), provider=self.provider, data=volume_vo, - account=account_id, + account=options.get("account_id"), tags=self.convert_tags_to_dict_type(raw.get("Tags", [])), region_code=region, reference=reference, diff --git a/src/plugin/manager/ec2_server/load_balancer_manager.py b/src/plugin/manager/ec2_server/load_balancer_manager.py index 57c8758..ff61c2d 100644 --- a/src/plugin/manager/ec2_server/load_balancer_manager.py +++ b/src/plugin/manager/ec2_server/load_balancer_manager.py @@ -91,7 +91,7 @@ def match_target_groups(target_groups, instance_id, instance_ip): for target_group in target_groups: target_group_arn = target_group.get("TargetGroupArn") - target_type = target_group.get("TargetType") # instance | ip | lambda + target_type = target_group.get("TargetType") # instance | ip | lambda_model for th in target_group.get("target_healths"): target = th.get("Target", {}) diff --git a/src/plugin/manager/ecr/__init__.py b/src/plugin/manager/ecr/__init__.py index e69de29..97b6268 100644 --- a/src/plugin/manager/ecr/__init__.py +++ b/src/plugin/manager/ecr/__init__.py @@ -0,0 +1,2 @@ +from .repository_manager import RepositoryManager + diff --git a/src/plugin/manager/ecr/repository_manager.py b/src/plugin/manager/ecr/repository_manager.py new file mode 100644 index 0000000..e7c1e79 --- /dev/null +++ b/src/plugin/manager/ecr/repository_manager.py @@ -0,0 +1,113 @@ +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.ecr import Repository, Image + + +class RepositoryManager(ResourceManager): + cloud_service_group = "ECR" + cloud_service_type = "Repository" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "ECR" + self.cloud_service_type = "Repository" + self.metadata_path = "metadata/ecr/repository.yaml" + + def create_cloud_service_type(self): + result = [] + repository_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonECR", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-ecr.svg" + }, + labels=["Container"], + ) + result.append(repository_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_repositories(options, region) + + def _collect_repositories(self, options, region): + region_name = region + + for result in self.connector.describe_repositories(): + for repository in result.get('repositories', []): + try: + repository.update({ + 'images': list(self._describe_images(repository)), + 'cloudtrail': self.set_cloudtrail(self.cloud_service_group, + repository['repositoryName'], region_name) + }) + + repository_vo = Repository(repository, strict=False) + + + repository_name = repository_vo.repository_name + link = f"https://{region}.console.aws.amazon.com/ecr/repositories?region={region}#/repository/{repository_name}" + resource_id = repository_vo.repository_arn + reference = self.get_reference(resource_id, link) + + cloud_service = make_cloud_service( + name=repository_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=repository_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=self.connector.list_tags_for_resource(resource_id), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_ecr_repositories] [{repository.get("RepositoryName")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _describe_images(self, repo): + for result in self.connector.describe_images(): + for image in result.get('imageDetails', []): + image.update({ + # 'image_size_in_megabytes': f'{float(raw["imageSizeInBytes"] / 1000000):.2f}', + 'image_tags_display': self._generate_image_tags_display(image.get('imageTags', [])), + 'image_uri': self._generate_image_uri(repo.get("repositoryUri", ''), image.get("imageTags", [])) + }) + + res = Image(image, strict=False) + yield res + + @staticmethod + def _generate_image_uri(repo_uri, image_tags): + if image_tags: + return f'{repo_uri}:{image_tags[0]}' + else: + return repo_uri + + @staticmethod + def _generate_image_tags_display(image_tags): + if image_tags: + return image_tags + else: + return [''] diff --git a/src/plugin/manager/ecs/__init__.py b/src/plugin/manager/ecs/__init__.py index e69de29..2c5c8b2 100644 --- a/src/plugin/manager/ecs/__init__.py +++ b/src/plugin/manager/ecs/__init__.py @@ -0,0 +1,2 @@ +from .cluster_manager import ClusterManager + diff --git a/src/plugin/manager/ecs/cluster_manager.py b/src/plugin/manager/ecs/cluster_manager.py new file mode 100644 index 0000000..7882963 --- /dev/null +++ b/src/plugin/manager/ecs/cluster_manager.py @@ -0,0 +1,198 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.ecs import Cluster + + +class ClusterManager(ResourceManager): + cloud_service_group = "ECS" + cloud_service_type = "Cluster" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "ECS" + self.cloud_service_type = "Cluster" + self.metadata_path = "metadata/ecs/cluster.yaml" + + def create_cloud_service_type(self): + result = [] + cluster_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonECS", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-ecs.svg" + }, + labels=["Container"], + ) + result.append(cluster_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_clusters(options, region) + + def _collect_clusters(self, options, region): + region_name = region + + try: + clusters, account_id = self.connector.list_ecs_clusters() + + for cluster in clusters: + try: + cluster_name = cluster.get("ClusterName") + cluster_arn = cluster.get("ClusterArn") + + # Get cluster tags + tags = self._get_cluster_tags(cluster_arn) + + # Get cluster services + services = self._get_cluster_services(cluster_name) + + # Get cluster tasks + tasks = self._get_cluster_tasks(cluster_name) + + # Get cluster container instances + container_instances = self._get_cluster_container_instances( + cluster_name + ) + + cluster_data = { + "cluster_name": cluster_name, + "cluster_arn": cluster_arn, + "status": cluster.get("Status", ""), + "running_tasks_count": cluster.get("RunningTasksCount", 0), + "pending_tasks_count": cluster.get("PendingTasksCount", 0), + "active_services_count": cluster.get("ActiveServicesCount", 0), + "registered_container_instances_count": cluster.get( + "RegisteredContainerInstancesCount", 0 + ), + "running_tasks_count": cluster.get("RunningTasksCount", 0), + "pending_tasks_count": cluster.get("PendingTasksCount", 0), + "active_services_count": cluster.get("ActiveServicesCount", 0), + "statistics": cluster.get("Statistics", []), + "tags": cluster.get("Tags", []), + "settings": cluster.get("Settings", []), + "capacity_providers": cluster.get("CapacityProviders", []), + "default_capacity_provider_strategy": cluster.get( + "DefaultCapacityProviderStrategy", [] + ), + "cluster_service_connect_defaults": cluster.get( + "ClusterServiceConnectDefaults", {} + ), + "attachments": cluster.get("Attachments", []), + "attachments_status": cluster.get("AttachmentsStatus", ""), + "services": services, + "tasks": tasks, + "container_instances": container_instances, + } + + cluster_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + cluster_name, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + cluster_name, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/ecs/home?region={region}#/clusters/{cluster_name}" + resource_id = cluster_arn + reference = self.get_reference(resource_id, link) + + cluster_vo = Cluster(cluster_data, strict=False) + cloud_service = make_cloud_service( + name=cluster_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=cluster_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=cluster_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_ecs_clusters] [{cluster.get("ClusterName")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_ecs_clusters] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_cluster_tags(self, cluster_arn): + """Get cluster tags""" + try: + return self.connector.get_cluster_tags(cluster_arn) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for cluster {cluster_arn}: {e}") + return [] + + def _get_cluster_services(self, cluster_name): + """Get cluster services""" + try: + return self.connector.get_cluster_services(cluster_name) + except Exception as e: + _LOGGER.warning(f"Failed to get services for cluster {cluster_name}: {e}") + return [] + + def _get_cluster_tasks(self, cluster_name): + """Get cluster tasks""" + try: + return self.connector.get_cluster_tasks(cluster_name) + except Exception as e: + _LOGGER.warning(f"Failed to get tasks for cluster {cluster_name}: {e}") + return [] + + def _get_cluster_container_instances(self, cluster_name): + """Get cluster container instances""" + try: + return self.connector.get_cluster_container_instances(cluster_name) + except Exception as e: + _LOGGER.warning( + f"Failed to get container instances for cluster {cluster_name}: {e}" + ) + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/efs/__init__.py b/src/plugin/manager/efs/__init__.py index e69de29..0f6942b 100644 --- a/src/plugin/manager/efs/__init__.py +++ b/src/plugin/manager/efs/__init__.py @@ -0,0 +1,2 @@ +from .file_system_manager import FileSystemManager + diff --git a/src/plugin/manager/efs/file_system_manager.py b/src/plugin/manager/efs/file_system_manager.py new file mode 100644 index 0000000..3477aee --- /dev/null +++ b/src/plugin/manager/efs/file_system_manager.py @@ -0,0 +1,185 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.efs import FileSystem + + +class FileSystemManager(ResourceManager): + cloud_service_group = "EFS" + cloud_service_type = "FileSystem" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "EFS" + self.cloud_service_type = "FileSystem" + self.metadata_path = "metadata/efs/file_system.yaml" + + def create_cloud_service_type(self): + result = [] + file_system_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonEFS", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-efs.svg" + }, + labels=["Storage"], + ) + result.append(file_system_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_file_systems(options, region) + + def _collect_file_systems(self, options, region): + region_name = region + + try: + file_systems, account_id = self.connector.list_efs_file_systems() + + for file_system in file_systems: + try: + file_system_id = file_system.get("FileSystemId") + + # Get file system tags + tags = self._get_file_system_tags(file_system_id) + + # Get mount targets + mount_targets = self._get_file_system_mount_targets(file_system_id) + + # Get access points + access_points = self._get_file_system_access_points(file_system_id) + + file_system_data = { + "file_system_id": file_system_id, + "creation_token": file_system.get("CreationToken", ""), + "creation_time": file_system.get("CreationTime"), + "life_cycle_state": file_system.get("LifeCycleState", ""), + "name": file_system.get("Name", ""), + "number_of_mount_targets": file_system.get( + "NumberOfMountTargets", 0 + ), + "owner_id": file_system.get("OwnerId", ""), + "size_in_bytes": file_system.get("SizeInBytes", {}), + "performance_mode": file_system.get("PerformanceMode", ""), + "encrypted": file_system.get("Encrypted", False), + "kms_key_id": file_system.get("KmsKeyId", ""), + "throughput_mode": file_system.get("ThroughputMode", ""), + "provisioned_throughput_in_mibps": file_system.get( + "ProvisionedThroughputInMibps", 0 + ), + "availability_zone_name": file_system.get( + "AvailabilityZoneName", "" + ), + "availability_zone_id": file_system.get( + "AvailabilityZoneId", "" + ), + "tags": file_system.get("Tags", []), + "mount_targets": mount_targets, + "access_points": access_points, + } + + file_system_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + file_system_id, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + file_system_id, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/efs/home?region={region}#/file-systems/{file_system_id}" + resource_id = file_system_id + reference = self.get_reference(resource_id, link) + + file_system_vo = FileSystem(file_system_data, strict=False) + cloud_service = make_cloud_service( + name=file_system_id, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=file_system_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=file_system_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_efs_file_systems] [{file_system.get("FileSystemId")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_efs_file_systems] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_file_system_tags(self, file_system_id): + """Get file system tags""" + try: + return self.connector.get_file_system_tags(file_system_id) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for file system {file_system_id}: {e}") + return [] + + def _get_file_system_mount_targets(self, file_system_id): + """Get file system mount targets""" + try: + return self.connector.get_file_system_mount_targets(file_system_id) + except Exception as e: + _LOGGER.warning( + f"Failed to get mount targets for file system {file_system_id}: {e}" + ) + return [] + + def _get_file_system_access_points(self, file_system_id): + """Get file system access points""" + try: + return self.connector.get_file_system_access_points(file_system_id) + except Exception as e: + _LOGGER.warning( + f"Failed to get access points for file system {file_system_id}: {e}" + ) + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/eip/__init__.py b/src/plugin/manager/eip/__init__.py index e69de29..c6b4113 100644 --- a/src/plugin/manager/eip/__init__.py +++ b/src/plugin/manager/eip/__init__.py @@ -0,0 +1,2 @@ +from .eip_manager import EIPManager + diff --git a/src/plugin/manager/eip/eip_manager.py b/src/plugin/manager/eip/eip_manager.py new file mode 100644 index 0000000..5d4ee98 --- /dev/null +++ b/src/plugin/manager/eip/eip_manager.py @@ -0,0 +1,149 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.eip import EIP + + +class EIPManager(ResourceManager): + cloud_service_group = "EIP" + cloud_service_type = "EIP" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "EIP" + self.cloud_service_type = "EIP" + self.metadata_path = "metadata/eip/eip.yaml" + + def create_cloud_service_type(self): + result = [] + eip_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonEC2", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-eip.svg" + }, + labels=["Networking"], + ) + result.append(eip_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_eips(options, region) + + def _collect_eips(self, options, region): + region_name = region + + try: + eips, account_id = self.connector.list_eip_addresses() + + for eip in eips: + try: + allocation_id = eip.get("AllocationId") + public_ip = eip.get("PublicIp") + + # Get EIP tags + tags = self._get_eip_tags(allocation_id) + + eip_data = { + "allocation_id": allocation_id, + "public_ip": public_ip, + "domain": eip.get("Domain", ""), + "instance_id": eip.get("InstanceId", ""), + "association_id": eip.get("AssociationId", ""), + "network_interface_id": eip.get("NetworkInterfaceId", ""), + "network_interface_owner_id": eip.get( + "NetworkInterfaceOwnerId", "" + ), + "private_ip_address": eip.get("PrivateIpAddress", ""), + "public_ipv4_pool": eip.get("PublicIpv4Pool", ""), + "network_border_group": eip.get("NetworkBorderGroup", ""), + "carrier_ip": eip.get("CarrierIp", ""), + "customer_owned_ip": eip.get("CustomerOwnedIp", ""), + "customer_owned_ipv4_pool": eip.get( + "CustomerOwnedIpv4Pool", "" + ), + } + + eip_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + allocation_id or public_ip, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + allocation_id or public_ip, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/ec2/home?region={region}#Addresses:search={public_ip}" + resource_id = allocation_id or public_ip + reference = self.get_reference(resource_id, link) + + eip_vo = EIP(eip_data, strict=False) + cloud_service = make_cloud_service( + name=public_ip, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=eip_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=eip_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error(f'[list_eip_addresses] [{eip.get("PublicIp")}] {e}') + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_eip_addresses] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_eip_tags(self, allocation_id): + """Get EIP tags""" + try: + return self.connector.get_eip_tags(allocation_id) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for EIP {allocation_id}: {e}") + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/eks/__init__.py b/src/plugin/manager/eks/__init__.py index e69de29..dd92f41 100644 --- a/src/plugin/manager/eks/__init__.py +++ b/src/plugin/manager/eks/__init__.py @@ -0,0 +1,3 @@ +from .cluster_manager import ClusterManager +from .node_group_manager import NodeGroupManager + diff --git a/src/plugin/manager/eks/cluster_manager.py b/src/plugin/manager/eks/cluster_manager.py new file mode 100644 index 0000000..7a9782a --- /dev/null +++ b/src/plugin/manager/eks/cluster_manager.py @@ -0,0 +1,181 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.eks import Cluster + + +class ClusterManager(ResourceManager): + cloud_service_group = "EKS" + cloud_service_type = "Cluster" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "EKS" + self.cloud_service_type = "Cluster" + self.metadata_path = "metadata/eks/cluster.yaml" + + def create_cloud_service_type(self): + result = [] + cluster_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonEKS", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-eks.svg" + }, + labels=["Container"], + ) + result.append(cluster_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_clusters(options, region) + + def _collect_clusters(self, options, region): + region_name = region + + try: + clusters, account_id = self.connector.list_eks_clusters() + + for cluster in clusters: + try: + cluster_name = cluster.get("Name") + cluster_arn = cluster.get("Arn") + + # Get cluster tags + tags = self._get_cluster_tags(cluster_arn) + + # Get cluster node groups + node_groups = self._get_cluster_node_groups(cluster_name) + + # Get cluster addons + addons = self._get_cluster_addons(cluster_name) + + cluster_data = { + "name": cluster_name, + "arn": cluster_arn, + "created_at": cluster.get("CreatedAt"), + "version": cluster.get("Version", ""), + "endpoint": cluster.get("Endpoint", ""), + "role_arn": cluster.get("RoleArn", ""), + "resources_vpc_config": cluster.get("ResourcesVpcConfig", {}), + "kubernetes_network_config": cluster.get( + "KubernetesNetworkConfig", {} + ), + "logging": cluster.get("Logging", {}), + "identity": cluster.get("Identity", {}), + "status": cluster.get("Status", ""), + "certificate_authority": cluster.get( + "CertificateAuthority", {} + ), + "client_request_token": cluster.get("ClientRequestToken", ""), + "platform_version": cluster.get("PlatformVersion", ""), + "tags": cluster.get("Tags", {}), + "encryption_config": cluster.get("EncryptionConfig", []), + "connector_config": cluster.get("ConnectorConfig", {}), + "outpost_config": cluster.get("OutpostConfig", {}), + "access_config": cluster.get("AccessConfig", {}), + "node_groups": node_groups, + "addons": addons, + } + + cluster_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + cluster_name, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + cluster_name, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/eks/home?region={region}#/clusters/{cluster_name}" + resource_id = cluster_arn + reference = self.get_reference(resource_id, link) + + cluster_vo = Cluster(cluster_data, strict=False) + cloud_service = make_cloud_service( + name=cluster_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=cluster_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=cluster_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error(f'[list_eks_clusters] [{cluster.get("Name")}] {e}') + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_eks_clusters] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_cluster_tags(self, cluster_arn): + """Get cluster tags""" + try: + return self.connector.get_cluster_tags(cluster_arn) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for cluster {cluster_arn}: {e}") + return [] + + def _get_cluster_node_groups(self, cluster_name): + """Get cluster node groups""" + try: + return self.connector.get_cluster_node_groups(cluster_name) + except Exception as e: + _LOGGER.warning( + f"Failed to get node groups for cluster {cluster_name}: {e}" + ) + return [] + + def _get_cluster_addons(self, cluster_name): + """Get cluster addons""" + try: + return self.connector.get_cluster_addons(cluster_name) + except Exception as e: + _LOGGER.warning(f"Failed to get addons for cluster {cluster_name}: {e}") + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/eks/node_group_manager.py b/src/plugin/manager/eks/node_group_manager.py new file mode 100644 index 0000000..6ea4a3a --- /dev/null +++ b/src/plugin/manager/eks/node_group_manager.py @@ -0,0 +1,158 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.eks import NodeGroup + + +class NodeGroupManager(ResourceManager): + cloud_service_group = "EKS" + cloud_service_type = "NodeGroup" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "EKS" + self.cloud_service_type = "NodeGroup" + self.metadata_path = "metadata/eks/node_group.yaml" + + def create_cloud_service_type(self): + result = [] + node_group_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonEKS", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-eks.svg" + }, + labels=["Container"], + ) + result.append(node_group_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_node_groups(options, region) + + def _collect_node_groups(self, options, region): + region_name = region + + try: + node_groups, account_id = self.connector.list_eks_node_groups() + + for node_group in node_groups: + try: + node_group_name = node_group.get("NodegroupName") + node_group_arn = node_group.get("NodegroupArn") + cluster_name = node_group.get("ClusterName") + + # Get node group tags + tags = self._get_node_group_tags(node_group_arn) + + node_group_data = { + "nodegroup_name": node_group_name, + "nodegroup_arn": node_group_arn, + "cluster_name": cluster_name, + "version": node_group.get("Version", ""), + "release_version": node_group.get("ReleaseVersion", ""), + "created_at": node_group.get("CreatedAt"), + "modified_at": node_group.get("ModifiedAt"), + "status": node_group.get("Status", ""), + "capacity_type": node_group.get("CapacityType", ""), + "scaling_config": node_group.get("ScalingConfig", {}), + "instance_types": node_group.get("InstanceTypes", []), + "subnets": node_group.get("Subnets", []), + "remote_access": node_group.get("RemoteAccess", {}), + "ami_type": node_group.get("AmiType", ""), + "node_role": node_group.get("NodeRole", ""), + "labels": node_group.get("Labels", {}), + "taints": node_group.get("Taints", []), + "resources": node_group.get("Resources", {}), + "disk_size": node_group.get("DiskSize", 0), + "health": node_group.get("Health", {}), + "update_config": node_group.get("UpdateConfig", {}), + "launch_template": node_group.get("LaunchTemplate", {}), + "tags": node_group.get("Tags", {}), + } + + node_group_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + node_group_name, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + node_group_name, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/eks/home?region={region}#/clusters/{cluster_name}/node-groups/{node_group_name}" + resource_id = node_group_arn + reference = self.get_reference(resource_id, link) + + node_group_vo = NodeGroup(node_group_data, strict=False) + cloud_service = make_cloud_service( + name=node_group_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=node_group_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=node_group_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_eks_node_groups] [{node_group.get("NodegroupName")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_eks_node_groups] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_node_group_tags(self, node_group_arn): + """Get node group tags""" + try: + return self.connector.get_node_group_tags(node_group_arn) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for node group {node_group_arn}: {e}") + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/elasticache/__init__.py b/src/plugin/manager/elasticache/__init__.py index e69de29..697ed80 100644 --- a/src/plugin/manager/elasticache/__init__.py +++ b/src/plugin/manager/elasticache/__init__.py @@ -0,0 +1,3 @@ +from .memcached_manager import MemcachedManager +from .redis_manager import RedisManager + diff --git a/src/plugin/manager/elasticache/memcached_manager.py b/src/plugin/manager/elasticache/memcached_manager.py new file mode 100644 index 0000000..a801b18 --- /dev/null +++ b/src/plugin/manager/elasticache/memcached_manager.py @@ -0,0 +1,224 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.elasticache import Memcached + + +class MemcachedManager(ResourceManager): + cloud_service_group = "ElastiCache" + cloud_service_type = "Memcached" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "ElastiCache" + self.cloud_service_type = "Memcached" + self.metadata_path = "metadata/elasticache/memcached.yaml" + + def create_cloud_service_type(self): + result = [] + memcached_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonElastiCache", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-elasticache.svg" + }, + labels=["Database"], + ) + result.append(memcached_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_memcached_clusters(options, region) + + def _collect_memcached_clusters(self, options, region): + region_name = region + + try: + memcached_clusters, account_id = ( + self.connector.list_elasticache_memcached_clusters() + ) + + for cluster in memcached_clusters: + try: + cluster_id = cluster.get("CacheClusterId") + + # Get cluster tags + tags = self._get_cluster_tags(cluster_id) + + # Get cluster parameter group + parameter_group = self._get_cluster_parameter_group( + cluster.get("CacheParameterGroup", {}) + ) + + # Get cluster security groups + security_groups = self._get_cluster_security_groups( + cluster.get("SecurityGroups", []) + ) + + cluster_data = { + "cache_cluster_id": cluster_id, + "cache_node_type": cluster.get("CacheNodeType", ""), + "engine": cluster.get("Engine", ""), + "engine_version": cluster.get("EngineVersion", ""), + "cache_cluster_status": cluster.get("CacheClusterStatus", ""), + "num_cache_nodes": cluster.get("NumCacheNodes", 0), + "preferred_availability_zone": cluster.get( + "PreferredAvailabilityZone", "" + ), + "preferred_outpost_arn": cluster.get("PreferredOutpostArn", ""), + "cache_cluster_create_time": cluster.get( + "CacheClusterCreateTime" + ), + "preferred_maintenance_window": cluster.get( + "PreferredMaintenanceWindow", "" + ), + "notification_configuration": cluster.get( + "NotificationConfiguration", {} + ), + "cache_security_groups": cluster.get("CacheSecurityGroups", []), + "cache_subnet_group_name": cluster.get( + "CacheSubnetGroupName", "" + ), + "cache_nodes": cluster.get("CacheNodes", []), + "auto_minor_version_upgrade": cluster.get( + "AutoMinorVersionUpgrade", False + ), + "security_groups": cluster.get("SecurityGroups", []), + "replication_group_id": cluster.get("ReplicationGroupId", ""), + "snapshot_retention_limit": cluster.get( + "SnapshotRetentionLimit", 0 + ), + "snapshot_window": cluster.get("SnapshotWindow", ""), + "auth_token_enabled": cluster.get("AuthTokenEnabled", False), + "auth_token_last_modified_date": cluster.get( + "AuthTokenLastModifiedDate" + ), + "transit_encryption_enabled": cluster.get( + "TransitEncryptionEnabled", False + ), + "at_rest_encryption_enabled": cluster.get( + "AtRestEncryptionEnabled", False + ), + "arn": cluster.get("ARN", ""), + "replication_group_log_delivery_enabled": cluster.get( + "ReplicationGroupLogDeliveryEnabled", False + ), + "log_delivery_configurations": cluster.get( + "LogDeliveryConfigurations", [] + ), + "network_type": cluster.get("NetworkType", ""), + "ip_discovery": cluster.get("IpDiscovery", ""), + "transit_encryption_mode": cluster.get( + "TransitEncryptionMode", "" + ), + "parameter_group": parameter_group, + "security_groups": security_groups, + } + + cluster_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + cluster_id, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + cluster_id, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/elasticache/home?region={region}#memcached:" + resource_id = cluster_id + reference = self.get_reference(resource_id, link) + + memcached_vo = Memcached(cluster_data, strict=False) + cloud_service = make_cloud_service( + name=cluster_id, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=memcached_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=cluster_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_elasticache_memcached_clusters] [{cluster.get("CacheClusterId")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_elasticache_memcached_clusters] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_cluster_tags(self, cluster_id): + """Get cluster tags""" + try: + return self.connector.get_cluster_tags(cluster_id) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for cluster {cluster_id}: {e}") + return [] + + def _get_cluster_parameter_group(self, parameter_group): + """Get cluster parameter group details""" + if not parameter_group: + return {} + + try: + return self.connector.get_cluster_parameter_group(parameter_group) + except Exception as e: + _LOGGER.warning(f"Failed to get parameter group: {e}") + return {} + + def _get_cluster_security_groups(self, security_groups): + """Get cluster security groups details""" + if not security_groups: + return [] + + try: + return self.connector.get_cluster_security_groups(security_groups) + except Exception as e: + _LOGGER.warning(f"Failed to get security groups: {e}") + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/elasticache/redis_manager.py b/src/plugin/manager/elasticache/redis_manager.py new file mode 100644 index 0000000..01b7d51 --- /dev/null +++ b/src/plugin/manager/elasticache/redis_manager.py @@ -0,0 +1,224 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.elasticache import Redis + + +class RedisManager(ResourceManager): + cloud_service_group = "ElastiCache" + cloud_service_type = "Redis" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "ElastiCache" + self.cloud_service_type = "Redis" + self.metadata_path = "metadata/elasticache/redis.yaml" + + def create_cloud_service_type(self): + result = [] + redis_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonElastiCache", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-elasticache.svg" + }, + labels=["Database"], + ) + result.append(redis_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_redis_clusters(options, region) + + def _collect_redis_clusters(self, options, region): + region_name = region + + try: + redis_clusters, account_id = ( + self.connector.list_elasticache_redis_clusters() + ) + + for cluster in redis_clusters: + try: + cluster_id = cluster.get("CacheClusterId") + + # Get cluster tags + tags = self._get_cluster_tags(cluster_id) + + # Get cluster parameter group + parameter_group = self._get_cluster_parameter_group( + cluster.get("CacheParameterGroup", {}) + ) + + # Get cluster security groups + security_groups = self._get_cluster_security_groups( + cluster.get("SecurityGroups", []) + ) + + cluster_data = { + "cache_cluster_id": cluster_id, + "cache_node_type": cluster.get("CacheNodeType", ""), + "engine": cluster.get("Engine", ""), + "engine_version": cluster.get("EngineVersion", ""), + "cache_cluster_status": cluster.get("CacheClusterStatus", ""), + "num_cache_nodes": cluster.get("NumCacheNodes", 0), + "preferred_availability_zone": cluster.get( + "PreferredAvailabilityZone", "" + ), + "preferred_outpost_arn": cluster.get("PreferredOutpostArn", ""), + "cache_cluster_create_time": cluster.get( + "CacheClusterCreateTime" + ), + "preferred_maintenance_window": cluster.get( + "PreferredMaintenanceWindow", "" + ), + "notification_configuration": cluster.get( + "NotificationConfiguration", {} + ), + "cache_security_groups": cluster.get("CacheSecurityGroups", []), + "cache_subnet_group_name": cluster.get( + "CacheSubnetGroupName", "" + ), + "cache_nodes": cluster.get("CacheNodes", []), + "auto_minor_version_upgrade": cluster.get( + "AutoMinorVersionUpgrade", False + ), + "security_groups": cluster.get("SecurityGroups", []), + "replication_group_id": cluster.get("ReplicationGroupId", ""), + "snapshot_retention_limit": cluster.get( + "SnapshotRetentionLimit", 0 + ), + "snapshot_window": cluster.get("SnapshotWindow", ""), + "auth_token_enabled": cluster.get("AuthTokenEnabled", False), + "auth_token_last_modified_date": cluster.get( + "AuthTokenLastModifiedDate" + ), + "transit_encryption_enabled": cluster.get( + "TransitEncryptionEnabled", False + ), + "at_rest_encryption_enabled": cluster.get( + "AtRestEncryptionEnabled", False + ), + "arn": cluster.get("ARN", ""), + "replication_group_log_delivery_enabled": cluster.get( + "ReplicationGroupLogDeliveryEnabled", False + ), + "log_delivery_configurations": cluster.get( + "LogDeliveryConfigurations", [] + ), + "network_type": cluster.get("NetworkType", ""), + "ip_discovery": cluster.get("IpDiscovery", ""), + "transit_encryption_mode": cluster.get( + "TransitEncryptionMode", "" + ), + "parameter_group": parameter_group, + "security_groups": security_groups, + } + + cluster_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + cluster_id, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + cluster_id, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/elasticache/home?region={region}#redis:" + resource_id = cluster_id + reference = self.get_reference(resource_id, link) + + redis_vo = Redis(cluster_data, strict=False) + cloud_service = make_cloud_service( + name=cluster_id, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=redis_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=cluster_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_elasticache_redis_clusters] [{cluster.get("CacheClusterId")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_elasticache_redis_clusters] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_cluster_tags(self, cluster_id): + """Get cluster tags""" + try: + return self.connector.get_cluster_tags(cluster_id) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for cluster {cluster_id}: {e}") + return [] + + def _get_cluster_parameter_group(self, parameter_group): + """Get cluster parameter group details""" + if not parameter_group: + return {} + + try: + return self.connector.get_cluster_parameter_group(parameter_group) + except Exception as e: + _LOGGER.warning(f"Failed to get parameter group: {e}") + return {} + + def _get_cluster_security_groups(self, security_groups): + """Get cluster security groups details""" + if not security_groups: + return [] + + try: + return self.connector.get_cluster_security_groups(security_groups) + except Exception as e: + _LOGGER.warning(f"Failed to get security groups: {e}") + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/elb/__init__.py b/src/plugin/manager/elb/__init__.py index e69de29..fcf6731 100644 --- a/src/plugin/manager/elb/__init__.py +++ b/src/plugin/manager/elb/__init__.py @@ -0,0 +1,3 @@ +from .loadbalancer_manager import LoadBalancerManager +from .target_group_manager import TargetGroupManager + diff --git a/src/plugin/manager/elb/loadbalancer_manager.py b/src/plugin/manager/elb/loadbalancer_manager.py new file mode 100644 index 0000000..02deba6 --- /dev/null +++ b/src/plugin/manager/elb/loadbalancer_manager.py @@ -0,0 +1,202 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.elb import LoadBalancer + + +class LoadBalancerManager(ResourceManager): + cloud_service_group = "ELB" + cloud_service_type = "LoadBalancer" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "ELB" + self.cloud_service_type = "LoadBalancer" + self.metadata_path = "metadata/elb/loadbalancer.yaml" + + def create_cloud_service_type(self): + result = [] + loadbalancer_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonElasticLoadBalancing", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-elb.svg" + }, + labels=["Networking"], + ) + result.append(loadbalancer_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_load_balancers(options, region) + + def _collect_load_balancers(self, options, region): + region_name = region + + try: + load_balancers, account_id = self.connector.list_elb_load_balancers() + + for load_balancer in load_balancers: + try: + load_balancer_arn = load_balancer.get("LoadBalancerArn") + load_balancer_name = load_balancer.get("LoadBalancerName") + + # Get load balancer attributes + attributes = self._get_load_balancer_attributes(load_balancer_arn) + + # Get load balancer tags + tags = self._get_load_balancer_tags(load_balancer_arn) + + # Get listeners + listeners = self._get_load_balancer_listeners(load_balancer_arn) + + # Get target groups + target_groups = self._get_load_balancer_target_groups( + load_balancer_arn + ) + + load_balancer_data = { + "load_balancer_arn": load_balancer_arn, + "load_balancer_name": load_balancer_name, + "dns_name": load_balancer.get("DNSName", ""), + "canonical_hosted_zone_id": load_balancer.get( + "CanonicalHostedZoneId", "" + ), + "created_time": load_balancer.get("CreatedTime"), + "load_balancer_type": load_balancer.get("Type", ""), + "scheme": load_balancer.get("Scheme", ""), + "vpc_id": load_balancer.get("VpcId", ""), + "state": load_balancer.get("State", {}), + "availability_zones": load_balancer.get( + "AvailabilityZones", [] + ), + "security_groups": load_balancer.get("SecurityGroups", []), + "ip_address_type": load_balancer.get("IpAddressType", ""), + "customer_owned_ipv4_pool": load_balancer.get( + "CustomerOwnedIpv4Pool", "" + ), + "enforce_security_group_inbound_rules_on_private_link_traffic": load_balancer.get( + "EnforceSecurityGroupInboundRulesOnPrivateLinkTraffic", "" + ), + "attributes": attributes, + "listeners": listeners, + "target_groups": target_groups, + } + + load_balancer_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + load_balancer_name, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + load_balancer_name, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/ec2/home?region={region}#LoadBalancers:search={load_balancer_arn}" + resource_id = load_balancer_arn + reference = self.get_reference(resource_id, link) + + load_balancer_vo = LoadBalancer(load_balancer_data, strict=False) + cloud_service = make_cloud_service( + name=load_balancer_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=load_balancer_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=load_balancer_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_elb_load_balancers] [{load_balancer.get("LoadBalancerName")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_elb_load_balancers] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_load_balancer_attributes(self, load_balancer_arn): + """Get load balancer attributes""" + try: + return self.connector.get_load_balancer_attributes(load_balancer_arn) + except Exception as e: + _LOGGER.warning( + f"Failed to get attributes for load balancer {load_balancer_arn}: {e}" + ) + return {} + + def _get_load_balancer_tags(self, load_balancer_arn): + """Get load balancer tags""" + try: + return self.connector.get_load_balancer_tags(load_balancer_arn) + except Exception as e: + _LOGGER.warning( + f"Failed to get tags for load balancer {load_balancer_arn}: {e}" + ) + return [] + + def _get_load_balancer_listeners(self, load_balancer_arn): + """Get load balancer listeners""" + try: + return self.connector.get_load_balancer_listeners(load_balancer_arn) + except Exception as e: + _LOGGER.warning( + f"Failed to get listeners for load balancer {load_balancer_arn}: {e}" + ) + return [] + + def _get_load_balancer_target_groups(self, load_balancer_arn): + """Get load balancer target groups""" + try: + return self.connector.get_load_balancer_target_groups(load_balancer_arn) + except Exception as e: + _LOGGER.warning( + f"Failed to get target groups for load balancer {load_balancer_arn}: {e}" + ) + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/elb/target_group_manager.py b/src/plugin/manager/elb/target_group_manager.py new file mode 100644 index 0000000..dd68078 --- /dev/null +++ b/src/plugin/manager/elb/target_group_manager.py @@ -0,0 +1,194 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.elb import TargetGroup + + +class TargetGroupManager(ResourceManager): + cloud_service_group = "ELB" + cloud_service_type = "TargetGroup" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "ELB" + self.cloud_service_type = "TargetGroup" + self.metadata_path = "metadata/elb/target_group.yaml" + + def create_cloud_service_type(self): + result = [] + target_group_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonElasticLoadBalancing", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-elb.svg" + }, + labels=["Networking"], + ) + result.append(target_group_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_target_groups(options, region) + + def _collect_target_groups(self, options, region): + region_name = region + + try: + target_groups, account_id = self.connector.list_elb_target_groups() + + for target_group in target_groups: + try: + target_group_arn = target_group.get("TargetGroupArn") + target_group_name = target_group.get("TargetGroupName") + + # Get target group attributes + attributes = self._get_target_group_attributes(target_group_arn) + + # Get target group tags + tags = self._get_target_group_tags(target_group_arn) + + # Get target health + target_health = self._get_target_health(target_group_arn) + + target_group_data = { + "target_group_arn": target_group_arn, + "target_group_name": target_group_name, + "protocol": target_group.get("Protocol", ""), + "port": target_group.get("Port", 0), + "vpc_id": target_group.get("VpcId", ""), + "health_check_protocol": target_group.get( + "HealthCheckProtocol", "" + ), + "health_check_port": target_group.get("HealthCheckPort", ""), + "health_check_enabled": target_group.get( + "HealthCheckEnabled", False + ), + "health_check_interval_seconds": target_group.get( + "HealthCheckIntervalSeconds", 0 + ), + "health_check_timeout_seconds": target_group.get( + "HealthCheckTimeoutSeconds", 0 + ), + "healthy_threshold_count": target_group.get( + "HealthyThresholdCount", 0 + ), + "unhealthy_threshold_count": target_group.get( + "UnhealthyThresholdCount", 0 + ), + "health_check_path": target_group.get("HealthCheckPath", ""), + "matcher": target_group.get("Matcher", {}), + "load_balancer_arns": target_group.get("LoadBalancerArns", []), + "target_type": target_group.get("TargetType", ""), + "protocol_version": target_group.get("ProtocolVersion", ""), + "ip_address_type": target_group.get("IpAddressType", ""), + "attributes": attributes, + "target_health": target_health, + } + + target_group_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + target_group_name, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + target_group_name, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/ec2/home?region={region}#TargetGroups:search={target_group_arn}" + resource_id = target_group_arn + reference = self.get_reference(resource_id, link) + + target_group_vo = TargetGroup(target_group_data, strict=False) + cloud_service = make_cloud_service( + name=target_group_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=target_group_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=target_group_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_elb_target_groups] [{target_group.get("TargetGroupName")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_elb_target_groups] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_target_group_attributes(self, target_group_arn): + """Get target group attributes""" + try: + return self.connector.get_target_group_attributes(target_group_arn) + except Exception as e: + _LOGGER.warning( + f"Failed to get attributes for target group {target_group_arn}: {e}" + ) + return {} + + def _get_target_group_tags(self, target_group_arn): + """Get target group tags""" + try: + return self.connector.get_target_group_tags(target_group_arn) + except Exception as e: + _LOGGER.warning( + f"Failed to get tags for target group {target_group_arn}: {e}" + ) + return [] + + def _get_target_health(self, target_group_arn): + """Get target health""" + try: + return self.connector.get_target_health(target_group_arn) + except Exception as e: + _LOGGER.warning( + f"Failed to get target health for target group {target_group_arn}: {e}" + ) + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/iam/__init__.py b/src/plugin/manager/iam/__init__.py index e69de29..243e943 100644 --- a/src/plugin/manager/iam/__init__.py +++ b/src/plugin/manager/iam/__init__.py @@ -0,0 +1,7 @@ +from .access_key_manager import AccessKeyManager +from .group_manager import GroupManager +from .identity_provider_manager import IdentityProviderManager +from .policy_manager import PolicyManager +from .role_manager import RoleManager +from .user_manager import UserManager + diff --git a/src/plugin/manager/iam/access_key_manager.py b/src/plugin/manager/iam/access_key_manager.py new file mode 100644 index 0000000..a44307a --- /dev/null +++ b/src/plugin/manager/iam/access_key_manager.py @@ -0,0 +1,130 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER + + +class AccessKeyManager(ResourceManager): + cloud_service_group = "IAM" + cloud_service_type = "AccessKey" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "IAM" + self.cloud_service_type = "AccessKey" + self.metadata_path = "metadata/iam/access_key.yaml" + + def create_cloud_service_type(self): + result = [] + access_key_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonIAM", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-iam.svg" + }, + labels=["Security"], + ) + result.append(access_key_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_access_keys(options, region) + + def _collect_access_keys(self, options, region): + region_name = region + cloudtrail_resource_type = "AWS::IAM::AccessKey" + + try: + access_keys, account_id = self.connector.list_iam_access_keys() + + for access_key in access_keys: + try: + access_key_id = access_key.get("AccessKeyId") + user_name = access_key.get("UserName") + + # Get access key last used + last_used = self._get_access_key_last_used(access_key_id) + + access_key_data = { + "access_key_id": access_key_id, + "user_name": user_name, + "status": access_key.get("Status", ""), + "create_date": access_key.get("CreateDate"), + "last_used": last_used, + } + + access_key_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": {}, + } + ) + + link = f"https://{region}.console.aws.amazon.com/iam/home?region={region}#/users/{user_name}" + resource_id = access_key_id + reference = self.get_reference(resource_id, link) + + cloud_service = make_cloud_service( + name=access_key_id, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=access_key_data, + account=options.get("account_id"), + reference=reference, + tags={}, + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_iam_access_keys] [{access_key.get("AccessKeyId")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_iam_access_keys] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_access_key_last_used(self, access_key_id): + """Get access key last used""" + try: + return self.connector.get_access_key_last_used(access_key_id) + except Exception as e: + _LOGGER.warning( + f"Failed to get last used for access key {access_key_id}: {e}" + ) + return {} + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/iam/group_manager.py b/src/plugin/manager/iam/group_manager.py new file mode 100644 index 0000000..f91f69b --- /dev/null +++ b/src/plugin/manager/iam/group_manager.py @@ -0,0 +1,159 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER + + +class GroupManager(ResourceManager): + cloud_service_group = "IAM" + cloud_service_type = "Group" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "IAM" + self.cloud_service_type = "Group" + self.metadata_path = "metadata/iam/group.yaml" + + def create_cloud_service_type(self): + result = [] + group_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonIAM", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-iam.svg" + }, + labels=["Security"], + ) + result.append(group_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_groups(options, region) + + def _collect_groups(self, options, region): + region_name = region + + try: + groups, account_id = self.connector.list_iam_groups() + + for group in groups: + try: + group_name = group.get("GroupName") + group_arn = group.get("Arn") + + # Get group tags + tags = self._get_group_tags(group_name) + + # Get group policies + policies = self._get_group_policies(group_name) + + # Get group users + users = self._get_group_users(group_name) + + group_data = { + "group_name": group_name, + "arn": group_arn, + "group_id": group.get("GroupId", ""), + "path": group.get("Path", ""), + "create_date": group.get("CreateDate"), + "policies": policies, + "users": users, + } + + group_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + group_name, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + group_name, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/iam/home?region={region}#/groups/{group_name}" + resource_id = group_arn + reference = self.get_reference(resource_id, link) + + cloud_service = make_cloud_service( + name=group_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=group_data, + account=options.get("account_id"), + reference=reference, + tags=group_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error(f'[list_iam_groups] [{group.get("GroupName")}] {e}') + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_iam_groups] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_group_tags(self, group_name): + """Get group tags""" + try: + return self.connector.get_group_tags(group_name) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for group {group_name}: {e}") + return [] + + def _get_group_policies(self, group_name): + """Get group policies""" + try: + return self.connector.get_group_policies(group_name) + except Exception as e: + _LOGGER.warning(f"Failed to get policies for group {group_name}: {e}") + return [] + + def _get_group_users(self, group_name): + """Get group users""" + try: + return self.connector.get_group_users(group_name) + except Exception as e: + _LOGGER.warning(f"Failed to get users for group {group_name}: {e}") + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/iam/identity_provider_manager.py b/src/plugin/manager/iam/identity_provider_manager.py new file mode 100644 index 0000000..55a9d99 --- /dev/null +++ b/src/plugin/manager/iam/identity_provider_manager.py @@ -0,0 +1,132 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER + + +class IdentityProviderManager(ResourceManager): + cloud_service_group = "IAM" + cloud_service_type = "IdentityProvider" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "IAM" + self.cloud_service_type = "IdentityProvider" + self.metadata_path = "metadata/iam/identity_provider.yaml" + + def create_cloud_service_type(self): + result = [] + identity_provider_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonIAM", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-iam.svg" + }, + labels=["Security"], + ) + result.append(identity_provider_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_identity_providers(options, region) + + def _collect_identity_providers(self, options, region): + region_name = region + cloudtrail_resource_type = "AWS::IAM::SAMLProvider" + + try: + identity_providers, account_id = ( + self.connector.list_iam_identity_providers() + ) + + for identity_provider in identity_providers: + try: + provider_arn = identity_provider.get("Arn") + provider_name = identity_provider.get("ProviderName") + + # Get identity provider tags + tags = self._get_identity_provider_tags(provider_arn) + + identity_provider_data = { + "provider_name": provider_name, + "arn": provider_arn, + "create_date": identity_provider.get("CreateDate"), + "valid_until": identity_provider.get("ValidUntil"), + "tags": identity_provider.get("Tags", []), + } + + identity_provider_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + } + ) + + link = f"https://{region}.console.aws.amazon.com/iam/home?region={region}#/providers" + resource_id = provider_arn + reference = self.get_reference(resource_id, link) + + cloud_service = make_cloud_service( + name=provider_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=identity_provider_data, + account=options.get("account_id"), + reference=reference, + tags=identity_provider_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_iam_identity_providers] [{identity_provider.get("ProviderName")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_iam_identity_providers] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_identity_provider_tags(self, provider_arn): + """Get identity provider tags""" + try: + return self.connector.get_identity_provider_tags(provider_arn) + except Exception as e: + _LOGGER.warning( + f"Failed to get tags for identity provider {provider_arn}: {e}" + ) + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/iam/policy_manager.py b/src/plugin/manager/iam/policy_manager.py new file mode 100644 index 0000000..3341566 --- /dev/null +++ b/src/plugin/manager/iam/policy_manager.py @@ -0,0 +1,148 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER + + +class PolicyManager(ResourceManager): + cloud_service_group = "IAM" + cloud_service_type = "Policy" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "IAM" + self.cloud_service_type = "Policy" + self.metadata_path = "metadata/iam/policy.yaml" + + def create_cloud_service_type(self): + result = [] + policy_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonIAM", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-iam.svg" + }, + labels=["Security"], + ) + result.append(policy_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_policies(options, region) + + def _collect_policies(self, options, region): + region_name = region + cloudtrail_resource_type = "AWS::IAM::Policy" + + try: + policies, account_id = self.connector.list_iam_policies() + + for policy in policies: + try: + policy_arn = policy.get("Arn") + policy_name = policy.get("PolicyName") + + # Get policy tags + tags = self._get_policy_tags(policy_arn) + + # Get policy version + policy_version = self._get_policy_version(policy_arn) + + policy_data = { + "policy_name": policy_name, + "arn": policy_arn, + "policy_id": policy.get("PolicyId", ""), + "path": policy.get("Path", ""), + "default_version_id": policy.get("DefaultVersionId", ""), + "attachment_count": policy.get("AttachmentCount", 0), + "permissions_boundary_usage_count": policy.get( + "PermissionsBoundaryUsageCount", 0 + ), + "is_attachable": policy.get("IsAttachable", False), + "description": policy.get("Description", ""), + "create_date": policy.get("CreateDate"), + "update_date": policy.get("UpdateDate"), + "policy_version": policy_version, + } + + policy_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + } + ) + + link = f"https://{region}.console.aws.amazon.com/iam/home?region={region}#/policies/{policy_arn}" + resource_id = policy_arn + reference = self.get_reference(resource_id, link) + + cloud_service = make_cloud_service( + name=policy_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=policy_data, + account=options.get("account_id"), + reference=reference, + tags=policy_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_iam_policies] [{policy.get("PolicyName")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_iam_policies] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_policy_tags(self, policy_arn): + """Get policy tags""" + try: + return self.connector.get_policy_tags(policy_arn) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for policy {policy_arn}: {e}") + return [] + + def _get_policy_version(self, policy_arn): + """Get policy version""" + try: + return self.connector.get_policy_version(policy_arn) + except Exception as e: + _LOGGER.warning(f"Failed to get version for policy {policy_arn}: {e}") + return {} + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/iam/role_manager.py b/src/plugin/manager/iam/role_manager.py new file mode 100644 index 0000000..1b1de84 --- /dev/null +++ b/src/plugin/manager/iam/role_manager.py @@ -0,0 +1,146 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER + + +class RoleManager(ResourceManager): + cloud_service_group = "IAM" + cloud_service_type = "Role" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "IAM" + self.cloud_service_type = "Role" + self.metadata_path = "metadata/iam/role.yaml" + + def create_cloud_service_type(self): + result = [] + role_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonIAM", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-iam.svg" + }, + labels=["Security"], + ) + result.append(role_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_roles(options, region) + + def _collect_roles(self, options, region): + region_name = region + cloudtrail_resource_type = "AWS::IAM::Role" + + try: + roles, account_id = self.connector.list_iam_roles() + + for role in roles: + try: + role_name = role.get("RoleName") + role_arn = role.get("Arn") + + # Get role tags + tags = self._get_role_tags(role_name) + + # Get role policies + policies = self._get_role_policies(role_name) + + role_data = { + "role_name": role_name, + "arn": role_arn, + "role_id": role.get("RoleId", ""), + "path": role.get("Path", ""), + "create_date": role.get("CreateDate"), + "assume_role_policy_document": role.get( + "AssumeRolePolicyDocument", "" + ), + "description": role.get("Description", ""), + "max_session_duration": role.get("MaxSessionDuration", 0), + "permissions_boundary": role.get("PermissionsBoundary", {}), + "role_last_used": role.get("RoleLastUsed", {}), + "tags": role.get("Tags", []), + "policies": policies, + } + + role_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + } + ) + + link = f"https://{region}.console.aws.amazon.com/iam/home?region={region}#/roles/{role_name}" + resource_id = role_arn + reference = self.get_reference(resource_id, link) + + cloud_service = make_cloud_service( + name=role_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=role_data, + account=options.get("account_id"), + reference=reference, + tags=role_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error(f'[list_iam_roles] [{role.get("RoleName")}] {e}') + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_iam_roles] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_role_tags(self, role_name): + """Get role tags""" + try: + return self.connector.get_role_tags(role_name) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for role {role_name}: {e}") + return [] + + def _get_role_policies(self, role_name): + """Get role policies""" + try: + return self.connector.get_role_policies(role_name) + except Exception as e: + _LOGGER.warning(f"Failed to get policies for role {role_name}: {e}") + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/iam/user_manager.py b/src/plugin/manager/iam/user_manager.py new file mode 100644 index 0000000..406c7a9 --- /dev/null +++ b/src/plugin/manager/iam/user_manager.py @@ -0,0 +1,188 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.iam import User + + +class UserManager(ResourceManager): + cloud_service_group = "IAM" + cloud_service_type = "User" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "IAM" + self.cloud_service_type = "User" + self.metadata_path = "metadata/iam/user.yaml" + + def create_cloud_service_type(self): + result = [] + user_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonIAM", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-iam.svg" + }, + labels=["Security"], + ) + result.append(user_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_users(options, region) + + def _collect_users(self, options, region): + region_name = region + + try: + users, account_id = self.connector.list_iam_users() + + for user in users: + try: + user_name = user.get("UserName") + user_arn = user.get("Arn") + + # Get user tags + tags = self._get_user_tags(user_name) + + # Get user groups + groups = self._get_user_groups(user_name) + + # Get user policies + policies = self._get_user_policies(user_name) + + # Get user access keys + access_keys = self._get_user_access_keys(user_name) + + # Get user MFA devices + mfa_devices = self._get_user_mfa_devices(user_name) + + user_data = { + "user_name": user_name, + "arn": user_arn, + "user_id": user.get("UserId", ""), + "path": user.get("Path", ""), + "create_date": user.get("CreateDate"), + "password_last_used": user.get("PasswordLastUsed"), + "permissions_boundary": user.get("PermissionsBoundary", {}), + "tags": user.get("Tags", []), + "groups": groups, + "policies": policies, + "access_keys": access_keys, + "mfa_devices": mfa_devices, + } + + user_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + user_name, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + user_name, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/iam/home?region={region}#/users/{user_name}" + resource_id = user_arn + reference = self.get_reference(resource_id, link) + + user_vo = User(user_data, strict=False) + cloud_service = make_cloud_service( + name=user_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=user_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=user_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error(f'[list_iam_users] [{user.get("UserName")}] {e}') + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_iam_users] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_user_tags(self, user_name): + """Get user tags""" + try: + return self.connector.get_user_tags(user_name) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for user {user_name}: {e}") + return [] + + def _get_user_groups(self, user_name): + """Get user groups""" + try: + return self.connector.get_user_groups(user_name) + except Exception as e: + _LOGGER.warning(f"Failed to get groups for user {user_name}: {e}") + return [] + + def _get_user_policies(self, user_name): + """Get user policies""" + try: + return self.connector.get_user_policies(user_name) + except Exception as e: + _LOGGER.warning(f"Failed to get policies for user {user_name}: {e}") + return [] + + def _get_user_access_keys(self, user_name): + """Get user access keys""" + try: + return self.connector.get_user_access_keys(user_name) + except Exception as e: + _LOGGER.warning(f"Failed to get access keys for user {user_name}: {e}") + return [] + + def _get_user_mfa_devices(self, user_name): + """Get user MFA devices""" + try: + return self.connector.get_user_mfa_devices(user_name) + except Exception as e: + _LOGGER.warning(f"Failed to get MFA devices for user {user_name}: {e}") + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/job_manager.py b/src/plugin/manager/job_manager.py new file mode 100644 index 0000000..7d89dae --- /dev/null +++ b/src/plugin/manager/job_manager.py @@ -0,0 +1,117 @@ +from plugin.conf.cloud_service_conf import METRIC_SERVICES, GLOBAL_SERVICES, SERVICE_NAME_MAP +from plugin.manager.base import ResourceManager + + +class JobManager(): + def __init__(self, options: dict, secret_data: dict): + self.options = options + self.secret_data = secret_data + + def get_tasks(self): + tasks = [] + services = self._set_service_filter() + regions = self._set_region_filter() + + # create task 1: task for collecting only cloud service type metadata + tasks.extend(self._add_cloud_service_type_tasks(services)) + + # create task 2: task for collecting only cloud service region metadata + tasks.extend(self._add_cloud_service_region_tasks(regions)) + + # create task 3: task for collecting only metrics + tasks.extend(self._add_metric_tasks(services)) + + # create task 4: task for collecting only cloud service group metadata + tasks.extend(self._add_cloud_service_group_tasks(services, regions)) + + return {"tasks": tasks} + + def _set_service_filter(self): + available_services = ResourceManager.get_service_names() + + if service_filter := self.options.get("service_filter"): + self._validate_service_filter(service_filter, available_services) + return service_filter + else: + return available_services + + @staticmethod + def _validate_service_filter(service_filter, available_services): + if not isinstance(service_filter, list): + raise ValueError( + f"Services input is supposed to be a list type! Your input is {service_filter}." + ) + for each_service in service_filter: + if each_service not in available_services: + raise ValueError("Not a valid service!") + + def _set_region_filter(self): + available_regions = ResourceManager.get_region_names(self.secret_data) + + if region_filter := self.options.get("region_filter"): + self._validate_region_filter(region_filter, available_regions) + return region_filter + else: + return available_regions + + @staticmethod + def _validate_region_filter(region_filter, available_regions): + if not isinstance(region_filter, list): + raise ValueError( + f"Regions input is supposed to be a list type! Your input is {region_filter}." + ) + for each_region in region_filter: + if each_region not in available_regions: + raise ValueError("Not a valid region!") + + def _add_cloud_service_type_tasks(self, services: list) -> list: + return [ + self._make_task_wrapper( + resource_type="inventory.CloudServiceType", services=services + ) + ] + + def _add_metric_tasks(self, services: list) -> list: + return [ + self._make_task_wrapper( + resource_type="inventory.Metric", + services=services, + ) + ] + + def _add_cloud_service_region_tasks(self, regions: list) -> list: + return [self._make_task_wrapper(resource_type="inventory.Region", regions=regions)] + + def _add_cloud_service_group_tasks(self, services: list[str], regions: list[str]) -> list: + tasks = [] + for service in services: + service_regions = self._get_service_supported_regions(service, regions) + + for region in service_regions: + tasks.append( + self._make_task_wrapper( + resource_type="inventory.CloudService", + service=service, + region=region, + ) + ) + return tasks + + def _get_service_supported_regions(self, service_name: str, available_regions: list[str]) -> list: + if service_name in GLOBAL_SERVICES: + return ["global"] + + aws_supported_regions = ResourceManager.get_available_regions(self.secret_data, SERVICE_NAME_MAP.get(service_name)) + + aws_regions_set = set(aws_supported_regions) + available_regions_set = set(available_regions) + intersection = aws_regions_set.intersection(available_regions_set) + + return list(intersection) + + @staticmethod + def _make_task_wrapper(**kwargs) -> dict: + task_options = {"task_options": {}} + for key, value in kwargs.items(): + task_options["task_options"][key] = value + return task_options \ No newline at end of file diff --git a/src/plugin/manager/kinesis_data_stream/__init__.py b/src/plugin/manager/kinesis_data_stream/__init__.py index e69de29..2ab95a4 100644 --- a/src/plugin/manager/kinesis_data_stream/__init__.py +++ b/src/plugin/manager/kinesis_data_stream/__init__.py @@ -0,0 +1,2 @@ +from .data_stream_manager import DataStreamManager + diff --git a/src/plugin/manager/kinesis_data_stream/data_stream_manager.py b/src/plugin/manager/kinesis_data_stream/data_stream_manager.py new file mode 100644 index 0000000..79209e9 --- /dev/null +++ b/src/plugin/manager/kinesis_data_stream/data_stream_manager.py @@ -0,0 +1,158 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.kinesis_data_stream import DataStream + + +class DataStreamManager(ResourceManager): + cloud_service_group = "Kinesis" + cloud_service_type = "DataStream" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "Kinesis" + self.cloud_service_type = "DataStream" + self.metadata_path = "metadata/kinesis_data_stream/data_stream.yaml" + + def create_cloud_service_type(self): + result = [] + datastream_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonKinesis", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-kinesis.svg" + }, + labels=["Analytics", "Streaming"], + ) + result.append(datastream_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_data_streams(options, region) + + def _collect_data_streams(self, options, region): + region_name = region + + try: + data_streams, account_id = self.connector.list_kinesis_data_streams() + + for stream in data_streams: + try: + stream_name = stream.get("StreamName") + + # Get stream consumers + consumers = self._get_stream_consumers(stream_name) + + # Get stream tags + tags = self._get_stream_tags(stream_name) + + stream_data = { + "stream_name": stream_name, + "stream_arn": stream.get("StreamARN"), + "stream_status": stream.get("StreamStatus", ""), + "stream_mode_details": stream.get("StreamModeDetails", {}), + "retention_period_hours": stream.get("RetentionPeriodHours", 0), + "stream_creation_timestamp": stream.get( + "StreamCreationTimestamp" + ), + "enhanced_monitoring": stream.get("EnhancedMonitoring", []), + "encryption_type": stream.get("EncryptionType", ""), + "key_id": stream.get("KeyId", ""), + "open_shard_count": stream.get("OpenShardCount", 0), + "consumer_count": stream.get("ConsumerCount", 0), + "consumers": consumers, + } + + stream_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + stream_name, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + stream_name, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/kinesis/home?region={region}#/streams/details/{stream_name}" + resource_id = stream_name + reference = self.get_reference(resource_id, link) + + stream_vo = DataStream(stream_data, strict=False) + cloud_service = make_cloud_service( + name=stream_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=stream_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=stream_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_kinesis_data_streams] [{stream.get("StreamName")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_kinesis_data_streams] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_stream_consumers(self, stream_name): + """Get stream consumers""" + try: + return self.connector.get_stream_consumers(stream_name) + except Exception as e: + _LOGGER.warning(f"Failed to get consumers for stream {stream_name}: {e}") + return [] + + def _get_stream_tags(self, stream_name): + """Get stream tags""" + try: + return self.connector.get_stream_tags(stream_name) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for stream {stream_name}: {e}") + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/kinesis_firehose/__init__.py b/src/plugin/manager/kinesis_firehose/__init__.py index e69de29..81d1c74 100644 --- a/src/plugin/manager/kinesis_firehose/__init__.py +++ b/src/plugin/manager/kinesis_firehose/__init__.py @@ -0,0 +1,2 @@ +from .delivery_stream_manager import DeliveryStreamManager + diff --git a/src/plugin/manager/kinesis_firehose/delivery_stream_manager.py b/src/plugin/manager/kinesis_firehose/delivery_stream_manager.py new file mode 100644 index 0000000..1cae07d --- /dev/null +++ b/src/plugin/manager/kinesis_firehose/delivery_stream_manager.py @@ -0,0 +1,140 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.kinesis_firehose import DeliveryStream + + +class DeliveryStreamManager(ResourceManager): + cloud_service_group = "Kinesis" + cloud_service_type = "DeliveryStream" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "Kinesis" + self.cloud_service_type = "DeliveryStream" + self.metadata_path = "metadata/kinesis_firehose/delivery_stream.yaml" + + def create_cloud_service_type(self): + result = [] + deliverystream_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonKinesisFirehose", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-kinesis-firehose.svg" + }, + labels=["Analytics", "Streaming"], + ) + result.append(deliverystream_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_delivery_streams(options, region) + + def _collect_delivery_streams(self, options, region): + region_name = region + cloudtrail_resource_type = "AWS::KinesisFirehose::DeliveryStream" + + try: + delivery_streams, account_id = self.connector.list_delivery_streams() + + for stream in delivery_streams: + try: + stream_name = stream.get("DeliveryStreamName") + + # Get delivery stream tags + tags = self._get_delivery_stream_tags(stream_name) + + stream_data = { + "delivery_stream_name": stream_name, + "delivery_stream_arn": stream.get("DeliveryStreamARN"), + "delivery_stream_status": stream.get( + "DeliveryStreamStatus", "" + ), + "delivery_stream_type": stream.get("DeliveryStreamType", ""), + "version_id": stream.get("VersionId", ""), + "create_timestamp": stream.get("CreateTimestamp"), + "last_update_timestamp": stream.get("LastUpdateTimestamp"), + "source": stream.get("Source", {}), + "destinations": stream.get("Destinations", []), + "has_more_destinations": stream.get( + "HasMoreDestinations", False + ), + } + + stream_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + } + ) + + link = f"https://{region}.console.aws.amazon.com/firehose/home?region={region}#/details/{stream_name}" + resource_id = stream_name + reference = self.get_reference(resource_id, link) + + delivery_stream_vo = DeliveryStream(stream_data, strict=False) + cloud_service = make_cloud_service( + name=stream_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=delivery_stream_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=stream_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_delivery_streams] [{stream.get("DeliveryStreamName")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_delivery_streams] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_delivery_stream_tags(self, stream_name): + """Get delivery stream tags""" + try: + return self.connector.get_delivery_stream_tags(stream_name) + except Exception as e: + _LOGGER.warning( + f"Failed to get tags for delivery stream {stream_name}: {e}" + ) + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/kms/__init__.py b/src/plugin/manager/kms/__init__.py index e69de29..b146ffc 100644 --- a/src/plugin/manager/kms/__init__.py +++ b/src/plugin/manager/kms/__init__.py @@ -0,0 +1,2 @@ +from .key_manager import KeyManager + diff --git a/src/plugin/manager/kms/key_manager.py b/src/plugin/manager/kms/key_manager.py new file mode 100644 index 0000000..238dd41 --- /dev/null +++ b/src/plugin/manager/kms/key_manager.py @@ -0,0 +1,198 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.kms import Key + + +class KeyManager(ResourceManager): + cloud_service_group = "KMS" + cloud_service_type = "Key" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "KMS" + self.cloud_service_type = "Key" + self.metadata_path = "metadata/kms/key.yaml" + + def create_cloud_service_type(self): + result = [] + key_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AWSKMS", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-kms.svg" + }, + labels=["Security"], + ) + result.append(key_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_keys(options, region) + + def _collect_keys(self, options, region): + region_name = region + + try: + keys, account_id = self.connector.list_kms_keys() + + for key in keys: + try: + key_id = key.get("KeyId") + key_arn = key.get("Arn") + + # Get key tags + tags = self._get_key_tags(key_id) + + # Get key aliases + aliases = self._get_key_aliases(key_id) + + # Get key policy + policy = self._get_key_policy(key_id) + + # Get key grants + grants = self._get_key_grants(key_id) + + key_data = { + "key_id": key_id, + "arn": key_arn, + "aws_account_id": key.get("AWSAccountId", ""), + "creation_date": key.get("CreationDate"), + "enabled": key.get("Enabled", False), + "description": key.get("Description", ""), + "key_usage": key.get("KeyUsage", ""), + "key_state": key.get("KeyState", ""), + "deletion_date": key.get("DeletionDate"), + "valid_to": key.get("ValidTo"), + "origin": key.get("Origin", ""), + "custom_key_store_id": key.get("CustomKeyStoreId", ""), + "cloud_hsm_cluster_id": key.get("CloudHsmClusterId", ""), + "expiration_model": key.get("ExpirationModel", ""), + "key_manager": key.get("KeyManager", ""), + "customer_master_key_spec": key.get( + "CustomerMasterKeySpec", "" + ), + "key_spec": key.get("KeySpec", ""), + "encryption_algorithms": key.get("EncryptionAlgorithms", []), + "signing_algorithms": key.get("SigningAlgorithms", []), + "multi_region": key.get("MultiRegion", False), + "multi_region_configuration": key.get( + "MultiRegionConfiguration", {} + ), + "pending_deletion_window_in_days": key.get( + "PendingDeletionWindowInDays", 0 + ), + "mac_algorithms": key.get("MacAlgorithms", []), + "xks_key_configuration": key.get("XksKeyConfiguration", {}), + "aliases": aliases, + "policy": policy, + "grants": grants, + } + + key_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + key_id, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + key_id, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/kms/home?region={region}#/kms/keys/{key_id}" + resource_id = key_arn + reference = self.get_reference(resource_id, link) + + key_vo = Key(key_data, strict=False) + cloud_service = make_cloud_service( + name=key_id, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=key_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=key_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error(f'[list_kms_keys] [{key.get("KeyId")}] {e}') + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_kms_keys] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_key_tags(self, key_id): + """Get key tags""" + try: + return self.connector.get_key_tags(key_id) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for key {key_id}: {e}") + return [] + + def _get_key_aliases(self, key_id): + """Get key aliases""" + try: + return self.connector.get_key_aliases(key_id) + except Exception as e: + _LOGGER.warning(f"Failed to get aliases for key {key_id}: {e}") + return [] + + def _get_key_policy(self, key_id): + """Get key policy""" + try: + return self.connector.get_key_policy(key_id) + except Exception as e: + _LOGGER.warning(f"Failed to get policy for key {key_id}: {e}") + return {} + + def _get_key_grants(self, key_id): + """Get key grants""" + try: + return self.connector.get_key_grants(key_id) + except Exception as e: + _LOGGER.warning(f"Failed to get grants for key {key_id}: {e}") + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/lambda/__init__.py b/src/plugin/manager/lambda/__init__.py index e69de29..5851170 100644 --- a/src/plugin/manager/lambda/__init__.py +++ b/src/plugin/manager/lambda/__init__.py @@ -0,0 +1,3 @@ +from .function_manager import FunctionManager +from .layer_manager import LayerManager + diff --git a/src/plugin/manager/lambda/function_manager.py b/src/plugin/manager/lambda/function_manager.py new file mode 100644 index 0000000..3e126f3 --- /dev/null +++ b/src/plugin/manager/lambda/function_manager.py @@ -0,0 +1,217 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.lambda_model import Function + + +class FunctionManager(ResourceManager): + cloud_service_group = "Lambda" + cloud_service_type = "Function" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "Lambda" + self.cloud_service_type = "Function" + self.metadata_path = "metadata/lambda_model/function.yaml" + + def create_cloud_service_type(self): + result = [] + function_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AWSLambda", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-lambda.svg" + }, + labels=["Compute"], + ) + result.append(function_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_functions(options, region) + + def _collect_functions(self, options, region): + region_name = region + + try: + functions, account_id = self.connector.list_lambda_functions() + + for function in functions: + try: + function_name = function.get("FunctionName") + function_arn = function.get("FunctionArn") + + # Get function tags + tags = self._get_function_tags(function_arn) + + # Get function configuration + configuration = self._get_function_configuration(function_name) + + # Get function code + code = self._get_function_code(function_name) + + # Get function policy + policy = self._get_function_policy(function_name) + + function_data = { + "function_name": function_name, + "function_arn": function_arn, + "runtime": function.get("Runtime", ""), + "role": function.get("Role", ""), + "handler": function.get("Handler", ""), + "code_size": function.get("CodeSize", 0), + "description": function.get("Description", ""), + "timeout": function.get("Timeout", 0), + "memory_size": function.get("MemorySize", 0), + "last_modified": function.get("LastModified", ""), + "code_sha256": function.get("CodeSha256", ""), + "version": function.get("Version", ""), + "vpc_config": function.get("VpcConfig", {}), + "dead_letter_config": function.get("DeadLetterConfig", {}), + "environment": function.get("Environment", {}), + "kms_key_arn": function.get("KMSKeyArn", ""), + "tracing_config": function.get("TracingConfig", {}), + "master_arn": function.get("MasterArn", ""), + "revision_id": function.get("RevisionId", ""), + "layers": function.get("Layers", []), + "state": function.get("State", ""), + "state_reason": function.get("StateReason", ""), + "state_reason_code": function.get("StateReasonCode", ""), + "last_update_status": function.get("LastUpdateStatus", ""), + "last_update_status_reason": function.get( + "LastUpdateStatusReason", "" + ), + "last_update_status_reason_code": function.get( + "LastUpdateStatusReasonCode", "" + ), + "file_system_configs": function.get("FileSystemConfigs", []), + "package_type": function.get("PackageType", ""), + "image_config_response": function.get( + "ImageConfigResponse", {} + ), + "signing_profile_version_arn": function.get( + "SigningProfileVersionArn", "" + ), + "signing_job_arn": function.get("SigningJobArn", ""), + "architectures": function.get("Architectures", []), + "ephemeral": function.get("Ephemeral", {}), + "snap_start": function.get("SnapStart", {}), + "runtime_version_config": function.get( + "RuntimeVersionConfig", {} + ), + "configuration": configuration, + "code": code, + "policy": policy, + } + + function_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + function_name, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + function_name, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/lambda_model/home?region={region}#/functions/{function_name}" + resource_id = function_arn + reference = self.get_reference(resource_id, link) + + function_vo = Function(function_data, strict=False) + cloud_service = make_cloud_service( + name=function_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=function_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=function_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_lambda_functions] [{function.get("FunctionName")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_lambda_functions] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_function_tags(self, function_arn): + """Get function tags""" + try: + return self.connector.get_function_tags(function_arn) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for function {function_arn}: {e}") + return [] + + def _get_function_configuration(self, function_name): + """Get function configuration""" + try: + return self.connector.get_function_configuration(function_name) + except Exception as e: + _LOGGER.warning( + f"Failed to get configuration for function {function_name}: {e}" + ) + return {} + + def _get_function_code(self, function_name): + """Get function code""" + try: + return self.connector.get_function_code(function_name) + except Exception as e: + _LOGGER.warning(f"Failed to get code for function {function_name}: {e}") + return {} + + def _get_function_policy(self, function_name): + """Get function policy""" + try: + return self.connector.get_function_policy(function_name) + except Exception as e: + _LOGGER.warning(f"Failed to get policy for function {function_name}: {e}") + return {} + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/lambda/layer_manager.py b/src/plugin/manager/lambda/layer_manager.py new file mode 100644 index 0000000..4935e1f --- /dev/null +++ b/src/plugin/manager/lambda/layer_manager.py @@ -0,0 +1,151 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.lambda_model import Layer + + +class LayerManager(ResourceManager): + cloud_service_group = "Lambda" + cloud_service_type = "Layer" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "Lambda" + self.cloud_service_type = "Layer" + self.metadata_path = "metadata/lambda_model/layer.yaml" + + def create_cloud_service_type(self): + result = [] + layer_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AWSLambda", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-lambda.svg" + }, + labels=["Compute"], + ) + result.append(layer_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_layers(options, region) + + def _collect_layers(self, options, region): + region_name = region + cloudtrail_resource_type = "AWS::Lambda::LayerVersion" + + try: + layers, account_id = self.connector.list_lambda_layers() + + for layer in layers: + try: + layer_name = layer.get("LayerName") + layer_arn = layer.get("LayerArn") + version = layer.get("Version") + + # Get layer tags + tags = self._get_layer_tags(layer_arn) + + # Get layer version details + layer_version = self._get_layer_version(layer_name, version) + + layer_data = { + "layer_name": layer_name, + "layer_arn": layer_arn, + "version": version, + "description": layer.get("Description", ""), + "created_date": layer.get("CreatedDate", ""), + "layer_version_arn": layer.get("LayerVersionArn", ""), + "compatible_runtimes": layer.get("CompatibleRuntimes", []), + "license_info": layer.get("LicenseInfo", ""), + "compatible_architectures": layer.get( + "CompatibleArchitectures", [] + ), + "layer_version": layer_version, + } + + layer_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + } + ) + + link = f"https://{region}.console.aws.amazon.com/lambda_model/home?region={region}#/layers/{layer_name}" + resource_id = layer_arn + reference = self.get_reference(resource_id, link) + + layer_vo = Layer(layer_data, strict=False) + cloud_service = make_cloud_service( + name=f"{layer_name}:{version}", + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=layer_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=layer_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_lambda_layers] [{layer.get("LayerName")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_lambda_layers] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_layer_tags(self, layer_arn): + """Get layer tags""" + try: + return self.connector.get_layer_tags(layer_arn) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for layer {layer_arn}: {e}") + return [] + + def _get_layer_version(self, layer_name, version): + """Get layer version details""" + try: + return self.connector.get_layer_version(layer_name, version) + except Exception as e: + _LOGGER.warning( + f"Failed to get version for layer {layer_name}:{version}: {e}" + ) + return {} + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/lightsail/__init__.py b/src/plugin/manager/lightsail/__init__.py index e69de29..6874490 100644 --- a/src/plugin/manager/lightsail/__init__.py +++ b/src/plugin/manager/lightsail/__init__.py @@ -0,0 +1,11 @@ +from .bucket_manager import BucketManager +from .container_manager import ContainerManager +from .database_manager import DatabaseManager +from .disk_manager import DiskManager +from .distribution_manager import DistributionManager +from .domain_manager import DomainManager +from .instance_manager import InstanceManager +from .loadbalancer_manager import LoadBalancerManager +from .snapshot_manager import SnapshotManager +from .static_ip_manager import StaticIPManager + diff --git a/src/plugin/manager/lightsail/bucket_manager.py b/src/plugin/manager/lightsail/bucket_manager.py new file mode 100644 index 0000000..1ef24c6 --- /dev/null +++ b/src/plugin/manager/lightsail/bucket_manager.py @@ -0,0 +1,173 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.lightsail import Bucket + + +class BucketManager(ResourceManager): + cloud_service_group = "Lightsail" + cloud_service_type = "Bucket" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "Lightsail" + self.cloud_service_type = "Bucket" + self.metadata_path = "metadata/lightsail/bucket.yaml" + + def create_cloud_service_type(self): + result = [] + bucket_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonLightsail", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-lightsail.svg" + }, + labels=["Storage"], + ) + result.append(bucket_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_buckets(options, region) + + def _collect_buckets(self, options, region): + region_name = region + cloudtrail_resource_type = "AWS::Lightsail::Bucket" + + try: + buckets, account_id = self.connector.list_lightsail_buckets() + + for bucket in buckets: + try: + bucket_name = bucket.get("Name") + bucket_arn = bucket.get("Arn") + + # Get bucket tags + tags = self._get_bucket_tags(bucket_arn) + + # Get bucket objects + objects = self._get_bucket_objects(bucket_name) + + # Get bucket access keys + access_keys = self._get_bucket_access_keys(bucket_name) + + bucket_data = { + "name": bucket_name, + "arn": bucket_arn, + "created_at": bucket.get("CreatedAt"), + "location": bucket.get("Location", {}), + "resource_type": bucket.get("ResourceType", ""), + "tags": bucket.get("Tags", []), + "support_code": bucket.get("SupportCode", ""), + "url": bucket.get("Url", ""), + "location_regional_domain_name": bucket.get( + "LocationRegionalDomainName", "" + ), + "state": bucket.get("State", {}), + "access_rules": bucket.get("AccessRules", {}), + "readonly_access_accounts": bucket.get( + "ReadonlyAccessAccounts", [] + ), + "resource_receiving_access": bucket.get( + "ResourceReceivingAccess", "" + ), + "access_log_config": bucket.get("AccessLogConfig", {}), + "versioning": bucket.get("Versioning", ""), + "object_versioning": bucket.get("ObjectVersioning", ""), + "transfer_acceleration": bucket.get("TransferAcceleration", {}), + "notification_config": bucket.get("NotificationConfig", {}), + "objects": objects, + "access_keys": access_keys, + } + + bucket_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + } + ) + + link = f"https://{region}.console.aws.amazon.com/lightsail/home?region={region}#/storage/buckets/{bucket_name}" + resource_id = bucket_arn + reference = self.get_reference(resource_id, link) + + bucket_vo = Bucket(bucket_data, strict=False) + cloud_service = make_cloud_service( + name=bucket_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=bucket_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=bucket_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_lightsail_buckets] [{bucket.get("Name")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_lightsail_buckets] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_bucket_tags(self, bucket_arn): + """Get bucket tags""" + try: + return self.connector.get_bucket_tags(bucket_arn) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for bucket {bucket_arn}: {e}") + return [] + + def _get_bucket_objects(self, bucket_name): + """Get bucket objects""" + try: + return self.connector.get_bucket_objects(bucket_name) + except Exception as e: + _LOGGER.warning(f"Failed to get objects for bucket {bucket_name}: {e}") + return [] + + def _get_bucket_access_keys(self, bucket_name): + """Get bucket access keys""" + try: + return self.connector.get_bucket_access_keys(bucket_name) + except Exception as e: + _LOGGER.warning(f"Failed to get access keys for bucket {bucket_name}: {e}") + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/lightsail/container_manager.py b/src/plugin/manager/lightsail/container_manager.py new file mode 100644 index 0000000..80a9544 --- /dev/null +++ b/src/plugin/manager/lightsail/container_manager.py @@ -0,0 +1,157 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.lightsail import Container + + +class ContainerManager(ResourceManager): + cloud_service_group = "Lightsail" + cloud_service_type = "Container" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "Lightsail" + self.cloud_service_type = "Container" + self.metadata_path = "metadata/lightsail/container.yaml" + + def create_cloud_service_type(self): + result = [] + container_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonLightsail", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-lightsail.svg" + }, + labels=["Container"], + ) + result.append(container_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_containers(options, region) + + def _collect_containers(self, options, region): + region_name = region + cloudtrail_resource_type = "AWS::Lightsail::ContainerService" + + try: + containers, account_id = self.connector.list_lightsail_containers() + + for container in containers: + try: + container_name = container.get("ContainerServiceName") + container_arn = container.get("Arn") + + # Get container tags + tags = self._get_container_tags(container_arn) + + # Get container deployments + deployments = self._get_container_deployments(container_name) + + container_data = { + "container_service_name": container_name, + "arn": container_arn, + "created_at": container.get("CreatedAt"), + "location": container.get("Location", {}), + "resource_type": container.get("ResourceType", ""), + "tags": container.get("Tags", []), + "power": container.get("Power", ""), + "power_id": container.get("PowerId", ""), + "state": container.get("State", ""), + "state_detail": container.get("StateDetail", {}), + "scale": container.get("Scale", 0), + "current_deployment": container.get("CurrentDeployment", {}), + "next_deployment": container.get("NextDeployment", {}), + "is_disabled": container.get("IsDisabled", False), + "principal_arn": container.get("PrincipalArn", ""), + "private_domain_name": container.get("PrivateDomainName", ""), + "public_domain_names": container.get("PublicDomainNames", {}), + "url": container.get("Url", ""), + "deployments": deployments, + } + + container_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + } + ) + + link = f"https://{region}.console.aws.amazon.com/lightsail/home?region={region}#/containers/{container_name}" + resource_id = container_arn + reference = self.get_reference(resource_id, link) + + container_vo = Container(container_data, strict=False) + cloud_service = make_cloud_service( + name=container_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=container_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=container_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_lightsail_containers] [{container.get("ContainerServiceName")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_lightsail_containers] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_container_tags(self, container_arn): + """Get container tags""" + try: + return self.connector.get_container_tags(container_arn) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for container {container_arn}: {e}") + return [] + + def _get_container_deployments(self, container_name): + """Get container deployments""" + try: + return self.connector.get_container_deployments(container_name) + except Exception as e: + _LOGGER.warning( + f"Failed to get deployments for container {container_name}: {e}" + ) + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/lightsail/database_manager.py b/src/plugin/manager/lightsail/database_manager.py new file mode 100644 index 0000000..fdf1bdf --- /dev/null +++ b/src/plugin/manager/lightsail/database_manager.py @@ -0,0 +1,211 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.lightsail import Database + + +class DatabaseManager(ResourceManager): + cloud_service_group = "Lightsail" + cloud_service_type = "Database" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "Lightsail" + self.cloud_service_type = "Database" + self.metadata_path = "metadata/lightsail/database.yaml" + + def create_cloud_service_type(self): + result = [] + database_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonLightsail", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-lightsail.svg" + }, + labels=["Database"], + ) + result.append(database_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_databases(options, region) + + def _collect_databases(self, options, region): + region_name = region + + try: + databases, account_id = self.connector.list_lightsail_databases() + + for database in databases: + try: + database_name = database.get("RelationalDatabaseName") + database_arn = database.get("Arn") + + # Get database tags + tags = self._get_database_tags(database_arn) + + # Get database events + events = self._get_database_events(database_name) + + # Get database logs + logs = self._get_database_logs(database_name) + + database_data = { + "relational_database_name": database_name, + "arn": database_arn, + "relational_database_arn": database.get( + "RelationalDatabaseArn", "" + ), + "created_at": database.get("CreatedAt"), + "location": database.get("Location", {}), + "resource_type": database.get("ResourceType", ""), + "tags": database.get("Tags", []), + "relational_database_blueprint_id": database.get( + "RelationalDatabaseBlueprintId", "" + ), + "relational_database_bundle_id": database.get( + "RelationalDatabaseBundleId", "" + ), + "master_database_name": database.get("MasterDatabaseName", ""), + "hardware": database.get("Hardware", {}), + "state": database.get("State", ""), + "secondary_availability_zone": database.get( + "SecondaryAvailabilityZone", "" + ), + "backup_retention_enabled": database.get( + "BackupRetentionEnabled", False + ), + "pending_modified_values": database.get( + "PendingModifiedValues", {} + ), + "engine": database.get("Engine", ""), + "engine_version": database.get("EngineVersion", ""), + "latest_restorable_time": database.get("LatestRestorableTime"), + "master_endpoint": database.get("MasterEndpoint", {}), + "preferred_backup_window": database.get( + "PreferredBackupWindow", "" + ), + "preferred_maintenance_window": database.get( + "PreferredMaintenanceWindow", "" + ), + "publicly_accessible": database.get( + "PubliclyAccessible", False + ), + "master_username": database.get("MasterUsername", ""), + "parameter_apply_status": database.get( + "ParameterApplyStatus", "" + ), + "ca_certificate_identifier": database.get( + "CaCertificateIdentifier", "" + ), + "pending_maintenance_actions": database.get( + "PendingMaintenanceActions", [] + ), + "automatic_snapshot_retention_days": database.get( + "AutomaticSnapshotRetentionDays", 0 + ), + "events": events, + "logs": logs, + } + + database_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + database_name, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + database_name, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/lightsail/home?region={region}#/databases/{database_name}" + resource_id = database_arn + reference = self.get_reference(resource_id, link) + + database_vo = Database(database_data, strict=False) + cloud_service = make_cloud_service( + name=database_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=database_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=database_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_lightsail_databases] [{database.get("RelationalDatabaseName")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_lightsail_databases] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_database_tags(self, database_arn): + """Get database tags""" + try: + return self.connector.get_database_tags(database_arn) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for database {database_arn}: {e}") + return [] + + def _get_database_events(self, database_name): + """Get database events""" + try: + return self.connector.get_database_events(database_name) + except Exception as e: + _LOGGER.warning(f"Failed to get events for database {database_name}: {e}") + return [] + + def _get_database_logs(self, database_name): + """Get database logs""" + try: + return self.connector.get_database_logs(database_name) + except Exception as e: + _LOGGER.warning(f"Failed to get logs for database {database_name}: {e}") + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/lightsail/disk_manager.py b/src/plugin/manager/lightsail/disk_manager.py new file mode 100644 index 0000000..12acbf1 --- /dev/null +++ b/src/plugin/manager/lightsail/disk_manager.py @@ -0,0 +1,164 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.lightsail import Disk + + +class DiskManager(ResourceManager): + cloud_service_group = "Lightsail" + cloud_service_type = "Disk" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "Lightsail" + self.cloud_service_type = "Disk" + self.metadata_path = "metadata/lightsail/disk.yaml" + + def create_cloud_service_type(self): + result = [] + disk_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonLightsail", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-lightsail.svg" + }, + labels=["Storage"], + ) + result.append(disk_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_disks(options, region) + + def _collect_disks(self, options, region): + region_name = region + cloudtrail_resource_type = "AWS::Lightsail::Disk" + + try: + disks, account_id = self.connector.list_lightsail_disks() + + for disk in disks: + try: + disk_name = disk.get("Name") + disk_arn = disk.get("Arn") + + # Get disk tags + tags = self._get_disk_tags(disk_arn) + + # Get disk snapshots + snapshots = self._get_disk_snapshots(disk_name) + + # Get disk attachments + attachments = self._get_disk_attachments(disk_name) + + disk_data = { + "name": disk_name, + "arn": disk_arn, + "created_at": disk.get("CreatedAt"), + "location": disk.get("Location", {}), + "resource_type": disk.get("ResourceType", ""), + "tags": disk.get("Tags", []), + "support_code": disk.get("SupportCode", ""), + "size_in_gb": disk.get("SizeInGb", 0), + "is_system_disk": disk.get("IsSystemDisk", False), + "iops": disk.get("Iops", 0), + "path": disk.get("Path", ""), + "state": disk.get("State", ""), + "attached_to": disk.get("AttachedTo", ""), + "is_attached": disk.get("IsAttached", False), + "attachment_state": disk.get("AttachmentState", ""), + "gb_in_use": disk.get("GbInUse", 0), + "auto_mount_status": disk.get("AutoMountStatus", ""), + "snapshots": snapshots, + "attachments": attachments, + } + + disk_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + } + ) + + link = f"https://{region}.console.aws.amazon.com/lightsail/home?region={region}#/storage/disks/{disk_name}" + resource_id = disk_arn + reference = self.get_reference(resource_id, link) + + disk_vo = Disk(disk_data, strict=False) + cloud_service = make_cloud_service( + name=disk_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=disk_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=disk_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error(f'[list_lightsail_disks] [{disk.get("Name")}] {e}') + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_lightsail_disks] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_disk_tags(self, disk_arn): + """Get disk tags""" + try: + return self.connector.get_disk_tags(disk_arn) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for disk {disk_arn}: {e}") + return [] + + def _get_disk_snapshots(self, disk_name): + """Get disk snapshots""" + try: + return self.connector.get_disk_snapshots(disk_name) + except Exception as e: + _LOGGER.warning(f"Failed to get snapshots for disk {disk_name}: {e}") + return [] + + def _get_disk_attachments(self, disk_name): + """Get disk attachments""" + try: + return self.connector.get_disk_attachments(disk_name) + except Exception as e: + _LOGGER.warning(f"Failed to get attachments for disk {disk_name}: {e}") + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/lightsail/distribution_manager.py b/src/plugin/manager/lightsail/distribution_manager.py new file mode 100644 index 0000000..834b36a --- /dev/null +++ b/src/plugin/manager/lightsail/distribution_manager.py @@ -0,0 +1,172 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.lightsail import Distribution + + +class DistributionManager(ResourceManager): + cloud_service_group = "Lightsail" + cloud_service_type = "Distribution" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "Lightsail" + self.cloud_service_type = "Distribution" + self.metadata_path = "metadata/lightsail/distribution.yaml" + + def create_cloud_service_type(self): + result = [] + distribution_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonLightsail", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-lightsail.svg" + }, + labels=["Networking"], + ) + result.append(distribution_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_distributions(options, region) + + def _collect_distributions(self, options, region): + region_name = region + cloudtrail_resource_type = "AWS::Lightsail::Distribution" + + try: + distributions, account_id = self.connector.list_lightsail_distributions() + + for distribution in distributions: + try: + distribution_name = distribution.get("Name") + distribution_arn = distribution.get("Arn") + + # Get distribution tags + tags = self._get_distribution_tags(distribution_arn) + + # Get distribution cache behaviors + cache_behaviors = self._get_distribution_cache_behaviors( + distribution_name + ) + + distribution_data = { + "name": distribution_name, + "arn": distribution_arn, + "created_at": distribution.get("CreatedAt"), + "location": distribution.get("Location", {}), + "resource_type": distribution.get("ResourceType", ""), + "tags": distribution.get("Tags", []), + "alternative_domain_names": distribution.get( + "AlternativeDomainNames", [] + ), + "status": distribution.get("Status", ""), + "is_enabled": distribution.get("IsEnabled", False), + "domain_name": distribution.get("DomainName", ""), + "bundle_id": distribution.get("BundleId", ""), + "certificate_name": distribution.get("CertificateName", ""), + "origin": distribution.get("Origin", {}), + "origin_public_dns": distribution.get("OriginPublicDNS", ""), + "default_cache_behavior": distribution.get( + "DefaultCacheBehavior", {} + ), + "cache_behavior_settings": distribution.get( + "CacheBehaviorSettings", {} + ), + "cache_behaviors": cache_behaviors, + "able_to_update_bundle": distribution.get( + "AbleToUpdateBundle", False + ), + "ip_address_type": distribution.get("IpAddressType", ""), + "cache_behaviors_count": distribution.get( + "CacheBehaviorsCount", 0 + ), + } + + distribution_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + } + ) + + link = f"https://{region}.console.aws.amazon.com/lightsail/home?region={region}#/networking/distributions/{distribution_name}" + resource_id = distribution_arn + reference = self.get_reference(resource_id, link) + + distribution_vo = Distribution(distribution_data, strict=False) + cloud_service = make_cloud_service( + name=distribution_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=distribution_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=distribution_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_lightsail_distributions] [{distribution.get("Name")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_lightsail_distributions] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_distribution_tags(self, distribution_arn): + """Get distribution tags""" + try: + return self.connector.get_distribution_tags(distribution_arn) + except Exception as e: + _LOGGER.warning( + f"Failed to get tags for distribution {distribution_arn}: {e}" + ) + return [] + + def _get_distribution_cache_behaviors(self, distribution_name): + """Get distribution cache behaviors""" + try: + return self.connector.get_distribution_cache_behaviors(distribution_name) + except Exception as e: + _LOGGER.warning( + f"Failed to get cache behaviors for distribution {distribution_name}: {e}" + ) + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/lightsail/domain_manager.py b/src/plugin/manager/lightsail/domain_manager.py new file mode 100644 index 0000000..c367846 --- /dev/null +++ b/src/plugin/manager/lightsail/domain_manager.py @@ -0,0 +1,145 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.lightsail import Domain + + +class DomainManager(ResourceManager): + cloud_service_group = "Lightsail" + cloud_service_type = "Domain" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "Lightsail" + self.cloud_service_type = "Domain" + self.metadata_path = "metadata/lightsail/domain.yaml" + + def create_cloud_service_type(self): + result = [] + domain_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonLightsail", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-lightsail.svg" + }, + labels=["Networking"], + ) + result.append(domain_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_domains(options, region) + + def _collect_domains(self, options, region): + region_name = region + cloudtrail_resource_type = "AWS::Lightsail::Domain" + + try: + domains, account_id = self.connector.list_lightsail_domains() + + for domain in domains: + try: + domain_name = domain.get("Name") + domain_arn = domain.get("Arn") + + # Get domain tags + tags = self._get_domain_tags(domain_arn) + + # Get domain records + records = self._get_domain_records(domain_name) + + domain_data = { + "name": domain_name, + "arn": domain_arn, + "created_at": domain.get("CreatedAt"), + "location": domain.get("Location", {}), + "resource_type": domain.get("ResourceType", ""), + "tags": domain.get("Tags", []), + "domain_entries": domain.get("DomainEntries", []), + "support_code": domain.get("SupportCode", ""), + "records": records, + } + + domain_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + } + ) + + link = f"https://{region}.console.aws.amazon.com/lightsail/home?region={region}#/networking/domains/{domain_name}" + resource_id = domain_arn + reference = self.get_reference(resource_id, link) + + domain_vo = Domain(domain_data, strict=False) + cloud_service = make_cloud_service( + name=domain_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=domain_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=domain_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_lightsail_domains] [{domain.get("Name")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_lightsail_domains] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_domain_tags(self, domain_arn): + """Get domain tags""" + try: + return self.connector.get_domain_tags(domain_arn) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for domain {domain_arn}: {e}") + return [] + + def _get_domain_records(self, domain_name): + """Get domain records""" + try: + return self.connector.get_domain_records(domain_name) + except Exception as e: + _LOGGER.warning(f"Failed to get records for domain {domain_name}: {e}") + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/lightsail/instance_manager.py b/src/plugin/manager/lightsail/instance_manager.py new file mode 100644 index 0000000..184a48d --- /dev/null +++ b/src/plugin/manager/lightsail/instance_manager.py @@ -0,0 +1,180 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.lightsail import Instance + + +class InstanceManager(ResourceManager): + cloud_service_group = "Lightsail" + cloud_service_type = "Instance" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "Lightsail" + self.cloud_service_type = "Instance" + self.metadata_path = "metadata/lightsail/instance.yaml" + + def create_cloud_service_type(self): + result = [] + instance_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonLightsail", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-lightsail.svg" + }, + labels=["Compute"], + ) + result.append(instance_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_instances(options, region) + + def _collect_instances(self, options, region): + region_name = region + + try: + instances, account_id = self.connector.list_lightsail_instances() + + for instance in instances: + try: + instance_name = instance.get("Name") + instance_arn = instance.get("Arn") + + # Get instance tags + tags = self._get_instance_tags(instance_arn) + + # Get instance ports + ports = self._get_instance_ports(instance_name) + + # Get instance networking + networking = self._get_instance_networking(instance_name) + + instance_data = { + "name": instance_name, + "arn": instance_arn, + "support_code": instance.get("SupportCode", ""), + "created_at": instance.get("CreatedAt"), + "location": instance.get("Location", {}), + "resource_type": instance.get("ResourceType", ""), + "tags": instance.get("Tags", []), + "blueprint_id": instance.get("BlueprintId", ""), + "blueprint_name": instance.get("BlueprintName", ""), + "bundle_id": instance.get("BundleId", ""), + "is_static_ip": instance.get("IsStaticIp", False), + "private_ip_address": instance.get("PrivateIpAddress", ""), + "public_ip_address": instance.get("PublicIpAddress", ""), + "ip_address_type": instance.get("IpAddressType", ""), + "ipv6_addresses": instance.get("Ipv6Addresses", []), + "hardware": instance.get("Hardware", {}), + "networking": instance.get("Networking", {}), + "state": instance.get("State", {}), + "username": instance.get("Username", ""), + "ssh_key_name": instance.get("SshKeyName", ""), + "ports": ports, + "networking_details": networking, + } + + instance_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + instance_name, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + instance_name, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/lightsail/home?region={region}#/instances/{instance_name}" + resource_id = instance_arn + reference = self.get_reference(resource_id, link) + + instance_vo = Instance(instance_data, strict=False) + cloud_service = make_cloud_service( + name=instance_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=instance_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=instance_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_lightsail_instances] [{instance.get("Name")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_lightsail_instances] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_instance_tags(self, instance_arn): + """Get instance tags""" + try: + return self.connector.get_instance_tags(instance_arn) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for instance {instance_arn}: {e}") + return [] + + def _get_instance_ports(self, instance_name): + """Get instance ports""" + try: + return self.connector.get_instance_ports(instance_name) + except Exception as e: + _LOGGER.warning(f"Failed to get ports for instance {instance_name}: {e}") + return [] + + def _get_instance_networking(self, instance_name): + """Get instance networking""" + try: + return self.connector.get_instance_networking(instance_name) + except Exception as e: + _LOGGER.warning( + f"Failed to get networking for instance {instance_name}: {e}" + ) + return {} + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/lightsail/loadbalancer_manager.py b/src/plugin/manager/lightsail/loadbalancer_manager.py new file mode 100644 index 0000000..a25fb22 --- /dev/null +++ b/src/plugin/manager/lightsail/loadbalancer_manager.py @@ -0,0 +1,169 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.lightsail import LoadBalancer + + +class LoadBalancerManager(ResourceManager): + cloud_service_group = "Lightsail" + cloud_service_type = "LoadBalancer" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "Lightsail" + self.cloud_service_type = "LoadBalancer" + self.metadata_path = "metadata/lightsail/loadbalancer.yaml" + + def create_cloud_service_type(self): + result = [] + loadbalancer_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonLightsail", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-lightsail.svg" + }, + labels=["Networking"], + ) + result.append(loadbalancer_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_loadbalancers(options, region) + + def _collect_loadbalancers(self, options, region): + region_name = region + cloudtrail_resource_type = "AWS::Lightsail::LoadBalancer" + + try: + loadbalancers, account_id = self.connector.list_lightsail_loadbalancers() + + for loadbalancer in loadbalancers: + try: + loadbalancer_name = loadbalancer.get("Name") + loadbalancer_arn = loadbalancer.get("Arn") + + # Get load balancer tags + tags = self._get_loadbalancer_tags(loadbalancer_arn) + + # Get load balancer target health + target_health = self._get_loadbalancer_target_health( + loadbalancer_name + ) + + loadbalancer_data = { + "name": loadbalancer_name, + "arn": loadbalancer_arn, + "created_at": loadbalancer.get("CreatedAt"), + "location": loadbalancer.get("Location", {}), + "resource_type": loadbalancer.get("ResourceType", ""), + "tags": loadbalancer.get("Tags", []), + "support_code": loadbalancer.get("SupportCode", ""), + "dns_name": loadbalancer.get("DnsName", ""), + "state": loadbalancer.get("State", ""), + "protocol": loadbalancer.get("Protocol", ""), + "public_ports": loadbalancer.get("PublicPorts", []), + "health_check_path": loadbalancer.get("HealthCheckPath", ""), + "instance_port": loadbalancer.get("InstancePort", 0), + "instance_health_summary": loadbalancer.get( + "InstanceHealthSummary", [] + ), + "tls_certificate_summaries": loadbalancer.get( + "TlsCertificateSummaries", [] + ), + "configuration_options": loadbalancer.get( + "ConfigurationOptions", {} + ), + "ip_address_type": loadbalancer.get("IpAddressType", ""), + "https_redirection_enabled": loadbalancer.get( + "HttpsRedirectionEnabled", False + ), + "target_health": target_health, + } + + loadbalancer_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + } + ) + + link = f"https://{region}.console.aws.amazon.com/lightsail/home?region={region}#/networking/load-balancers/{loadbalancer_name}" + resource_id = loadbalancer_arn + reference = self.get_reference(resource_id, link) + + loadbalancer_vo = LoadBalancer(loadbalancer_data, strict=False) + cloud_service = make_cloud_service( + name=loadbalancer_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=loadbalancer_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=loadbalancer_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_lightsail_loadbalancers] [{loadbalancer.get("Name")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_lightsail_loadbalancers] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_loadbalancer_tags(self, loadbalancer_arn): + """Get load balancer tags""" + try: + return self.connector.get_loadbalancer_tags(loadbalancer_arn) + except Exception as e: + _LOGGER.warning( + f"Failed to get tags for load balancer {loadbalancer_arn}: {e}" + ) + return [] + + def _get_loadbalancer_target_health(self, loadbalancer_name): + """Get load balancer target health""" + try: + return self.connector.get_loadbalancer_target_health(loadbalancer_name) + except Exception as e: + _LOGGER.warning( + f"Failed to get target health for load balancer {loadbalancer_name}: {e}" + ) + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/lightsail/snapshot_manager.py b/src/plugin/manager/lightsail/snapshot_manager.py new file mode 100644 index 0000000..ee91952 --- /dev/null +++ b/src/plugin/manager/lightsail/snapshot_manager.py @@ -0,0 +1,152 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.lightsail import Snapshot + + +class SnapshotManager(ResourceManager): + cloud_service_group = "Lightsail" + cloud_service_type = "Snapshot" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "Lightsail" + self.cloud_service_type = "Snapshot" + self.metadata_path = "metadata/lightsail/snapshot.yaml" + + def create_cloud_service_type(self): + result = [] + snapshot_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonLightsail", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-lightsail.svg" + }, + labels=["Storage"], + ) + result.append(snapshot_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_snapshots(options, region) + + def _collect_snapshots(self, options, region): + region_name = region + + try: + snapshots, account_id = self.connector.list_lightsail_snapshots() + + for snapshot in snapshots: + try: + snapshot_name = snapshot.get("Name") + snapshot_arn = snapshot.get("Arn") + + # Get snapshot tags + tags = self._get_snapshot_tags(snapshot_arn) + + snapshot_data = { + "name": snapshot_name, + "arn": snapshot_arn, + "created_at": snapshot.get("CreatedAt"), + "location": snapshot.get("Location", {}), + "resource_type": snapshot.get("ResourceType", ""), + "tags": snapshot.get("Tags", []), + "support_code": snapshot.get("SupportCode", ""), + "size_in_gb": snapshot.get("SizeInGb", 0), + "state": snapshot.get("State", ""), + "progress": snapshot.get("Progress", ""), + "from_resource_name": snapshot.get("FromResourceName", ""), + "from_resource_arn": snapshot.get("FromResourceArn", ""), + "from_blueprint_id": snapshot.get("FromBlueprintId", ""), + "from_bundle_id": snapshot.get("FromBundleId", ""), + "is_from_auto_snapshot": snapshot.get( + "IsFromAutoSnapshot", False + ), + "from_attached_disks": snapshot.get("FromAttachedDisks", []), + } + + snapshot_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + snapshot_name, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + snapshot_name, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/lightsail/home?region={region}#/storage/snapshots/{snapshot_name}" + resource_id = snapshot_arn + reference = self.get_reference(resource_id, link) + + snapshot_vo = Snapshot(snapshot_data, strict=False) + cloud_service = make_cloud_service( + name=snapshot_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=snapshot_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=snapshot_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_lightsail_snapshots] [{snapshot.get("Name")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_lightsail_snapshots] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_snapshot_tags(self, snapshot_arn): + """Get snapshot tags""" + try: + return self.connector.get_snapshot_tags(snapshot_arn) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for snapshot {snapshot_arn}: {e}") + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/lightsail/static_ip_manager.py b/src/plugin/manager/lightsail/static_ip_manager.py new file mode 100644 index 0000000..9bfbb0d --- /dev/null +++ b/src/plugin/manager/lightsail/static_ip_manager.py @@ -0,0 +1,145 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.lightsail import StaticIP + + +class StaticIPManager(ResourceManager): + cloud_service_group = "Lightsail" + cloud_service_type = "StaticIP" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "Lightsail" + self.cloud_service_type = "StaticIP" + self.metadata_path = "metadata/lightsail/static_ip.yaml" + + def create_cloud_service_type(self): + result = [] + static_ip_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonLightsail", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-lightsail.svg" + }, + labels=["Networking"], + ) + result.append(static_ip_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_static_ips(options, region) + + def _collect_static_ips(self, options, region): + region_name = region + + try: + static_ips, account_id = self.connector.list_lightsail_static_ips() + + for static_ip in static_ips: + try: + static_ip_name = static_ip.get("Name") + static_ip_arn = static_ip.get("Arn") + + # Get static IP tags + tags = self._get_static_ip_tags(static_ip_arn) + + static_ip_data = { + "name": static_ip_name, + "arn": static_ip_arn, + "created_at": static_ip.get("CreatedAt"), + "location": static_ip.get("Location", {}), + "resource_type": static_ip.get("ResourceType", ""), + "tags": static_ip.get("Tags", []), + "support_code": static_ip.get("SupportCode", ""), + "ip_address": static_ip.get("IpAddress", ""), + "attached_to": static_ip.get("AttachedTo", ""), + "is_attached": static_ip.get("IsAttached", False), + "attachment_state": static_ip.get("AttachmentState", ""), + } + + static_ip_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + static_ip_name, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + static_ip_name, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/lightsail/home?region={region}#/networking/static-ips/{static_ip_name}" + resource_id = static_ip_arn + reference = self.get_reference(resource_id, link) + + static_ip_vo = StaticIP(static_ip_data, strict=False) + cloud_service = make_cloud_service( + name=static_ip_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=static_ip_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=static_ip_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_lightsail_static_ips] [{static_ip.get("Name")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_lightsail_static_ips] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_static_ip_tags(self, static_ip_arn): + """Get static IP tags""" + try: + return self.connector.get_static_ip_tags(static_ip_arn) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for static IP {static_ip_arn}: {e}") + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/msk/__init__.py b/src/plugin/manager/msk/__init__.py index e69de29..a0faf25 100644 --- a/src/plugin/manager/msk/__init__.py +++ b/src/plugin/manager/msk/__init__.py @@ -0,0 +1,3 @@ +from .cluster_configuration_manager import ClusterConfigurationManager +from .cluster_manager import ClusterManager + diff --git a/src/plugin/manager/msk/cluster_configuration_manager.py b/src/plugin/manager/msk/cluster_configuration_manager.py new file mode 100644 index 0000000..3148820 --- /dev/null +++ b/src/plugin/manager/msk/cluster_configuration_manager.py @@ -0,0 +1,136 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.msk import ClusterConfiguration + + +class ClusterConfigurationManager(ResourceManager): + cloud_service_group = "MSK" + cloud_service_type = "ClusterConfiguration" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "MSK" + self.cloud_service_type = "ClusterConfiguration" + self.metadata_path = "metadata/msk/cluster_configuration.yaml" + + def create_cloud_service_type(self): + result = [] + configuration_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonMSK", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-msk.svg" + }, + labels=["Analytics", "Streaming"], + ) + result.append(configuration_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_cluster_configurations(options, region) + + def _collect_cluster_configurations(self, options, region): + region_name = region + cloudtrail_resource_type = "AWS::MSK::Configuration" + + try: + configurations, account_id = self.connector.list_msk_configurations() + + for configuration in configurations: + try: + configuration_arn = configuration.get("Arn") + configuration_name = configuration.get("Name") + + # Get configuration tags + tags = self._get_configuration_tags(configuration_arn) + + configuration_data = { + "arn": configuration_arn, + "name": configuration_name, + "description": configuration.get("Description", ""), + "kafka_versions": configuration.get("KafkaVersions", []), + "creation_time": configuration.get("CreationTime"), + "latest_revision": configuration.get("LatestRevision", {}), + "state": configuration.get("State", ""), + } + + configuration_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + } + ) + + link = f"https://{region}.console.aws.amazon.com/msk/home?region={region}#/configuration/{configuration_name}" + resource_id = configuration_arn + reference = self.get_reference(resource_id, link) + + configuration_vo = ClusterConfiguration( + configuration_data, strict=False + ) + cloud_service = make_cloud_service( + name=configuration_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=configuration_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=configuration_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_msk_configurations] [{configuration.get("Name")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_msk_configurations] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_configuration_tags(self, configuration_arn): + """Get configuration tags""" + try: + return self.connector.get_configuration_tags(configuration_arn) + except Exception as e: + _LOGGER.warning( + f"Failed to get tags for configuration {configuration_arn}: {e}" + ) + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/msk/cluster_manager.py b/src/plugin/manager/msk/cluster_manager.py new file mode 100644 index 0000000..d824177 --- /dev/null +++ b/src/plugin/manager/msk/cluster_manager.py @@ -0,0 +1,179 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.msk import Cluster + + +class ClusterManager(ResourceManager): + cloud_service_group = "MSK" + cloud_service_type = "Cluster" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "MSK" + self.cloud_service_type = "Cluster" + self.metadata_path = "metadata/msk/cluster.yaml" + + def create_cloud_service_type(self): + result = [] + cluster_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonMSK", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-msk.svg" + }, + labels=["Analytics", "Streaming"], + ) + result.append(cluster_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_clusters(options, region) + + def _collect_clusters(self, options, region): + region_name = region + + try: + clusters, account_id = self.connector.list_msk_clusters() + + for cluster in clusters: + try: + cluster_arn = cluster.get("ClusterArn") + cluster_name = cluster.get("ClusterName") + + # Get cluster configuration + configuration = self._get_cluster_configuration(cluster_arn) + + # Get cluster tags + tags = self._get_cluster_tags(cluster_arn) + + cluster_data = { + "cluster_arn": cluster_arn, + "cluster_name": cluster_name, + "creation_time": cluster.get("CreationTime"), + "current_version": cluster.get("CurrentVersion", ""), + "state": cluster.get("State", ""), + "state_info": cluster.get("StateInfo", {}), + "tags": cluster.get("Tags", {}), + "active_operation_arn": cluster.get("ActiveOperationArn", ""), + "cluster_type": cluster.get("ClusterType", ""), + "cluster_version": cluster.get("ClusterVersion", ""), + "broker_node_group_info": cluster.get( + "BrokerNodeGroupInfo", {} + ), + "client_authentication": cluster.get( + "ClientAuthentication", {} + ), + "encryption_info": cluster.get("EncryptionInfo", {}), + "enhanced_monitoring": cluster.get("EnhancedMonitoring", ""), + "open_monitoring": cluster.get("OpenMonitoring", {}), + "logging_info": cluster.get("LoggingInfo", {}), + "number_of_broker_nodes": cluster.get("NumberOfBrokerNodes", 0), + "zookeeper_connect_string": cluster.get( + "ZookeeperConnectString", "" + ), + "zookeeper_connect_string_tls": cluster.get( + "ZookeeperConnectStringTls", "" + ), + "storage_mode": cluster.get("StorageMode", ""), + "customer_action_status": cluster.get( + "CustomerActionStatus", "" + ), + "configuration": configuration, + } + + cluster_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + cluster_name, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + cluster_name, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/msk/home?region={region}#/cluster/{cluster_name}/details" + resource_id = cluster_arn + reference = self.get_reference(resource_id, link) + + cluster_vo = Cluster(cluster_data, strict=False) + cloud_service = make_cloud_service( + name=cluster_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=cluster_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=cluster_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_msk_clusters] [{cluster.get("ClusterName")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_msk_clusters] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_cluster_configuration(self, cluster_arn): + """Get cluster configuration""" + try: + return self.connector.get_cluster_configuration(cluster_arn) + except Exception as e: + _LOGGER.warning( + f"Failed to get configuration for cluster {cluster_arn}: {e}" + ) + return {} + + def _get_cluster_tags(self, cluster_arn): + """Get cluster tags""" + try: + return self.connector.get_cluster_tags(cluster_arn) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for cluster {cluster_arn}: {e}") + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/rds/__init__.py b/src/plugin/manager/rds/__init__.py index e69de29..28dfa35 100644 --- a/src/plugin/manager/rds/__init__.py +++ b/src/plugin/manager/rds/__init__.py @@ -0,0 +1,7 @@ +from .database_manager import DatabaseManager +from .instance_manager import InstanceManager +from .option_group_manager import OptionGroupManager +from .parameter_group_manager import ParameterGroupManager +from .snapshot_manager import SnapshotManager +from .subnet_group_manager import SubnetGroupManager + diff --git a/src/plugin/manager/rds/database_manager.py b/src/plugin/manager/rds/database_manager.py new file mode 100644 index 0000000..db81bb3 --- /dev/null +++ b/src/plugin/manager/rds/database_manager.py @@ -0,0 +1,314 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.rds import Database + + +class DatabaseManager(ResourceManager): + cloud_service_group = "RDS" + cloud_service_type = "Database" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "RDS" + self.cloud_service_type = "Database" + self.metadata_path = "metadata/rds/database.yaml" + + def create_cloud_service_type(self): + result = [] + database_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonRDS", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-rds.svg" + }, + labels=["Database"], + ) + result.append(database_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_databases(options, region) + + def _collect_databases(self, options, region): + region_name = region + + try: + databases, account_id = self.connector.list_rds_databases() + + for database in databases: + try: + database_id = database.get("DBClusterIdentifier") + + # Get database tags + tags = self._get_database_tags(database_id) + + # Get database members + members = self._get_database_members(database_id) + + # Get database snapshots + snapshots = self._get_database_snapshots(database_id) + + database_data = { + "db_cluster_identifier": database_id, + "db_cluster_arn": database.get("DBClusterArn"), + "status": database.get("Status", ""), + "percent_progress": database.get("PercentProgress", ""), + "earliest_restorable_time": database.get( + "EarliestRestorableTime" + ), + "endpoint": database.get("Endpoint", ""), + "reader_endpoint": database.get("ReaderEndpoint", ""), + "custom_endpoints": database.get("CustomEndpoints", []), + "multi_az": database.get("MultiAZ", False), + "engine": database.get("Engine", ""), + "engine_version": database.get("EngineVersion", ""), + "latest_restorable_time": database.get("LatestRestorableTime"), + "port": database.get("Port", 0), + "master_username": database.get("MasterUsername", ""), + "db_cluster_option_group_memberships": database.get( + "DBClusterOptionGroupMemberships", [] + ), + "preferred_backup_window": database.get( + "PreferredBackupWindow", "" + ), + "preferred_maintenance_window": database.get( + "PreferredMaintenanceWindow", "" + ), + "replication_source_identifier": database.get( + "ReplicationSourceIdentifier", "" + ), + "read_replica_identifiers": database.get( + "ReadReplicaIdentifiers", [] + ), + "db_cluster_members": database.get("DBClusterMembers", []), + "vpc_security_groups": database.get("VpcSecurityGroups", []), + "hosted_zone_id": database.get("HostedZoneId", ""), + "storage_encrypted": database.get("StorageEncrypted", False), + "kms_key_id": database.get("KmsKeyId", ""), + "db_cluster_resource_id": database.get( + "DbClusterResourceId", "" + ), + "db_cluster_arn": database.get("DBClusterArn"), + "associated_roles": database.get("AssociatedRoles", []), + "iam_database_authentication_enabled": database.get( + "IAMDatabaseAuthenticationEnabled", False + ), + "clone_group_id": database.get("CloneGroupId", ""), + "cluster_create_time": database.get("ClusterCreateTime"), + "earliest_backtrack_time": database.get( + "EarliestBacktrackTime" + ), + "backtrack_window": database.get("BacktrackWindow", 0), + "backtrack_consumed_change_records": database.get( + "BacktrackConsumedChangeRecords", 0 + ), + "enabled_cloudwatch_logs_exports": database.get( + "EnabledCloudwatchLogsExports", [] + ), + "capacity": database.get("Capacity", 0), + "engine_mode": database.get("EngineMode", ""), + "scaling_configuration_info": database.get( + "ScalingConfigurationInfo", {} + ), + "deletion_protection": database.get( + "DeletionProtection", False + ), + "http_endpoint_enabled": database.get( + "HttpEndpointEnabled", False + ), + "activity_stream_kinesis_stream_name": database.get( + "ActivityStreamKinesisStreamName", "" + ), + "activity_stream_kms_key_id": database.get( + "ActivityStreamKmsKeyId", "" + ), + "activity_stream_mode": database.get("ActivityStreamMode", ""), + "activity_stream_status": database.get( + "ActivityStreamStatus", "" + ), + "backtrack_window": database.get("BacktrackWindow", 0), + "backtrack_consumed_change_records": database.get( + "BacktrackConsumedChangeRecords", 0 + ), + "enabled_cloudwatch_logs_exports": database.get( + "EnabledCloudwatchLogsExports", [] + ), + "capacity": database.get("Capacity", 0), + "engine_mode": database.get("EngineMode", ""), + "scaling_configuration_info": database.get( + "ScalingConfigurationInfo", {} + ), + "deletion_protection": database.get( + "DeletionProtection", False + ), + "http_endpoint_enabled": database.get( + "HttpEndpointEnabled", False + ), + "activity_stream_kinesis_stream_name": database.get( + "ActivityStreamKinesisStreamName", "" + ), + "activity_stream_kms_key_id": database.get( + "ActivityStreamKmsKeyId", "" + ), + "activity_stream_mode": database.get("ActivityStreamMode", ""), + "activity_stream_status": database.get( + "ActivityStreamStatus", "" + ), + "copy_tags_to_snapshot": database.get( + "CopyTagsToSnapshot", False + ), + "cross_account_clone": database.get("CrossAccountClone", False), + "domain_memberships": database.get("DomainMemberships", []), + "tag_list": database.get("TagList", []), + "global_write_forwarding_status": database.get( + "GlobalWriteForwardingStatus", "" + ), + "global_write_forwarding_requested": database.get( + "GlobalWriteForwardingRequested", False + ), + "pending_modified_values": database.get( + "PendingModifiedValues", {} + ), + "db_cluster_instance_class": database.get( + "DBClusterInstanceClass", "" + ), + "storage_type": database.get("StorageType", ""), + "iops": database.get("Iops", 0), + "publicly_accessible": database.get( + "PubliclyAccessible", False + ), + "auto_minor_version_upgrade": database.get( + "AutoMinorVersionUpgrade", False + ), + "monitoring_interval": database.get("MonitoringInterval", 0), + "monitoring_role_arn": database.get("MonitoringRoleArn", ""), + "performance_insights_enabled": database.get( + "PerformanceInsightsEnabled", False + ), + "performance_insights_kms_key_id": database.get( + "PerformanceInsightsKmsKeyId", "" + ), + "performance_insights_retention_period": database.get( + "PerformanceInsightsRetentionPeriod", 0 + ), + "serverless_v2_scaling_configuration": database.get( + "ServerlessV2ScalingConfiguration", {} + ), + "network_type": database.get("NetworkType", ""), + "db_system_id": database.get("DBSystemId", ""), + "master_user_secret": database.get("MasterUserSecret", {}), + "io_optimized_next_allowed_modification_time": database.get( + "IOOptimizedNextAllowedModificationTime" + ), + "local_write_forwarding_status": database.get( + "LocalWriteForwardingStatus", "" + ), + "aws_backup_recovery_point_arn": database.get( + "AwsBackupRecoveryPointArn", "" + ), + "members": members, + "snapshots": snapshots, + } + + database_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + database_id, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + database_id, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/rds/home?region={region}#database:id={database_id};is-cluster=true" + resource_id = database_id + reference = self.get_reference(resource_id, link) + + database_vo = Database(database_data, strict=False) + cloud_service = make_cloud_service( + name=database_id, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=database_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=database_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_rds_databases] [{database.get("DBClusterIdentifier")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_rds_databases] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_database_tags(self, database_id): + """Get database tags""" + try: + return self.connector.get_database_tags(database_id) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for database {database_id}: {e}") + return [] + + def _get_database_members(self, database_id): + """Get database members""" + try: + return self.connector.get_database_members(database_id) + except Exception as e: + _LOGGER.warning(f"Failed to get members for database {database_id}: {e}") + return [] + + def _get_database_snapshots(self, database_id): + """Get database snapshots""" + try: + return self.connector.get_database_snapshots(database_id) + except Exception as e: + _LOGGER.warning(f"Failed to get snapshots for database {database_id}: {e}") + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/rds/instance_manager.py b/src/plugin/manager/rds/instance_manager.py new file mode 100644 index 0000000..723780f --- /dev/null +++ b/src/plugin/manager/rds/instance_manager.py @@ -0,0 +1,292 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.rds import Instance + + +class InstanceManager(ResourceManager): + cloud_service_group = "RDS" + cloud_service_type = "Instance" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "RDS" + self.cloud_service_type = "Instance" + self.metadata_path = "metadata/rds/instance.yaml" + + def create_cloud_service_type(self): + result = [] + instance_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonRDS", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-rds.svg" + }, + labels=["Database"], + ) + result.append(instance_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_instances(options, region) + + def _collect_instances(self, options, region): + region_name = region + cloudtrail_resource_type = "AWS::RDS::DBInstance" + + try: + instances, account_id = self.connector.list_rds_instances() + + for instance in instances: + try: + instance_id = instance.get("DBInstanceIdentifier") + + # Get instance tags + tags = self._get_instance_tags(instance_id) + + # Get instance snapshots + snapshots = self._get_instance_snapshots(instance_id) + + # Get instance parameter groups + parameter_groups = self._get_instance_parameter_groups( + instance.get("DBParameterGroups", []) + ) + + # Get instance option groups + option_groups = self._get_instance_option_groups( + instance.get("OptionGroupMemberships", []) + ) + + instance_data = { + "db_instance_identifier": instance_id, + "db_instance_arn": instance.get("DBInstanceArn"), + "db_instance_class": instance.get("DBInstanceClass", ""), + "engine": instance.get("Engine", ""), + "engine_version": instance.get("EngineVersion", ""), + "db_instance_status": instance.get("DBInstanceStatus", ""), + "master_username": instance.get("MasterUsername", ""), + "db_name": instance.get("DBName", ""), + "endpoint": instance.get("Endpoint", {}), + "allocated_storage": instance.get("AllocatedStorage", 0), + "instance_create_time": instance.get("InstanceCreateTime"), + "preferred_backup_window": instance.get( + "PreferredBackupWindow", "" + ), + "backup_retention_period": instance.get( + "BackupRetentionPeriod", 0 + ), + "db_security_groups": instance.get("DBSecurityGroups", []), + "vpc_security_groups": instance.get("VpcSecurityGroups", []), + "db_parameter_groups": instance.get("DBParameterGroups", []), + "availability_zone": instance.get("AvailabilityZone", ""), + "db_subnet_group": instance.get("DBSubnetGroup", {}), + "preferred_maintenance_window": instance.get( + "PreferredMaintenanceWindow", "" + ), + "pending_modified_values": instance.get( + "PendingModifiedValues", {} + ), + "latest_restorable_time": instance.get("LatestRestorableTime"), + "multi_az": instance.get("MultiAZ", False), + "engine_version": instance.get("EngineVersion", ""), + "auto_minor_version_upgrade": instance.get( + "AutoMinorVersionUpgrade", False + ), + "read_replica_source_db_instance_identifier": instance.get( + "ReadReplicaSourceDBInstanceIdentifier", "" + ), + "read_replica_db_instance_identifiers": instance.get( + "ReadReplicaDBInstanceIdentifiers", [] + ), + "read_replica_db_cluster_identifiers": instance.get( + "ReadReplicaDBClusterIdentifiers", [] + ), + "license_model": instance.get("LicenseModel", ""), + "iops": instance.get("Iops", 0), + "option_group_memberships": instance.get( + "OptionGroupMemberships", [] + ), + "character_set_name": instance.get("CharacterSetName", ""), + "nchar_character_set_name": instance.get( + "NcharCharacterSetName", "" + ), + "secondary_availability_zone": instance.get( + "SecondaryAvailabilityZone", "" + ), + "publicly_accessible": instance.get( + "PubliclyAccessible", False + ), + "status_infos": instance.get("StatusInfos", []), + "storage_type": instance.get("StorageType", ""), + "tde_credential_arn": instance.get("TdeCredentialArn", ""), + "db_instance_port": instance.get("DbInstancePort", 0), + "db_cluster_identifier": instance.get( + "DBClusterIdentifier", "" + ), + "storage_encrypted": instance.get("StorageEncrypted", False), + "kms_key_id": instance.get("KmsKeyId", ""), + "dbi_resource_id": instance.get("DbiResourceId", ""), + "ca_certificate_identifier": instance.get( + "CACertificateIdentifier", "" + ), + "domain_memberships": instance.get("DomainMemberships", []), + "copy_tags_to_snapshot": instance.get( + "CopyTagsToSnapshot", False + ), + "monitoring_interval": instance.get("MonitoringInterval", 0), + "enhanced_monitoring_resource_arn": instance.get( + "EnhancedMonitoringResourceArn", "" + ), + "monitoring_role_arn": instance.get("MonitoringRoleArn", ""), + "promotion_tier": instance.get("PromotionTier", 0), + "db_instance_automated_backups_replications": instance.get( + "DBInstanceAutomatedBackupsReplications", [] + ), + "customer_owned_ip_enabled": instance.get( + "CustomerOwnedIpEnabled", False + ), + "aws_backup_recovery_point_arn": instance.get( + "AwsBackupRecoveryPointArn", "" + ), + "activity_stream_status": instance.get( + "ActivityStreamStatus", "" + ), + "activity_stream_kms_key_id": instance.get( + "ActivityStreamKmsKeyId", "" + ), + "activity_stream_kinesis_stream_name": instance.get( + "ActivityStreamKinesisStreamName", "" + ), + "activity_stream_mode": instance.get("ActivityStreamMode", ""), + "activity_stream_engine_native_audit_fields_included": instance.get( + "ActivityStreamEngineNativeAuditFieldsIncluded", False + ), + "automation_mode": instance.get("AutomationMode", ""), + "resume_full_automation_mode_time": instance.get( + "ResumeFullAutomationModeTime" + ), + "custom_iam_instance_profile": instance.get( + "CustomIamInstanceProfile", "" + ), + "backup_target": instance.get("BackupTarget", ""), + "network_type": instance.get("NetworkType", ""), + "activity_stream_policy_status": instance.get( + "ActivityStreamPolicyStatus", "" + ), + "storage_throughput": instance.get("StorageThroughput", 0), + "db_system_id": instance.get("DBSystemId", ""), + "master_user_secret": instance.get("MasterUserSecret", {}), + "certificate_details": instance.get("CertificateDetails", {}), + "read_replica_source_db_cluster_identifier": instance.get( + "ReadReplicaSourceDBClusterIdentifier", "" + ), + "snapshots": snapshots, + "parameter_groups": parameter_groups, + "option_groups": option_groups, + } + + instance_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + } + ) + + link = f"https://{region}.console.aws.amazon.com/rds/home?region={region}#database:id={instance_id};is-cluster=false" + resource_id = instance_id + reference = self.get_reference(resource_id, link) + + instance_vo = Instance(instance_data, strict=False) + cloud_service = make_cloud_service( + name=instance_id, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=instance_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=instance_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_rds_instances] [{instance.get("DBInstanceIdentifier")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_rds_instances] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_instance_tags(self, instance_id): + """Get instance tags""" + try: + return self.connector.get_instance_tags(instance_id) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for instance {instance_id}: {e}") + return [] + + def _get_instance_snapshots(self, instance_id): + """Get instance snapshots""" + try: + return self.connector.get_instance_snapshots(instance_id) + except Exception as e: + _LOGGER.warning(f"Failed to get snapshots for instance {instance_id}: {e}") + return [] + + def _get_instance_parameter_groups(self, parameter_groups): + """Get instance parameter groups details""" + if not parameter_groups: + return [] + + try: + return self.connector.get_instance_parameter_groups(parameter_groups) + except Exception as e: + _LOGGER.warning(f"Failed to get parameter groups: {e}") + return [] + + def _get_instance_option_groups(self, option_groups): + """Get instance option groups details""" + if not option_groups: + return [] + + try: + return self.connector.get_instance_option_groups(option_groups) + except Exception as e: + _LOGGER.warning(f"Failed to get option groups: {e}") + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/rds/option_group_manager.py b/src/plugin/manager/rds/option_group_manager.py new file mode 100644 index 0000000..cbd0831 --- /dev/null +++ b/src/plugin/manager/rds/option_group_manager.py @@ -0,0 +1,153 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.rds import OptionGroup + + +class OptionGroupManager(ResourceManager): + cloud_service_group = "RDS" + cloud_service_type = "OptionGroup" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "RDS" + self.cloud_service_type = "OptionGroup" + self.metadata_path = "metadata/rds/option_group.yaml" + + def create_cloud_service_type(self): + result = [] + option_group_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonRDS", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-rds.svg" + }, + labels=["Database"], + ) + result.append(option_group_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_option_groups(options, region) + + def _collect_option_groups(self, options, region): + region_name = region + cloudtrail_resource_type = "AWS::RDS::DBOptionGroup" + + try: + option_groups, account_id = self.connector.list_rds_option_groups() + + for option_group in option_groups: + try: + option_group_name = option_group.get("OptionGroupName") + + # Get option group tags + tags = self._get_option_group_tags(option_group_name) + + # Get option group options + options = self._get_option_group_options(option_group_name) + + option_group_data = { + "option_group_name": option_group_name, + "option_group_description": option_group.get( + "OptionGroupDescription", "" + ), + "engine_name": option_group.get("EngineName", ""), + "major_engine_version": option_group.get( + "MajorEngineVersion", "" + ), + "option_group_arn": option_group.get("OptionGroupArn"), + "allows_vpc_and_non_vpc_instance_memberships": option_group.get( + "AllowsVpcAndNonVpcInstanceMemberships", False + ), + "vpc_id": option_group.get("VpcId", ""), + "options": options, + } + + option_group_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + } + ) + + link = f"https://{region}.console.aws.amazon.com/rds/home?region={region}#option-groups:option-group-name={option_group_name}" + resource_id = option_group_name + reference = self.get_reference(resource_id, link) + + option_group_vo = OptionGroup(option_group_data, strict=False) + cloud_service = make_cloud_service( + name=option_group_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=option_group_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=option_group_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_rds_option_groups] [{option_group.get("OptionGroupName")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_rds_option_groups] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_option_group_tags(self, option_group_name): + """Get option group tags""" + try: + return self.connector.get_option_group_tags(option_group_name) + except Exception as e: + _LOGGER.warning( + f"Failed to get tags for option group {option_group_name}: {e}" + ) + return [] + + def _get_option_group_options(self, option_group_name): + """Get option group options""" + try: + return self.connector.get_option_group_options(option_group_name) + except Exception as e: + _LOGGER.warning( + f"Failed to get options for option group {option_group_name}: {e}" + ) + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/rds/parameter_group_manager.py b/src/plugin/manager/rds/parameter_group_manager.py new file mode 100644 index 0000000..c4ed6c2 --- /dev/null +++ b/src/plugin/manager/rds/parameter_group_manager.py @@ -0,0 +1,152 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.rds import ParameterGroup + + +class ParameterGroupManager(ResourceManager): + cloud_service_group = "RDS" + cloud_service_type = "ParameterGroup" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "RDS" + self.cloud_service_type = "ParameterGroup" + self.metadata_path = "metadata/rds/parameter_group.yaml" + + def create_cloud_service_type(self): + result = [] + parameter_group_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonRDS", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-rds.svg" + }, + labels=["Database"], + ) + result.append(parameter_group_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_parameter_groups(options, region) + + def _collect_parameter_groups(self, options, region): + region_name = region + cloudtrail_resource_type = "AWS::RDS::DBParameterGroup" + + try: + parameter_groups, account_id = self.connector.list_rds_parameter_groups() + + for parameter_group in parameter_groups: + try: + parameter_group_name = parameter_group.get("DBParameterGroupName") + + # Get parameter group tags + tags = self._get_parameter_group_tags(parameter_group_name) + + # Get parameter group parameters + parameters = self._get_parameter_group_parameters( + parameter_group_name + ) + + parameter_group_data = { + "db_parameter_group_name": parameter_group_name, + "db_parameter_group_family": parameter_group.get( + "DBParameterGroupFamily", "" + ), + "description": parameter_group.get("Description", ""), + "db_parameter_group_arn": parameter_group.get( + "DBParameterGroupArn" + ), + "parameters": parameters, + } + + parameter_group_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + } + ) + + link = f"https://{region}.console.aws.amazon.com/rds/home?region={region}#parameter-groups:parameter-group-family={parameter_group.get('DBParameterGroupFamily', '')}" + resource_id = parameter_group_name + reference = self.get_reference(resource_id, link) + + parameter_group_vo = ParameterGroup( + parameter_group_data, strict=False + ) + cloud_service = make_cloud_service( + name=parameter_group_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=parameter_group_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=parameter_group_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_rds_parameter_groups] [{parameter_group.get("DBParameterGroupName")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_rds_parameter_groups] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_parameter_group_tags(self, parameter_group_name): + """Get parameter group tags""" + try: + return self.connector.get_parameter_group_tags(parameter_group_name) + except Exception as e: + _LOGGER.warning( + f"Failed to get tags for parameter group {parameter_group_name}: {e}" + ) + return [] + + def _get_parameter_group_parameters(self, parameter_group_name): + """Get parameter group parameters""" + try: + return self.connector.get_parameter_group_parameters(parameter_group_name) + except Exception as e: + _LOGGER.warning( + f"Failed to get parameters for parameter group {parameter_group_name}: {e}" + ) + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/rds/snapshot_manager.py b/src/plugin/manager/rds/snapshot_manager.py new file mode 100644 index 0000000..287ba0b --- /dev/null +++ b/src/plugin/manager/rds/snapshot_manager.py @@ -0,0 +1,170 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.rds import Snapshot + + +class SnapshotManager(ResourceManager): + cloud_service_group = "RDS" + cloud_service_type = "Snapshot" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "RDS" + self.cloud_service_type = "Snapshot" + self.metadata_path = "metadata/rds/snapshot.yaml" + + def create_cloud_service_type(self): + result = [] + snapshot_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonRDS", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-rds.svg" + }, + labels=["Database"], + ) + result.append(snapshot_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_snapshots(options, region) + + def _collect_snapshots(self, options, region): + region_name = region + cloudtrail_resource_type = "AWS::RDS::DBSnapshot" + + try: + snapshots, account_id = self.connector.list_rds_snapshots() + + for snapshot in snapshots: + try: + snapshot_id = snapshot.get("DBSnapshotIdentifier") + + # Get snapshot tags + tags = self._get_snapshot_tags(snapshot_id) + + snapshot_data = { + "db_snapshot_identifier": snapshot_id, + "db_instance_identifier": snapshot.get( + "DBInstanceIdentifier", "" + ), + "snapshot_create_time": snapshot.get("SnapshotCreateTime"), + "engine": snapshot.get("Engine", ""), + "allocated_storage": snapshot.get("AllocatedStorage", 0), + "status": snapshot.get("Status", ""), + "port": snapshot.get("Port", 0), + "availability_zone": snapshot.get("AvailabilityZone", ""), + "vpc_id": snapshot.get("VpcId", ""), + "instance_create_time": snapshot.get("InstanceCreateTime"), + "master_username": snapshot.get("MasterUsername", ""), + "engine_version": snapshot.get("EngineVersion", ""), + "license_model": snapshot.get("LicenseModel", ""), + "snapshot_type": snapshot.get("SnapshotType", ""), + "iops": snapshot.get("Iops", 0), + "option_group_name": snapshot.get("OptionGroupName", ""), + "percent_progress": snapshot.get("PercentProgress", 0), + "source_region": snapshot.get("SourceRegion", ""), + "source_db_snapshot_identifier": snapshot.get( + "SourceDBSnapshotIdentifier", "" + ), + "storage_type": snapshot.get("StorageType", ""), + "tde_credential_arn": snapshot.get("TdeCredentialArn", ""), + "encrypted": snapshot.get("Encrypted", False), + "kms_key_id": snapshot.get("KmsKeyId", ""), + "db_snapshot_arn": snapshot.get("DBSnapshotArn"), + "timezone": snapshot.get("Timezone", ""), + "iam_database_authentication_enabled": snapshot.get( + "IAMDatabaseAuthenticationEnabled", False + ), + "processor_features": snapshot.get("ProcessorFeatures", []), + "dbi_resource_id": snapshot.get("DbiResourceId", ""), + "tag_list": snapshot.get("TagList", []), + "original_snapshot_create_time": snapshot.get( + "OriginalSnapshotCreateTime" + ), + "snapshot_database_time": snapshot.get("SnapshotDatabaseTime"), + "snapshot_target": snapshot.get("SnapshotTarget", ""), + "storage_throughput": snapshot.get("StorageThroughput", 0), + "db_system_id": snapshot.get("DBSystemId", ""), + "dedicated_log_volume": snapshot.get( + "DedicatedLogVolume", False + ), + "multi_tenant": snapshot.get("MultiTenant", False), + } + + snapshot_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + } + ) + + link = f"https://{region}.console.aws.amazon.com/rds/home?region={region}#snapshots:snapshot-id={snapshot_id}" + resource_id = snapshot_id + reference = self.get_reference(resource_id, link) + + snapshot_vo = Snapshot(snapshot_data, strict=False) + cloud_service = make_cloud_service( + name=snapshot_id, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=snapshot_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=snapshot_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_rds_snapshots] [{snapshot.get("DBSnapshotIdentifier")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_rds_snapshots] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_snapshot_tags(self, snapshot_id): + """Get snapshot tags""" + try: + return self.connector.get_snapshot_tags(snapshot_id) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for snapshot {snapshot_id}: {e}") + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/rds/subnet_group_manager.py b/src/plugin/manager/rds/subnet_group_manager.py new file mode 100644 index 0000000..26daebe --- /dev/null +++ b/src/plugin/manager/rds/subnet_group_manager.py @@ -0,0 +1,139 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.rds import SubnetGroup + + +class SubnetGroupManager(ResourceManager): + cloud_service_group = "RDS" + cloud_service_type = "SubnetGroup" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "RDS" + self.cloud_service_type = "SubnetGroup" + self.metadata_path = "metadata/rds/subnet_group.yaml" + + def create_cloud_service_type(self): + result = [] + subnet_group_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonRDS", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-rds.svg" + }, + labels=["Database"], + ) + result.append(subnet_group_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_subnet_groups(options, region) + + def _collect_subnet_groups(self, options, region): + region_name = region + cloudtrail_resource_type = "AWS::RDS::DBSubnetGroup" + + try: + subnet_groups, account_id = self.connector.list_rds_subnet_groups() + + for subnet_group in subnet_groups: + try: + subnet_group_name = subnet_group.get("DBSubnetGroupName") + + # Get subnet group tags + tags = self._get_subnet_group_tags(subnet_group_name) + + subnet_group_data = { + "db_subnet_group_name": subnet_group_name, + "db_subnet_group_description": subnet_group.get( + "DBSubnetGroupDescription", "" + ), + "vpc_id": subnet_group.get("VpcId", ""), + "subnet_group_status": subnet_group.get( + "SubnetGroupStatus", "" + ), + "subnets": subnet_group.get("Subnets", []), + "db_subnet_group_arn": subnet_group.get("DBSubnetGroupArn"), + "supported_network_types": subnet_group.get( + "SupportedNetworkTypes", [] + ), + } + + subnet_group_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + } + ) + + link = f"https://{region}.console.aws.amazon.com/rds/home?region={region}#subnet-groups:db-subnet-group-name={subnet_group_name}" + resource_id = subnet_group_name + reference = self.get_reference(resource_id, link) + + subnet_group_vo = SubnetGroup(subnet_group_data, strict=False) + cloud_service = make_cloud_service( + name=subnet_group_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=subnet_group_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=subnet_group_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_rds_subnet_groups] [{subnet_group.get("DBSubnetGroupName")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_rds_subnet_groups] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_subnet_group_tags(self, subnet_group_name): + """Get subnet group tags""" + try: + return self.connector.get_subnet_group_tags(subnet_group_name) + except Exception as e: + _LOGGER.warning( + f"Failed to get tags for subnet group {subnet_group_name}: {e}" + ) + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/redshift/__init__.py b/src/plugin/manager/redshift/__init__.py index e69de29..2c5c8b2 100644 --- a/src/plugin/manager/redshift/__init__.py +++ b/src/plugin/manager/redshift/__init__.py @@ -0,0 +1,2 @@ +from .cluster_manager import ClusterManager + diff --git a/src/plugin/manager/redshift/cluster_manager.py b/src/plugin/manager/redshift/cluster_manager.py new file mode 100644 index 0000000..6c9c916 --- /dev/null +++ b/src/plugin/manager/redshift/cluster_manager.py @@ -0,0 +1,291 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.redshift import Cluster + + +class ClusterManager(ResourceManager): + cloud_service_group = "Redshift" + cloud_service_type = "Cluster" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "Redshift" + self.cloud_service_type = "Cluster" + self.metadata_path = "metadata/redshift/cluster.yaml" + + def create_cloud_service_type(self): + result = [] + cluster_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonRedshift", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-redshift.svg" + }, + labels=["Database", "Analytics"], + ) + result.append(cluster_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_clusters(options, region) + + def _collect_clusters(self, options, region): + region_name = region + cloudtrail_resource_type = "AWS::Redshift::Cluster" + + try: + clusters, account_id = self.connector.list_redshift_clusters() + + for cluster in clusters: + try: + cluster_id = cluster.get("ClusterIdentifier") + + # Get cluster snapshots + snapshots = self._get_cluster_snapshots(cluster_id) + + # Get cluster parameter groups + parameter_groups = self._get_cluster_parameter_groups( + cluster.get("ClusterParameterGroups", []) + ) + + # Get cluster security groups + security_groups = self._get_cluster_security_groups( + cluster.get("ClusterSecurityGroups", []) + ) + + # Get cluster subnet groups + subnet_groups = self._get_cluster_subnet_groups( + cluster.get("ClusterSubnetGroupName") + ) + + cluster_data = { + "cluster_identifier": cluster_id, + "cluster_namespace_arn": cluster.get("ClusterNamespaceArn"), + "node_type": cluster.get("NodeType", ""), + "cluster_status": cluster.get("ClusterStatus", ""), + "cluster_availability_status": cluster.get( + "ClusterAvailabilityStatus", "" + ), + "master_username": cluster.get("MasterUsername", ""), + "db_name": cluster.get("DBName", ""), + "endpoint": cluster.get("Endpoint", {}), + "cluster_create_time": cluster.get("ClusterCreateTime"), + "automated_snapshot_retention_period": cluster.get( + "AutomatedSnapshotRetentionPeriod", 0 + ), + "manual_snapshot_retention_period": cluster.get( + "ManualSnapshotRetentionPeriod", 0 + ), + "cluster_security_groups": cluster.get( + "ClusterSecurityGroups", [] + ), + "vpc_security_groups": cluster.get("VpcSecurityGroups", []), + "cluster_parameter_groups": cluster.get( + "ClusterParameterGroups", [] + ), + "cluster_subnet_group_name": cluster.get( + "ClusterSubnetGroupName", "" + ), + "vpc_id": cluster.get("VpcId", ""), + "availability_zone": cluster.get("AvailabilityZone", ""), + "preferred_maintenance_window": cluster.get( + "PreferredMaintenanceWindow", "" + ), + "pending_modified_values": cluster.get( + "PendingModifiedValues", {} + ), + "cluster_version": cluster.get("ClusterVersion", ""), + "allow_version_upgrade": cluster.get( + "AllowVersionUpgrade", False + ), + "number_of_nodes": cluster.get("NumberOfNodes", 0), + "publicly_accessible": cluster.get("PubliclyAccessible", False), + "encrypted": cluster.get("Encrypted", False), + "restore_status": cluster.get("RestoreStatus", {}), + "data_transfer_progress": cluster.get( + "DataTransferProgress", {} + ), + "hsm_status": cluster.get("HsmStatus", {}), + "cluster_snapshot_copy_status": cluster.get( + "ClusterSnapshotCopyStatus", {} + ), + "cluster_public_key": cluster.get("ClusterPublicKey", ""), + "cluster_nodes": cluster.get("ClusterNodes", []), + "elastic_ip_status": cluster.get("ElasticIpStatus", {}), + "cluster_revision_number": cluster.get( + "ClusterRevisionNumber", "" + ), + "tags": cluster.get("Tags", []), + "kms_key_id": cluster.get("KmsKeyId", ""), + "enhanced_vpc_routing": cluster.get( + "EnhancedVpcRouting", False + ), + "iam_roles": cluster.get("IamRoles", []), + "pending_actions": cluster.get("PendingActions", []), + "maintenance_track_name": cluster.get( + "MaintenanceTrackName", "" + ), + "elastic_resize_number_of_node_options": cluster.get( + "ElasticResizeNumberOfNodeOptions", "" + ), + "deferred_maintenance_windows": cluster.get( + "DeferredMaintenanceWindows", [] + ), + "snapshot_schedule_identifier": cluster.get( + "SnapshotScheduleIdentifier", "" + ), + "snapshot_schedule_state": cluster.get( + "SnapshotScheduleState", "" + ), + "expected_next_snapshot_schedule_time": cluster.get( + "ExpectedNextSnapshotScheduleTime" + ), + "expected_next_snapshot_schedule_time_status": cluster.get( + "ExpectedNextSnapshotScheduleTimeStatus", "" + ), + "next_maintenance_window_start_time": cluster.get( + "NextMaintenanceWindowStartTime" + ), + "resize_info": cluster.get("ResizeInfo", {}), + "availability_zone_relocation_status": cluster.get( + "AvailabilityZoneRelocationStatus", "" + ), + "cluster_namespace_arn": cluster.get("ClusterNamespaceArn", ""), + "total_storage_capacity_in_mega_bytes": cluster.get( + "TotalStorageCapacityInMegaBytes", 0 + ), + "aqua_configuration": cluster.get("AquaConfiguration", {}), + "default_iam_role_arn": cluster.get("DefaultIamRoleArn", ""), + "reserved_node_exchange_status": cluster.get( + "ReservedNodeExchangeStatus", {} + ), + "custom_domain_name": cluster.get("CustomDomainName", ""), + "custom_domain_certificate_arn": cluster.get( + "CustomDomainCertificateArn", "" + ), + "custom_domain_certificate_expiry_date": cluster.get( + "CustomDomainCertificateExpiryDate" + ), + "master_password_secret_arn": cluster.get( + "MasterPasswordSecretArn", "" + ), + "master_password_secret_kms_key_id": cluster.get( + "MasterPasswordSecretKmsKeyId", "" + ), + "ip_address_type": cluster.get("IpAddressType", ""), + "multi_az": cluster.get("MultiAZ", ""), + "snapshots": snapshots, + "parameter_groups": parameter_groups, + "security_groups": security_groups, + "subnet_groups": subnet_groups, + } + + cluster_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(cluster.get("Tags", [])), + } + ) + + link = f"https://{region}.console.aws.amazon.com/redshiftv2/home?region={region}#cluster-details?cluster={cluster_id}" + resource_id = cluster_id + reference = self.get_reference(resource_id, link) + + cluster_vo = Cluster(cluster_data, strict=False) + cloud_service = make_cloud_service( + name=cluster_id, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=cluster_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=cluster_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_redshift_clusters] [{cluster.get("ClusterIdentifier")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_redshift_clusters] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_cluster_snapshots(self, cluster_id): + """Get cluster snapshots""" + try: + return self.connector.get_cluster_snapshots(cluster_id) + except Exception as e: + _LOGGER.warning(f"Failed to get snapshots for cluster {cluster_id}: {e}") + return [] + + def _get_cluster_parameter_groups(self, parameter_groups): + """Get cluster parameter groups details""" + if not parameter_groups: + return [] + + try: + return self.connector.get_cluster_parameter_groups(parameter_groups) + except Exception as e: + _LOGGER.warning(f"Failed to get parameter groups: {e}") + return [] + + def _get_cluster_security_groups(self, security_groups): + """Get cluster security groups details""" + if not security_groups: + return [] + + try: + return self.connector.get_cluster_security_groups(security_groups) + except Exception as e: + _LOGGER.warning(f"Failed to get security groups: {e}") + return [] + + def _get_cluster_subnet_groups(self, subnet_group_name): + """Get cluster subnet groups details""" + if not subnet_group_name: + return {} + + try: + return self.connector.get_cluster_subnet_groups(subnet_group_name) + except Exception as e: + _LOGGER.warning(f"Failed to get subnet groups: {e}") + return {} + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/route53/__init__.py b/src/plugin/manager/route53/__init__.py index e69de29..531921f 100644 --- a/src/plugin/manager/route53/__init__.py +++ b/src/plugin/manager/route53/__init__.py @@ -0,0 +1,2 @@ +from .hosted_zone_manager import HostedZoneManager + diff --git a/src/plugin/manager/route53/hosted_zone_manager.py b/src/plugin/manager/route53/hosted_zone_manager.py new file mode 100644 index 0000000..63eeb58 --- /dev/null +++ b/src/plugin/manager/route53/hosted_zone_manager.py @@ -0,0 +1,162 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.route53 import HostedZone + + +class HostedZoneManager(ResourceManager): + cloud_service_group = "Route53" + cloud_service_type = "HostedZone" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "Route53" + self.cloud_service_type = "HostedZone" + self.metadata_path = "metadata/route53/hosted_zone.yaml" + + def create_cloud_service_type(self): + result = [] + hosted_zone_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonRoute53", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-route53.svg" + }, + labels=["Networking"], + ) + result.append(hosted_zone_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_hosted_zones(options, region) + + def _collect_hosted_zones(self, options, region): + region_name = region + cloudtrail_resource_type = "AWS::Route53::HostedZone" + + try: + hosted_zones, account_id = self.connector.list_route53_hosted_zones() + + for hosted_zone in hosted_zones: + try: + hosted_zone_id = hosted_zone.get("Id") + hosted_zone_name = hosted_zone.get("Name") + + # Get hosted zone tags + tags = self._get_hosted_zone_tags(hosted_zone_id) + + # Get record sets + record_sets = self._get_hosted_zone_record_sets(hosted_zone_id) + + # Get hosted zone details + hosted_zone_details = self._get_hosted_zone_details(hosted_zone_id) + + hosted_zone_data = { + "id": hosted_zone_id, + "name": hosted_zone_name, + "caller_reference": hosted_zone.get("CallerReference", ""), + "config": hosted_zone.get("Config", {}), + "resource_record_set_count": hosted_zone.get( + "ResourceRecordSetCount", 0 + ), + "linked_service": hosted_zone.get("LinkedService", {}), + "tags": hosted_zone.get("Tags", []), + "record_sets": record_sets, + "hosted_zone_details": hosted_zone_details, + } + + hosted_zone_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + } + ) + + link = f"https://console.aws.amazon.com/route53/v2/hostedzones#{hosted_zone_id}" + resource_id = hosted_zone_id + reference = self.get_reference(resource_id, link) + + hosted_zone_vo = HostedZone(hosted_zone_data, strict=False) + cloud_service = make_cloud_service( + name=hosted_zone_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=hosted_zone_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=hosted_zone_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_route53_hosted_zones] [{hosted_zone.get("Name")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_route53_hosted_zones] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_hosted_zone_tags(self, hosted_zone_id): + """Get hosted zone tags""" + try: + return self.connector.get_hosted_zone_tags(hosted_zone_id) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for hosted zone {hosted_zone_id}: {e}") + return [] + + def _get_hosted_zone_record_sets(self, hosted_zone_id): + """Get hosted zone record sets""" + try: + return self.connector.get_hosted_zone_record_sets(hosted_zone_id) + except Exception as e: + _LOGGER.warning( + f"Failed to get record sets for hosted zone {hosted_zone_id}: {e}" + ) + return [] + + def _get_hosted_zone_details(self, hosted_zone_id): + """Get hosted zone details""" + try: + return self.connector.get_hosted_zone_details(hosted_zone_id) + except Exception as e: + _LOGGER.warning( + f"Failed to get details for hosted zone {hosted_zone_id}: {e}" + ) + return {} + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/s3/__init__.py b/src/plugin/manager/s3/__init__.py index e69de29..a9a482c 100644 --- a/src/plugin/manager/s3/__init__.py +++ b/src/plugin/manager/s3/__init__.py @@ -0,0 +1,2 @@ +from .bucket import BucketManager + diff --git a/src/plugin/manager/s3/bucket.py b/src/plugin/manager/s3/bucket.py new file mode 100644 index 0000000..b0fbae2 --- /dev/null +++ b/src/plugin/manager/s3/bucket.py @@ -0,0 +1,295 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.s3 import Bucket + + +class BucketManager(ResourceManager): + cloud_service_group = "S3" + cloud_service_type = "Bucket" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "S3" + self.cloud_service_type = "Bucket" + self.metadata_path = "metadata/s3/bucket.yaml" + + def create_cloud_service_type(self): + result = [] + bucket_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonS3", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-s3.svg" + }, + labels=["Storage"], + ) + result.append(bucket_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_buckets(options, region) + + def _collect_buckets(self, options, region): + region_name = region + + try: + buckets, account_id = self.connector.list_s3_buckets() + + for bucket in buckets: + try: + bucket_name = bucket.get("Name") + + # Get bucket tags + tags = self._get_bucket_tags(bucket_name) + + # Get bucket versioning + versioning = self._get_bucket_versioning(bucket_name) + + # Get bucket encryption + encryption = self._get_bucket_encryption(bucket_name) + + # Get bucket policy + policy = self._get_bucket_policy(bucket_name) + + # Get bucket ACL + acl = self._get_bucket_acl(bucket_name) + + # Get bucket location + location = self._get_bucket_location(bucket_name) + + # Get bucket notification configuration + notification = self._get_bucket_notification(bucket_name) + + # Get bucket website configuration + website = self._get_bucket_website(bucket_name) + + # Get bucket cors configuration + cors = self._get_bucket_cors(bucket_name) + + # Get bucket lifecycle configuration + lifecycle = self._get_bucket_lifecycle(bucket_name) + + # Get bucket logging + logging = self._get_bucket_logging(bucket_name) + + # Get bucket request payment + request_payment = self._get_bucket_request_payment(bucket_name) + + # Get bucket transfer acceleration + transfer_acceleration = self._get_bucket_transfer_acceleration( + bucket_name + ) + + # Get bucket object lock configuration + object_lock = self._get_bucket_object_lock(bucket_name) + + bucket_data = { + "name": bucket_name, + "creation_date": bucket.get("CreationDate"), + "versioning": versioning, + "encryption": encryption, + "policy": policy, + "acl": acl, + "location": location, + "notification_configuration": notification, + "website_configuration": website, + "cors_configuration": cors, + "lifecycle_configuration": lifecycle, + "logging": logging, + "request_payment": request_payment, + "transfer_acceleration": transfer_acceleration, + "object_lock_configuration": object_lock, + } + + bucket_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + bucket_name, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + bucket_name, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/s3/buckets/{bucket_name}" + resource_id = bucket_name + reference = self.get_reference(resource_id, link) + + bucket_vo = Bucket(bucket_data, strict=False) + cloud_service = make_cloud_service( + name=bucket_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=bucket_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=bucket_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error(f'[list_s3_buckets] [{bucket.get("Name")}] {e}') + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_s3_buckets] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_bucket_tags(self, bucket_name): + """Get bucket tags""" + try: + return self.connector.get_bucket_tags(bucket_name) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for bucket {bucket_name}: {e}") + return [] + + def _get_bucket_versioning(self, bucket_name): + """Get bucket versioning""" + try: + return self.connector.get_bucket_versioning(bucket_name) + except Exception as e: + _LOGGER.warning(f"Failed to get versioning for bucket {bucket_name}: {e}") + return {} + + def _get_bucket_encryption(self, bucket_name): + """Get bucket encryption""" + try: + return self.connector.get_bucket_encryption(bucket_name) + except Exception as e: + _LOGGER.warning(f"Failed to get encryption for bucket {bucket_name}: {e}") + return {} + + def _get_bucket_policy(self, bucket_name): + """Get bucket policy""" + try: + return self.connector.get_bucket_policy(bucket_name) + except Exception as e: + _LOGGER.warning(f"Failed to get policy for bucket {bucket_name}: {e}") + return {} + + def _get_bucket_acl(self, bucket_name): + """Get bucket ACL""" + try: + return self.connector.get_bucket_acl(bucket_name) + except Exception as e: + _LOGGER.warning(f"Failed to get ACL for bucket {bucket_name}: {e}") + return {} + + def _get_bucket_location(self, bucket_name): + """Get bucket location""" + try: + return self.connector.get_bucket_location(bucket_name) + except Exception as e: + _LOGGER.warning(f"Failed to get location for bucket {bucket_name}: {e}") + return "" + + def _get_bucket_notification(self, bucket_name): + """Get bucket notification configuration""" + try: + return self.connector.get_bucket_notification(bucket_name) + except Exception as e: + _LOGGER.warning(f"Failed to get notification for bucket {bucket_name}: {e}") + return {} + + def _get_bucket_website(self, bucket_name): + """Get bucket website configuration""" + try: + return self.connector.get_bucket_website(bucket_name) + except Exception as e: + _LOGGER.warning(f"Failed to get website for bucket {bucket_name}: {e}") + return {} + + def _get_bucket_cors(self, bucket_name): + """Get bucket CORS configuration""" + try: + return self.connector.get_bucket_cors(bucket_name) + except Exception as e: + _LOGGER.warning(f"Failed to get CORS for bucket {bucket_name}: {e}") + return {} + + def _get_bucket_lifecycle(self, bucket_name): + """Get bucket lifecycle configuration""" + try: + return self.connector.get_bucket_lifecycle(bucket_name) + except Exception as e: + _LOGGER.warning(f"Failed to get lifecycle for bucket {bucket_name}: {e}") + return {} + + def _get_bucket_logging(self, bucket_name): + """Get bucket logging""" + try: + return self.connector.get_bucket_logging(bucket_name) + except Exception as e: + _LOGGER.warning(f"Failed to get logging for bucket {bucket_name}: {e}") + return {} + + def _get_bucket_request_payment(self, bucket_name): + """Get bucket request payment""" + try: + return self.connector.get_bucket_request_payment(bucket_name) + except Exception as e: + _LOGGER.warning( + f"Failed to get request payment for bucket {bucket_name}: {e}" + ) + return {} + + def _get_bucket_transfer_acceleration(self, bucket_name): + """Get bucket transfer acceleration""" + try: + return self.connector.get_bucket_transfer_acceleration(bucket_name) + except Exception as e: + _LOGGER.warning( + f"Failed to get transfer acceleration for bucket {bucket_name}: {e}" + ) + return {} + + def _get_bucket_object_lock(self, bucket_name): + """Get bucket object lock configuration""" + try: + return self.connector.get_bucket_object_lock(bucket_name) + except Exception as e: + _LOGGER.warning(f"Failed to get object lock for bucket {bucket_name}: {e}") + return {} + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/secrets_manager/__init__.py b/src/plugin/manager/secrets_manager/__init__.py index e69de29..0f3685c 100644 --- a/src/plugin/manager/secrets_manager/__init__.py +++ b/src/plugin/manager/secrets_manager/__init__.py @@ -0,0 +1,2 @@ +from .secret_manager import SecretManager + diff --git a/src/plugin/manager/secrets_manager/secret_manager.py b/src/plugin/manager/secrets_manager/secret_manager.py new file mode 100644 index 0000000..c315bc4 --- /dev/null +++ b/src/plugin/manager/secrets_manager/secret_manager.py @@ -0,0 +1,155 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.secrets_manager import Secret + + +class SecretManager(ResourceManager): + cloud_service_group = "SecretsManager" + cloud_service_type = "Secret" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "SecretsManager" + self.cloud_service_type = "Secret" + self.metadata_path = "metadata/secrets_manager/secret.yaml" + + def create_cloud_service_type(self): + result = [] + secret_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonSecretsManager", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-secrets-manager.svg" + }, + labels=["Security"], + ) + result.append(secret_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_secrets(options, region) + + def _collect_secrets(self, options, region): + region_name = region + cloudtrail_resource_type = "AWS::SecretsManager::Secret" + + try: + secrets, account_id = self.connector.list_secrets() + + for secret in secrets: + try: + secret_name = secret.get("Name") + secret_arn = secret.get("ARN") + + # Get secret tags + tags = self._get_secret_tags(secret_arn) + + # Get secret value (metadata only, not actual secret value) + secret_value = self._get_secret_metadata(secret_arn) + + secret_data = { + "arn": secret_arn, + "name": secret_name, + "description": secret.get("Description", ""), + "kms_key_id": secret.get("KmsKeyId", ""), + "rotation_enabled": secret.get("RotationEnabled", False), + "rotation_lambda_arn": secret.get("RotationLambdaArn", ""), + "rotation_rules": secret.get("RotationRules", {}), + "last_rotated_date": secret.get("LastRotatedDate"), + "last_changed_date": secret.get("LastChangedDate"), + "last_accessed_date": secret.get("LastAccessedDate"), + "deleted_date": secret.get("DeletedDate"), + "next_rotation_date": secret.get("NextRotationDate"), + "tags": secret.get("Tags", []), + "secret_versions_to_stages": secret.get( + "SecretVersionsToStages", {} + ), + "owning_service": secret.get("OwningService", ""), + "created_date": secret.get("CreatedDate"), + "primary_region": secret.get("PrimaryRegion", ""), + "replication_status": secret.get("ReplicationStatus", []), + "secret_value": secret_value, + } + + secret_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + } + ) + + link = f"https://{region}.console.aws.amazon.com/secretsmanager/secret?name={secret_name}" + resource_id = secret_arn + reference = self.get_reference(resource_id, link) + + secret_vo = Secret(secret_data, strict=False) + cloud_service = make_cloud_service( + name=secret_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=secret_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=secret_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error(f'[list_secrets] [{secret.get("Name")}] {e}') + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_secrets] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_secret_tags(self, secret_arn): + """Get secret tags""" + try: + return self.connector.get_secret_tags(secret_arn) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for secret {secret_arn}: {e}") + return [] + + def _get_secret_metadata(self, secret_arn): + """Get secret metadata (not the actual secret value)""" + try: + return self.connector.get_secret_metadata(secret_arn) + except Exception as e: + _LOGGER.warning(f"Failed to get metadata for secret {secret_arn}: {e}") + return {} + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/sns/__init__.py b/src/plugin/manager/sns/__init__.py index e69de29..bd658f6 100644 --- a/src/plugin/manager/sns/__init__.py +++ b/src/plugin/manager/sns/__init__.py @@ -0,0 +1,2 @@ +from .topic_manager import TopicManager + diff --git a/src/plugin/manager/sns/topic_manager.py b/src/plugin/manager/sns/topic_manager.py new file mode 100644 index 0000000..b8e4909 --- /dev/null +++ b/src/plugin/manager/sns/topic_manager.py @@ -0,0 +1,183 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.sns import Topic + + +class TopicManager(ResourceManager): + cloud_service_group = "SNS" + cloud_service_type = "Topic" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "SNS" + self.cloud_service_type = "Topic" + self.metadata_path = "metadata/sns/topic.yaml" + + def create_cloud_service_type(self): + result = [] + topic_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonSNS", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-sns.svg" + }, + labels=["Messaging"], + ) + result.append(topic_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_topics(options, region) + + def _collect_topics(self, options, region): + region_name = region + + try: + topics, account_id = self.connector.list_sns_topics() + + for topic in topics: + try: + topic_arn = topic.get("TopicArn") + topic_name = ( + topic.get("TopicName", "").split(":")[-1] + if ":" in topic.get("TopicName", "") + else topic.get("TopicName", "") + ) + + # Get topic attributes + attributes = self._get_topic_attributes(topic_arn) + + # Get topic subscriptions + subscriptions = self._get_topic_subscriptions(topic_arn) + + # Get topic tags + tags = self._get_topic_tags(topic_arn) + + topic_data = { + "topic_arn": topic_arn, + "topic_name": topic_name, + "display_name": attributes.get("DisplayName", ""), + "owner": attributes.get("Owner", ""), + "subscriptions_confirmed": attributes.get( + "SubscriptionsConfirmed", "0" + ), + "subscriptions_deleted": attributes.get( + "SubscriptionsDeleted", "0" + ), + "subscriptions_pending": attributes.get( + "SubscriptionsPending", "0" + ), + "effective_delivery_policy": attributes.get( + "EffectiveDeliveryPolicy", "" + ), + "policy": attributes.get("Policy", ""), + "kms_master_key_id": attributes.get("KmsMasterKeyId", ""), + "fifo_topic": attributes.get("FifoTopic", "false").lower() + == "true", + "content_based_deduplication": attributes.get( + "ContentBasedDeduplication", "false" + ).lower() + == "true", + "subscriptions": subscriptions, + } + + topic_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + topic_name, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + topic_name, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/sns/v3/home?region={region}#/topic/{topic_arn}" + resource_id = topic_arn + reference = self.get_reference(resource_id, link) + + topic_vo = Topic(topic_data, strict=False) + cloud_service = make_cloud_service( + name=topic_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=topic_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=topic_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error(f'[list_sns_topics] [{topic.get("TopicArn")}] {e}') + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_sns_topics] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_topic_attributes(self, topic_arn): + """Get topic attributes""" + try: + return self.connector.get_topic_attributes(topic_arn) + except Exception as e: + _LOGGER.warning(f"Failed to get attributes for topic {topic_arn}: {e}") + return {} + + def _get_topic_subscriptions(self, topic_arn): + """Get topic subscriptions""" + try: + return self.connector.get_topic_subscriptions(topic_arn) + except Exception as e: + _LOGGER.warning(f"Failed to get subscriptions for topic {topic_arn}: {e}") + return [] + + def _get_topic_tags(self, topic_arn): + """Get topic tags""" + try: + return self.connector.get_topic_tags(topic_arn) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for topic {topic_arn}: {e}") + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/sqs/__init__.py b/src/plugin/manager/sqs/__init__.py index e69de29..5cee578 100644 --- a/src/plugin/manager/sqs/__init__.py +++ b/src/plugin/manager/sqs/__init__.py @@ -0,0 +1,2 @@ +from .queue_manager import QueueManager + diff --git a/src/plugin/manager/sqs/queue_manager.py b/src/plugin/manager/sqs/queue_manager.py new file mode 100644 index 0000000..330bd7e --- /dev/null +++ b/src/plugin/manager/sqs/queue_manager.py @@ -0,0 +1,181 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.sqs import Queue + + +class QueueManager(ResourceManager): + cloud_service_group = "SQS" + cloud_service_type = "Queue" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "SQS" + self.cloud_service_type = "Queue" + self.metadata_path = "metadata/sqs/queue.yaml" + + def create_cloud_service_type(self): + result = [] + queue_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonSQS", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-sqs.svg" + }, + labels=["Messaging"], + ) + result.append(queue_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_queues(options, region) + + def _collect_queues(self, options, region): + region_name = region + + try: + queues, account_id = self.connector.list_sqs_queues() + + for queue in queues: + try: + queue_url = queue.get("QueueUrl") + queue_name = queue.get("QueueName") + + # Get queue attributes + attributes = self._get_queue_attributes(queue_url) + + # Get queue tags + tags = self._get_queue_tags(queue_url) + + queue_data = { + "queue_url": queue_url, + "queue_name": queue_name, + "queue_arn": attributes.get("QueueArn", ""), + "visibility_timeout_seconds": attributes.get( + "VisibilityTimeoutSeconds", "30" + ), + "message_retention_period": attributes.get( + "MessageRetentionPeriod", "1209600" + ), + "maximum_message_size": attributes.get( + "MaximumMessageSize", "262144" + ), + "delay_seconds": attributes.get("DelaySeconds", "0"), + "receive_message_wait_time_seconds": attributes.get( + "ReceiveMessageWaitTimeSeconds", "0" + ), + "redrive_policy": attributes.get("RedrivePolicy", ""), + "fifo_queue": attributes.get("FifoQueue", "false").lower() + == "true", + "content_based_deduplication": attributes.get( + "ContentBasedDeduplication", "false" + ).lower() + == "true", + "kms_master_key_id": attributes.get("KmsMasterKeyId", ""), + "kms_data_key_reuse_period_seconds": attributes.get( + "KmsDataKeyReusePeriodSeconds", "300" + ), + "deduplication_scope": attributes.get("DeduplicationScope", ""), + "fifo_throughput_limit": attributes.get( + "FifoThroughputLimit", "" + ), + "redrive_allow_policy": attributes.get( + "RedriveAllowPolicy", "" + ), + "sqs_managed_sse_enabled": attributes.get( + "SqsManagedSseEnabled", "false" + ).lower() + == "true", + } + + queue_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + queue_name, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + queue_name, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/sqs/v2/home?region={region}#/queues/{queue_url}" + resource_id = queue_url + reference = self.get_reference(resource_id, link) + + queue_vo = Queue(queue_data, strict=False) + cloud_service = make_cloud_service( + name=queue_name, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=queue_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=queue_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error(f'[list_sqs_queues] [{queue.get("QueueName")}] {e}') + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_sqs_queues] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_queue_attributes(self, queue_url): + """Get queue attributes""" + try: + return self.connector.get_queue_attributes(queue_url) + except Exception as e: + _LOGGER.warning(f"Failed to get attributes for queue {queue_url}: {e}") + return {} + + def _get_queue_tags(self, queue_url): + """Get queue tags""" + try: + return self.connector.get_queue_tags(queue_url) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for queue {queue_url}: {e}") + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/vpc/__init__.py b/src/plugin/manager/vpc/__init__.py index e69de29..89739d6 100644 --- a/src/plugin/manager/vpc/__init__.py +++ b/src/plugin/manager/vpc/__init__.py @@ -0,0 +1,14 @@ +from .customer_gateway_manager import CustomerGatewayManager +from .egress_only_internet_gateway_manager import EgressOnlyInternetGatewayManager +from .endpoint_manager import EndpointManager +from .internet_gateway_manager import InternetGatewayManager +from .nat_gateway_manager import NATGatewayManager +from .network_acl_manager import NetworkACLManager +from .peering_connection_manager import PeeringConnectionManager +from .route_table_manager import RouteTableManager +from .subnet_manager import SubnetManager +from .transit_gateway_manager import TransitGatewayManager +from .vpc_manager import VPCManager +from .vpn_connection_manager import VPNConnectionManager +from .vpn_gateway_manager import VPNGatewayManager + diff --git a/src/plugin/manager/vpc/customer_gateway_manager.py b/src/plugin/manager/vpc/customer_gateway_manager.py new file mode 100644 index 0000000..fa90baa --- /dev/null +++ b/src/plugin/manager/vpc/customer_gateway_manager.py @@ -0,0 +1,145 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.vpc import CustomerGateway + + +class CustomerGatewayManager(ResourceManager): + cloud_service_group = "VPC" + cloud_service_type = "CustomerGateway" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "VPC" + self.cloud_service_type = "CustomerGateway" + self.metadata_path = "metadata/vpc/customer_gateway.yaml" + + def create_cloud_service_type(self): + result = [] + customer_gateway_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonVPC", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-vpc.svg" + }, + labels=["Networking"], + ) + result.append(customer_gateway_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_customer_gateways(options, region) + + def _collect_customer_gateways(self, options, region): + region_name = region + + try: + customer_gateways, account_id = self.connector.list_vpc_customer_gateways() + + for customer_gateway in customer_gateways: + try: + customer_gateway_id = customer_gateway.get("CustomerGatewayId") + + # Get customer gateway tags + tags = self._get_customer_gateway_tags(customer_gateway_id) + + customer_gateway_data = { + "customer_gateway_id": customer_gateway_id, + "bgp_asn": customer_gateway.get("BgpAsn", ""), + "ip_address": customer_gateway.get("IpAddress", ""), + "certificate_arn": customer_gateway.get("CertificateArn", ""), + "state": customer_gateway.get("State", ""), + "type": customer_gateway.get("Type", ""), + "device_name": customer_gateway.get("DeviceName", ""), + "tags": customer_gateway.get("Tags", []), + } + + customer_gateway_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + customer_gateway_id, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + customer_gateway_id, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/vpc/home?region={region}#CustomerGateways:search={customer_gateway_id}" + resource_id = customer_gateway_id + reference = self.get_reference(resource_id, link) + + customer_gateway_vo = CustomerGateway( + customer_gateway_data, strict=False + ) + cloud_service = make_cloud_service( + name=customer_gateway_id, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=customer_gateway_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=customer_gateway_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_vpc_customer_gateways] [{customer_gateway.get("CustomerGatewayId")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_vpc_customer_gateways] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_customer_gateway_tags(self, customer_gateway_id): + """Get customer gateway tags""" + try: + return self.connector.get_customer_gateway_tags(customer_gateway_id) + except Exception as e: + _LOGGER.warning( + f"Failed to get tags for customer gateway {customer_gateway_id}: {e}" + ) + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/vpc/egress_only_internet_gateway_manager.py b/src/plugin/manager/vpc/egress_only_internet_gateway_manager.py new file mode 100644 index 0000000..4998e48 --- /dev/null +++ b/src/plugin/manager/vpc/egress_only_internet_gateway_manager.py @@ -0,0 +1,152 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.vpc import EgressOnlyInternetGateway + + +class EgressOnlyInternetGatewayManager(ResourceManager): + cloud_service_group = "VPC" + cloud_service_type = "EgressOnlyInternetGateway" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "VPC" + self.cloud_service_type = "EgressOnlyInternetGateway" + self.metadata_path = "metadata/vpc/egress_only_internet_gateway.yaml" + + def create_cloud_service_type(self): + result = [] + egress_only_internet_gateway_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonVPC", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-vpc.svg" + }, + labels=["Networking"], + ) + result.append(egress_only_internet_gateway_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_egress_only_internet_gateways(options, region) + + def _collect_egress_only_internet_gateways(self, options, region): + region_name = region + + try: + egress_only_internet_gateways, account_id = ( + self.connector.list_vpc_egress_only_internet_gateways() + ) + + for egress_only_internet_gateway in egress_only_internet_gateways: + try: + egress_only_internet_gateway_id = egress_only_internet_gateway.get( + "EgressOnlyInternetGatewayId" + ) + + # Get egress only internet gateway tags + tags = self._get_egress_only_internet_gateway_tags( + egress_only_internet_gateway_id + ) + + egress_only_internet_gateway_data = { + "egress_only_internet_gateway_id": egress_only_internet_gateway_id, + "attachments": egress_only_internet_gateway.get( + "Attachments", [] + ), + "tags": egress_only_internet_gateway.get("Tags", []), + } + + egress_only_internet_gateway_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + egress_only_internet_gateway_id, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + egress_only_internet_gateway_id, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/vpc/home?region={region}#EgressOnlyInternetGateways:search={egress_only_internet_gateway_id}" + resource_id = egress_only_internet_gateway_id + reference = self.get_reference(resource_id, link) + + egress_only_internet_gateway_vo = EgressOnlyInternetGateway( + egress_only_internet_gateway_data, strict=False + ) + cloud_service = make_cloud_service( + name=egress_only_internet_gateway_id, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=egress_only_internet_gateway_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=egress_only_internet_gateway_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_vpc_egress_only_internet_gateways] [{egress_only_internet_gateway.get("EgressOnlyInternetGatewayId")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error( + f"[list_vpc_egress_only_internet_gateways] [{region_name}] {e}" + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_egress_only_internet_gateway_tags(self, egress_only_internet_gateway_id): + """Get egress only internet gateway tags""" + try: + return self.connector.get_egress_only_internet_gateway_tags( + egress_only_internet_gateway_id + ) + except Exception as e: + _LOGGER.warning( + f"Failed to get tags for egress only internet gateway {egress_only_internet_gateway_id}: {e}" + ) + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/vpc/endpoint_manager.py b/src/plugin/manager/vpc/endpoint_manager.py new file mode 100644 index 0000000..cc7735e --- /dev/null +++ b/src/plugin/manager/vpc/endpoint_manager.py @@ -0,0 +1,166 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.vpc import Endpoint + + +class EndpointManager(ResourceManager): + cloud_service_group = "VPC" + cloud_service_type = "Endpoint" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "VPC" + self.cloud_service_type = "Endpoint" + self.metadata_path = "metadata/vpc/endpoint.yaml" + + def create_cloud_service_type(self): + result = [] + endpoint_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonVPC", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-vpc.svg" + }, + labels=["Networking"], + ) + result.append(endpoint_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_endpoints(options, region) + + def _collect_endpoints(self, options, region): + region_name = region + + try: + endpoints, account_id = self.connector.list_vpc_endpoints() + + for endpoint in endpoints: + try: + endpoint_id = endpoint.get("VpcEndpointId") + + # Get endpoint tags + tags = self._get_endpoint_tags(endpoint_id) + + # Get endpoint policy + policy = self._get_endpoint_policy(endpoint_id) + + endpoint_data = { + "vpc_endpoint_id": endpoint_id, + "vpc_endpoint_type": endpoint.get("VpcEndpointType", ""), + "vpc_id": endpoint.get("VpcId", ""), + "service_name": endpoint.get("ServiceName", ""), + "state": endpoint.get("State", ""), + "policy_document": endpoint.get("PolicyDocument", ""), + "route_table_ids": endpoint.get("RouteTableIds", []), + "subnet_ids": endpoint.get("SubnetIds", []), + "groups": endpoint.get("Groups", []), + "ip_address_type": endpoint.get("IpAddressType", ""), + "dns_entries": endpoint.get("DnsEntries", []), + "network_interface_ids": endpoint.get( + "NetworkInterfaceIds", [] + ), + "dns_options": endpoint.get("DnsOptions", {}), + "private_dns_enabled": endpoint.get("PrivateDnsEnabled", False), + "requester_managed": endpoint.get("RequesterManaged", False), + "tags": endpoint.get("Tags", []), + "creation_timestamp": endpoint.get("CreationTimestamp"), + "owner_id": endpoint.get("OwnerId", ""), + "last_error": endpoint.get("LastError", {}), + "policy": policy, + } + + endpoint_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + endpoint_id, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + endpoint_id, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/vpc/home?region={region}#Endpoints:search={endpoint_id}" + resource_id = endpoint_id + reference = self.get_reference(resource_id, link) + + endpoint_vo = Endpoint(endpoint_data, strict=False) + cloud_service = make_cloud_service( + name=endpoint_id, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=endpoint_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=endpoint_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_vpc_endpoints] [{endpoint.get("VpcEndpointId")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_vpc_endpoints] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_endpoint_tags(self, endpoint_id): + """Get endpoint tags""" + try: + return self.connector.get_endpoint_tags(endpoint_id) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for endpoint {endpoint_id}: {e}") + return [] + + def _get_endpoint_policy(self, endpoint_id): + """Get endpoint policy""" + try: + return self.connector.get_endpoint_policy(endpoint_id) + except Exception as e: + _LOGGER.warning(f"Failed to get policy for endpoint {endpoint_id}: {e}") + return {} + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/vpc/internet_gateway_manager.py b/src/plugin/manager/vpc/internet_gateway_manager.py new file mode 100644 index 0000000..c2ea05b --- /dev/null +++ b/src/plugin/manager/vpc/internet_gateway_manager.py @@ -0,0 +1,141 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.vpc import InternetGateway + + +class InternetGatewayManager(ResourceManager): + cloud_service_group = "VPC" + cloud_service_type = "InternetGateway" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "VPC" + self.cloud_service_type = "InternetGateway" + self.metadata_path = "metadata/vpc/internet_gateway.yaml" + + def create_cloud_service_type(self): + result = [] + internet_gateway_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonVPC", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-vpc.svg" + }, + labels=["Networking"], + ) + result.append(internet_gateway_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_internet_gateways(options, region) + + def _collect_internet_gateways(self, options, region): + region_name = region + + try: + internet_gateways, account_id = self.connector.list_vpc_internet_gateways() + + for internet_gateway in internet_gateways: + try: + internet_gateway_id = internet_gateway.get("InternetGatewayId") + + # Get internet gateway tags + tags = self._get_internet_gateway_tags(internet_gateway_id) + + internet_gateway_data = { + "internet_gateway_id": internet_gateway_id, + "owner_id": internet_gateway.get("OwnerId", ""), + "attachments": internet_gateway.get("Attachments", []), + "tags": internet_gateway.get("Tags", []), + } + + internet_gateway_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + internet_gateway_id, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + internet_gateway_id, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/vpc/home?region={region}#InternetGateways:search={internet_gateway_id}" + resource_id = internet_gateway_id + reference = self.get_reference(resource_id, link) + + internet_gateway_vo = InternetGateway( + internet_gateway_data, strict=False + ) + cloud_service = make_cloud_service( + name=internet_gateway_id, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=internet_gateway_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=internet_gateway_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_vpc_internet_gateways] [{internet_gateway.get("InternetGatewayId")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_vpc_internet_gateways] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_internet_gateway_tags(self, internet_gateway_id): + """Get internet gateway tags""" + try: + return self.connector.get_internet_gateway_tags(internet_gateway_id) + except Exception as e: + _LOGGER.warning( + f"Failed to get tags for internet gateway {internet_gateway_id}: {e}" + ) + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/vpc/nat_gateway_manager.py b/src/plugin/manager/vpc/nat_gateway_manager.py new file mode 100644 index 0000000..6175216 --- /dev/null +++ b/src/plugin/manager/vpc/nat_gateway_manager.py @@ -0,0 +1,144 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.vpc import NATGateway + + +class NATGatewayManager(ResourceManager): + cloud_service_group = "VPC" + cloud_service_type = "NATGateway" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "VPC" + self.cloud_service_type = "NATGateway" + self.metadata_path = "metadata/vpc/nat_gateway.yaml" + + def create_cloud_service_type(self): + result = [] + nat_gateway_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonVPC", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-vpc.svg" + }, + labels=["Networking"], + ) + result.append(nat_gateway_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_nat_gateways(options, region) + + def _collect_nat_gateways(self, options, region): + region_name = region + + try: + nat_gateways, account_id = self.connector.list_vpc_nat_gateways() + + for nat_gateway in nat_gateways: + try: + nat_gateway_id = nat_gateway.get("NatGatewayId") + + # Get NAT gateway tags + tags = self._get_nat_gateway_tags(nat_gateway_id) + + nat_gateway_data = { + "nat_gateway_id": nat_gateway_id, + "create_time": nat_gateway.get("CreateTime"), + "delete_time": nat_gateway.get("DeleteTime"), + "nat_gateway_addresses": nat_gateway.get( + "NatGatewayAddresses", [] + ), + "state": nat_gateway.get("State", ""), + "subnet_id": nat_gateway.get("SubnetId", ""), + "vpc_id": nat_gateway.get("VpcId", ""), + "tags": nat_gateway.get("Tags", []), + "connectivity_type": nat_gateway.get("ConnectivityType", ""), + } + + nat_gateway_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + nat_gateway_id, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + nat_gateway_id, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/vpc/home?region={region}#NatGateways:search={nat_gateway_id}" + resource_id = nat_gateway_id + reference = self.get_reference(resource_id, link) + + nat_gateway_vo = NATGateway(nat_gateway_data, strict=False) + cloud_service = make_cloud_service( + name=nat_gateway_id, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=nat_gateway_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=nat_gateway_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_vpc_nat_gateways] [{nat_gateway.get("NatGatewayId")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_vpc_nat_gateways] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_nat_gateway_tags(self, nat_gateway_id): + """Get NAT gateway tags""" + try: + return self.connector.get_nat_gateway_tags(nat_gateway_id) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for NAT gateway {nat_gateway_id}: {e}") + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/vpc/network_acl_manager.py b/src/plugin/manager/vpc/network_acl_manager.py new file mode 100644 index 0000000..b03a7b2 --- /dev/null +++ b/src/plugin/manager/vpc/network_acl_manager.py @@ -0,0 +1,168 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.vpc import NetworkACL + + +class NetworkACLManager(ResourceManager): + cloud_service_group = "VPC" + cloud_service_type = "NetworkACL" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "VPC" + self.cloud_service_type = "NetworkACL" + self.metadata_path = "metadata/vpc/network_acl.yaml" + + def create_cloud_service_type(self): + result = [] + network_acl_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonVPC", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-vpc.svg" + }, + labels=["Networking"], + ) + result.append(network_acl_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_network_acls(options, region) + + def _collect_network_acls(self, options, region): + region_name = region + + try: + network_acls, account_id = self.connector.list_vpc_network_acls() + + for network_acl in network_acls: + try: + network_acl_id = network_acl.get("NetworkAclId") + + # Get network ACL tags + tags = self._get_network_acl_tags(network_acl_id) + + # Get network ACL entries + entries = self._get_network_acl_entries(network_acl_id) + + # Get network ACL associations + associations = self._get_network_acl_associations(network_acl_id) + + network_acl_data = { + "network_acl_id": network_acl_id, + "vpc_id": network_acl.get("VpcId", ""), + "is_default": network_acl.get("IsDefault", False), + "associations": network_acl.get("Associations", []), + "entries": network_acl.get("Entries", []), + "owner_id": network_acl.get("OwnerId", ""), + "tags": network_acl.get("Tags", []), + "acl_entries": entries, + "acl_associations": associations, + } + + network_acl_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + network_acl_id, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + network_acl_id, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/vpc/home?region={region}#NetworkAcls:search={network_acl_id}" + resource_id = network_acl_id + reference = self.get_reference(resource_id, link) + + network_acl_vo = NetworkACL(network_acl_data, strict=False) + cloud_service = make_cloud_service( + name=network_acl_id, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=network_acl_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=network_acl_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_vpc_network_acls] [{network_acl.get("NetworkAclId")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_vpc_network_acls] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_network_acl_tags(self, network_acl_id): + """Get network ACL tags""" + try: + return self.connector.get_network_acl_tags(network_acl_id) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for network ACL {network_acl_id}: {e}") + return [] + + def _get_network_acl_entries(self, network_acl_id): + """Get network ACL entries""" + try: + return self.connector.get_network_acl_entries(network_acl_id) + except Exception as e: + _LOGGER.warning( + f"Failed to get entries for network ACL {network_acl_id}: {e}" + ) + return [] + + def _get_network_acl_associations(self, network_acl_id): + """Get network ACL associations""" + try: + return self.connector.get_network_acl_associations(network_acl_id) + except Exception as e: + _LOGGER.warning( + f"Failed to get associations for network ACL {network_acl_id}: {e}" + ) + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/vpc/peering_connection_manager.py b/src/plugin/manager/vpc/peering_connection_manager.py new file mode 100644 index 0000000..38010bd --- /dev/null +++ b/src/plugin/manager/vpc/peering_connection_manager.py @@ -0,0 +1,151 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.vpc import PeeringConnection + + +class PeeringConnectionManager(ResourceManager): + cloud_service_group = "VPC" + cloud_service_type = "PeeringConnection" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "VPC" + self.cloud_service_type = "PeeringConnection" + self.metadata_path = "metadata/vpc/peering_connection.yaml" + + def create_cloud_service_type(self): + result = [] + peering_connection_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonVPC", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-vpc.svg" + }, + labels=["Networking"], + ) + result.append(peering_connection_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_peering_connections(options, region) + + def _collect_peering_connections(self, options, region): + region_name = region + + try: + peering_connections, account_id = ( + self.connector.list_vpc_peering_connections() + ) + + for peering_connection in peering_connections: + try: + peering_connection_id = peering_connection.get( + "VpcPeeringConnectionId" + ) + + # Get peering connection tags + tags = self._get_peering_connection_tags(peering_connection_id) + + peering_connection_data = { + "vpc_peering_connection_id": peering_connection_id, + "status": peering_connection.get("Status", {}), + "requester_vpc_info": peering_connection.get( + "RequesterVpcInfo", {} + ), + "accepter_vpc_info": peering_connection.get( + "AccepterVpcInfo", {} + ), + "expiration_time": peering_connection.get("ExpirationTime"), + "tags": peering_connection.get("Tags", []), + } + + peering_connection_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + peering_connection_id, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + peering_connection_id, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/vpc/home?region={region}#PeeringConnections:search={peering_connection_id}" + resource_id = peering_connection_id + reference = self.get_reference(resource_id, link) + + peering_connection_vo = PeeringConnection( + peering_connection_data, strict=False + ) + cloud_service = make_cloud_service( + name=peering_connection_id, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=peering_connection_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=peering_connection_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_vpc_peering_connections] [{peering_connection.get("VpcPeeringConnectionId")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_vpc_peering_connections] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_peering_connection_tags(self, peering_connection_id): + """Get peering connection tags""" + try: + return self.connector.get_peering_connection_tags(peering_connection_id) + except Exception as e: + _LOGGER.warning( + f"Failed to get tags for peering connection {peering_connection_id}: {e}" + ) + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/vpc/route_table_manager.py b/src/plugin/manager/vpc/route_table_manager.py new file mode 100644 index 0000000..41d7ff6 --- /dev/null +++ b/src/plugin/manager/vpc/route_table_manager.py @@ -0,0 +1,168 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.vpc import RouteTable + + +class RouteTableManager(ResourceManager): + cloud_service_group = "VPC" + cloud_service_type = "RouteTable" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "VPC" + self.cloud_service_type = "RouteTable" + self.metadata_path = "metadata/vpc/route_table.yaml" + + def create_cloud_service_type(self): + result = [] + route_table_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonVPC", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-vpc.svg" + }, + labels=["Networking"], + ) + result.append(route_table_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_route_tables(options, region) + + def _collect_route_tables(self, options, region): + region_name = region + + try: + route_tables, account_id = self.connector.list_vpc_route_tables() + + for route_table in route_tables: + try: + route_table_id = route_table.get("RouteTableId") + + # Get route table tags + tags = self._get_route_table_tags(route_table_id) + + # Get route table routes + routes = self._get_route_table_routes(route_table_id) + + # Get route table associations + associations = self._get_route_table_associations(route_table_id) + + route_table_data = { + "route_table_id": route_table_id, + "vpc_id": route_table.get("VpcId", ""), + "associations": route_table.get("Associations", []), + "routes": route_table.get("Routes", []), + "propagating_vgws": route_table.get("PropagatingVgws", []), + "tags": route_table.get("Tags", []), + "owner_id": route_table.get("OwnerId", ""), + "route_table_routes": routes, + "route_table_associations": associations, + } + + route_table_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + route_table_id, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + route_table_id, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/vpc/home?region={region}#RouteTables:search={route_table_id}" + resource_id = route_table_id + reference = self.get_reference(resource_id, link) + + route_table_vo = RouteTable(route_table_data, strict=False) + cloud_service = make_cloud_service( + name=route_table_id, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=route_table_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=route_table_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_vpc_route_tables] [{route_table.get("RouteTableId")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_vpc_route_tables] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_route_table_tags(self, route_table_id): + """Get route table tags""" + try: + return self.connector.get_route_table_tags(route_table_id) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for route table {route_table_id}: {e}") + return [] + + def _get_route_table_routes(self, route_table_id): + """Get route table routes""" + try: + return self.connector.get_route_table_routes(route_table_id) + except Exception as e: + _LOGGER.warning( + f"Failed to get routes for route table {route_table_id}: {e}" + ) + return [] + + def _get_route_table_associations(self, route_table_id): + """Get route table associations""" + try: + return self.connector.get_route_table_associations(route_table_id) + except Exception as e: + _LOGGER.warning( + f"Failed to get associations for route table {route_table_id}: {e}" + ) + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/vpc/subnet_manager.py b/src/plugin/manager/vpc/subnet_manager.py new file mode 100644 index 0000000..35e7f65 --- /dev/null +++ b/src/plugin/manager/vpc/subnet_manager.py @@ -0,0 +1,165 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.vpc import Subnet + + +class SubnetManager(ResourceManager): + cloud_service_group = "VPC" + cloud_service_type = "Subnet" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "VPC" + self.cloud_service_type = "Subnet" + self.metadata_path = "metadata/vpc/subnet.yaml" + + def create_cloud_service_type(self): + result = [] + subnet_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonVPC", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-vpc.svg" + }, + labels=["Networking"], + ) + result.append(subnet_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_subnets(options, region) + + def _collect_subnets(self, options, region): + region_name = region + + try: + subnets, account_id = self.connector.list_vpc_subnets() + + for subnet in subnets: + try: + subnet_id = subnet.get("SubnetId") + + # Get subnet tags + tags = self._get_subnet_tags(subnet_id) + + subnet_data = { + "subnet_id": subnet_id, + "vpc_id": subnet.get("VpcId", ""), + "availability_zone": subnet.get("AvailabilityZone", ""), + "availability_zone_id": subnet.get("AvailabilityZoneId", ""), + "available_ip_address_count": subnet.get( + "AvailableIpAddressCount", 0 + ), + "cidr_block": subnet.get("CidrBlock", ""), + "default_for_az": subnet.get("DefaultForAz", False), + "map_public_ip_on_launch": subnet.get( + "MapPublicIpOnLaunch", False + ), + "map_customer_owned_ip_on_launch": subnet.get( + "MapCustomerOwnedIpOnLaunch", False + ), + "customer_owned_ipv4_pool": subnet.get( + "CustomerOwnedIpv4Pool", "" + ), + "state": subnet.get("State", ""), + "subnet_arn": subnet.get("SubnetArn", ""), + "outpost_arn": subnet.get("OutpostArn", ""), + "enable_dns64": subnet.get("EnableDns64", False), + "ipv6_native": subnet.get("Ipv6Native", False), + "private_dns_name_options_on_launch": subnet.get( + "PrivateDnsNameOptionsOnLaunch", {} + ), + "assign_ipv6_address_on_creation": subnet.get( + "AssignIpv6AddressOnCreation", False + ), + "ipv6_cidr_block_association_set": subnet.get( + "Ipv6CidrBlockAssociationSet", [] + ), + "tags": subnet.get("Tags", []), + "owner_id": subnet.get("OwnerId", ""), + } + + subnet_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + subnet_id, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + subnet_id, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/vpc/home?region={region}#Subnets:search={subnet_id}" + resource_id = subnet_id + reference = self.get_reference(resource_id, link) + + subnet_vo = Subnet(subnet_data, strict=False) + cloud_service = make_cloud_service( + name=subnet_id, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=subnet_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=subnet_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error(f'[list_vpc_subnets] [{subnet.get("SubnetId")}] {e}') + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_vpc_subnets] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_subnet_tags(self, subnet_id): + """Get subnet tags""" + try: + return self.connector.get_subnet_tags(subnet_id) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for subnet {subnet_id}: {e}") + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/vpc/transit_gateway_manager.py b/src/plugin/manager/vpc/transit_gateway_manager.py new file mode 100644 index 0000000..2c52ad4 --- /dev/null +++ b/src/plugin/manager/vpc/transit_gateway_manager.py @@ -0,0 +1,163 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.vpc import TransitGateway + + +class TransitGatewayManager(ResourceManager): + cloud_service_group = "VPC" + cloud_service_type = "TransitGateway" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "VPC" + self.cloud_service_type = "TransitGateway" + self.metadata_path = "metadata/vpc/transit_gateway.yaml" + + def create_cloud_service_type(self): + result = [] + transit_gateway_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonVPC", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-vpc.svg" + }, + labels=["Networking"], + ) + result.append(transit_gateway_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_transit_gateways(options, region) + + def _collect_transit_gateways(self, options, region): + region_name = region + + try: + transit_gateways, account_id = self.connector.list_vpc_transit_gateways() + + for transit_gateway in transit_gateways: + try: + transit_gateway_id = transit_gateway.get("TransitGatewayId") + + # Get transit gateway tags + tags = self._get_transit_gateway_tags(transit_gateway_id) + + # Get transit gateway attachments + attachments = self._get_transit_gateway_attachments( + transit_gateway_id + ) + + transit_gateway_data = { + "transit_gateway_id": transit_gateway_id, + "transit_gateway_arn": transit_gateway.get( + "TransitGatewayArn", "" + ), + "state": transit_gateway.get("State", ""), + "owner_id": transit_gateway.get("OwnerId", ""), + "description": transit_gateway.get("Description", ""), + "creation_time": transit_gateway.get("CreationTime"), + "options": transit_gateway.get("Options", {}), + "tags": transit_gateway.get("Tags", []), + "attachments": attachments, + } + + transit_gateway_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + transit_gateway_id, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + transit_gateway_id, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/vpc/home?region={region}#TransitGateways:search={transit_gateway_id}" + resource_id = transit_gateway_id + reference = self.get_reference(resource_id, link) + + transit_gateway_vo = TransitGateway( + transit_gateway_data, strict=False + ) + cloud_service = make_cloud_service( + name=transit_gateway_id, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=transit_gateway_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=transit_gateway_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_vpc_transit_gateways] [{transit_gateway.get("TransitGatewayId")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_vpc_transit_gateways] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_transit_gateway_tags(self, transit_gateway_id): + """Get transit gateway tags""" + try: + return self.connector.get_transit_gateway_tags(transit_gateway_id) + except Exception as e: + _LOGGER.warning( + f"Failed to get tags for transit gateway {transit_gateway_id}: {e}" + ) + return [] + + def _get_transit_gateway_attachments(self, transit_gateway_id): + """Get transit gateway attachments""" + try: + return self.connector.get_transit_gateway_attachments(transit_gateway_id) + except Exception as e: + _LOGGER.warning( + f"Failed to get attachments for transit gateway {transit_gateway_id}: {e}" + ) + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/vpc/vpc_manager.py b/src/plugin/manager/vpc/vpc_manager.py new file mode 100644 index 0000000..ced563a --- /dev/null +++ b/src/plugin/manager/vpc/vpc_manager.py @@ -0,0 +1,193 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.vpc import VPC + + +class VPCManager(ResourceManager): + cloud_service_group = "VPC" + cloud_service_type = "VPC" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "VPC" + self.cloud_service_type = "VPC" + self.metadata_path = "metadata/vpc/vpc.yaml" + + def create_cloud_service_type(self): + result = [] + vpc_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonVPC", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-vpc.svg" + }, + labels=["Networking"], + ) + result.append(vpc_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_vpcs(options, region) + + def _collect_vpcs(self, options, region): + region_name = region + + try: + vpcs, account_id = self.connector.list_vpcs() + + for vpc in vpcs: + try: + vpc_id = vpc.get("VpcId") + + # Get VPC tags + tags = self._get_vpc_tags(vpc_id) + + # Get VPC subnets + subnets = self._get_vpc_subnets(vpc_id) + + # Get VPC route tables + route_tables = self._get_vpc_route_tables(vpc_id) + + # Get VPC network ACLs + network_acls = self._get_vpc_network_acls(vpc_id) + + # Get VPC internet gateways + internet_gateways = self._get_vpc_internet_gateways(vpc_id) + + vpc_data = { + "vpc_id": vpc_id, + "state": vpc.get("State", ""), + "cidr_block": vpc.get("CidrBlock", ""), + "dhcp_options_id": vpc.get("DhcpOptionsId", ""), + "instance_tenancy": vpc.get("InstanceTenancy", ""), + "is_default": vpc.get("IsDefault", False), + "owner_id": vpc.get("OwnerId", ""), + "cidr_block_association_set": vpc.get( + "CidrBlockAssociationSet", [] + ), + "ipv6_cidr_block_association_set": vpc.get( + "Ipv6CidrBlockAssociationSet", [] + ), + "tags": vpc.get("Tags", []), + "subnets": subnets, + "route_tables": route_tables, + "network_acls": network_acls, + "internet_gateways": internet_gateways, + } + + vpc_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + vpc_id, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + vpc_id, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/vpc/home?region={region}#Vpcs:search={vpc_id}" + resource_id = vpc_id + reference = self.get_reference(resource_id, link) + + vpc_vo = VPC(vpc_data, strict=False) + cloud_service = make_cloud_service( + name=vpc_id, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=vpc_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=vpc_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error(f'[list_vpcs] [{vpc.get("VpcId")}] {e}') + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_vpcs] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_vpc_tags(self, vpc_id): + """Get VPC tags""" + try: + return self.connector.get_vpc_tags(vpc_id) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for VPC {vpc_id}: {e}") + return [] + + def _get_vpc_subnets(self, vpc_id): + """Get VPC subnets""" + try: + return self.connector.get_vpc_subnets(vpc_id) + except Exception as e: + _LOGGER.warning(f"Failed to get subnets for VPC {vpc_id}: {e}") + return [] + + def _get_vpc_route_tables(self, vpc_id): + """Get VPC route tables""" + try: + return self.connector.get_vpc_route_tables(vpc_id) + except Exception as e: + _LOGGER.warning(f"Failed to get route tables for VPC {vpc_id}: {e}") + return [] + + def _get_vpc_network_acls(self, vpc_id): + """Get VPC network ACLs""" + try: + return self.connector.get_vpc_network_acls(vpc_id) + except Exception as e: + _LOGGER.warning(f"Failed to get network ACLs for VPC {vpc_id}: {e}") + return [] + + def _get_vpc_internet_gateways(self, vpc_id): + """Get VPC internet gateways""" + try: + return self.connector.get_vpc_internet_gateways(vpc_id) + except Exception as e: + _LOGGER.warning(f"Failed to get internet gateways for VPC {vpc_id}: {e}") + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/vpc/vpn_connection_manager.py b/src/plugin/manager/vpc/vpn_connection_manager.py new file mode 100644 index 0000000..af5962f --- /dev/null +++ b/src/plugin/manager/vpc/vpn_connection_manager.py @@ -0,0 +1,151 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.vpc import VPNConnection + + +class VPNConnectionManager(ResourceManager): + cloud_service_group = "VPC" + cloud_service_type = "VPNConnection" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "VPC" + self.cloud_service_type = "VPNConnection" + self.metadata_path = "metadata/vpc/vpn_connection.yaml" + + def create_cloud_service_type(self): + result = [] + vpn_connection_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonVPC", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-vpc.svg" + }, + labels=["Networking"], + ) + result.append(vpn_connection_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_vpn_connections(options, region) + + def _collect_vpn_connections(self, options, region): + region_name = region + + try: + vpn_connections, account_id = self.connector.list_vpc_vpn_connections() + + for vpn_connection in vpn_connections: + try: + vpn_connection_id = vpn_connection.get("VpnConnectionId") + + # Get VPN connection tags + tags = self._get_vpn_connection_tags(vpn_connection_id) + + vpn_connection_data = { + "vpn_connection_id": vpn_connection_id, + "state": vpn_connection.get("State", ""), + "customer_gateway_id": vpn_connection.get( + "CustomerGatewayId", "" + ), + "customer_gateway_configuration": vpn_connection.get( + "CustomerGatewayConfiguration", "" + ), + "type": vpn_connection.get("Type", ""), + "vpn_gateway_id": vpn_connection.get("VpnGatewayId", ""), + "transit_gateway_id": vpn_connection.get( + "TransitGatewayId", "" + ), + "options": vpn_connection.get("Options", {}), + "routes": vpn_connection.get("Routes", []), + "tags": vpn_connection.get("Tags", []), + } + + vpn_connection_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + vpn_connection_id, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + vpn_connection_id, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/vpc/home?region={region}#VPNConnections:search={vpn_connection_id}" + resource_id = vpn_connection_id + reference = self.get_reference(resource_id, link) + + vpn_connection_vo = VPNConnection(vpn_connection_data, strict=False) + cloud_service = make_cloud_service( + name=vpn_connection_id, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=vpn_connection_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=vpn_connection_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_vpc_vpn_connections] [{vpn_connection.get("VpnConnectionId")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_vpc_vpn_connections] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_vpn_connection_tags(self, vpn_connection_id): + """Get VPN connection tags""" + try: + return self.connector.get_vpn_connection_tags(vpn_connection_id) + except Exception as e: + _LOGGER.warning( + f"Failed to get tags for VPN connection {vpn_connection_id}: {e}" + ) + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/manager/vpc/vpn_gateway_manager.py b/src/plugin/manager/vpc/vpn_gateway_manager.py new file mode 100644 index 0000000..288aea7 --- /dev/null +++ b/src/plugin/manager/vpc/vpn_gateway_manager.py @@ -0,0 +1,140 @@ +from typing import List + +from spaceone.inventory.plugin.collector.lib import ( + make_cloud_service_type, + make_cloud_service, + make_error_response, +) + +from ..base import ResourceManager, _LOGGER +from ...model.vpc import VPNGateway + + +class VPNGatewayManager(ResourceManager): + cloud_service_group = "VPC" + cloud_service_type = "VPNGateway" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cloud_service_group = "VPC" + self.cloud_service_type = "VPNGateway" + self.metadata_path = "metadata/vpc/vpn_gateway.yaml" + + def create_cloud_service_type(self): + result = [] + vpn_gateway_cst_result = make_cloud_service_type( + name=self.cloud_service_type, + group=self.cloud_service_group, + provider=self.provider, + metadata_path=self.metadata_path, + is_primary=True, + is_major=True, + service_code="AmazonVPC", + tags={ + "spaceone:icon": "https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-vpc.svg" + }, + labels=["Networking"], + ) + result.append(vpn_gateway_cst_result) + return result + + def create_cloud_service( + self, region: str, options: dict, secret_data: dict, schema: str + ): + yield from self._collect_vpn_gateways(options, region) + + def _collect_vpn_gateways(self, options, region): + region_name = region + + try: + vpn_gateways, account_id = self.connector.list_vpc_vpn_gateways() + + for vpn_gateway in vpn_gateways: + try: + vpn_gateway_id = vpn_gateway.get("VpnGatewayId") + + # Get VPN gateway tags + tags = self._get_vpn_gateway_tags(vpn_gateway_id) + + vpn_gateway_data = { + "vpn_gateway_id": vpn_gateway_id, + "state": vpn_gateway.get("State", ""), + "type": vpn_gateway.get("Type", ""), + "availability_zone": vpn_gateway.get("AvailabilityZone", ""), + "vpc_attachments": vpn_gateway.get("VpcAttachments", []), + "amazon_side_asn": vpn_gateway.get("AmazonSideAsn", 0), + "tags": vpn_gateway.get("Tags", []), + } + + vpn_gateway_data.update( + { + "region_code": region_name, + "account": account_id, + "tags": self.convert_tags(tags), + "cloudwatch": self.set_cloudwatch( + self.cloud_service_group, + vpn_gateway_id, + region, + ), + "cloudtrail": self.set_cloudtrail( + self.cloud_service_group, + vpn_gateway_id, + region, + ), + } + ) + + link = f"https://{region}.console.aws.amazon.com/vpc/home?region={region}#VPNGateways:search={vpn_gateway_id}" + resource_id = vpn_gateway_id + reference = self.get_reference(resource_id, link) + + vpn_gateway_vo = VPNGateway(vpn_gateway_data, strict=False) + cloud_service = make_cloud_service( + name=vpn_gateway_id, + cloud_service_type=self.cloud_service_type, + cloud_service_group=self.cloud_service_group, + provider=self.provider, + data=vpn_gateway_vo.to_primitive(), + account=options.get("account_id"), + reference=reference, + tags=vpn_gateway_data.get("tags", {}), + region_code=region, + ) + yield cloud_service + + except Exception as e: + _LOGGER.error( + f'[list_vpc_vpn_gateways] [{vpn_gateway.get("VpnGatewayId")}] {e}' + ) + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + except Exception as e: + _LOGGER.error(f"[list_vpc_vpn_gateways] [{region_name}] {e}") + yield make_error_response( + error=e, + provider=self.provider, + cloud_service_group=self.cloud_service_group, + cloud_service_type=self.cloud_service_type, + region_name=region, + ) + + def _get_vpn_gateway_tags(self, vpn_gateway_id): + """Get VPN gateway tags""" + try: + return self.connector.get_vpn_gateway_tags(vpn_gateway_id) + except Exception as e: + _LOGGER.warning(f"Failed to get tags for VPN gateway {vpn_gateway_id}: {e}") + return [] + + def convert_tags(self, tags): + """Convert tags to dictionary format""" + dict_tags = {} + for tag in tags: + dict_tags[tag.get("Key")] = tag.get("Value") + return dict_tags diff --git a/src/plugin/metadata/cloudwatch/__init__.py b/src/plugin/metadata/cloudwatch/__init__.py new file mode 100644 index 0000000..df53ed6 --- /dev/null +++ b/src/plugin/metadata/cloudwatch/__init__.py @@ -0,0 +1 @@ +# CloudWatch metadata diff --git a/src/plugin/metadata/cloudwatch/alarms.yaml b/src/plugin/metadata/cloudwatch/alarms.yaml new file mode 100644 index 0000000..db2ca8c --- /dev/null +++ b/src/plugin/metadata/cloudwatch/alarms.yaml @@ -0,0 +1,114 @@ +search: + fields: + - Alarm ARN: data.alarm_arn + - Alarm Name: data.name + - State: data.state_value + type: text + labels: + - OK: "OK" + - ALARM: "ALARM" + - INSUFFICIENT_DATA: "INSUFFICIENT_DATA" + - Actions Enabled: data.actions_enabled + type: text + labels: + - "true": "Actions enabled" + - "false": "No actions" + - Namespace: data.namespace + - Metric Name: data.metric_name + - Statistic: data.statistic + type: text + labels: + - SampleCount: "SampleCount" + - Average: "Average" + - Sum: "Sum" + - Minimum: "Minimum" + - Maximum: "Maximum" + - Period: data.period + - Conditions: data.conditions + - AWS Account ID: account + +table: + sort: + key: data.name + desc: true + fields: + - Alarm Name: data.name + - State: data.state_value + type: enum + enums: + - OK: green.500 + type: state + - ALARM: red.500 + type: state + - INSUFFICIENT_DATA: yellow.500 + type: state + - Actions Enabled: data.actions_enabled + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Namespace: data.namespace + - Metric Name: data.metric_name + - Statistic: data.statistic + - Period: data.period + - Last State Update: data.state_updated_timestamp + type: datetime + - Alarm ARN: data.alarm_arn + is_optional: true + - Conditions: data.conditions + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Alarm + type: item + fields: + - Alarm Name: data.name + - Alarm ARN: data.alarm_arn + - State: data.state_value + type: enum + enums: + - OK: green.500 + type: state + - ALARM: red.500 + type: state + - INSUFFICIENT_DATA: yellow.500 + type: state + - Actions Enabled: data.actions_enabled + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Namespace: data.namespace + - Metric Name: data.metric_name + - Statistic: data.statistic + - Period: data.period + - Conditions: data.conditions + - Last State Update: data.state_updated_timestamp + type: datetime + source_type: iso8601 + +tabs.1: + name: Actions + type: table + root_path: data.actions + fields: + - Type: type + - ARN: arn + +tabs.2: + name: History + type: table + root_path: data.history + fields: + - Date: date + type: datetime + source_type: iso8601 + - Type: type + type: enum + enums: + - ConfigurationUpdate: blue.400 + - StateUpdate: green.500 + - Action: coral.600 + - Description: description diff --git a/src/plugin/metadata/ebs/__init__.py b/src/plugin/metadata/ebs/__init__.py new file mode 100644 index 0000000..67e56d8 --- /dev/null +++ b/src/plugin/metadata/ebs/__init__.py @@ -0,0 +1 @@ +# EBS metadata diff --git a/src/plugin/metadata/ebs/snapshot.yaml b/src/plugin/metadata/ebs/snapshot.yaml new file mode 100644 index 0000000..e69de29 diff --git a/src/plugin/metadata/ebs/volume.yaml b/src/plugin/metadata/ebs/volume.yaml new file mode 100644 index 0000000..e69de29 diff --git a/src/plugin/metadata/ec2/ami.yaml b/src/plugin/metadata/ec2/ami.yaml index 873145e..ece0fc4 100644 --- a/src/plugin/metadata/ec2/ami.yaml +++ b/src/plugin/metadata/ec2/ami.yaml @@ -1,81 +1,3 @@ -widget: - - name: Count by Region - type: chart - options: - chart_type: COLUMN - name_options: - key: name - reference: - reference_key: region_code - resource_type: inventory.Region - type: text - query: - aggregate: - - group: - fields: - - name: value - operator: count - keys: - - key: region_code - name: name - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: AMI - - - name: Count by Account - type: chart - options: - chart_type: DONUT - query: - aggregate: - - group: - fields: - - name: value - operator: count - keys: - - key: account - name: name - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: AMI - - - name: Total Count - type: card - options: - value_options: - key: value - options: - default: '0' - type: text - query: - aggregate: - - count: - name: value - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: AMI - search: fields: - AMI ID: data.ImageId diff --git a/src/plugin/metadata/ec2/asg.yaml b/src/plugin/metadata/ec2/asg.yaml index 5129040..f5d2806 100644 --- a/src/plugin/metadata/ec2/asg.yaml +++ b/src/plugin/metadata/ec2/asg.yaml @@ -1,197 +1,3 @@ -widget: - - name: Count by Region - type: chart - options: - chart_type: COLUMN - name_options: - key: name - reference: - reference_key: region_code - resource_type: inventory.Region - type: text - query: - aggregate: - - group: - fields: - - name: value - operator: count - keys: - - key: region_code - name: name - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: AutoScalingGroup - - - name: Count by Account - type: chart - options: - chart_type: DONUT - query: - aggregate: - - group: - fields: - - name: value - operator: count - keys: - - key: account - name: name - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: AutoScalingGroup - - - name: Related Instance by Region - type: chart - options: - chart_type: COLUMN - name_options: - key: name - reference: - reference_key: region_code - resource_type: inventory.Region - type: text - query: - aggregate: - - unwind: - path: data.instances - - group: - fields: - - name: value - key: data.instances - operator: count - keys: - - key: region_code - name: name - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: AutoScalingGroup - - - name: Related Instance by Account - type: chart - options: - chart_type: DONUT - query: - aggregate: - - unwind: - path: data.instances - - group: - keys: - - name: name - key: account - fields: - - name: value - operator: count - key: data.instances - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: AutoScalingGroup - - - name: Total Count - type: card - options: - value_options: - key: value - options: - default: '0' - type: text - query: - aggregate: - - count: - name: value - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: AutoScalingGroup - - - name: Releated ELB Total Count - type: card - options: - value_options: - key: value - options: - default: '0' - type: text - query: - aggregate: - - unwind: - path: data.load_balancers - - group: - fields: - - name: value - operator: count - key: data.load_balancers - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: AutoScalingGroup - - - name: Related Instance Total Count - type: card - options: - value_options: - key: value - options: - default: '0' - type: text - query: - aggregate: - - unwind: - path: data.instances - - group: - fields: - - name: value - key: data.instances - operator: count - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: AutoScalingGroup - search: fields: - ARN: data.AutoScalingGroupARN diff --git a/src/plugin/metadata/ec2/eip.yaml b/src/plugin/metadata/ec2/eip.yaml index 1f73cd6..150c100 100644 --- a/src/plugin/metadata/ec2/eip.yaml +++ b/src/plugin/metadata/ec2/eip.yaml @@ -1,106 +1,3 @@ -widget: - - name: Count by Region - type: chart - options: - chart_type: COLUMN - name_options: - key: name - reference: - reference_key: region_code - resource_type: inventory.Region - type: text - query: - aggregate: - - group: - fields: - - name: value - operator: count - keys: - - key: region_code - name: name - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: EIP - - - name: Count by Account - type: chart - options: - chart_type: DONUT - query: - aggregate: - - group: - fields: - - name: value - operator: count - keys: - - key: account - name: name - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: EIP - - - name: In-use/Unused Count - type: chart - options: - chart_type: DONUT - query: - aggregate: - - group: - fields: - - name: value - operator: count - keys: - - key: data.allocation_status - name: name - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: EIP - - - name: Total Count - type: card - options: - value_options: - key: value - options: - default: '0' - type: text - query: - aggregate: - - count: - name: value - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: EIP - - search: fields: - IP Address: data.PublicIp @@ -164,4 +61,4 @@ tabs.0: - standard: indigo.500 - Network Interface Owner Account ID: data.NetworkInterfaceOwnerId - Customer owned IP Address: data.CustomerOwnedIp - - Customer owned IP Address Pool: data.CustomerOwnedIpv4Pool + - Customer owned IP Address Pool: data.CustomerOwnedIpv4Pool \ No newline at end of file diff --git a/src/plugin/metadata/ec2/instance.yaml b/src/plugin/metadata/ec2/instance.yaml index 4cbaa44..0794913 100644 --- a/src/plugin/metadata/ec2/instance.yaml +++ b/src/plugin/metadata/ec2/instance.yaml @@ -1,196 +1,3 @@ -widget: - - name: Count by Region - type: chart - options: - chart_type: COLUMN - name_options: - key: name - reference: - reference_key: region_code - resource_type: inventory.Region - type: text - query: - aggregate: - - group: - fields: - - name: value - operator: count - keys: - - key: region_code - name: name - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: Instance - - - name: Count By Instance Type - type: chart - options: - chart_type: TREEMAP - name_options: - key: name - type: text - query: - aggregate: - - group: - keys: - - name: name - key: instance_type - fields: - - name: value - operator: count - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: Instance - - - name: Count by Account - type: chart - options: - chart_type: DONUT - query: - aggregate: - - group: - fields: - - name: value - operator: count - keys: - - key: account - name: name - filter: - - key: account - value: true - operator: exists - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: Instance - - - name: Total Running Count - type: card - options: - value_options: - key: value - options: - default: '0' - type: text - query: - aggregate: - - count: - name: value - filter: - - key: data.compute.instance_state - value: RUNNING - operator: eq - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: Instance - - - name: Total vCPU Count - type: card - options: - value_options: - key: value - options: - default: '0' - type: text - query: - aggregate: - - group: - fields: - - name: value - key: data.hardware.core - operator: sum - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: Instance - - - name: Total Memory Size - type: card - options: - value_options: - key: value - type: size - options: - default: '0' - source_unit: 'GB' - query: - aggregate: - - group: - fields: - - name: value - operator: sum - key: data.hardware.memory - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: Instance - - - name: Total Disk Size - type: card - options: - value_options: - key: value - type: size - options: - default: '0' - source_unit: 'GB' - query: - aggregate: - - unwind: - path: data.disks - - group: - fields: - - name: value - operator: sum - key: data.disks.size - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: Instance - search: fields: - IP Address: ip_addresses @@ -498,7 +305,4 @@ tabs.8: type: enum enums: - "internet-facing": indigo.500 - - "internal": coral.600 - - - + - "internal": coral.600 \ No newline at end of file diff --git a/src/plugin/metadata/ec2/sg.yaml b/src/plugin/metadata/ec2/sg.yaml index 64e51d3..5488467 100644 --- a/src/plugin/metadata/ec2/sg.yaml +++ b/src/plugin/metadata/ec2/sg.yaml @@ -1,166 +1,3 @@ -widget: - - name: Count by Region - type: chart - options: - chart_type: COLUMN - name_options: - key: name - reference: - reference_key: region_code - resource_type: inventory.Region - type: text - query: - aggregate: - - group: - fields: - - name: value - operator: count - keys: - - key: region_code - name: name - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: SecurityGroup - - - name: Count by Account - type: chart - options: - chart_type: DONUT - query: - aggregate: - - group: - fields: - - name: value - operator: count - keys: - - key: account - name: name - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: SecurityGroup - - - name: Total Count - type: card - options: - value_options: - key: value - options: - default: '0' - type: text - query: - aggregate: - - count: - name: value - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: SecurityGroup - - - name: Inbound Rule Total Count - type: card - options: - value_options: - key: value - options: - default: '0' - type: text - query: - aggregate: - - unwind: - path: data.ip_permissions - - group: - fields: - - name: value - operator: count - key: data.ip_permissions - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: SecurityGroup - - - name: Outbound Rule Total Count - type: card - options: - value_options: - key: value - options: - default: '0' - type: text - query: - aggregate: - - unwind: - path: data.ip_permissions_egress - - group: - fields: - - name: value - operator: count - key: data.ip_permissions_egress - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: SecurityGroup - - - name: Related Instance Total Count - type: card - options: - value_options: - key: value - options: - default: '0' - type: text - query: - aggregate: - - unwind: - path: data.instances - - group: - fields: - - name: value - operator: count - key: data.instances - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: SecurityGroup - - search: fields: - Security Group ID: data.GroupId @@ -249,5 +86,4 @@ tabs.3: type: state - VPC ID: VpcId - Subnet ID: SubnetId - - Private IP: PrivateIpAddress - + - Private IP: PrivateIpAddress \ No newline at end of file diff --git a/src/plugin/metadata/ec2/snapshot.yaml b/src/plugin/metadata/ec2/snapshot.yaml index 670e96d..35a7b9b 100644 --- a/src/plugin/metadata/ec2/snapshot.yaml +++ b/src/plugin/metadata/ec2/snapshot.yaml @@ -1,176 +1,3 @@ -widget: - - name: Total Size by Region - type: chart - options: - chart_type: COLUMN - name_options: - key: name - reference: - reference_key: region_code - resource_type: inventory.Region - type: text - value_options: - key: value - type: size - options: - default: '0' - source_unit: 'GB' - query: - aggregate: - - group: - keys: - - name: name - key: region_code - fields: - - name: value - key: instance_size - operator: sum - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: Snapshot - - - name: Count by Account - type: chart - options: - chart_type: DONUT - query: - aggregate: - - group: - fields: - - name: value - operator: count - keys: - - key: account - name: name - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: Snapshot - - - name: Count by Region - type: chart - options: - chart_type: COLUMN - name_options: - key: name - reference: - reference_key: region_code - resource_type: inventory.Region - type: text - query: - aggregate: - - group: - fields: - - name: value - operator: count - keys: - - key: region_code - name: name - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: Snapshot - - - name: Total Size by Account - type: chart - options: - chart_type: DONUT - value_options: - key: value - type: size - options: - default: '0' - source_unit: 'GB' - query: - aggregate: - - group: - keys: - - name: name - key: account - fields: - - name: value - key: instance_size - operator: sum - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: Snapshot - - - name: Total Count - type: card - options: - value_options: - key: value - options: - default: '0' - type: text - query: - aggregate: - - count: - name: value - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: Snapshot - - - name: Total Size - type: card - options: - value_options: - key: value - type: size - options: - default: '0' - source_unit: 'GB' - query: - aggregate: - - group: - fields: - - name: value - key: instance_size - operator: sum - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: Snapshot - search: fields: - Snapshot ID: data.SnapshotId @@ -252,4 +79,4 @@ tabs.0: - KMS Key ID: data.kms_key_id - KMS Key ARN: data.KmsKeyId - Started: data.StartTime - type: datetime + type: datetime \ No newline at end of file diff --git a/src/plugin/metadata/ec2/volume.yaml b/src/plugin/metadata/ec2/volume.yaml index 168a0cc..a7ed972 100644 --- a/src/plugin/metadata/ec2/volume.yaml +++ b/src/plugin/metadata/ec2/volume.yaml @@ -1,211 +1,3 @@ -widget: - - name: Total Size by Region - type: chart - options: - chart_type: COLUMN - name_options: - key: name - reference: - reference_key: region_code - resource_type: inventory.Region - type: text - value_options: - key: value - type: size - options: - default: '0' - query: - aggregate: - - group: - keys: - - name: name - key: region_code - fields: - - name: value - key: instance_size - operator: sum - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: Volume - - - name: Total Size by Account - type: chart - options: - chart_type: DONUT - value_options: - key: value - type: size - options: - default: '0' - query: - aggregate: - - group: - keys: - - name: name - key: account - fields: - - name: value - key: instance_size - operator: sum - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: Volume - - - name: Total Size by Availability Zone - type: chart - options: - chart_type: COLUMN - value_options: - key: value - type: size - options: - default: '0' - query: - aggregate: - - group: - keys: - - name: name - key: data.AvailabilityZone - fields: - - name: value - key: instance_size - operator: sum - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: Volume - - - name: Total Size by Volume Type - type: chart - options: - chart_type: TREEMAP - value_options: - key: value - type: size - options: - default: '0' - source_unit: 'GB' - query: - aggregate: - - group: - keys: - - name: name - key: instance_type - fields: - - name: value - key: instance_size - operator: sum - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: Volume - - - name: Total Size by State - type: chart - options: - chart_type: TREEMAP - value_options: - key: value - type: size - options: - default: '0' - source_unit: 'GB' - query: - aggregate: - - group: - keys: - - name: name - key: data.State - fields: - - name: value - key: instance_size - operator: sum - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: Volume - - - name: Total Count - type: card - options: - value_options: - key: value - options: - default: '0' - type: text - query: - aggregate: - - count: - name: value - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: Volume - - - name: Total Size - type: card - options: - value_options: - key: value - type: size - options: - default: '0' - query: - aggregate: - - group: - fields: - - name: value - key: instance_size - operator: sum - filter: - - key: provider - operator: eq - value: aws - - key: cloud_service_group - operator: eq - value: EC2 - - key: cloud_service_type - operator: eq - value: Volume - search: fields: - Volume ID: data.VolumeId diff --git a/src/plugin/metadata/ecr/__init__.py b/src/plugin/metadata/ecr/__init__.py new file mode 100644 index 0000000..010be05 --- /dev/null +++ b/src/plugin/metadata/ecr/__init__.py @@ -0,0 +1 @@ +# ECR metadata diff --git a/src/plugin/metadata/ecr/repository.yaml b/src/plugin/metadata/ecr/repository.yaml new file mode 100644 index 0000000..522e4b2 --- /dev/null +++ b/src/plugin/metadata/ecr/repository.yaml @@ -0,0 +1,97 @@ +search: + fields: + - Repository ID: data.registry_id + - Repository Name: data.repository_name + - Repository ARN: data.repository_arn + - Repository URI: data.repository_uri + - Image Tag Mutability: data.image_tag_mutability + type: text + labels: + - MUTABLE: "MUTABLE" + - IMMUTABLE: "IMMUTABLE" + - Scan On Push: data.image_scanning_configuration.scan_on_push + data_type: "boolean" + - Image URI: data.images.image_uri + - Image Tag: data.images.image_tags_display + - Scan Status: data.images.image_scan_status.status + type: text + labels: + - COMPLETE: "COMPLETE" + - IN_PROGRESS: "IN_PROGRESS" + - FAILED: "FAILED" + - AWS Account ID: account + +table: + sort: + key: data.repository_name + desc: true + fields: + - Repository Name: data.repository_name + - Repository URI: data.repository_uri + - Image Tag Mutability: data.image_tag_mutability + type: enum + enums: + - MUTABLE: indigo.500 + - IMMUTABLE: coral.600 + - Scan On Push: data.image_scanning_configuration.scan_on_push + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Created: data.created_at + type: datetime + - Repository ARN: data.repository_arn + is_optional: true + - Repository ID: data.registry_id + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Repository + type: item + fields: + - Repository Name: data.repository_name + - Repository ARN: data.repository_arn + - Repository URI: data.repository_uri + - Repository ID: data.registry_id + - Image Tag Mutability: data.image_tag_mutability + type: enum + enums: + - MUTABLE: indigo.500 + - IMMUTABLE: coral.600 + - Scan On Push: data.image_scanning_configuration.scan_on_push + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Created: data.created_at + type: datetime + source_type: iso8601 + +tabs.1: + name: Images + type: table + root_path: data.images + fields: + - Image Tag: image_tags_display + type: badge + outline_color: violet.500 + - Image URI: image_uri + - Image Size: image_size_in_bytes + display_unit: MB + source_unit: B + type: size + - Digest: image_digest + - Scan Status: image_scan_status.status + type: enum + enums: + - COMPLETE: green.500 + type: state + - IN_PROGRESS: yellow.500 + type: state + - FAILED: red.500 + type: state + - Pushed At: image_pushed_at + type: datetime + source_type: iso8601 diff --git a/src/plugin/metadata/ecs/__init__.py b/src/plugin/metadata/ecs/__init__.py new file mode 100644 index 0000000..7450487 --- /dev/null +++ b/src/plugin/metadata/ecs/__init__.py @@ -0,0 +1 @@ +# ECS metadata diff --git a/src/plugin/metadata/ecs/cluster.yaml b/src/plugin/metadata/ecs/cluster.yaml new file mode 100644 index 0000000..24dd5f5 --- /dev/null +++ b/src/plugin/metadata/ecs/cluster.yaml @@ -0,0 +1,187 @@ +search: + fields: + - Cluster Name: data.cluster_name + - Cluster ARN: data.cluster_arn + - Status: data.status + type: text + labels: + - ACTIVE: "ACTIVE" + - PROVISIONING: "PROVISIONING" + - DEPROVISIONING: "DEPROVISIONING" + - INACTIVE: "INACTIVE" + - FAILED: "FAILED" + - Active Services Count: data.active_services_count + data_type: "integer" + - Running Tasks Count: data.running_tasks_count + data_type: "integer" + - Pending Tasks Count: data.pending_tasks_count + data_type: "integer" + - Registered Instances Count: data.registered_container_instances_count + data_type: "integer" + - Service Name: data.services.service_name + - Service ARN: data.services.service_arn + - Service Type: data.services.scheduling_strategy + type: text + labels: + - REPLICA: "REPLICA" + - DAEMON: "DAEMON" + - Task Name: data.tasks.task + - Task Definition: data.tasks.task_definition + - Task Definition ARN: data.tasks.task_definition_arn + - Container Instance ID: data.container_instances.ec2_instance_id + - AWS Account ID: account + +table: + sort: + key: data.cluster_name + desc: true + fields: + - Cluster Name: data.cluster_name + - Status: data.status + type: enum + enums: + - ACTIVE: green.500 + type: state + - PROVISIONING: yellow.500 + type: state + - DEPROVISIONING: yellow.500 + type: state + - INACTIVE: gray.400 + type: state + - FAILED: red.500 + type: state + - Active Services: data.active_services_count + - Running Tasks: data.running_tasks_count + - Pending Tasks: data.pending_tasks_count + - Registered Instances: data.registered_container_instances_count + - Cluster ARN: data.cluster_arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Cluster + type: item + fields: + - Cluster Name: data.cluster_name + - Cluster ARN: data.cluster_arn + - Status: data.status + type: enum + enums: + - ACTIVE: green.500 + type: state + - PROVISIONING: yellow.500 + type: state + - DEPROVISIONING: yellow.500 + type: state + - INACTIVE: gray.400 + type: state + - FAILED: red.500 + type: state + - Active Services: data.active_services_count + - Running Tasks: data.running_tasks_count + - Pending Tasks: data.pending_tasks_count + - Registered Instances: data.registered_container_instances_count + - Capacity Providers: data.capacity_providers + type: badge + outline_color: violet.500 + - Attachments Status: data.attachments_status + +tabs.1: + name: Services + type: table + root_path: data.services + fields: + - Service Name: service_name + - Status: status + type: enum + enums: + - ACTIVE: green.500 + type: state + - INACTIVE: gray.400 + type: state + - DRAINING: yellow.500 + type: state + - Service Type: scheduling_strategy + type: enum + enums: + - REPLICA: indigo.500 + - DAEMON: coral.600 + - Task Definition: task_definition + - Desired Tasks: desired_count + - Running Tasks: running_count + - Launch Type: launch_type + type: enum + enums: + - EC2: blue.400 + - FARGATE: indigo.500 + - Platform Version: platform_version + +tabs.2: + name: Tasks + type: table + root_path: data.tasks + fields: + - Task: task + - Task Definition: task_definition + - Last Status: last_status + type: enum + enums: + - RUNNING: green.500 + type: state + - STOPPED: red.500 + type: state + - PENDING: yellow.500 + type: state + - Desired Status: desired_status + type: enum + enums: + - RUNNING: green.500 + type: state + - STOPPED: red.500 + type: state + - Started By: started_by + - Group: group + - Container Instance: container_instance_arn + - Launch Type: launch_type + type: enum + enums: + - EC2: blue.400 + - FARGATE: indigo.500 + - Platform Version: platform_version + - Health Status: health_status + type: enum + enums: + - HEALTHY: green.500 + type: state + - UNHEALTHY: red.500 + type: state + - UNKNOWN: yellow.500 + type: state + +tabs.3: + name: Container Instances + type: table + root_path: data.container_instances + fields: + - Container Instance: container_instance_arn + - EC2 Instance: ec2_instance_id + - Agent Connected: agent_connected + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Running Tasks Count: running_tasks_count + - Pending Tasks Count: pending_tasks_count + - Agent Version: version_info.agent_version + - Docker Version: version_info.docker_version + - Status: status + - Agent Update Status: agent_update_status + type: enum + enums: + - PENDING: yellow.500 + - STAGING: blue.400 + - STAGED: indigo.500 + - UPDATING: coral.600 + - UPDATED: green.500 + - FAILED: red.500 diff --git a/src/plugin/metadata/efs/__init__.py b/src/plugin/metadata/efs/__init__.py new file mode 100644 index 0000000..128e965 --- /dev/null +++ b/src/plugin/metadata/efs/__init__.py @@ -0,0 +1 @@ +# EFS metadata diff --git a/src/plugin/metadata/efs/file_system.yaml b/src/plugin/metadata/efs/file_system.yaml new file mode 100644 index 0000000..9bffc94 --- /dev/null +++ b/src/plugin/metadata/efs/file_system.yaml @@ -0,0 +1,163 @@ +search: + fields: + - File System ID: data.file_system_id + - File System ARN: data.arn + - Name: data.name + - State: data.life_cycle_state + type: text + labels: + - available: "available" + - creating: "creating" + - updating: "updating" + - deleting: "deleting" + - deleted: "deleted" + - Metered Size: instance_size + data_type: "integer" + - Performance Mode: data.performance_mode + type: text + labels: + - generalPurpose: "General Purpose" + - maxIO: "Max IO" + - Throughput Mode: data.throughput_mode + type: text + labels: + - bursting: "Bursting" + - provisioned: "Provisioned" + - Encrypted: data.encrypted + data_type: "boolean" + - Mount Target Count: data.number_of_mount_targets + data_type: "integer" + - Mount Target ID: data.mount_targets.mount_target_id + - IP Address: data.mount_targets.ip_address + - Availability Zone: data.mount_targets.availability_zone_name + - Subnet ID: data.mount_targets.subnet_id + - Security Group ID: data.mount_targets.security_groups + - AWS Account ID: account + +table: + sort: + key: data.file_system_id + desc: true + fields: + - File System ID: data.file_system_id + - Name: data.name + - State: data.life_cycle_state + type: enum + enums: + - available: green.500 + type: state + - creating: yellow.500 + type: state + - updating: yellow.500 + type: state + - deleting: yellow.500 + type: state + - deleted: gray.400 + type: state + - Performance Mode: data.performance_mode + - Throughput Mode: data.throughput_mode + - Encrypted: data.encrypted + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Mount Targets: data.number_of_mount_targets + - Metered Size: data.size_in_bytes.value + display_unit: GB + source_unit: B + type: size + - File System ARN: data.arn + is_optional: true + - KMS Key ID: data.kms_key_id + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: File System + type: item + fields: + - File System ID: data.file_system_id + - File System ARN: data.arn + - Name: data.name + - State: data.life_cycle_state + type: enum + enums: + - available: green.500 + type: state + - creating: yellow.500 + type: state + - updating: yellow.500 + type: state + - deleting: yellow.500 + type: state + - deleted: gray.400 + type: state + - Owner ID: data.owner_id + - Creation Token: data.creation_token + - Performance Mode: data.performance_mode + - Throughput Mode: data.throughput_mode + - Provisioned Throughput: data.provisioned_throughput_in_mibps + - Encrypted: data.encrypted + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - KMS Key ID: data.kms_key_id + - Mount Targets: data.number_of_mount_targets + - Metered Size: data.size_in_bytes.value + display_unit: GB + source_unit: B + type: size + - Size in IA: data.size_in_bytes.value_in_ia + display_unit: GB + source_unit: B + type: size + - Size in Standard: data.size_in_bytes.value_in_standard + display_unit: GB + source_unit: B + type: size + - Creation Time: data.creation_time + type: datetime + source_type: iso8601 + +tabs.1: + name: Lifecycle Policies + type: table + root_path: data.life_cycle_policies + fields: + - Transition to IA: transition_to_ia_display + type: enum + enums: + - AFTER_7_DAYS: blue.400 + - AFTER_14_DAYS: indigo.500 + - AFTER_30_DAYS: coral.600 + - AFTER_60_DAYS: green.500 + - AFTER_90_DAYS: yellow.500 + +tabs.2: + name: Mount Targets + type: table + root_path: data.mount_targets + fields: + - Mount Target ID: mount_target_id + - State: life_cycle_state + type: enum + enums: + - available: green.500 + type: state + - creating: yellow.500 + type: state + - updating: yellow.500 + type: state + - deleting: yellow.500 + type: state + - deleted: gray.400 + type: state + - Availability Zone: availability_zone_name + - Subnet ID: subnet_id + - IP Address: ip_address + - Network Interface ID: network_interface_id + - Security Groups: security_groups + type: badge + outline_color: violet.500 diff --git a/src/plugin/metadata/eip/__init__.py b/src/plugin/metadata/eip/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/plugin/metadata/eip/eip.yaml b/src/plugin/metadata/eip/eip.yaml new file mode 100644 index 0000000..1626ff5 --- /dev/null +++ b/src/plugin/metadata/eip/eip.yaml @@ -0,0 +1,64 @@ +search: + fields: + - IP Address: data.PublicIp + - Associated Instance ID: data.InstanceId + - Public DNS: data.public_dns + - Private IP: data.PrivateIpAddress + - NAT Gateway ID: data.nat_gateway_id + - Scope: data.Domain + type: text + labels: + - vpc: "VPC" + - standard: "Standard" + - AWS Account ID: account + +table: + sort: + key: data.id + desc: true + fields: + - Public IP: data.PublicIp + - Private IP: data.PrivateIpAddress + - Address Pool: data.PublicIpv4Pool + - Scope: data.Domain + type: enum + enums: + - vpc: blue.400 + - standard: indigo.500 + - Associate Instance ID: data.InstanceId + - Public DNS: data.public_dns + is_optional: true + - NAT Gateway ID: data.nat_gateway_id + is_optional: true + - Association ID: data.AssociationId + is_optional: true + - Allocation ID: data.AllocationId + is_optional: true + - AWS Account ID: account + is_optional: true + + +tabs.0: + name: Elastic IPs + type: item + fields: + - Public IPv4 Address: data.PublicIp + - Associated Instance ID: data.InstanceId + - Public DNS: data.public_dns + - Allocation ID: data.AllocationId + - Private IP Address: data.PrivateIpAddress + - NAT Gateway ID: data.nat_gateway_id + - Association ID: data.AssociationId + - Network Interface ID: data.NetworkInterfaceId + - Address Pool: data.PublicIpv4Pool + type: Badge + background_color: gray.200 + text_color: gray.900 + - Scope: data.Domain + type: enum + enums: + - vpc: blue.400 + - standard: indigo.500 + - Network Interface Owner Account ID: data.NetworkInterfaceOwnerId + - Customer owned IP Address: data.CustomerOwnedIp + - Customer owned IP Address Pool: data.CustomerOwnedIpv4Pool diff --git a/src/plugin/metadata/eks/__init__.py b/src/plugin/metadata/eks/__init__.py new file mode 100644 index 0000000..bdbadbb --- /dev/null +++ b/src/plugin/metadata/eks/__init__.py @@ -0,0 +1 @@ +# EKS metadata diff --git a/src/plugin/metadata/eks/cluster.yaml b/src/plugin/metadata/eks/cluster.yaml new file mode 100644 index 0000000..477975a --- /dev/null +++ b/src/plugin/metadata/eks/cluster.yaml @@ -0,0 +1,182 @@ +search: + fields: + - Cluster Name: data.name + - Cluster ARN: data.arn + - Status: data.status + type: text + labels: + - ACTIVE: "ACTIVE" + - CREATING: "CREATING" + - DELETING: "DELETING" + - FAILED: "FAILED" + - UPDATING: "UPDATING" + - Version: data.version + - Endpoint: data.endpoint + - Role ARN: data.role_arn + - VPC ID: data.resources_vpc_config.vpc_id + - Subnets: data.resources_vpc_config.subnet_ids + - Public Access CIDRs: data.resources_vpc_config.public_access_cidrs + - Cluster Security Group ID: data.resources_vpc_config.cluster_security_group_id + - Endpoint Public Access: data.resources_vpc_config.endpoint_public_access + data_type: "boolean" + - Endpoint Private Access: data.resources_vpc_config.endpoint_private_access + data_type: "boolean" + - Node Group ARNs: data.node_groups.nodegroup_arn + - Node Group Names: data.node_groups.nodegroup_name + - Node Role ARNs: data.node_groups.node_role + - OIDC Issuer: data.identity.oidc.issuer + - Platform Version: data.platform_version + - AWS Account ID: account + +table: + sort: + key: data.name + desc: true + fields: + - Cluster Name: data.name + - Status: data.status + type: enum + enums: + - ACTIVE: green.500 + type: state + - CREATING: yellow.500 + type: state + - DELETING: yellow.500 + type: state + - FAILED: red.500 + type: state + - UPDATING: yellow.500 + type: state + - Version: data.version + - Endpoint: data.endpoint + - Role ARN: data.role_arn + - VPC ID: data.resources_vpc_config.vpc_id + - Platform Version: data.platform_version + - Cluster ARN: data.arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Cluster + type: item + fields: + - Cluster Name: data.name + - Cluster ARN: data.arn + - Status: data.status + type: enum + enums: + - ACTIVE: green.500 + type: state + - CREATING: yellow.500 + type: state + - DELETING: yellow.500 + type: state + - FAILED: red.500 + type: state + - UPDATING: yellow.500 + type: state + - Version: data.version + - Endpoint: data.endpoint + - Role ARN: data.role_arn + - Certificate Authority: data.certificate_authority.data + - Platform Version: data.platform_version + - Client Request Token: data.client_request_token + +tabs.1: + name: VPC Configuration + type: item + fields: + - VPC ID: data.resources_vpc_config.vpc_id + - Subnets: data.resources_vpc_config.subnet_ids + type: badge + outline_color: violet.500 + - Security Groups: data.resources_vpc_config.security_group_ids + type: badge + outline_color: violet.500 + - Cluster Security Group ID: data.resources_vpc_config.cluster_security_group_id + - Endpoint Public Access: data.resources_vpc_config.endpoint_public_access + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Endpoint Private Access: data.resources_vpc_config.endpoint_private_access + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Public Access CIDRs: data.resources_vpc_config.public_access_cidrs + type: badge + outline_color: violet.500 + +tabs.2: + name: Node Groups + type: table + root_path: data.node_groups + fields: + - Group Name: nodegroup_name + - Status: status + type: enum + enums: + - ACTIVE: green.500 + type: state + - CREATING: yellow.500 + type: state + - UPDATING: yellow.500 + type: state + - DELETING: yellow.500 + type: state + - CREATE_FAILED: red.500 + type: state + - DELETE_FAILED: red.500 + type: state + - DEGRADED: red.500 + type: state + - Instance Types: instance_types + type: badge + outline_color: violet.500 + - Subnets: subnets + type: badge + outline_color: violet.500 + - Disk Size: disk_size + - AMI Type: ami_type + - Node Role: node_role + +tabs.3: + name: Cluster Logging + type: table + root_path: data.logging.cluster_logging + fields: + - Types: types + type: badge + outline_color: violet.500 + - Enabled: enabled + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + +tabs.4: + name: Updates + type: table + root_path: data.updates + fields: + - Update ID: id + - Status: status + type: enum + enums: + - Successful: green.500 + type: state + - InProgress: yellow.500 + type: state + - Failed: red.500 + type: state + - Cancelled: gray.400 + type: state + - Type: type + - Submission Time: created_at + type: datetime + source_type: iso8601 + - Error: errors.error_code + type: badge + outline_color: violet.500 diff --git a/src/plugin/metadata/eks/node_group.yaml b/src/plugin/metadata/eks/node_group.yaml new file mode 100644 index 0000000..8aa1e12 --- /dev/null +++ b/src/plugin/metadata/eks/node_group.yaml @@ -0,0 +1,147 @@ +search: + fields: + - Node Group Name: data.nodegroup_name + - Node Group ARN: data.nodegroup_arn + - Status: data.status + type: text + labels: + - ACTIVE: "ACTIVE" + - CREATING: "CREATING" + - UPDATING: "UPDATING" + - DELETING: "DELETING" + - CREATE_FAILED: "CREATE_FAILED" + - DELETE_FAILED: "DELETE_FAILED" + - DEGRADED: "DEGRADED" + - EKS Cluster Name: data.cluster_name + - EKS Cluster ARN: data.cluster_arn + - Version: data.version + - Instance Type: data.instance_types + - Subnet: data.subnets + - Node Role: data.node_role + - Disk Size: data.disk_size + data_type: "integer" + - AMI Type: data.ami_type + - Release Version: data.release_version + - Modification Time: data.modified_at + data_type: "datetime" + - AWS Account ID: account + +table: + sort: + key: data.nodegroup_name + desc: true + fields: + - Node Group Name: data.nodegroup_name + - Status: data.status + type: enum + enums: + - ACTIVE: green.500 + type: state + - CREATING: yellow.500 + type: state + - UPDATING: yellow.500 + type: state + - DELETING: yellow.500 + type: state + - CREATE_FAILED: red.500 + type: state + - DELETE_FAILED: red.500 + type: state + - DEGRADED: red.500 + type: state + - EKS Cluster Name: data.cluster_name + - Version: data.version + - Instance Types: data.instance_types + type: badge + outline_color: violet.500 + - Disk Size: data.disk_size + - AMI Type: data.ami_type + - Node Role: data.node_role + - Node Group ARN: data.nodegroup_arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Node Group + type: item + fields: + - Node Group Name: data.nodegroup_name + - Node Group ARN: data.nodegroup_arn + - Status: data.status + type: enum + enums: + - ACTIVE: green.500 + type: state + - CREATING: yellow.500 + type: state + - UPDATING: yellow.500 + type: state + - DELETING: yellow.500 + type: state + - CREATE_FAILED: red.500 + type: state + - DELETE_FAILED: red.500 + type: state + - DEGRADED: red.500 + type: state + - EKS Cluster Name: data.cluster_name + - EKS Cluster ARN: data.cluster_arn + - Version: data.version + - Release Version: data.release_version + - Instance Types: data.instance_types + type: badge + outline_color: violet.500 + - Subnets: data.subnets + type: badge + outline_color: violet.500 + - AMI Type: data.ami_type + - Node Role: data.node_role + - Labels: data.labels.string + - Disk Size: data.disk_size + - Creation Time: data.created_at + type: datetime + source_type: iso8601 + - Modification Time: data.modified_at + type: datetime + source_type: iso8601 + +tabs.1: + name: Scaling Config + type: item + fields: + - Min Size: data.scaling_config.min_size + - Max Size: data.scaling_config.max_size + - Desired Size: data.scaling_config.desired_size + +tabs.2: + name: Resources + type: item + fields: + - Auto Scaling Group Name: data.resources.auto_scaling_groups.name + type: badge + outline_color: violet.500 + - Auto Scaling Group ARN: data.resources.auto_scaling_groups.arn + type: badge + outline_color: violet.500 + - Remote Access Security Group: data.resources.remote_access_security_group + +tabs.3: + name: Remote Access + type: item + fields: + - EC2 SSH Key: data.remote_access.ec2_ssh_key + - Source Security Groups: data.remote_access.source_security_groups + type: badge + outline_color: violet.500 + +tabs.4: + name: Health + type: table + root_path: data.health.issues + fields: + - Code: code + - Message: message + - Resource IDs: resource_ids + type: badge + outline_color: violet.500 diff --git a/src/plugin/metadata/elasticache/__init__.py b/src/plugin/metadata/elasticache/__init__.py new file mode 100644 index 0000000..025a3e0 --- /dev/null +++ b/src/plugin/metadata/elasticache/__init__.py @@ -0,0 +1 @@ +# ElastiCache metadata diff --git a/src/plugin/metadata/elasticache/memcached.yaml b/src/plugin/metadata/elasticache/memcached.yaml new file mode 100644 index 0000000..f58066d --- /dev/null +++ b/src/plugin/metadata/elasticache/memcached.yaml @@ -0,0 +1,165 @@ +search: + fields: + - Cluster Name: data.cache_cluster_id + - ARN: data.arn + - Status: data.cache_cluster_status + type: text + labels: + - available: "available" + - creating: "creating" + - modifying: "modifying" + - deleting: "deleting" + - snapshotting: "snapshotting" + - create-failed: "create-failed" + - restore-failed: "restore-failed" + - Nodes: data.num_cache_nodes + data_type: "integer" + - Node Type: instance_type + - Zone: data.preferred_availability_zone + - Configuration Endpoint: data.configuration_endpoint_display + - Configuration Endpoint Address: data.configuration_endpoint.address + - Configuration Endpoint Port: data.configuration_endpoint.port + - Engine: data.engine + - Engine Version: data.engine_version + - Cache Node Type: data.cache_node_type + - Description: data.description + - Automatic Failover: data.automatic_failover + - Snapshot Retention Limit: data.snapshot_retention_limit + - Replication Group ID: data.replication_group_id + - Snapshot Window: data.snapshot_window + - Subnet Group Name: data.cache_subnet_group_name + - Auth Token Enabled: data.auth_token_enabled + data_type: "boolean" + - Transit Encryption Enabled: data.transit_encryption_enabled + data_type: "boolean" + - At Rest Encryption Enabled: data.at_rest_encryption_enabled + data_type: "boolean" + - AWS Account ID: account + +table: + sort: + key: data.cache_cluster_id + desc: true + fields: + - Cluster Name: data.cache_cluster_id + - Status: data.cache_cluster_status + type: enum + enums: + - available: green.500 + type: state + - creating: yellow.500 + type: state + - modifying: yellow.500 + type: state + - deleting: yellow.500 + type: state + - snapshotting: yellow.500 + type: state + - create-failed: red.500 + type: state + - restore-failed: red.500 + type: state + - Nodes: data.num_cache_nodes + - Node Type: instance_type + - Zone: data.preferred_availability_zone + - Configuration Endpoint: data.configuration_endpoint_display + - Engine: data.engine + - Engine Version: data.engine_version + - ARN: data.arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Description + type: item + fields: + - Cluster Name: data.cache_cluster_id + - ARN: data.arn + - Status: data.cache_cluster_status + type: enum + enums: + - available: green.500 + type: state + - creating: yellow.500 + type: state + - modifying: yellow.500 + type: state + - deleting: yellow.500 + type: state + - snapshotting: yellow.500 + type: state + - create-failed: red.500 + type: state + - restore-failed: red.500 + type: state + - Configuration Endpoint: data.configuration_endpoint_display + - Engine: data.engine + - Engine Version: data.engine_version + - Node Type: data.cache_node_type + - Number of Nodes: data.num_cache_nodes + - Availability Zone: data.preferred_availability_zone + - Parameter Group: data.cache_parameter_group.cache_parameter_group_name + - Subnet Group: data.cache_subnet_group_name + - Security Groups: data.security_groups.security_group_id + type: badge + outline_color: violet.500 + - Notification ARN: data.notification_configuration.topic_arn + - Maintenance Window: data.preferred_maintenance_window + - Backup Retention Period: data.snapshot_retention_limit + - Backup Window: data.snapshot_window + - Auto Minor Version Upgrade: data.auto_minor_version_upgrade + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Auth Token Enabled: data.auth_token_enabled + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Transit Encryption: data.transit_encryption_enabled + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - At Rest Encryption: data.at_rest_encryption_enabled + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Creation Time: data.cache_cluster_create_time + type: datetime + source_type: iso8601 + +tabs.1: + name: Nodes + type: table + root_path: data.nodes + fields: + - Node Name: node_name + - Status: status + type: enum + enums: + - available: green.500 + type: state + - creating: yellow.500 + type: state + - modifying: yellow.500 + type: state + - deleting: yellow.500 + type: state + - Port: port + - Endpoint: endpoint + - Parameter Group Status: parameter_group_status + type: enum + enums: + - in-sync: green.500 + type: state + - applying: yellow.500 + type: state + - pending-reboot: yellow.500 + type: state + - Created On: created_on + type: datetime + source_type: iso8601 diff --git a/src/plugin/metadata/elasticache/redis.yaml b/src/plugin/metadata/elasticache/redis.yaml new file mode 100644 index 0000000..a3c62ec --- /dev/null +++ b/src/plugin/metadata/elasticache/redis.yaml @@ -0,0 +1,209 @@ +search: + fields: + - Replication Group ID: data.replication_group_id + - ARN: data.arn + - Mode: data.mode + - Status: data.status + type: text + labels: + - available: "available" + - creating: "creating" + - modifying: "modifying" + - deleting: "deleting" + - snapshotting: "snapshotting" + - create-failed: "create-failed" + - restore-failed: "restore-failed" + - Shard Count: data.shard_count + data_type: "integer" + - Node Count: data.node_count + data_type: "integer" + - Node Type: instance_type + - Multi AZ: data.multi_az + - Configuration Endpoint Address: data.configuration_endpoint.address + - Configuration Endpoint Port: data.configuration_endpoint.port + - Primary Endpoint: data.primary_endpoint + - Reader Endpoint: data.reader_endpoint + - Engine: data.engine + - Engine Version: data.engine_version + - Cache Node Type: data.cache_node_type + - Description: data.description + - Automatic Failover: data.automatic_failover + - Parameter Group Name: data.parameter_group_name + - Subnet Group Name: data.subnet_group_name + - Snapshot Retention Limit: data.snapshot_retention_limit + - Snapshot Window: data.snapshot_window + - Transit Encryption Enabled: data.transit_encryption_enabled + data_type: "boolean" + - At Rest Encryption Enabled: data.at_rest_encryption_enabled + data_type: "boolean" + - Auth Token Enabled: data.auth_token_enabled + data_type: "boolean" + - KMS Key ID: data.kms_key_id + - User Group IDs: data.user_group_ids + - Availability Zones: data.availability_zones + - AWS Account ID: account + +table: + sort: + key: data.replication_group_id + desc: true + fields: + - Replication Group ID: data.replication_group_id + - Mode: data.mode + - Status: data.status + type: enum + enums: + - available: green.500 + type: state + - creating: yellow.500 + type: state + - modifying: yellow.500 + type: state + - deleting: yellow.500 + type: state + - snapshotting: yellow.500 + type: state + - create-failed: red.500 + type: state + - restore-failed: red.500 + type: state + - Shard Count: data.shard_count + - Node Count: data.node_count + - Node Type: instance_type + - Transit Encryption: data.transit_encryption_enabled + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - At Rest Encryption: data.at_rest_encryption_enabled + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Multi AZ: data.multi_az + - Engine Version: data.engine_version + - ARN: data.arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Description + type: item + fields: + - Replication Group ID: data.replication_group_id + - ARN: data.arn + - Mode: data.mode + - Status: data.status + type: enum + enums: + - available: green.500 + type: state + - creating: yellow.500 + type: state + - modifying: yellow.500 + type: state + - deleting: yellow.500 + type: state + - snapshotting: yellow.500 + type: state + - create-failed: red.500 + type: state + - restore-failed: red.500 + type: state + - Configuration Endpoint Address: data.configuration_endpoint.address + - Configuration Endpoint Port: data.configuration_endpoint.port + - Primary Endpoint: data.primary_endpoint + - Reader Endpoint: data.reader_endpoint + - Engine: data.engine + - Engine Version: data.engine_version + - Multi AZ: data.multi_az + - Availability Zones: data.availability_zones + type: badge + outline_color: violet.500 + - Auto Failover: data.automatic_failover + - Description: data.description + - Parameter Group: data.parameter_group_name + - Subnet Group: data.subnet_group_name + - Backup Retention Period: data.snapshot_retention_limit + - Backup Window: data.snapshot_window + - Transit Encryption: data.transit_encryption_enabled + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - At Rest Encryption: data.at_rest_encryption_enabled + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Auth Token Enabled: data.auth_token_enabled + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - KMS Key ID: data.kms_key_id + - User Group IDs: data.user_group_ids + type: badge + outline_color: violet.500 + - Auth Token Last Modified: data.auth_token_last_modified_date + type: datetime + source_type: iso8601 + - Outpost ARNs: data.member_clusters_outpost_arns + type: badge + outline_color: violet.500 + +tabs.1: + name: Shards + type: table + root_path: data.shards + fields: + - Shard Name: shard_name + - Status: status + type: enum + enums: + - available: green.500 + type: state + - creating: yellow.500 + type: state + - modifying: yellow.500 + type: state + - deleting: yellow.500 + type: state + - Node Count: nodes + - Slots: slots + +tabs.2: + name: Nodes + type: table + root_path: data.nodes + fields: + - Node Name: node_name + - Status: status + type: enum + enums: + - available: green.500 + type: state + - creating: yellow.500 + type: state + - modifying: yellow.500 + type: state + - deleting: yellow.500 + type: state + - Current Role: current_role + - Port: port + - Endpoint: endpoint + - Parameter Group Status: parameter_group_status + type: enum + enums: + - in-sync: green.500 + type: state + - applying: yellow.500 + type: state + - pending-reboot: yellow.500 + type: state + - Zone: zone + - ARN: arn + - Created On: created_on + type: datetime + source_type: iso8601 diff --git a/src/plugin/metadata/elb/__init__.py b/src/plugin/metadata/elb/__init__.py new file mode 100644 index 0000000..cfa8298 --- /dev/null +++ b/src/plugin/metadata/elb/__init__.py @@ -0,0 +1 @@ +# ELB metadata diff --git a/src/plugin/metadata/elb/loadbalancer.yaml b/src/plugin/metadata/elb/loadbalancer.yaml new file mode 100644 index 0000000..82d4f8a --- /dev/null +++ b/src/plugin/metadata/elb/loadbalancer.yaml @@ -0,0 +1,233 @@ +search: + fields: + - Load Balancer Name: data.load_balancer_name + - Load Balancer ARN: data.load_balancer_arn + - DNS Name: data.dns_name + - State: data.state.code + type: text + labels: + - active: "active" + - provisioning: "provisioning" + - active_impaired: "active_impaired" + - failed: "failed" + - Type: instance_type + type: text + labels: + - application: "Application" + - network: "Network" + - Scheme: data.scheme + type: text + labels: + - internet-facing: "Internet Facing" + - internal: "Internal" + - VPC ID: data.vpc_id + - Availability Zone: data.availability_zones.zone_name + - Subnet ID: data.availability_zones.subnet_id + - Hosted Zone: data.canonical_hosted_zone_id + - Protocol: data.listeners.protocol + type: text + labels: + - HTTP: "HTTP" + - HTTPS: "HTTPS" + - TCP: "TCP" + - UDP: "UDP" + - TLS: "TLS" + - TCP_UDP: "TCP/UDP" + - Port: data.listeners.port + data_type: "integer" + - Deletion Protection: data.attributes.deletion_protection_enabled + data_type: "boolean" + - Cross-Zone Load Balancing: data.attributes.load_balancing_cross_zone_enabled + data_type: "boolean" + - Security Group ID: data.security_groups + - Listener ARN: data.listeners.listener_arn + - Target Group ARN: data.target_groups.target_group_arn + - Target Group Name: data.target_groups.target_group_name + - Instance ID: data.instances.instance_id + - Instance Name: data.instances.instance_name + - Instance State: data.instances.state + - Security Policy: data.listeners.ssl_policy + - AWS Account ID: account + +table: + sort: + key: data.load_balancer_name + desc: true + fields: + - Load Balancer Name: data.load_balancer_name + - DNS Name: data.dns_name + - State: data.state.code + type: enum + enums: + - active: green.500 + type: state + - provisioning: yellow.500 + type: state + - active_impaired: red.500 + type: state + - failed: red.500 + type: state + - Type: instance_type + type: enum + enums: + - network: indigo.500 + - application: coral.600 + - Scheme: data.scheme + type: enum + enums: + - internet-facing: indigo.500 + - internal: coral.600 + - VPC ID: data.vpc_id + - Availability Zones: data.availability_zones.zone_name + type: badge + outline_color: violet.500 + - Security Groups: data.security_groups + type: badge + outline_color: violet.500 + - Load Balancer ARN: data.load_balancer_arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Load Balancer + type: item + fields: + - Load Balancer Name: data.load_balancer_name + - Load Balancer ARN: data.load_balancer_arn + - DNS Name: data.dns_name + - State: data.state.code + type: enum + enums: + - active: green.500 + type: state + - provisioning: yellow.500 + type: state + - active_impaired: red.500 + type: state + - failed: red.500 + type: state + - Type: data.type + - Scheme: data.scheme + type: enum + enums: + - internet-facing: indigo.500 + - internal: coral.600 + - VPC ID: data.vpc_id + - IP Address Type: data.ip_address_type + - Hosted Zone: data.canonical_hosted_zone_id + - Creation Time: data.created_time + type: datetime + source_type: iso8601 + +tabs.1: + name: Attributes + type: item + fields: + - Deletion Protection: data.attributes.deletion_protection_enabled + - Cross-Zone Load Balancing: data.attributes.load_balancing_cross_zone_enabled + - Idle Timeout Seconds: data.attributes.idle_timeout_seconds + - Routing HTTP2 Enabled: data.attributes.routing_http2_enabled + - Routing HTTP Drop Invalid Header Fields: data.attributes.routing_http_drop_invalid_header_fields_enabled + - Routing HTTP Desync Mitigation Mode: data.attributes.routing_http_desync_mitigation_mode + - WAF Fail Open Enabled: data.attributes.waf_fail_open_enabled + - Access Logs: data.attributes.access_logs_s3_enabled + - Access Logs S3 Prefix: data.attributes.access_logs_s3_prefix + - Access Logs S3 Bucket: data.attributes.access_logs_s3_bucket + +tabs.2: + name: Listeners + type: table + root_path: data.listeners + fields: + - Protocol: protocol + type: enum + enums: + - HTTP: blue.400 + - HTTPS: indigo.500 + - TCP: coral.600 + - TLS: green.500 + - UDP: yellow.500 + - TCP_UDP: violet.500 + - Port: port + - Default Actions Target Group ARN: default_actions.target_group_arn + type: badge + outline_color: violet.500 + - Security Policy: ssl_policy + - Certificates: certificates.certificate_arn + type: badge + outline_color: violet.500 + +tabs.3: + name: Listener Rules + type: table + root_path: data.listener_rules + fields: + - Protocol: protocol + type: enum + enums: + - HTTP: blue.400 + - HTTPS: indigo.500 + - TCP: coral.600 + - TLS: green.500 + - UDP: yellow.500 + - TCP_UDP: violet.500 + - Port: port + - Priority: priority + - Conditions: conditions + type: badge + outline_color: violet.500 + - Actions: actions + type: badge + outline_color: violet.500 + - Rule ARN: rule_arn + +tabs.4: + name: Target Groups + type: table + root_path: data.target_groups + fields: + - Name: target_group_name + - ARN: target_group_arn + - Protocol: protocol + type: enum + enums: + - HTTP: blue.400 + - HTTPS: indigo.500 + - TCP: coral.600 + - TLS: green.500 + - UDP: yellow.500 + - TCP_UDP: violet.500 + - Port: port + - Target Type: target_type + type: enum + enums: + - instance: indigo.500 + - ip: coral.600 + - lambda: green.500 + +tabs.5: + name: Instances + type: table + root_path: data.instances + fields: + - Instance ID: instance_id + - Instance Name: instance_name + - State: state.name + type: enum + enums: + - running: green.500 + type: state + - pending: yellow.500 + type: state + - stopping: yellow.500 + type: state + - shutting-down: gray.400 + type: state + - stopped: red.500 + type: state + - Target Group ARN: target_group_arn + - Target Group Name: target_group_name + - VPC ID: vpc_id + - Subnet ID: subnet_id + - Private IP: private_ip_address diff --git a/src/plugin/metadata/elb/target_group.yaml b/src/plugin/metadata/elb/target_group.yaml new file mode 100644 index 0000000..7a3868b --- /dev/null +++ b/src/plugin/metadata/elb/target_group.yaml @@ -0,0 +1,177 @@ +search: + fields: + - Target Group Name: data.target_group_name + - Target Group ARN: data.target_group_arn + - Protocol: data.protocol + type: text + labels: + - HTTP: "HTTP" + - HTTPS: "HTTPS" + - TCP: "TCP" + - UDP: "UDP" + - TLS: "TLS" + - TCP_UDP: "TCP/UDP" + - Port: data.port + data_type: "integer" + - Target Type: instance_type + type: text + labels: + - instance: "Instance" + - ip: "IP" + - lambda: "Lambda" + - VPC ID: data.vpc_id + - Stickiness: data.attributes.stickiness_enabled + type: text + labels: + - Enabled: "Enabled" + - Disabled: "Disabled" + - Stickiness Type: data.attributes.stickiness_type + type: text + labels: + - lb_cookie: "LB Cookie" + - source_ip: "Source IP" + - Health Check Enabled: data.health_check_enabled + data_type: "boolean" + - Health Check Protocol: data.health_check_protocol + - Health Check Port: data.health_check_port + - Health Check Path: data.health_check_path + - Healthy Threshold Count: data.healthy_threshold_count + - Unhealthy Threshold Count: data.unhealthy_threshold_count + - Health Check Interval Seconds: data.health_check_interval_seconds + - Health Check Timeout Seconds: data.health_check_timeout_seconds + - Deregistration Delay Timeout Seconds: data.attributes.deregistration_delay_timeout_seconds + - Slow Start Duration Seconds: data.attributes.slow_start_duration_seconds + - Load Balancing Algorithm Type: data.attributes.load_balancing_algorithm_type + - Stickiness LB Cookie Duration Seconds: data.attributes.stickiness_lb_cookie_duration_seconds + - Load Balancer ARNs: data.load_balancer_arns + - AWS Account ID: account + +table: + sort: + key: data.target_group_name + desc: true + fields: + - Target Group Name: data.target_group_name + - Protocol: data.protocol + type: enum + enums: + - HTTP: blue.400 + - HTTPS: indigo.500 + - TCP: coral.600 + - TLS: green.500 + - UDP: yellow.500 + - TCP_UDP: violet.500 + - Port: data.port_display + - Target Type: instance_type + type: enum + enums: + - instance: indigo.500 + - ip: coral.600 + - lambda: green.500 + - Load Balancers: data.load_balancer_arns + type: badge + outline_color: violet.500 + - Health Check: data.health_check_enabled + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Target Group ARN: data.target_group_arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Target Group + type: item + fields: + - Target Group Name: data.target_group_name + - Target Group ARN: data.target_group_arn + - Protocol: data.protocol + type: enum + enums: + - HTTP: blue.400 + - HTTPS: indigo.500 + - TCP: coral.600 + - TLS: green.500 + - UDP: yellow.500 + - TCP_UDP: violet.500 + - Port: data.port + - Target Type: data.target_type + type: enum + enums: + - instance: indigo.500 + - ip: coral.600 + - lambda: green.500 + - VPC ID: data.vpc_id + - Load Balancer ARNs: data.load_balancer_arns + type: badge + outline_color: violet.500 + +tabs.1: + name: Target Health + type: table + root_path: data.targets_health + fields: + - Target ID: target.id + - Health Check Port: health_check_port_display + - Availability Zone: target.availability_zone + - State: target_health.state + type: enum + enums: + - healthy: green.500 + - initial: gray.500 + - unused: gray.500 + - unavailable: gray.500 + - draining: gray.500 + - unhealthy: red.600 + - unhealthy.draining: red.600 + - Reason: target_health.reason + - Description: target_health.description + +tabs.2: + name: Attributes + type: item + fields: + - Deregistration Delay: data.attributes.deregistration_delay_timeout_seconds + - Slow Start Duration: data.attributes.slow_start_duration_seconds + - Load Balancing Algorithm: data.attributes.load_balancing_algorithm_type + type: enum + enums: + - round_robin: indigo.500 + - least_outstanding_requests: coral.600 + - Stickiness: data.attributes.stickiness_enabled + type: enum + enums: + - Enabled: indigo.500 + - Disabled: coral.600 + - Stickiness Type: data.attributes.stickiness_type + type: enum + enums: + - lb_cookie: indigo.500 + - source_ip: coral.600 + +tabs.3: + name: Health Check + type: item + fields: + - Health Check Protocol: data.health_check_protocol + type: enum + enums: + - HTTP: blue.400 + - HTTPS: indigo.500 + - TCP: coral.600 + - TLS: green.500 + - UDP: yellow.500 + - TCP_UDP: violet.500 + - Health Check Port: data.health_check_port + - Health Check Enabled: data.health_check_enabled + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Health Check Interval Seconds: data.health_check_interval_seconds + - Health Check Timeout Seconds: data.health_check_timeout_seconds + - Healthy Threshold Count: data.healthy_threshold_count + - Unhealthy Threshold Count: data.unhealthy_threshold_count + - Health Check Path: data.health_check_path diff --git a/src/plugin/metadata/iam/__init__.py b/src/plugin/metadata/iam/__init__.py new file mode 100644 index 0000000..471fe75 --- /dev/null +++ b/src/plugin/metadata/iam/__init__.py @@ -0,0 +1 @@ +# IAM metadata diff --git a/src/plugin/metadata/iam/access_key.yaml b/src/plugin/metadata/iam/access_key.yaml new file mode 100644 index 0000000..a33c590 --- /dev/null +++ b/src/plugin/metadata/iam/access_key.yaml @@ -0,0 +1,53 @@ +search: + fields: + - Access Key ID: data.key_id + - User Name: data.user_name + - Status: data.status + type: text + labels: + - Active: "Active" + - Inactive: "Inactive" + - Creation Time: data.create_date + data_type: "datetime" + - Last Used Date: data.last_update_date_display + - Last Used Service: data.last_used_service + - Last Used Region: data.last_used_region + - AWS Account ID: account + +table: + sort: + key: data.key_id + desc: true + fields: + - Access Key ID: data.key_id + - User Name: data.user_name + - Status: data.status + type: enum + enums: + - Active: indigo.500 + - Inactive: coral.600 + - Creation Time: data.create_date + type: datetime + - Last Used Date: data.last_update_date_display + - Last Used Service: data.last_used_service + - Last Used Region: data.last_used_region + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Access Key + type: item + fields: + - Access Key ID: data.key_id + - User Name: data.user_name + - Status: data.status + type: enum + enums: + - Active: indigo.500 + - Inactive: coral.600 + - Creation Time: data.create_date + type: datetime + source_type: iso8601 + - Last Used Date: data.last_update_date_display + - Last Used Service: data.last_used_service + - Last Used Region: data.last_used_region diff --git a/src/plugin/metadata/iam/group.yaml b/src/plugin/metadata/iam/group.yaml new file mode 100644 index 0000000..34f6d0d --- /dev/null +++ b/src/plugin/metadata/iam/group.yaml @@ -0,0 +1,90 @@ +search: + fields: + - Group Name: data.group_name + - Group ID: data.group_id + - Group ARN: data.arn + - Path: data.path + - User Count: data.user_count + data_type: "integer" + - Creation Time: data.create_date + data_type: "datetime" + - User Name: data.users.user_name + - Access Key Age: data.users.access_key_age_display + - Last Activity: data.users.last_activity + - MFA: data.users.mfa_device + type: text + labels: + - Virtual: "Virtual" + - Not enabled: "Not enabled" + - Policy Name: data.attached_permission.policy_name + - Policy Type: data.attached_permission.policy_type + type: text + labels: + - AWS Managed: "AWS Managed" + - Local Managed: "Local Managed" + - AWS Account ID: account + +table: + sort: + key: data.group_name + desc: true + fields: + - Group Name: data.group_name + - Group ID: data.group_id + - Path: data.path + - User Count: data.user_count + - Creation Time: data.create_date + type: datetime + - Group ARN: data.arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Group + type: item + fields: + - Group Name: data.group_name + - Group ID: data.group_id + - Group ARN: data.arn + - Path: data.path + - User Count: data.user_count + - Creation Time: data.create_date + type: datetime + source_type: iso8601 + +tabs.1: + name: Users + type: table + root_path: data.users + fields: + - User Name: user_name + - Access Key Age: access_key_age_display + - Last Activity: last_activity + - MFA: mfa_device + type: enum + enums: + - Virtual: indigo.500 + - Not enabled: coral.600 + +tabs.2: + name: Permissions + type: table + root_path: data.attached_permission + fields: + - Policy Name: policy_name + - Policy ID: policy_id + - Policy Type: policy_type + type: enum + enums: + - AWS Managed: indigo.500 + - Local Managed: coral.600 + - Policy ARN: arn + - Permission Usage Count: attachment_count + - Description: description + - Creation Time: create_date + type: datetime + source_type: iso8601 + - Updated At: update_date + type: datetime + source_type: iso8601 diff --git a/src/plugin/metadata/iam/identity_provider.yaml b/src/plugin/metadata/iam/identity_provider.yaml new file mode 100644 index 0000000..43aa12d --- /dev/null +++ b/src/plugin/metadata/iam/identity_provider.yaml @@ -0,0 +1,52 @@ +search: + fields: + - Provider Name: data.provider_name + - Provider Type: data.provider_type + type: text + labels: + - SAML: "SAML" + - OIDC: "OIDC" + - Provider ARN: data.arn + - Creation Time: data.create_date + data_type: "datetime" + - Valid Until: data.valid_until + data_type: "datetime" + - AWS Account ID: account + +table: + sort: + key: data.provider_name + desc: true + fields: + - Provider Name: data.provider_name + - Provider Type: data.provider_type + type: enum + enums: + - SAML: indigo.500 + - OIDC: coral.600 + - Creation Time: data.create_date + type: datetime + - Valid Until: data.valid_until + type: datetime + - Provider ARN: data.arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Identity Provider + type: item + fields: + - Provider Name: data.provider_name + - Provider Type: data.provider_type + type: enum + enums: + - SAML: indigo.500 + - OIDC: coral.600 + - Provider ARN: data.arn + - Creation Time: data.create_date + type: datetime + source_type: iso8601 + - Valid Until: data.valid_until + type: datetime + source_type: iso8601 diff --git a/src/plugin/metadata/iam/policy.yaml b/src/plugin/metadata/iam/policy.yaml new file mode 100644 index 0000000..e26abe3 --- /dev/null +++ b/src/plugin/metadata/iam/policy.yaml @@ -0,0 +1,103 @@ +search: + fields: + - Policy Name: data.policy_name + - Policy ID: data.policy_id + - Policy ARN: data.arn + - Path: data.path + - Description: data.description + - Policy Type: data.policy_type + type: text + labels: + - AWS Managed: "AWS Managed" + - Local Managed: "Local Managed" + - Attachment Count: data.attachment_count + data_type: "integer" + - Is Attachable: data.is_attachable + data_type: "boolean" + - Default Version ID: data.default_version_id + - Permissions Boundary Usage Count: data.permissions_boundary_usage_count + data_type: "integer" + - Creation Time: data.create_date + data_type: "datetime" + - Update Time: data.update_date + data_type: "datetime" + - AWS Account ID: account + +table: + sort: + key: data.policy_name + desc: true + fields: + - Policy Name: data.policy_name + - Policy ID: data.policy_id + - Path: data.path + - Description: data.description + - Policy Type: data.policy_type + type: enum + enums: + - AWS Managed: indigo.500 + - Local Managed: coral.600 + - Attachment Count: data.attachment_count + - Is Attachable: data.is_attachable + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Creation Time: data.create_date + type: datetime + - Policy ARN: data.arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Policy + type: item + fields: + - Policy Name: data.policy_name + - Policy ID: data.policy_id + - Policy ARN: data.arn + - Path: data.path + - Description: data.description + - Policy Type: data.policy_type + type: enum + enums: + - AWS Managed: indigo.500 + - Local Managed: coral.600 + - Attachment Count: data.attachment_count + - Is Attachable: data.is_attachable + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Default Version ID: data.default_version_id + - Permissions Boundary Usage Count: data.permissions_boundary_usage_count + - Creation Time: data.create_date + type: datetime + source_type: iso8601 + - Update Time: data.update_date + type: datetime + source_type: iso8601 + +tabs.1: + name: Policy Usage + type: table + root_path: data.policy_usage + fields: + - Name: name + - Type: type + +tabs.2: + name: Permission Versions + type: table + root_path: data.permission_versions + fields: + - Version ID: version_id + - Is Default Version: is_default_version + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Creation Time: create_date + type: datetime + source_type: iso8601 diff --git a/src/plugin/metadata/iam/role.yaml b/src/plugin/metadata/iam/role.yaml new file mode 100644 index 0000000..62e3017 --- /dev/null +++ b/src/plugin/metadata/iam/role.yaml @@ -0,0 +1,90 @@ +search: + fields: + - Role Name: data.role_name + - Role ID: data.role_id + - Role ARN: data.arn + - Path: data.path + - Description: data.description + - Max Session Duration: data.max_session_duration + - Assume Role Policy Document: data.assume_role_policy_document + - Creation Time: data.create_date + data_type: "datetime" + - Last Accessed At: data.role_last_used.last_used_date + data_type: "datetime" + - Policy Name: data.attached_permission.policy_name + - Policy Type: data.attached_permission.policy_type + type: text + labels: + - AWS Managed: "AWS Managed" + - Local Managed: "Local Managed" + - Instance Profile Name: data.instance_profiles.instance_profile_name + - AWS Account ID: account + +table: + sort: + key: data.role_name + desc: true + fields: + - Role Name: data.role_name + - Role ID: data.role_id + - Path: data.path + - Description: data.description + - Max Session Duration: data.max_session_duration + - Creation Time: data.create_date + type: datetime + - Role ARN: data.arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Role + type: item + fields: + - Role Name: data.role_name + - Role ID: data.role_id + - Role ARN: data.arn + - Path: data.path + - Description: data.description + - Max Session Duration: data.max_session_duration + - Assume Role Policy Document: data.assume_role_policy_document + - Creation Time: data.create_date + type: datetime + source_type: iso8601 + - Last Accessed At: data.role_last_used.last_used_date + type: datetime + source_type: iso8601 + +tabs.1: + name: Permissions + type: table + root_path: data.attached_permission + fields: + - Policy Name: policy_name + - Policy ID: policy_id + - Policy Type: policy_type + type: enum + enums: + - AWS Managed: indigo.500 + - Local Managed: coral.600 + - Policy ARN: arn + - Permission Usage Count: attachment_count + - Description: description + - Creation Time: create_date + type: datetime + source_type: iso8601 + - Updated At: update_date + type: datetime + source_type: iso8601 + +tabs.2: + name: Instance Profiles + type: table + root_path: data.instance_profiles + fields: + - Instance Profile Name: instance_profile_name + - Instance Profile ARN: arn + - Path: path + - Creation Time: create_date + type: datetime + source_type: iso8601 diff --git a/src/plugin/metadata/iam/user.yaml b/src/plugin/metadata/iam/user.yaml new file mode 100644 index 0000000..b059f02 --- /dev/null +++ b/src/plugin/metadata/iam/user.yaml @@ -0,0 +1,153 @@ +search: + fields: + - User Name: data.user_name + - User ID: data.user_id + - User ARN: data.arn + - Path: data.path + - Groups: data.groups_display + - Access Key Age: data.access_key_age_display + - Last Activity: data.last_activity + - MFA: data.mfa_device + type: text + labels: + - Virtual: "Virtual" + - Not enabled: "Not enabled" + - Creation Time: data.create_date + data_type: "datetime" + - Last Accessed At: data.password_last_used + data_type: "datetime" + - Policy Name: data.policies.policy_name + - Policy Type: data.policies.policy_type + type: text + labels: + - AWS Managed: "AWS Managed" + - Local Managed: "Local Managed" + - Group Name: data.groups.group_name + - Access Key ID: data.access_key.key_id + - Access Key Status: data.access_key.status + type: text + labels: + - Active: "Active" + - Inactive: "Inactive" + - SSH Key ID: data.ssh_public_key.key_id + - AWS Account ID: account + +table: + sort: + key: data.user_name + desc: true + fields: + - User Name: data.user_name + - User ID: data.user_id + - Path: data.path + - Groups: data.groups_display + - Access Key Age: data.access_key_age_display + - Last Activity: data.last_activity + - MFA: data.mfa_device + type: enum + enums: + - Virtual: indigo.500 + - Not enabled: coral.600 + - Creation Time: data.create_date + type: datetime + - User ARN: data.arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: User + type: item + fields: + - User Name: data.user_name + - User ID: data.user_id + - User ARN: data.arn + - Path: data.path + - Groups: data.groups_display + - Access Key Age: data.access_key_age_display + - Last Activity: data.last_activity + - MFA: data.mfa_device + type: enum + enums: + - Virtual: indigo.500 + - Not enabled: coral.600 + - Creation Time: data.create_date + type: datetime + source_type: iso8601 + - Last Accessed At: data.password_last_used + type: datetime + source_type: iso8601 + +tabs.1: + name: Permissions + type: table + root_path: data.policies + fields: + - Policy Name: policy_name + - Policy Type: policy_type + type: enum + enums: + - AWS Managed: indigo.500 + - Local Managed: coral.600 + - Description: description + - Creation Time: create_date + type: datetime + source_type: iso8601 + +tabs.2: + name: Groups + type: table + root_path: data.groups + fields: + - Group Name: group_name + - Policy Name: attached_policy_name + type: badge + outline_color: violet.500 + - Creation Time: create_date + type: datetime + source_type: iso8601 + +tabs.3: + name: Sign-in Credentials + type: item + fields: + - Summary: data.sign_in_credential.summary + type: badge + outline_color: violet.500 + - Console Password: data.sign_in_credential.console_password + type: enum + enums: + - Enabled: indigo.500 + - Disabled: coral.600 + - Assigned MFA Device: data.sign_in_credential.assigned_mfa_device + +tabs.4: + name: Access Keys + type: table + root_path: data.access_key + fields: + - Access Key ID: key_id + - Creation Time: create_date + type: datetime + source_type: iso8601 + - Last Used: last_update_date_display + - Status: status + type: enum + enums: + - Active: indigo.500 + - Inactive: coral.600 + +tabs.5: + name: SSH Keys for AWS CodeCommit + type: table + root_path: data.ssh_public_key + fields: + - SSH Key ID: key_id + - Uploaded At: upload_date + type: datetime + source_type: iso8601 + - Status: status + type: enum + enums: + - Active: indigo.500 + - Inactive: coral.600 diff --git a/src/plugin/metadata/job.yaml b/src/plugin/metadata/job.yaml new file mode 100644 index 0000000..e69de29 diff --git a/src/plugin/metadata/kinesis_data_stream/__init__.py b/src/plugin/metadata/kinesis_data_stream/__init__.py new file mode 100644 index 0000000..c08681f --- /dev/null +++ b/src/plugin/metadata/kinesis_data_stream/__init__.py @@ -0,0 +1 @@ +# Kinesis Data Stream metadata diff --git a/src/plugin/metadata/kinesis_data_stream/data_stream.yaml b/src/plugin/metadata/kinesis_data_stream/data_stream.yaml new file mode 100644 index 0000000..98a0dd2 --- /dev/null +++ b/src/plugin/metadata/kinesis_data_stream/data_stream.yaml @@ -0,0 +1,107 @@ +search: + fields: + - Stream Name: data.stream_name + - Stream ARN: data.stream_arn + - Stream Status: data.stream_status + type: text + labels: + - CREATING: "Creating" + - DELETING: "Deleting" + - ACTIVE: "Active" + - UPDATING: "Updating" + - Consumer Name: data.consumers_vo.consumer_name + - Consumer ARN: data.consumers_vo.consumer_arn + - Shard ID: data.shards.shard_id + - Parent Shard ID: data.shards.parent_shard_id + - Retention Hours: data.retention_period_hours + data_type: "integer" + - Retention Days: data.retention_period_days + data_type: "integer" + - Number of Open Shards: instance_size + data_type: "integer" + - Number of Closed Shards: data.closed_shards_num + data_type: "integer" + - Encryption Type: data.encryption_type + - Encryption Key ID: data.key_id + - AWS Account ID: account + +table: + sort: + key: data.stream_name + desc: true + fields: + - Stream Name: data.stream_name + - Status: data.stream_status_display + type: enum + enums: + - Active: green.500 + type: state + - Creating: yellow.500 + type: state + - Deleting: yellow.500 + type: state + - Updating: yellow.500 + type: state + - Open Shards: instance_size + - Data Retention Period: data.retention_period_display + - Encryption: data.encryption_display + - Consumers with Enhanced Fan-out: data.consumers_vo.num_of_consumers + - Stream ARN: data.stream_arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Stream Details + type: item + fields: + - Stream Name: data.stream_name + - Status: data.stream_status_display + type: enum + enums: + - Active: green.500 + type: state + - Creating: yellow.500 + type: state + - Deleting: yellow.500 + type: state + - Updating: yellow.500 + type: state + - Stream ARN: data.stream_arn + - Data Retention Period: data.retention_period_display + - Stream Creation Timestamp: data.stream_creation_timestamp + type: datetime + source_type: iso8601 + +tabs.1: + name: Configuration + type: item + fields: + - Number of Open Shards: data.open_shards_num + - Number of Closed Shards: data.closed_shards_num + - Server-side Encryption: data.encryption_display + - Data Retention Period: data.retention_period_display_hours + - Enhanced (shard-level) Metrics: data.shard_level_metrics_display + type: badge + outline_color: violet.500 + - Encryption Type: data.encryption_type + - Encryption Key ID: data.key_id + +tabs.2: + name: Consumers using Enhanced Fan-out + type: table + root_path: data.consumers_vo.consumers + fields: + - Consumer Name: consumer_name + - Registration Status: consumer_status_display + type: enum + enums: + - Active: green.500 + type: state + - Creating: yellow.500 + type: state + - Deleting: yellow.500 + type: state + - Registration Date: consumer_creation_timestamp + type: datetime + source_type: iso8601 diff --git a/src/plugin/metadata/kinesis_firehose/__init__.py b/src/plugin/metadata/kinesis_firehose/__init__.py new file mode 100644 index 0000000..d9d32c7 --- /dev/null +++ b/src/plugin/metadata/kinesis_firehose/__init__.py @@ -0,0 +1 @@ +# Kinesis Firehose metadata diff --git a/src/plugin/metadata/kinesis_firehose/delivery_stream.yaml b/src/plugin/metadata/kinesis_firehose/delivery_stream.yaml new file mode 100644 index 0000000..07d7d06 --- /dev/null +++ b/src/plugin/metadata/kinesis_firehose/delivery_stream.yaml @@ -0,0 +1,135 @@ +search: + fields: + - Delivery Stream Name: data.delivery_stream_name + - Delivery Stream ARN: data.delivery_stream_arn + - Stream Status: data.delivery_stream_status + type: text + labels: + - ACTIVE: "ACTIVE" + - CREATING: "CREATING" + - DELETING: "DELETING" + - DELETING_FAILED: "DELETING_FAILED" + - CREATING_FAILED: "CREATING_FAILED" + - SUSPENDED: "SUSPENDED" + - Source Name: data.source.source_name + - Destination: data.destinations.destination_id + - Creation Time: data.create_timestamp + data_type: "datetime" + - Type: data.delivery_stream_type + - Version ID: data.version_id + - Encryption Configuration Status: data.delivery_stream_encryption_configuration.status + - Failure Description: data.failure_description + - AWS Account ID: account + +table: + sort: + key: data.delivery_stream_name + desc: true + fields: + - Delivery Stream Name: data.delivery_stream_name + - Status: data.delivery_stream_status + type: enum + enums: + - ACTIVE: green.500 + type: state + - CREATING: yellow.500 + type: state + - DELETING: yellow.500 + type: state + - DELETING_FAILED: red.500 + type: state + - CREATING_FAILED: red.500 + type: state + - SUSPENDED: red.500 + type: state + - Source: data.source.source_name + - Destination: data.destinations.destination_id + type: badge + outline_color: violet.500 + - Creation Time: data.create_timestamp + type: datetime + - Delivery Stream ARN: data.delivery_stream_arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Stream Details + type: item + fields: + - Delivery Stream Name: data.delivery_stream_name + - Delivery Stream ARN: data.delivery_stream_arn + - Status: data.delivery_stream_status + type: enum + enums: + - ACTIVE: green.500 + type: state + - CREATING: yellow.500 + type: state + - DELETING: yellow.500 + type: state + - DELETING_FAILED: red.500 + type: state + - CREATING_FAILED: red.500 + type: state + - SUSPENDED: red.500 + type: state + - Creation Time: data.create_timestamp + type: datetime + source_type: iso8601 + - Source: data.source.source_name + - Destination: data.destinations.destination_id + type: badge + outline_color: violet.500 + - Type: data.delivery_stream_type + - Version ID: data.version_id + - Encryption Configuration Status: data.delivery_stream_encryption_configuration.status + - Failure Description: data.failure_description + +tabs.1: + name: Source + type: item + fields: + - Source Name: data.source.source_name + - Source Details: data.source.source_details + - Server-side Encryption for Source Records: data.delivery_stream_encryption_configuration.status + - Encryption Type: data.delivery_stream_encryption_configuration.key_type + +tabs.2: + name: S3 Destination Details + type: table + root_path: data.destinations.s3_destination_description + fields: + - S3 Bucket ARN: bucket_arn + - Prefix: prefix + - Error Prefix: error_output_prefix + - Buffer Size: buffering_hints.size_in_mbs + - Buffer Interval: buffering_hints.interval_in_seconds + - Compression: compression_format + - Encryption: encryption_configuration.kms_encryption_config.aws_kms_key_arn + - Cloud Watch Logging: cloud_watch_logging_optinos.enabled + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + +tabs.3: + name: Extended S3 Destination Details + type: table + root_path: data.destinations.extended_s3_destination_description + fields: + - S3 Backup Mode: s3_backup_mode + - S3 Backup Bucket ARN: s3_backup_description.bucket_arn + - Processing Configuration: processing_configuration.enabled + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Processing Type: processing_configuration.processors.type + type: badge + outline_color: violet.500 + - Dynamic Partition Enabled: dynamic_partitioning_configuration.enabled + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 diff --git a/src/plugin/metadata/kms/__init__.py b/src/plugin/metadata/kms/__init__.py new file mode 100644 index 0000000..a68cab8 --- /dev/null +++ b/src/plugin/metadata/kms/__init__.py @@ -0,0 +1 @@ +# KMS metadata diff --git a/src/plugin/metadata/kms/key.yaml b/src/plugin/metadata/kms/key.yaml new file mode 100644 index 0000000..5414023 --- /dev/null +++ b/src/plugin/metadata/kms/key.yaml @@ -0,0 +1,156 @@ +search: + fields: + - KMS ID: data.key_id + - ARN: data.arn + - Alias: data.alias_name + - Enabled: data.enabled + data_type: "boolean" + - Key Status: data.key_state + type: text + labels: + - Enabled: "Enabled" + - Disabled: "Disabled" + - PendingDeletion: "Pending Deletion" + - PendingImport: "Pending Import" + - Unavailable: "Unavailable" + - Key Algorithms: data.encryption_algorithms + - Origin: data.origin + type: text + labels: + - AWS_KMS: "KMS" + - EXTERNAL: "EXTERNAL" + - AWS_CLOUDHSM: "CLOUD HSM" + - Key Manager: data.key_manager + type: text + labels: + - AWS: "AWS" + - CUSTOMER: "CUSTOMER" + - Key Usage: data.key_usage + - Customer Master Key Spec: data.customer_master_key_spec + - Custom Key Store ID: data.custom_key_store_id + - Cloud HSM Cluster ID: data.cloud_hsm_cluster_id + - Description: data.description + - AWS Account ID: account + +table: + sort: + key: data.key_id + desc: true + fields: + - KMS ID: data.key_id + - Alias: data.alias_name + - Status: data.key_state + type: enum + enums: + - Enabled: green.500 + type: state + - Disabled: gray.400 + type: state + - PendingDeletion: yellow.500 + type: state + - PendingImport: yellow.500 + type: state + - Unavailable: red.500 + type: state + - Enabled: data.enabled + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Origin: data.origin + type: enum + enums: + - AWS_KMS: indigo.500 + - EXTERNAL: coral.600 + - AWS_CLOUDHSM: green.500 + - Key Manager: data.key_manager + type: enum + enums: + - AWS: indigo.500 + - CUSTOMER: coral.600 + - Key Usage: data.key_usage + - ARN: data.arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Keys + type: item + fields: + - KMS ID: data.key_id + - ARN: data.arn + - Alias: data.alias_name + - Enabled: data.enabled + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Key Status: data.key_state + type: enum + enums: + - Enabled: green.500 + type: state + - Disabled: gray.400 + type: state + - PendingDeletion: yellow.500 + type: state + - PendingImport: yellow.500 + type: state + - Unavailable: red.500 + type: state + - Description: data.description + - Key Algorithms: data.encryption_algorithms + type: badge + outline_color: violet.500 + - Signing Algorithms: data.signing_algorithms + type: badge + outline_color: violet.500 + - Origin: data.origin + type: enum + enums: + - AWS_KMS: indigo.500 + - EXTERNAL: coral.600 + - AWS_CLOUDHSM: green.500 + - Key Manager: data.key_manager + type: enum + enums: + - AWS: indigo.500 + - CUSTOMER: coral.600 + - CMK Auto Rotation: data.key_rotated + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Key Usage: data.key_usage + type: enum + enums: + - SIGN_VERIFY: indigo.500 + - ENCRYPT_DECRYPT: coral.600 + - Expiration Model: data.expiration_model + type: enum + enums: + - KEY_MATERIAL_EXPIRES: indigo.500 + - KEY_MATERIAL_DOES_NOT_EXPIRE: coral.600 + - Customer Master Key Spec: data.customer_master_key_spec + type: enum + enums: + - RSA_2048: indigo.500 + - RSA_3072: coral.600 + - RSA_4096: green.500 + - ECC_NIST_P256: yellow.500 + - ECC_NIST_P384: violet.500 + - ECC_NIST_P521: blue.400 + - ECC_SECG_P256K1: red.500 + - SYMMETRIC_DEFAULT: gray.400 + - Custom Key Store ID: data.custom_key_store_id + - Cloud HSM Cluster ID: data.cloud_hsm_cluster_id + - Creation Time: data.creation_date + type: datetime + source_type: iso8601 + - Deletion Date: data.deletion_date + type: datetime + source_type: iso8601 + - Valid To: data.valid_to + type: datetime + source_type: iso8601 diff --git a/src/plugin/metadata/lambda/__init__.py b/src/plugin/metadata/lambda/__init__.py new file mode 100644 index 0000000..1eecf54 --- /dev/null +++ b/src/plugin/metadata/lambda/__init__.py @@ -0,0 +1 @@ +# Lambda metadata diff --git a/src/plugin/metadata/lambda/function.yaml b/src/plugin/metadata/lambda/function.yaml new file mode 100644 index 0000000..9cb19d4 --- /dev/null +++ b/src/plugin/metadata/lambda/function.yaml @@ -0,0 +1,184 @@ +search: + fields: + - Function Name: data.name + - ARN: data.arn + - Package Type: data.package_type + - Runtime: data.runtime + - State: data.state.type + type: text + labels: + - Active: "Active" + - Pending: "Pending" + - Inactive: "Inactive" + - Failed: "Failed" + - State Reason: data.state.reason + - State Reason Code: data.state.reason_code + - Role ARN: data.role + - Handler: data.handler + - Code Size: instance_size + data_type: "integer" + - Description: data.description + - Timeout: data.time_out + data_type: "integer" + - Memory Size: data.memory_size + data_type: "integer" + - Code SHA256: data.code_sha256 + - KMS Key ARN: data.kms_key_arn + - Master ARN: data.master_arn + - Revision ID: data.revision_id + - Last Update Status: data.last_update.type + type: text + labels: + - Successful: "Successful" + - Failed: "Failed" + - InProgress: "InProgress" + - Last Update State Reason: data.last_update.reason + - Last Modified: data.last_modified + data_type: "datetime" + - VPC ID: data.vpc_config.vpc_id + - Subnet IDs: data.vpc_config.subnet_ids + - Security Group IDs: data.vpc_config.security_group_ids + - Layers ARN: data.layers.arn + - Dead Letter Target Name: data.dead_letter_config.target_name + - Dead Letter Target ARN: data.dead_letter_config.target_arn + - Trace Config Mode: data.trace_config.mode + - AWS Account ID: account + +table: + sort: + key: data.name + desc: true + fields: + - Function Name: data.name + - Package Type: data.package_type + - Runtime: data.runtime + type: badge + outline_color: violet.500 + - State: data.state.type + type: enum + enums: + - Active: green.500 + type: state + - Pending: yellow.500 + type: state + - Inactive: gray.400 + type: state + - Failed: red.500 + type: state + - Code Size: instance_size + display_unit: MB + source_unit: B + type: size + - Memory Size: data.memory_size + display_unit: MB + source_unit: MB + type: size + - Description: data.description + - ARN: data.arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Functions + type: item + fields: + - Function Name: data.name + - ARN: data.arn + - Package Type: data.package_type + - Runtime: data.runtime + type: badge + outline_color: violet.500 + - State: data.state.type + type: enum + enums: + - Active: green.500 + type: state + - Pending: yellow.500 + type: state + - Inactive: gray.400 + type: state + - Failed: red.500 + type: state + - State Reason: data.state.reason + - State Reason Code: data.state.reason_code + type: enum + enums: + - Creating: yellow.500 + - Restoring: yellow.500 + - Idle: yellow.500 + - EniLimitExceeded: red.500 + - InsufficientRolePermissions: red.500 + - InvalidConfiguration: red.500 + - InternalError: red.500 + - SubnetOutOfIPAddresses: red.500 + - InvalidSubnet: red.500 + - InvalidSecurityGroup: red.500 + - ImageDeleted: red.500 + - ImageAccessDenied: red.500 + - InvalidImage: red.500 + - KMSKeyAccessDenied: red.500 + - KMSKeyNotFound: red.500 + - InvalidStateKMSKey: red.500 + - DisabledKMSKey: red.500 + - EFSIOError: red.500 + - EFSMountConnectivityError: red.500 + - EFSMountFailure: red.500 + - EFSMountTimeout: red.500 + - InvalidRuntime: red.500 + - InvalidZipFileException: red.500 + - FunctionError: red.500 + - Role: data.role + - Handler: data.handler + - Code Size: data.code_size + - Description: data.description + - Timeout: data.time_out + - Memory Size: data.memory_size + - Code SHA 256: data.code_sha256 + - KMS Key ARN: data.kms_key_arn + - Master ARN: data.master_arn + - Revision ID: data.revision_id + - Last Update Status: data.last_update.type + type: enum + enums: + - Successful: green.500 + type: state + - Failed: red.500 + type: state + - InProgress: yellow.500 + type: state + - Last Update State Reason: data.last_update.reason + - Last Modified: data.last_modified + type: datetime + source_type: iso8601 + +tabs.1: + name: VPC + type: item + fields: + - VPC ID: data.vpc_config.vpc_id + - Subnet IDs: data.vpc_config.subnet_ids + type: badge + outline_color: violet.500 + - Security Group IDs: data.vpc_config.security_group_ids + type: badge + outline_color: violet.500 + +tabs.2: + name: Environment Variables + type: table + root_path: data.environment_variables + fields: + - Key: key + - Value: value + +tabs.3: + name: Layers + type: table + root_path: data.layers + fields: + - Layer ARN: arn + - Code Size: code_size + display_unit: MB + source_unit: B + type: size diff --git a/src/plugin/metadata/lambda/layer.yaml b/src/plugin/metadata/lambda/layer.yaml new file mode 100644 index 0000000..c4b7650 --- /dev/null +++ b/src/plugin/metadata/lambda/layer.yaml @@ -0,0 +1,45 @@ +search: + fields: + - Layer Name: data.layer_name + - Layer ARN: data.layer_arn + - Version: data.version + data_type: "integer" + - Description: data.latest_matching_version.description + - Compatible Runtimes: data.latest_matching_version.compatible_runtimes + - License Info: data.latest_matching_version.license_info + - Created Date: data.latest_matching_version.created_date + data_type: "datetime" + - AWS Account ID: account + +table: + sort: + key: data.layer_name + desc: true + fields: + - Layer Name: data.layer_name + - Version: data.version + - Compatible Runtimes: data.latest_matching_version.compatible_runtimes + type: badge + outline_color: violet.500 + - Description: data.latest_matching_version.description + - License Info: data.latest_matching_version.license_info + - Layer ARN: data.layer_arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Layers + type: item + fields: + - Layer Name: data.layer_name + - Layer ARN: data.layer_arn + - Version: data.version + - Description: data.latest_matching_version.description + - Compatible Runtimes: data.latest_matching_version.compatible_runtimes + type: badge + outline_color: violet.500 + - License Info: data.latest_matching_version.license_info + - Created Date: data.latest_matching_version.created_date + type: datetime + source_type: iso8601 diff --git a/src/plugin/metadata/lightsail/__init__.py b/src/plugin/metadata/lightsail/__init__.py new file mode 100644 index 0000000..f164669 --- /dev/null +++ b/src/plugin/metadata/lightsail/__init__.py @@ -0,0 +1 @@ +# Lightsail metadata diff --git a/src/plugin/metadata/lightsail/bucket.yaml b/src/plugin/metadata/lightsail/bucket.yaml new file mode 100644 index 0000000..981247b --- /dev/null +++ b/src/plugin/metadata/lightsail/bucket.yaml @@ -0,0 +1,42 @@ +search: + fields: + - ARN: data.arn + - Name: data.name + - State: data.state + - Support Code: data.support_code + - Availability Zone: data.location.availability_zone + - Region: data.location.region_name + - Resource Type: data.resource_type + - Created At: data.created_at + data_type: "datetime" + - AWS Account ID: account + +table: + sort: + key: data.name + desc: true + fields: + - Name: data.name + - State: data.state + - Availability Zone: data.location.availability_zone + - Region: data.location.region_name + - Resource Type: data.resource_type + - ARN: data.arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Bucket + type: item + fields: + - ARN: data.arn + - Name: data.name + - State: data.state + - Support Code: data.support_code + - Availability Zone: data.location.availability_zone + - Region: data.location.region_name + - Resource Type: data.resource_type + - Created At: data.created_at + type: datetime + source_type: iso8601 diff --git a/src/plugin/metadata/lightsail/container.yaml b/src/plugin/metadata/lightsail/container.yaml new file mode 100644 index 0000000..1657e25 --- /dev/null +++ b/src/plugin/metadata/lightsail/container.yaml @@ -0,0 +1,62 @@ +search: + fields: + - ARN: data.arn + - Name: data.name + - State: data.state + - Power: data.power + - Scale: data.scale + - Current Deployment State: data.current_deployment.state + - Current Deployment Version: data.current_deployment.version + - Current Deployment Created At: data.current_deployment.created_at + data_type: "datetime" + - Current Deployment Public Endpoint: data.current_deployment.public_endpoint + - Current Deployment Container Service: data.current_deployment.container_service + - Support Code: data.support_code + - Availability Zone: data.location.availability_zone + - Region: data.location.region_name + - Resource Type: data.resource_type + - Created At: data.created_at + data_type: "datetime" + - AWS Account ID: account + +table: + sort: + key: data.name + desc: true + fields: + - Name: data.name + - State: data.state + - Power: data.power + - Scale: data.scale + - Current Deployment State: data.current_deployment.state + - Current Deployment Version: data.current_deployment.version + - Current Deployment Public Endpoint: data.current_deployment.public_endpoint + - Availability Zone: data.location.availability_zone + - ARN: data.arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Container + type: item + fields: + - ARN: data.arn + - Name: data.name + - State: data.state + - Power: data.power + - Scale: data.scale + - Current Deployment State: data.current_deployment.state + - Current Deployment Version: data.current_deployment.version + - Current Deployment Created At: data.current_deployment.created_at + type: datetime + source_type: iso8601 + - Current Deployment Public Endpoint: data.current_deployment.public_endpoint + - Current Deployment Container Service: data.current_deployment.container_service + - Support Code: data.support_code + - Availability Zone: data.location.availability_zone + - Region: data.location.region_name + - Resource Type: data.resource_type + - Created At: data.created_at + type: datetime + source_type: iso8601 diff --git a/src/plugin/metadata/lightsail/database.yaml b/src/plugin/metadata/lightsail/database.yaml new file mode 100644 index 0000000..c67c68b --- /dev/null +++ b/src/plugin/metadata/lightsail/database.yaml @@ -0,0 +1,74 @@ +search: + fields: + - ARN: data.arn + - Name: data.name + - State: data.state + - Relational Database Blueprint ID: data.relational_database_blueprint_id + - Relational Database Bundle ID: data.relational_database_bundle_id + - Master Database Name: data.master_database_name + - Master Username: data.master_username + - Master Endpoint Address: data.master_endpoint.address + - Master Endpoint Port: data.master_endpoint.port + - Preferred Backup Window: data.preferred_backup_window + - Preferred Maintenance Window: data.preferred_maintenance_window + - Publicly Accessible: data.publicly_accessible + data_type: "boolean" + - Support Code: data.support_code + - Availability Zone: data.location.availability_zone + - Region: data.location.region_name + - Resource Type: data.resource_type + - Created At: data.created_at + data_type: "datetime" + - AWS Account ID: account + +table: + sort: + key: data.name + desc: true + fields: + - Name: data.name + - State: data.state + - Relational Database Blueprint ID: data.relational_database_blueprint_id + - Relational Database Bundle ID: data.relational_database_bundle_id + - Master Database Name: data.master_database_name + - Master Username: data.master_username + - Master Endpoint Address: data.master_endpoint.address + - Master Endpoint Port: data.master_endpoint.port + - Publicly Accessible: data.publicly_accessible + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Availability Zone: data.location.availability_zone + - ARN: data.arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Database + type: item + fields: + - ARN: data.arn + - Name: data.name + - State: data.state + - Relational Database Blueprint ID: data.relational_database_blueprint_id + - Relational Database Bundle ID: data.relational_database_bundle_id + - Master Database Name: data.master_database_name + - Master Username: data.master_username + - Master Endpoint Address: data.master_endpoint.address + - Master Endpoint Port: data.master_endpoint.port + - Preferred Backup Window: data.preferred_backup_window + - Preferred Maintenance Window: data.preferred_maintenance_window + - Publicly Accessible: data.publicly_accessible + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Support Code: data.support_code + - Availability Zone: data.location.availability_zone + - Region: data.location.region_name + - Resource Type: data.resource_type + - Created At: data.created_at + type: datetime + source_type: iso8601 diff --git a/src/plugin/metadata/lightsail/disk.yaml b/src/plugin/metadata/lightsail/disk.yaml new file mode 100644 index 0000000..6dc9a11 --- /dev/null +++ b/src/plugin/metadata/lightsail/disk.yaml @@ -0,0 +1,97 @@ +search: + fields: + - ARN: data.arn + - Name: data.name + - State: data.state + - Size: data.size_in_gb + data_type: "integer" + - IOPS: data.iops + data_type: "integer" + - Attached To: data.attached_to + - Is Attached: data.is_attached + data_type: "boolean" + - Attachment State: data.attachment_state + - GB In Use: data.gb_in_use + data_type: "integer" + - Availability Zone: data.location.availability_zone + - Support Code: data.support_code + - AWS Account ID: account + +table: + sort: + key: data.name + desc: true + fields: + - Name: data.name + - State: data.state + type: enum + enums: + - available: green.500 + type: state + - in-use: indigo.500 + type: state + - pending: yellow.500 + type: state + - error: red.500 + type: state + - unknown: gray.400 + type: state + - Size: data.size_in_gb + display_unit: GB + source_unit: GB + type: size + - IOPS: data.iops + - Attached To: data.attached_to + - Is Attached: data.is_attached + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Availability Zone: data.location.availability_zone + - ARN: data.arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Disk + type: item + fields: + - ARN: data.arn + - Name: data.name + - State: data.state + - Support Code: data.support_code + - Availability Zone: data.location.availability_zone + - Region: data.location.region_name + - Size: data.size_in_gb + display_unit: GB + source_unit: GB + type: size + - System Disk: data.is_system_disk + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - IOPS: data.iops + - Path: data.path + - Attached To: data.attached_to + - Attached: data.is_attached + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Attachment State: data.attachment_state + - GB In Use: data.gb_in_use + - Created At: data.created_at + type: datetime + source_type: iso8601 + +tabs.1: + name: Add-ons + type: table + root_path: data.add_ons + fields: + - Name: name + - Status: status + - Snapshot Time Of Day: snapshot_time_of_day + - Next Snapshot Time Of Day: next_snapshot_time_of_day diff --git a/src/plugin/metadata/lightsail/distribution.yaml b/src/plugin/metadata/lightsail/distribution.yaml new file mode 100644 index 0000000..ee10263 --- /dev/null +++ b/src/plugin/metadata/lightsail/distribution.yaml @@ -0,0 +1,42 @@ +search: + fields: + - ARN: data.arn + - Name: data.name + - State: data.state + - Support Code: data.support_code + - Availability Zone: data.location.availability_zone + - Region: data.location.region_name + - Resource Type: data.resource_type + - Created At: data.created_at + data_type: "datetime" + - AWS Account ID: account + +table: + sort: + key: data.name + desc: true + fields: + - Name: data.name + - State: data.state + - Availability Zone: data.location.availability_zone + - Region: data.location.region_name + - Resource Type: data.resource_type + - ARN: data.arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Distribution + type: item + fields: + - ARN: data.arn + - Name: data.name + - State: data.state + - Support Code: data.support_code + - Availability Zone: data.location.availability_zone + - Region: data.location.region_name + - Resource Type: data.resource_type + - Created At: data.created_at + type: datetime + source_type: iso8601 diff --git a/src/plugin/metadata/lightsail/domain.yaml b/src/plugin/metadata/lightsail/domain.yaml new file mode 100644 index 0000000..b99d797 --- /dev/null +++ b/src/plugin/metadata/lightsail/domain.yaml @@ -0,0 +1,42 @@ +search: + fields: + - ARN: data.arn + - Name: data.name + - State: data.state + - Support Code: data.support_code + - Availability Zone: data.location.availability_zone + - Region: data.location.region_name + - Resource Type: data.resource_type + - Created At: data.created_at + data_type: "datetime" + - AWS Account ID: account + +table: + sort: + key: data.name + desc: true + fields: + - Name: data.name + - State: data.state + - Availability Zone: data.location.availability_zone + - Region: data.location.region_name + - Resource Type: data.resource_type + - ARN: data.arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Domain + type: item + fields: + - ARN: data.arn + - Name: data.name + - State: data.state + - Support Code: data.support_code + - Availability Zone: data.location.availability_zone + - Region: data.location.region_name + - Resource Type: data.resource_type + - Created At: data.created_at + type: datetime + source_type: iso8601 diff --git a/src/plugin/metadata/lightsail/instance.yaml b/src/plugin/metadata/lightsail/instance.yaml new file mode 100644 index 0000000..6d58339 --- /dev/null +++ b/src/plugin/metadata/lightsail/instance.yaml @@ -0,0 +1,114 @@ +search: + fields: + - ARN: data.arn + - Name: data.name + - Bundle ID: data.bundle_id + - Blueprint: data.blueprint_name + - CPU Core: data.hardware.cpu_count + data_type: "integer" + - Memory: data.hardware.ram_size_in_gb + data_type: "float" + - Availability Zone: data.location.availability_zone + - Public IP: data.public_ip_address + - Private IP: data.private_ip_address + - Support Code: data.support_code + - Is Static IP: data.is_static_ip + data_type: "boolean" + - Username: data.username + - SSH Key Name: data.ssh_key_name + - AWS Account ID: account + +table: + sort: + key: data.name + desc: true + fields: + - Name: data.name + - State: data.state.name + type: enum + enums: + - running: green.500 + type: state + - provisioning: yellow.500 + type: state + - stopped: red.500 + type: state + - Core: data.hardware.cpu_count + - Memory: data.hardware.ram_size_in_gb + display_unit: GB + source_unit: GB + type: size + - Availability Zone: data.location.availability_zone + - Public IP: data.public_ip_address + - Private IP: data.private_ip_address + - Blueprint: data.blueprint_name + is_optional: true + - Bundle ID: data.bundle_id + is_optional: true + - ARN: data.arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Instance + type: item + fields: + - ARN: data.arn + - Name: data.name + - Support Code: data.support_code + - Created At: data.created_at + type: datetime + source_type: iso8601 + - Availability Zone: data.location.availability_zone + - Region: data.location.region_name + - Blue Print ID: data.blueprint_id + - Blue Print Name: data.blueprint_name + - Bundle ID: data.bundle_id + - Static IP: data.is_static_ip + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Private IP: data.private_ip_address + - Public IP: data.public_ip_address + - IPv6: data.ipv6_address + type: badge + outline_color: violet.500 + - State: data.state.name + - User Name: data.username + - SSH Key Name: data.ssh_key_name + +tabs.1: + name: Snapshot Time + type: table + root_path: data.add_ons + fields: + - Name: name + - Status: status + - Snapshot Time Of Day: snapshot_time_of_day + - Next Snapshot Time Of Day: next_snapshot_time_of_day + +tabs.2: + name: Hardware + type: table + root_path: data.hardware + fields: + - CPU Count: cpu_count + - Disks: disks.name + type: badge + outline_color: violet.500 + - Ram: ram_size_in_gb + display_unit: GB + source_unit: GB + type: size + +tabs.3: + name: Networking + type: table + root_path: data.networking + fields: + - Monthly Transfer: monthly_transfer.gb_per_month_allocated + - Ports: ports.common_name + type: badge + outline_color: violet.500 diff --git a/src/plugin/metadata/lightsail/loadbalancer.yaml b/src/plugin/metadata/lightsail/loadbalancer.yaml new file mode 100644 index 0000000..d0d2e56 --- /dev/null +++ b/src/plugin/metadata/lightsail/loadbalancer.yaml @@ -0,0 +1,67 @@ +search: + fields: + - ARN: data.arn + - Name: data.name + - State: data.state + - Protocol: data.protocol + - Public Ports: data.public_ports + - Private Ports: data.private_ports + - Health Check Path: data.health_check_path + - Instance Port: data.instance_port + - Instance Protocol: data.instance_protocol + - Tls Certificate Name: data.tls_certificate_name + - Tls Certificate Domain Name: data.tls_certificate_domain_name + - Tls Certificate Status: data.tls_certificate_status + - Support Code: data.support_code + - Availability Zone: data.location.availability_zone + - Region: data.location.region_name + - Resource Type: data.resource_type + - Created At: data.created_at + data_type: "datetime" + - AWS Account ID: account + +table: + sort: + key: data.name + desc: true + fields: + - Name: data.name + - State: data.state + - Protocol: data.protocol + - Public Ports: data.public_ports + - Private Ports: data.private_ports + - Health Check Path: data.health_check_path + - Instance Port: data.instance_port + - Instance Protocol: data.instance_protocol + - Tls Certificate Name: data.tls_certificate_name + - Tls Certificate Domain Name: data.tls_certificate_domain_name + - Tls Certificate Status: data.tls_certificate_status + - Availability Zone: data.location.availability_zone + - ARN: data.arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Load Balancer + type: item + fields: + - ARN: data.arn + - Name: data.name + - State: data.state + - Protocol: data.protocol + - Public Ports: data.public_ports + - Private Ports: data.private_ports + - Health Check Path: data.health_check_path + - Instance Port: data.instance_port + - Instance Protocol: data.instance_protocol + - Tls Certificate Name: data.tls_certificate_name + - Tls Certificate Domain Name: data.tls_certificate_domain_name + - Tls Certificate Status: data.tls_certificate_status + - Support Code: data.support_code + - Availability Zone: data.location.availability_zone + - Region: data.location.region_name + - Resource Type: data.resource_type + - Created At: data.created_at + type: datetime + source_type: iso8601 diff --git a/src/plugin/metadata/lightsail/snapshot.yaml b/src/plugin/metadata/lightsail/snapshot.yaml new file mode 100644 index 0000000..c6d1a27 --- /dev/null +++ b/src/plugin/metadata/lightsail/snapshot.yaml @@ -0,0 +1,62 @@ +search: + fields: + - ARN: data.arn + - Name: data.name + - State: data.state + - Progress: data.progress + - From Resource Name: data.from_resource_name + - From Resource ARN: data.from_resource_arn + - From Blueprint ID: data.from_blueprint_id + - From Bundle ID: data.from_bundle_id + - Size In GB: data.size_in_gb + data_type: "integer" + - Support Code: data.support_code + - Availability Zone: data.location.availability_zone + - Region: data.location.region_name + - Resource Type: data.resource_type + - Created At: data.created_at + data_type: "datetime" + - AWS Account ID: account + +table: + sort: + key: data.name + desc: true + fields: + - Name: data.name + - State: data.state + - Progress: data.progress + - From Resource Name: data.from_resource_name + - Size In GB: data.size_in_gb + display_unit: GB + source_unit: GB + type: size + - Availability Zone: data.location.availability_zone + - ARN: data.arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Snapshot + type: item + fields: + - ARN: data.arn + - Name: data.name + - State: data.state + - Progress: data.progress + - From Resource Name: data.from_resource_name + - From Resource ARN: data.from_resource_arn + - From Blueprint ID: data.from_blueprint_id + - From Bundle ID: data.from_bundle_id + - Size In GB: data.size_in_gb + display_unit: GB + source_unit: GB + type: size + - Support Code: data.support_code + - Availability Zone: data.location.availability_zone + - Region: data.location.region_name + - Resource Type: data.resource_type + - Created At: data.created_at + type: datetime + source_type: iso8601 diff --git a/src/plugin/metadata/lightsail/static_ip.yaml b/src/plugin/metadata/lightsail/static_ip.yaml new file mode 100644 index 0000000..3996e07 --- /dev/null +++ b/src/plugin/metadata/lightsail/static_ip.yaml @@ -0,0 +1,55 @@ +search: + fields: + - ARN: data.arn + - Name: data.name + - IP Address: data.ip_address + - Attached To: data.attached_to + - Is Attached: data.is_attached + data_type: "boolean" + - Support Code: data.support_code + - Availability Zone: data.location.availability_zone + - Region: data.location.region_name + - Resource Type: data.resource_type + - Created At: data.created_at + data_type: "datetime" + - AWS Account ID: account + +table: + sort: + key: data.name + desc: true + fields: + - Name: data.name + - IP Address: data.ip_address + - Attached To: data.attached_to + - Is Attached: data.is_attached + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Availability Zone: data.location.availability_zone + - ARN: data.arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Static IP + type: item + fields: + - ARN: data.arn + - Name: data.name + - IP Address: data.ip_address + - Attached To: data.attached_to + - Attached: data.is_attached + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Support Code: data.support_code + - Availability Zone: data.location.availability_zone + - Region: data.location.region_name + - Resource Type: data.resource_type + - Created At: data.created_at + type: datetime + source_type: iso8601 diff --git a/src/plugin/metadata/msk/__init__.py b/src/plugin/metadata/msk/__init__.py new file mode 100644 index 0000000..68e7d05 --- /dev/null +++ b/src/plugin/metadata/msk/__init__.py @@ -0,0 +1 @@ +# MSK metadata diff --git a/src/plugin/metadata/msk/cluster.yaml b/src/plugin/metadata/msk/cluster.yaml new file mode 100644 index 0000000..668e97c --- /dev/null +++ b/src/plugin/metadata/msk/cluster.yaml @@ -0,0 +1,156 @@ +search: + fields: + - Cluster ARN: data.cluster_arn + - Kafka Version: data.current_broker_software_info.kafka_version + - Broker Type: data.broker_node_group_info.instance_type + - Status: data.state + - Number Of Broker Nodes: data.number_of_broker_nodes + data_type: "integer" + - Active Operation ARN: data.active_operation_arn + - Zookeeper Connect String TLS: data.zookeeper_connect_string_tls + - Zookeeper Connect String: data.zookeeper_connect_string + - Nodes ARN: data.node_info_list.node_arn + - Client Auth SASL: data.client_authentication.sasl + - Client Auth TLS: data.client_authentication.tls + - Encryption At Rest: data.encryption_info.encryption_at_rest.data_volume_kms_key_id + - Encryption In Transit: data.encryption_info.encryption_in_transit.client_broker + - Enhance Monitoring: data.enhanced_monitoring + - Prometheus JMX Exporter: data.open_monitoring.prometheus.jmx_exporter + - Prometheus Node Exporter: data.open_monitoring.prometheus.node_exporter + - Logging (S3 Bucket): data.logging_info.s3.bucket + - Logging (Firehose): data.logging_info.firehose.delivery_stream + - Logging (Cloudwatch): data.logging_info.broker_logs.cloud_watch_logs + - AWS Account ID: account + +table: + sort: + key: data.cluster_name + desc: true + fields: + - Name: data.cluster_name + - Status: data.state + type: enum + enums: + - ACTIVE: green.500 + type: state + - CREATING: yellow.500 + type: state + - DELETING: yellow.500 + type: state + - HEALING: yellow.500 + type: state + - MAINTENANCE: yellow.500 + type: state + - REBOOTING_BROKER: yellow.500 + type: state + - FAILED: red.500 + type: state + - Kafka Version: data.current_broker_software_info.kafka_version + - Broker Type: data.broker_node_group_info.instance_type + - Number Of Broker Nodes: data.number_of_broker_nodes + - ARN: data.cluster_arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Cluster + type: item + fields: + - ARN: data.cluster_arn + - Name: data.cluster_name + - Status: data.state + type: enum + enums: + - ACTIVE: green.500 + type: state + - CREATING: yellow.500 + type: state + - DELETING: yellow.500 + type: state + - HEALING: yellow.500 + type: state + - MAINTENANCE: yellow.500 + type: state + - REBOOTING_BROKER: yellow.500 + type: state + - FAILED: red.500 + type: state + - Current Version: data.current_version + - Enhanced Monitoring: data.enhanced_monitoring + - Number of Broker Nodes: data.number_of_broker_nodes + - Zookeeper Connect String: data.zookeeper_connect_string + - Created Time: data.creation_time + type: datetime + source_type: iso8601 + +tabs.1: + name: Broker Summary Info + type: item + root_path: data.broker_node_group_info + fields: + - Broker AZ Distribution: broker_az_distribution + - Client Subnet: client_subnets + type: badge + outline_color: violet.500 + - Security Group: security_group + type: badge + outline_color: violet.500 + - EBS storage volume per broker: storage_info.ebs_storage_info.volume_size + +tabs.2: + name: Broker Node Info + type: table + root_path: data.node_info_list + fields: + - Broker ID: broker_node_info.broker_id + - Instance Type: instance_type + - Node Type: node_type + - Client Subnet: broker_node_info.client_subnet + - Client VPC IP: broker_node_info.client_vpc_ip_address + - Endpoints: broker_node_info.endpoints + type: badge + outline_color: violet.500 + - Node ARN: node_arn + - Added To Cluster Time: added_to_cluster_time + type: datetime + source_type: iso8601 + +tabs.3: + name: Encryption Info + type: item + root_path: data.encryption_info + fields: + - Within the cluster: encryption_in_transit.in_cluster + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Between clients and brokers: encryption_in_transit.client_broker + - Customer master key in KMS: encryption_at_rest.data_volume_kms_key_id + +tabs.4: + name: Client Authentication + type: item + root_path: data.client_authentication + fields: + - SASL scram: sasl.scram + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Tls CertificateAuthorityArnList: tls.certificate_authority_arn_list + type: badge + outline_color: violet.500 + +tabs.5: + name: CloudWatch Logs + type: item + root_path: data.logging_info.broker_logs.cloud_watch_logs + fields: + - Enabled: enabled + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Log Group: log_group diff --git a/src/plugin/metadata/msk/cluster_configuration.yaml b/src/plugin/metadata/msk/cluster_configuration.yaml new file mode 100644 index 0000000..14e1dc4 --- /dev/null +++ b/src/plugin/metadata/msk/cluster_configuration.yaml @@ -0,0 +1,42 @@ +search: + fields: + - ARN: data.arn + - Name: data.name + - Description: data.description + - Kafka Versions List: data.kafka_versions_list + - Latest Revision: data.latest_revision + - State: data.state + - AWS Account ID: account + +table: + sort: + key: data.name + desc: true + fields: + - Name: data.name + - Description: data.description + - Kafka Versions List: data.kafka_versions_list + type: badge + outline_color: violet.500 + - Latest Revision: data.latest_revision + - State: data.state + - ARN: data.arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Configuration + type: item + fields: + - ARN: data.arn + - Name: data.name + - Description: data.description + - Kafka Versions List: data.kafka_versions_list + type: badge + outline_color: violet.500 + - Latest Revision: data.latest_revision + - State: data.state + - Creation Time: data.creation_time + type: datetime + source_type: iso8601 diff --git a/src/plugin/metadata/rds/__init__.py b/src/plugin/metadata/rds/__init__.py new file mode 100644 index 0000000..9b2310a --- /dev/null +++ b/src/plugin/metadata/rds/__init__.py @@ -0,0 +1 @@ +# RDS metadata diff --git a/src/plugin/metadata/rds/database.yaml b/src/plugin/metadata/rds/database.yaml new file mode 100644 index 0000000..d6b7ba6 --- /dev/null +++ b/src/plugin/metadata/rds/database.yaml @@ -0,0 +1,207 @@ +search: + fields: + - ARN: data.arn + - Role: data.role + type: text + labels: + - cluster: "Cluster" + - instance: "Instance" + - Status: data.status + type: text + labels: + - available: "Available" + - creating: "Creating" + - deleting: "Deleting" + - maintenance: "Maintenance" + - modifying: "Modifying" + - rebooting: "Rebooting" + - renaming: "Renaming" + - starting: "Starting" + - stopping: "Stopping" + - upgrading: "Upgrading" + - failed: "Failed" + - inaccessible-encryption-credentials: "Inaccessible Encryption Credentials" + - restore-error: "Restore Error" + - stopped: "Stopped" + - storage-full: "Storage Full" + - Engine: data.engine + - Engine Version: data.engine_version + - Cluster member counts: data.cluster.db_cluster_member_counts + data_type: "integer" + - Instance Class: data.instance.db_instance_class + - Availability Zone: data.availability_zone + - Multi AZ: data.multi_az + data_type: "boolean" + - Cluster Endpoint: data.cluster.endpoint + - Cluster Reader Endpoint: data.cluster.reader_endpoint + - Cluster Custom Endpoint: data.cluster.custom_endpoints + - Cluster Port: data.cluster.port + data_type: "integer" + - Instance Endpoint: data.instance.endpoint.address + - Auto Minor Version Upgrade: data.cluster.auto_minor_version_upgrade + - Preferred Maintenance Window: data.preferred_maintenance_window + - Deletion Protection: data.deletion_protection + - AWS Account ID: account + +table: + sort: + key: data.db_identifier + desc: true + fields: + - DB Identifier: data.db_identifier + - Role: data.role + - Engine: data.engine + - Status: data.status + type: enum + enums: + - available: green.500 + type: state + - creating: yellow.500 + type: state + - deleting: yellow.500 + type: state + - maintenance: yellow.500 + type: state + - modifying: yellow.500 + type: state + - rebooting: yellow.500 + type: state + - renaming: yellow.500 + type: state + - starting: yellow.500 + type: state + - stopping: yellow.500 + type: state + - upgrading: yellow.500 + type: state + - failed: red.500 + type: state + - inaccessible-encryption-credentials: red.500 + type: state + - restore-error: red.500 + type: state + - stopped: red.500 + type: state + - storage-full: red.500 + type: state + - Size: data.size + - Region & AZ: data.availability_zone + - Multi-AZ: data.multi_az + - ARN: data.arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Summary + type: item + fields: + - DB Identifier: data.db_identifier + - Role: data.role + - Status: data.status + type: enum + enums: + - available: green.500 + type: state + - creating: yellow.500 + type: state + - deleting: yellow.500 + type: state + - maintenance: yellow.500 + type: state + - modifying: yellow.500 + type: state + - rebooting: yellow.500 + type: state + - renaming: yellow.500 + type: state + - starting: yellow.500 + type: state + - stopping: yellow.500 + type: state + - upgrading: yellow.500 + type: state + - failed: red.500 + type: state + - inaccessible-encryption-credentials: red.500 + type: state + - restore-error: red.500 + type: state + - stopped: red.500 + type: state + - storage-full: red.500 + type: state + - Engine: data.engine + - Engine Version: data.cluster.engine_version + - Class: data.size + - Region & AZ: data.availability_zone + +tabs.1: + name: Endpoints + type: item + fields: + - Endpoint: data.cluster.endpoint + - Port: data.cluster.port + - Reader Endpoint: data.cluster.reader_endpoint + +tabs.2: + name: Configuration + type: item + fields: + - DB Cluster ID: data.cluster.db_cluster_identifier + - ARN: data.cluster.db_cluster_arn + - DB Cluster Role: data.cluster.db_cluster_role + - Engine Version: data.cluster.engine_version + - Resource ID: data.cluster.db_cluster_resource_id + - Engine Mode: data.cluster.engine_mode + - DB Cluster Parameter Group: data.cluster.db_cluster_parameter_group + - Deletion Protection: data.cluster.deletion_protection + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - IAM DB Authentication: data.cluster.iam_database_authentication_enabled + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Master username: data.cluster.master_username + - Multi AZ: data.cluster.multi_az + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Encrypted: data.cluster.storage_encrypted + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - KMS Key: data.cluster.kms_key_id + - Auto Minor Version Upgrade: data.cluster.auto_minor_version_upgrade + - Created Time: data.cluster.cluster_create_time + type: datetime + source_type: iso8601 + +tabs.3: + name: Maintenance + type: item + fields: + - Maintenance Window: data.cluster.preferred_maintenance_window + +tabs.4: + name: Backup + type: item + fields: + - Automated Backup (Period Day): data.cluster.backup_retention_period + - Copy tags to snapshots: data.cluster.copy_tags_to_snapshot + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Earliest Restorable Time: data.cluster.earliest_restorable_time + type: datetime + source_type: iso8601 + - Latest Restore Time: data.cluster.latest_restorable_time + type: datetime + source_type: iso8601 + - Backup Window: data.cluster.preferred_backup_window diff --git a/src/plugin/metadata/rds/instance.yaml b/src/plugin/metadata/rds/instance.yaml new file mode 100644 index 0000000..d64b6ae --- /dev/null +++ b/src/plugin/metadata/rds/instance.yaml @@ -0,0 +1,233 @@ +search: + fields: + - ARN: data.arn + - DB Instance Identifier: data.instance.db_instance_identifier + - Engine: data.instance.engine + - Engine Version: data.instance.engine_version + - Status: data.instance.db_instance_status + type: text + labels: + - available: "Available" + - creating: "Creating" + - deleting: "Deleting" + - maintenance: "Maintenance" + - modifying: "Modifying" + - rebooting: "Rebooting" + - renaming: "Renaming" + - starting: "Starting" + - stopping: "Stopping" + - upgrading: "Upgrading" + - failed: "Failed" + - inaccessible-encryption-credentials: "Inaccessible Encryption Credentials" + - restore-error: "Restore Error" + - stopped: "Stopped" + - storage-full: "Storage Full" + - Instance Class: data.instance.db_instance_class + - VPC ID: data.instance.db_subnet_group.vpc_id + - Availability Zone: data.instance.availability_zone + - Multi-AZ: data.instance.multi_az + data_type: "boolean" + - Endpoint: data.instance.endpoint.address + - Port: data.instance.endpoint.port + data_type: "integer" + - Master Username: data.instance.master_username + - Allocated Storage: data.instance.allocated_storage + data_type: "integer" + - Storage Type: data.instance.storage_type + - Storage Encrypted: data.instance.storage_encrypted + data_type: "boolean" + - KMS Key ID: data.instance.kms_key_id + - Backup Retention Period: data.instance.backup_retention_period + data_type: "integer" + - Preferred Backup Window: data.instance.preferred_backup_window + - Preferred Maintenance Window: data.instance.preferred_maintenance_window + - Auto Minor Version Upgrade: data.instance.auto_minor_version_upgrade + data_type: "boolean" + - Deletion Protection: data.instance.deletion_protection + data_type: "boolean" + - AWS Account ID: account + +table: + sort: + key: data.instance.db_instance_identifier + desc: true + fields: + - DB Instance Identifier: data.instance.db_instance_identifier + - Engine: data.instance.engine + - Status: data.instance.db_instance_status + type: enum + enums: + - available: green.500 + type: state + - creating: yellow.500 + type: state + - deleting: yellow.500 + type: state + - maintenance: yellow.500 + type: state + - modifying: yellow.500 + type: state + - rebooting: yellow.500 + type: state + - renaming: yellow.500 + type: state + - starting: yellow.500 + type: state + - stopping: yellow.500 + type: state + - upgrading: yellow.500 + type: state + - failed: red.500 + type: state + - inaccessible-encryption-credentials: red.500 + type: state + - restore-error: red.500 + type: state + - stopped: red.500 + type: state + - storage-full: red.500 + type: state + - Instance Class: data.instance.db_instance_class + - VPC ID: data.instance.db_subnet_group.vpc_id + - Availability Zone: data.instance.availability_zone + - Multi-AZ: data.instance.multi_az + - ARN: data.arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Summary + type: item + fields: + - DB Instance Identifier: data.instance.db_instance_identifier + - Engine: data.instance.engine + - Engine Version: data.instance.engine_version + - Status: data.instance.db_instance_status + type: enum + enums: + - available: green.500 + type: state + - creating: yellow.500 + type: state + - deleting: yellow.500 + type: state + - maintenance: yellow.500 + type: state + - modifying: yellow.500 + type: state + - rebooting: yellow.500 + type: state + - renaming: yellow.500 + type: state + - starting: yellow.500 + type: state + - stopping: yellow.500 + type: state + - upgrading: yellow.500 + type: state + - failed: red.500 + type: state + - inaccessible-encryption-credentials: red.500 + type: state + - restore-error: red.500 + type: state + - stopped: red.500 + type: state + - storage-full: red.500 + type: state + - Instance Class: data.instance.db_instance_class + - VPC ID: data.instance.db_subnet_group.vpc_id + - Availability Zone: data.instance.availability_zone + - Multi-AZ: data.instance.multi_az + +tabs.1: + name: Connectivity + type: item + fields: + - Endpoint: data.instance.endpoint.address + - Port: data.instance.endpoint.port + - Availability Zone: data.instance.availability_zone + - VPC: data.instance.db_subnet_group.vpc_id + - Subnet Group: data.instance.db_subnet_group.db_subnet_group_name + - Publicly Accessible: data.instance.publicly_accessible + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Security Groups: data.instance.vpc_security_groups + type: badge + outline_color: violet.500 + +tabs.2: + name: Configuration + type: item + fields: + - ARN: data.instance.db_instance_arn + - Resource ID: data.instance.dbi_resource_id + - Engine Version: data.instance.engine_version + - DB Parameter Group: data.instance.db_parameter_groups + - Option Group: data.instance.option_group_memberships + - DB Subnet Group: data.instance.db_subnet_group.db_subnet_group_name + - Deletion Protection: data.instance.deletion_protection + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - IAM DB Authentication: data.instance.iam_database_authentication_enabled + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Master Username: data.instance.master_username + - Multi AZ: data.instance.multi_az + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Encrypted: data.instance.storage_encrypted + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - KMS Key: data.instance.kms_key_id + - Auto Minor Version Upgrade: data.instance.auto_minor_version_upgrade + - Created Time: data.instance.instance_create_time + type: datetime + source_type: iso8601 + +tabs.3: + name: Storage + type: item + fields: + - Allocated Storage: data.instance.allocated_storage + - Storage Type: data.instance.storage_type + - Storage Encrypted: data.instance.storage_encrypted + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - KMS Key ID: data.instance.kms_key_id + - IOPS: data.instance.iops + - Storage Throughput: data.instance.storage_throughput + +tabs.4: + name: Backup + type: item + fields: + - Backup Retention Period: data.instance.backup_retention_period + - Preferred Backup Window: data.instance.preferred_backup_window + - Copy Tags to Snapshots: data.instance.copy_tags_to_snapshot + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Latest Restorable Time: data.instance.latest_restorable_time + type: datetime + source_type: iso8601 + +tabs.5: + name: Maintenance + type: item + fields: + - Preferred Maintenance Window: data.instance.preferred_maintenance_window diff --git a/src/plugin/metadata/rds/option_group.yaml b/src/plugin/metadata/rds/option_group.yaml new file mode 100644 index 0000000..a0036d7 --- /dev/null +++ b/src/plugin/metadata/rds/option_group.yaml @@ -0,0 +1,98 @@ +search: + fields: + - ARN: data.arn + - Option Group Name: data.option_group.option_group_name + - Option Group Description: data.option_group.option_group_description + - Engine Name: data.option_group.engine_name + - Major Engine Version: data.option_group.major_engine_version + - Option Name: data.option_group.options.option_name + - Option Description: data.option_group.options.option_description + - Persistent: data.option_group.options.persistent + data_type: "boolean" + - Permanent: data.option_group.options.permanent + data_type: "boolean" + - Port: data.option_group.options.port + data_type: "integer" + - Option Version: data.option_group.options.option_version + - Allows VPC and Non-VPC Instance Memberships: data.option_group.allows_vpc_and_non_vpc_instance_memberships + data_type: "boolean" + - VPC ID: data.option_group.vpc_id + - AWS Account ID: account + +table: + sort: + key: data.option_group.option_group_name + desc: true + fields: + - Option Group Name: data.option_group.option_group_name + - Engine Name: data.option_group.engine_name + - Major Engine Version: data.option_group.major_engine_version + - Allows VPC and Non-VPC Instance Memberships: data.option_group.allows_vpc_and_non_vpc_instance_memberships + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - VPC ID: data.option_group.vpc_id + - ARN: data.arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Option Group + type: item + fields: + - ARN: data.arn + - Option Group Name: data.option_group.option_group_name + - Option Group Description: data.option_group.option_group_description + - Engine Name: data.option_group.engine_name + - Major Engine Version: data.option_group.major_engine_version + - Allows VPC and Non-VPC Instance Memberships: data.option_group.allows_vpc_and_non_vpc_instance_memberships + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - VPC ID: data.option_group.vpc_id + +tabs.1: + name: Options + type: table + root_path: data.option_group.options + fields: + - Option Name: option_name + - Option Description: option_description + - Persistent: persistent + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Permanent: permanent + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Port: port + - Option Version: option_version + +tabs.2: + name: Option Settings + type: table + root_path: data.option_group.options.option_settings + fields: + - Name: name + - Value: value + - Default Value: default_value + - Description: description + - Apply Type: apply_type + - Data Type: data_type + - Allowed Values: allowed_values + - Is Modifiable: is_modifiable + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Is Collection: is_collection + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 diff --git a/src/plugin/metadata/rds/parameter_group.yaml b/src/plugin/metadata/rds/parameter_group.yaml new file mode 100644 index 0000000..0adcb5c --- /dev/null +++ b/src/plugin/metadata/rds/parameter_group.yaml @@ -0,0 +1,65 @@ +search: + fields: + - ARN: data.arn + - DB Parameter Group Name: data.parameter_group.db_parameter_group_name + - DB Parameter Group Family: data.parameter_group.db_parameter_group_family + - Description: data.parameter_group.description + - DB Parameter Group Type: data.parameter_group.db_parameter_group_type + - Parameter Name: data.parameter_group.parameters.parameter_name + - Parameter Value: data.parameter_group.parameters.parameter_value + - Source: data.parameter_group.parameters.source + - Apply Type: data.parameter_group.parameters.apply_type + - Data Type: data.parameter_group.parameters.data_type + - Allowed Values: data.parameter_group.parameters.allowed_values + - Is Modifiable: data.parameter_group.parameters.is_modifiable + data_type: "boolean" + - Minimum Engine Version: data.parameter_group.parameters.minimum_engine_version + - Apply Method: data.parameter_group.parameters.apply_method + - Supported Engine Modes: data.parameter_group.parameters.supported_engine_modes + - AWS Account ID: account + +table: + sort: + key: data.parameter_group.db_parameter_group_name + desc: true + fields: + - DB Parameter Group Name: data.parameter_group.db_parameter_group_name + - DB Parameter Group Family: data.parameter_group.db_parameter_group_family + - Description: data.parameter_group.description + - DB Parameter Group Type: data.parameter_group.db_parameter_group_type + - ARN: data.arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Parameter Group + type: item + fields: + - ARN: data.arn + - DB Parameter Group Name: data.parameter_group.db_parameter_group_name + - DB Parameter Group Family: data.parameter_group.db_parameter_group_family + - Description: data.parameter_group.description + - DB Parameter Group Type: data.parameter_group.db_parameter_group_type + +tabs.1: + name: Parameters + type: table + root_path: data.parameter_group.parameters + fields: + - Parameter Name: parameter_name + - Parameter Value: parameter_value + - Source: source + - Apply Type: apply_type + - Data Type: data_type + - Allowed Values: allowed_values + - Is Modifiable: is_modifiable + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Minimum Engine Version: minimum_engine_version + - Apply Method: apply_method + - Supported Engine Modes: supported_engine_modes + type: badge + outline_color: violet.500 diff --git a/src/plugin/metadata/rds/snapshot.yaml b/src/plugin/metadata/rds/snapshot.yaml new file mode 100644 index 0000000..3e19c0a --- /dev/null +++ b/src/plugin/metadata/rds/snapshot.yaml @@ -0,0 +1,92 @@ +search: + fields: + - ARN: data.arn + - DB Snapshot Identifier: data.snapshot.db_snapshot_identifier + - DB Instance Identifier: data.snapshot.db_instance_identifier + - Engine: data.snapshot.engine + - Engine Version: data.snapshot.engine_version + - Snapshot Type: data.snapshot.snapshot_type + - Status: data.snapshot.status + type: text + labels: + - available: "Available" + - creating: "Creating" + - deleting: "Deleting" + - failed: "Failed" + - modifying: "Modifying" + - rebooting: "Rebooting" + - restoring: "Restoring" + - Allocated Storage: data.snapshot.allocated_storage + data_type: "integer" + - Storage Type: data.snapshot.storage_type + - Encrypted: data.snapshot.encrypted + data_type: "boolean" + - KMS Key ID: data.snapshot.kms_key_id + - Availability Zone: data.snapshot.availability_zone + - VPC ID: data.snapshot.vpc_id + - Snapshot Create Time: data.snapshot.snapshot_create_time + data_type: "datetime" + - AWS Account ID: account + +table: + sort: + key: data.snapshot.db_snapshot_identifier + desc: true + fields: + - DB Snapshot Identifier: data.snapshot.db_snapshot_identifier + - DB Instance Identifier: data.snapshot.db_instance_identifier + - Engine: data.snapshot.engine + - Status: data.snapshot.status + type: enum + enums: + - available: green.500 + type: state + - creating: yellow.500 + type: state + - deleting: yellow.500 + type: state + - failed: red.500 + type: state + - modifying: yellow.500 + type: state + - rebooting: yellow.500 + type: state + - restoring: yellow.500 + type: state + - Allocated Storage: data.snapshot.allocated_storage + - Storage Type: data.snapshot.storage_type + - Encrypted: data.snapshot.encrypted + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Availability Zone: data.snapshot.availability_zone + - ARN: data.arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Snapshot + type: item + fields: + - ARN: data.arn + - DB Snapshot Identifier: data.snapshot.db_snapshot_identifier + - DB Instance Identifier: data.snapshot.db_instance_identifier + - Engine: data.snapshot.engine + - Engine Version: data.snapshot.engine_version + - Snapshot Type: data.snapshot.snapshot_type + - Status: data.snapshot.status + - Allocated Storage: data.snapshot.allocated_storage + - Storage Type: data.snapshot.storage_type + - Encrypted: data.snapshot.encrypted + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - KMS Key ID: data.snapshot.kms_key_id + - Availability Zone: data.snapshot.availability_zone + - VPC ID: data.snapshot.vpc_id + - Snapshot Create Time: data.snapshot.snapshot_create_time + type: datetime + source_type: iso8601 diff --git a/src/plugin/metadata/rds/subnet_group.yaml b/src/plugin/metadata/rds/subnet_group.yaml new file mode 100644 index 0000000..1070a89 --- /dev/null +++ b/src/plugin/metadata/rds/subnet_group.yaml @@ -0,0 +1,46 @@ +search: + fields: + - ARN: data.arn + - DB Subnet Group Name: data.subnet_group.db_subnet_group_name + - DB Subnet Group Description: data.subnet_group.db_subnet_group_description + - VPC ID: data.subnet_group.vpc_id + - Subnet Group Status: data.subnet_group.subnet_group_status + - Subnet IDs: data.subnet_group.subnets.subnet_identifier + - Subnet Availability Zone: data.subnet_group.subnets.subnet_availability_zone.name + - Subnet Status: data.subnet_group.subnets.subnet_status + - AWS Account ID: account + +table: + sort: + key: data.subnet_group.db_subnet_group_name + desc: true + fields: + - DB Subnet Group Name: data.subnet_group.db_subnet_group_name + - VPC ID: data.subnet_group.vpc_id + - Subnet Group Status: data.subnet_group.subnet_group_status + - Subnet IDs: data.subnet_group.subnets.subnet_identifier + type: badge + outline_color: violet.500 + - ARN: data.arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Subnet Group + type: item + fields: + - ARN: data.arn + - DB Subnet Group Name: data.subnet_group.db_subnet_group_name + - DB Subnet Group Description: data.subnet_group.db_subnet_group_description + - VPC ID: data.subnet_group.vpc_id + - Subnet Group Status: data.subnet_group.subnet_group_status + +tabs.1: + name: Subnets + type: table + root_path: data.subnet_group.subnets + fields: + - Subnet Identifier: subnet_identifier + - Subnet Availability Zone: subnet_availability_zone.name + - Subnet Status: subnet_status diff --git a/src/plugin/metadata/redshift/__init__.py b/src/plugin/metadata/redshift/__init__.py new file mode 100644 index 0000000..4934411 --- /dev/null +++ b/src/plugin/metadata/redshift/__init__.py @@ -0,0 +1 @@ +# Redshift metadata diff --git a/src/plugin/metadata/redshift/cluster.yaml b/src/plugin/metadata/redshift/cluster.yaml new file mode 100644 index 0000000..d3439c8 --- /dev/null +++ b/src/plugin/metadata/redshift/cluster.yaml @@ -0,0 +1,303 @@ +search: + fields: + - Cluster Identifier: data.cluster_identifier + - Status: data.cluster_status + type: text + labels: + - available: "Available" + - prep-for-resize: "Prep For Resize" + - resize-cleanup: "Resize Cleanup" + - cancelling-resize: "Cancelling Resize" + - creating: "Creating" + - deleting: "Deleting" + - final-snapshot: "Final Snapshot" + - modifying: "Modifying" + - rebooting: "Rebooting" + - renaming: "Renaming" + - resizing: "Resizing" + - rotating-keys: "Rotating Keys" + - updating-hsm: "Updating HSM" + - paused: "Paused" + - hardware-failure: "Hardware Failure" + - incompatible-hsm: "Incompatible HSM" + - incompatible-network: "Incompatible Network" + - incompatible-parameters: "Incompatible Parameters" + - incompatible-restore: "Incompatible Restore" + - storage-full: "Storage Full" + - Cluster Version: data.cluster_version + - Nodes: data.number_of_nodes + data_type: "integer" + - Node Type: instance_type + - Endpoint: data.endpoint.address + - Port: data.endpoint.port + data_type: "integer" + - VPC ID: data.vpc_id + - Availability Zone: data.availability_zone + - Cluster Revision Number: data.cluster_revision_number + - Preferred Maintenance Window: data.preferred_maintenance_window + - Next maintenance window start time: data.next_maintenance_window_start_time + data_type: "datetime" + - DB Name: data.db_name + - Allow Version Upgrade: data.allow_version_upgrade + data_type: "boolean" + - Encrypted: data.encrypted + data_type: "boolean" + - KMS Key ID: data.kms_key_id + - Publicly Accessible: data.publicly_accessible + data_type: "boolean" + - Automated Snapshot Retention Period: data.automated_snapshot_retention_period + data_type: "integer" + - Subnet Group Name: data.cluster_subnet_group_name + - Master Username: data.master_username + - IAM Role ARNs: data.iam_roles.iam_role_arn + - Security Groups: data.vpc_security_groups.vpc_security_group_id + - HSM Status: data.hsm_status + - AWS Account ID: account + +table: + sort: + key: data.cluster_identifier + desc: true + fields: + - Cluster: data.cluster_identifier + - Status: data.cluster_status + type: enum + enums: + - available: green.500 + type: state + - prep-for-resize: yellow.500 + type: state + - resize-cleanup: yellow.500 + type: state + - cancelling-resize: yellow.500 + type: state + - creating: yellow.500 + type: state + - deleting: yellow.500 + type: state + - final-snapshot: yellow.500 + type: state + - modifying: yellow.500 + type: state + - rebooting: yellow.500 + type: state + - renaming: yellow.500 + type: state + - resizing: yellow.500 + type: state + - rotating-keys: yellow.500 + type: state + - updating-hsm: yellow.500 + type: state + - paused: gray.400 + type: state + - hardware-failure: red.500 + type: state + - incompatible-hsm: red.500 + type: state + - incompatible-network: red.500 + type: state + - incompatible-parameters: red.500 + type: state + - incompatible-restore: red.500 + type: state + - storage-full: red.500 + type: state + - Cluster Version: data.cluster_version + - Node Count: data.number_of_nodes + - Node Type: data.node_type + - Endpoint: data.endpoint.address + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Clusters + type: item + fields: + - Cluster: data.cluster_identifier + - Status: data.cluster_status + type: enum + enums: + - available: green.500 + type: state + - prep-for-resize: yellow.500 + type: state + - resize-cleanup: yellow.500 + type: state + - cancelling-resize: yellow.500 + type: state + - creating: yellow.500 + type: state + - deleting: yellow.500 + type: state + - final-snapshot: yellow.500 + type: state + - modifying: yellow.500 + type: state + - rebooting: yellow.500 + type: state + - renaming: yellow.500 + type: state + - resizing: yellow.500 + type: state + - rotating-keys: yellow.500 + type: state + - updating-hsm: yellow.500 + type: state + - paused: gray.400 + type: state + - hardware-failure: red.500 + type: state + - incompatible-hsm: red.500 + type: state + - incompatible-network: red.500 + type: state + - incompatible-parameters: red.500 + type: state + - incompatible-restore: red.500 + type: state + - storage-full: red.500 + type: state + - Endpoint: data.endpoint.address + - Cluster Version: data.cluster_version + - Cluster Availability Status: data.cluster_availability_status + type: enum + enums: + - Available: green.500 + type: state + - Maintenance: yellow.500 + type: state + - Modifying: yellow.500 + type: state + - Unavailable: gray.400 + type: state + - Failed: red.500 + type: state + - Node Count: data.number_of_nodes + - Node Type: data.node_type + - Automated Snapshot Retention Period: data.automated_snapshot_retention_period + - Manual Snapshot Retention Period: data.manual_snapshot_retention_period + - Allow Version Upgrade: data.allow_version_upgrade + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Cluster Revision Number: data.cluster_revision_number + +tabs.1: + name: Database configurations + type: item + fields: + - Database Name: data.db_name + - Port: data.endpoint.port + - Master User Name: data.master_username + - Encrypted: data.encrypted + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + +tabs.2: + name: Network and Security + type: item + fields: + - VPC ID: data.vpc_id + - Availability Zone: data.availability_zone + - Subnet Group: data.cluster_subnet_group_name + - Security Groups: data.vpc_security_groups.vpc_security_group_id + type: badge + outline_color: violet.500 + - Enhanced VPC Routing: data.enhanced_vpc_routing + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Publicly Accessible: data.publicly_accessible + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + +tabs.3: + name: Parameter Groups + type: table + root_path: data.cluster_parameter_groups + fields: + - Parameter Group Name: parameter_group_name + - Apply status: parameter_apply_status + type: enum + enums: + - available: green.500 + type: state + +tabs.4: + name: Nodes + type: table + root_path: data.cluster_nodes + fields: + - Node Role: node_role + - Private IP: private_ip_address + - Public IP: public_ip_address + +tabs.5: + name: Snapshots + type: table + root_path: data.snapshots + fields: + - Snapshot Identifier: snapshot_identifier + - Snapshot Type: snapshot_type + - Status: status + type: enum + enums: + - active: green.500 + type: state + - Size(MB): total_backup_size_in_mega_bytes + - Actual Incremental Size(MB): actual_incremental_backup_size_in_mega_bytes + - Encrypted: encrypted + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Creation Time: snapshot_create_time + type: datetime + source_type: iso8601 + +tabs.6: + name: Snapshot Schedules + type: table + root_path: data.snapshot_schedules + fields: + - Schedule Identifier: schedule_identifier + - Schedule Description: schedule_description + - Schedule Definition: schedule_definitions + - State: associated_state + type: enum + enums: + - active: green.500 + type: state + +tabs.7: + name: Scheduled Actions + type: table + root_path: data.scheduled_actions + fields: + - Action name: scheduled_action_name + - Description: scheduled_action_description + - Schedule: schedule + - IAM Role: iam_role + - State: state + type: enum + enums: + - ACTIVE: green.500 + type: state + - DISABLED: gray.400 + type: state + - Next Invocations: next_invocations + type: datetime + source_type: iso8601 + - Start Time: start_time + type: datetime + source_type: iso8601 + - End Time: end_time + type: datetime + source_type: iso8601 diff --git a/src/plugin/metadata/route53/__init__.py b/src/plugin/metadata/route53/__init__.py new file mode 100644 index 0000000..342ab4c --- /dev/null +++ b/src/plugin/metadata/route53/__init__.py @@ -0,0 +1 @@ +# Route53 metadata diff --git a/src/plugin/metadata/s3/__init__.py b/src/plugin/metadata/s3/__init__.py new file mode 100644 index 0000000..1715ecc --- /dev/null +++ b/src/plugin/metadata/s3/__init__.py @@ -0,0 +1 @@ +# S3 metadata diff --git a/src/plugin/metadata/s3/bucket.yaml b/src/plugin/metadata/s3/bucket.yaml new file mode 100644 index 0000000..3c08988 --- /dev/null +++ b/src/plugin/metadata/s3/bucket.yaml @@ -0,0 +1,148 @@ +search: + fields: + - Name: data.name + - ARN: data.arn + - Region: data.region_name + - Access: data.public_access + type: text + labels: + - Private: "Private" + - Public: "Public" + - Object Total Counts: data.object_count + data_type: "integer" + - Object Total Size: instance_size + data_type: "integer" + - Versioning Status: data.versioning.status + - Has Bucket Policy: data.policy_document_exists + data_type: "boolean" + - Bucket Owner ID: data.bucket_acl.owner.owner_id + - Webhosting Index Document: data.website_hosting.index_document + - Webhosting Error Document: data.website_hosting.error_document + - Webhosting Error Document: data.website_hosting.routing_rules + - Access Logging Target Bucket: data.server_access_logging.target_bucket + - Access Logging Target Prefix: data.server_access_logging.target_prefix + - AWS Account ID: account + +table: + sort: + key: data.name + desc: true + fields: + - Name: data.name + - Access: data.public_access + type: enum + enums: + - Private: indigo.500 + - Public: coral.600 + - Object Total Counts: data.object_count + - Object Total Size: instance_size + display_unit: MB + source_unit: B + type: size + - Region: data.region_name + - ARN: data.arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Buckets + type: item + fields: + - Name: data.name + - ARN: data.arn + - Region: data.region_name + - Public Access: data.public_access + type: enum + enums: + - Private: indigo.500 + - Public: coral.600 + +tabs.1: + name: Objects + type: item + fields: + - Object Counts: data.object_count + - Object Total Size: data.object_total_size + display_unit: MB + source_unit: B + type: size + +tabs.2: + name: Bucket Policy + type: item + fields: + - Policy Document Exists: data.policy_document_exists + - Bucket Policy Document: data.output_display.data.bucket_policy.policy_document + +tabs.3: + name: Access Control List + type: table + root_path: data.bucket_acl.grants + fields: + - Grantee Type: grantee.type + - Canonical ID: grantee.id + - Group URI: grantee.uri + - Email(If Exists): grantee.email + - Permission: readable_permission + +tabs.4: + name: Versioning + type: item + fields: + - Status: data.versioning.status + type: enum + enums: + - Enabled: green.500 + type: state + - Suspended: red.500 + type: state + - MFA Delete: data.versioning.mfa_delete + type: enum + enums: + - Enabled: indigo.500 + - Disabled: coral.600 + +tabs.5: + name: Website Hosting + type: item + fields: + - Hostname: data.website_hosting.redirect_all_requests_to.host_name + - Protocol: data.website_hosting.redirect_all_requests_to.protocol + - Index Document: data.website_hosting.index_document + - Error Document: data.website_hosting.error_document + - Routing Rules: data.website_hosting.routing_rules + +tabs.6: + name: Server Access Logging + type: item + fields: + - Target Bucket: data.server_access_logging.target_bucket + - Target Prefix: data.server_access_logging.target_prefix + +tabs.7: + name: Lifecycle Rules + type: table + root_path: data.lifecycle_rules + fields: + - ID: id + - Status: status + - Filter: filter + - Transitions: transitions + - Expiration: expiration + - Noncurrent Version Transitions: noncurrent_version_transitions + - Noncurrent Version Expiration: noncurrent_version_expiration + - Abort Incomplete Multipart Upload: abort_incomplete_multipart_upload + +tabs.8: + name: Notification Configurations + type: table + root_path: data.notification_configurations + fields: + - ID: id + - Notification Type: notification_type + - ARN: arn + - Events: events + type: badge + outline_color: violet.500 + - Filter: filter diff --git a/src/plugin/metadata/secrets_manager/__init__.py b/src/plugin/metadata/secrets_manager/__init__.py new file mode 100644 index 0000000..789ef8d --- /dev/null +++ b/src/plugin/metadata/secrets_manager/__init__.py @@ -0,0 +1 @@ +# Secrets Manager metadata diff --git a/src/plugin/metadata/secrets_manager/secret.yaml b/src/plugin/metadata/secrets_manager/secret.yaml new file mode 100644 index 0000000..69b22ae --- /dev/null +++ b/src/plugin/metadata/secrets_manager/secret.yaml @@ -0,0 +1,61 @@ +search: + fields: + - ARN: data.arn + - Last Changed Time: data.last_changed_date + data_type: "datetime" + - Last Accessed Time: data.last_accessed_date + data_type: "datetime" + - Rotation Enabled: data.rotation_enabled + data_type: "boolean" + - AWS Account ID: account + +table: + sort: + key: data.name + desc: true + fields: + - Name: data.name + - Description: data.description + - Last Retrieved: data.last_accessed_date + type: datetime + source_type: iso8601 + - Rotation Enabled: data.rotation_enabled + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - ARN: data.arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Secrets + type: item + fields: + - Name: data.name + - ARN: data.arn + - Description: data.description + - Encryption Key ID: data.kms_key_id + - Own Service: data.owning_service + - Last Changed Date: data.last_changed_date + type: datetime + source_type: iso8601 + - Last Accessed Date: data.last_accessed_date + type: datetime + source_type: iso8601 + +tabs.1: + name: Rotation Configuration + type: item + fields: + - Rotation Status: data.rotation_enabled + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Rotation Interval: data.rotation_rules + - AWS Lambda Function: data.rotation_lambda_arn + - Last Rotated date: data.last_rotated_date + type: datetime + source_type: iso8601 diff --git a/src/plugin/metadata/sns/__init__.py b/src/plugin/metadata/sns/__init__.py new file mode 100644 index 0000000..3ffc79f --- /dev/null +++ b/src/plugin/metadata/sns/__init__.py @@ -0,0 +1 @@ +# SNS metadata diff --git a/src/plugin/metadata/sns/topic.yaml b/src/plugin/metadata/sns/topic.yaml new file mode 100644 index 0000000..1228194 --- /dev/null +++ b/src/plugin/metadata/sns/topic.yaml @@ -0,0 +1,61 @@ +search: + fields: + - Topic ARN: data.topic_arn + - Subscription ARN: data.subscriptions.subscription_arn + - Endpoint: data.subscriptions.endpoint + - Protocol: data.subscriptions.protocol + - AWS Account ID: account + +table: + sort: + key: data.name + desc: true + fields: + - Name: data.name + - Display Name: data.display_name + - Subscription Confirmed: data.subscription_confirmed + - Subscription Pending: data.subscriptions_pending + - Subscription Deleted: data.subscription_deleted + - ARN: data.topic_arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: SNS + type: item + fields: + - Name: data.name + - Display Name: data.display_name + - ARN: data.topic_arn + - Topic Owner: data.owner + +tabs.1: + name: Subscriptions + type: table + root_path: data.subscriptions + fields: + - Subscription ARN: subscription_arn + - Endpoint: endpoint + - Protocol: protocol + type: enum + enums: + - http: indigo.500 + - https: coral.600 + - email: green.500 + - email-json: yellow.500 + - sqs: violet.500 + - lambda: blue.400 + +tabs.2: + name: Encryptions + type: item + root_path: data.kms + fields: + - Encryption: encryption + type: enum + enums: + - Configured: indigo.500 + - Description: description + - Custom Master Key (CMK): alias + - CMK ARN: arn diff --git a/src/plugin/metadata/sqs/__init__.py b/src/plugin/metadata/sqs/__init__.py new file mode 100644 index 0000000..4aadb26 --- /dev/null +++ b/src/plugin/metadata/sqs/__init__.py @@ -0,0 +1 @@ +# SQS metadata diff --git a/src/plugin/metadata/sqs/queue.yaml b/src/plugin/metadata/sqs/queue.yaml new file mode 100644 index 0000000..8b6afd4 --- /dev/null +++ b/src/plugin/metadata/sqs/queue.yaml @@ -0,0 +1,71 @@ +search: + fields: + - ARN: data.arn + - URL: data.url + - Maximum Message Size (Bytes): data.maximum_message_size + data_type: "integer" + - Approximate Number of Messages: data.approximate_number_of_messages + data_type: "integer" + - Last Modified Time: data.last_modified_timestamp + data_type: "datetime" + - AWS Account ID: account + +table: + sort: + key: data.name + desc: true + fields: + - Name: data.name + - URL: data.url + - Approximate Number of Messages: data.approximate_number_of_messages + - FIFO Queue: data.fifo_queue + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Content Based Deduplication: data.content_based_duplication + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - ARN: data.arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Queue + type: item + fields: + - ARN: data.arn + - Name: data.name + - URL: data.url + - FIFO Queue: data.fifo_queue + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Content Based Deduplication: data.content_based_duplication + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Approximate Number Of Messages: data.approximate_number_of_messages + - Approximate Number Of Messages Delayed: data.approximate_number_of_messages_delayed + - Approximate Number Of Messages Not Visible: data.approximate_number_of_messages_not_visible + - Delay Seconds: data.delay_seconds + - Maximum Message Size: data.maximum_message_size + display_unit: B + source_unit: B + type: size + - Message Retention Period: data.message_retention_period + - Receive Message Wait Time Seconds: data.receive_message_wait_time_seconds + - Visibility Timeout: data.visibility_timeout + - Created Time: data.created_timestamp + type: datetime + source_type: timestamp + source_format: seconds + - Last Modified Time: data.last_modified_timestamp + type: datetime + source_type: timestamp + source_format: seconds diff --git a/src/plugin/metadata/vpc/__init__.py b/src/plugin/metadata/vpc/__init__.py new file mode 100644 index 0000000..25cdf11 --- /dev/null +++ b/src/plugin/metadata/vpc/__init__.py @@ -0,0 +1 @@ +# VPC metadata diff --git a/src/plugin/metadata/vpc/customer_gateway.yaml b/src/plugin/metadata/vpc/customer_gateway.yaml new file mode 100644 index 0000000..e04749f --- /dev/null +++ b/src/plugin/metadata/vpc/customer_gateway.yaml @@ -0,0 +1,61 @@ +search: + fields: + - Customer Gateway ID: data.customer_gateway_id + - State: data.state + type: text + labels: + - pending: "Pending" + - available: "Available" + - deleting: "Deleting" + - deleted: "Deleted" + - Type: data.type + - IP Address: data.ip_address + - BGP ASN: data.bgp_asn + - Device Name: data.device_name + - Certificate ARN: data.certificate_arn + - AWS Account ID: account + +table: + sort: + key: data.customer_gateway_id + desc: true + fields: + - Customer Gateway ID: data.customer_gateway_id + - State: data.state + type: enum + enums: + - pending: yellow.500 + type: state + - available: green.500 + type: state + - deleting: yellow.500 + type: state + - deleted: gray.400 + type: state + - Type: data.type + - IP Address: data.ip_address + - BGP ASN: data.bgp_asn + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Customer Gateway + type: item + fields: + - Customer Gateway ID: data.customer_gateway_id + - State: data.state + type: enum + enums: + - pending: yellow.500 + type: state + - available: green.500 + type: state + - deleting: yellow.500 + type: state + - deleted: gray.400 + type: state + - Type: data.type + - IP Address: data.ip_address + - BGP ASN: data.bgp_asn + - Device Name: data.device_name + - Certificate ARN: data.certificate_arn diff --git a/src/plugin/metadata/vpc/egress_only_internet_gateway.yaml b/src/plugin/metadata/vpc/egress_only_internet_gateway.yaml new file mode 100644 index 0000000..675291b --- /dev/null +++ b/src/plugin/metadata/vpc/egress_only_internet_gateway.yaml @@ -0,0 +1,64 @@ +search: + fields: + - Egress Only Internet Gateway ID: data.egress_only_internet_gateway_id + - State: data.state + type: text + labels: + - available: "Available" + - pending: "Pending" + - attaching: "Attaching" + - attached: "Attached" + - detaching: "Detaching" + - detached: "Detached" + - VPC ID: data.vpc_id + - Owner ID: data.owner_id + - AWS Account ID: account + +table: + sort: + key: data.egress_only_internet_gateway_id + desc: true + fields: + - Egress Only Internet Gateway ID: data.egress_only_internet_gateway_id + - State: data.state + type: enum + enums: + - available: green.500 + type: state + - pending: yellow.500 + type: state + - attaching: yellow.500 + type: state + - attached: green.500 + type: state + - detaching: yellow.500 + type: state + - detached: gray.400 + type: state + - VPC ID: data.vpc_id + - Owner ID: data.owner_id + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Egress Only Internet Gateway + type: item + fields: + - Egress Only Internet Gateway ID: data.egress_only_internet_gateway_id + - State: data.state + type: enum + enums: + - available: green.500 + type: state + - pending: yellow.500 + type: state + - attaching: yellow.500 + type: state + - attached: green.500 + type: state + - detaching: yellow.500 + type: state + - detached: gray.400 + type: state + - VPC ID: data.vpc_id + - Owner ID: data.owner_id diff --git a/src/plugin/metadata/vpc/endpoint.yaml b/src/plugin/metadata/vpc/endpoint.yaml new file mode 100644 index 0000000..4791d6f --- /dev/null +++ b/src/plugin/metadata/vpc/endpoint.yaml @@ -0,0 +1,123 @@ +search: + fields: + - VPC Endpoint ID: data.vpc_endpoint_id + - VPC Endpoint Type: data.vpc_endpoint_type + - VPC ID: data.vpc_id + - Service Name: data.service_name + - State: data.state + type: text + labels: + - pendingAcceptance: "Pending Acceptance" + - pending: "Pending" + - available: "Available" + - deleting: "Deleting" + - deleted: "Deleted" + - rejected: "Rejected" + - failed: "Failed" + - expired: "Expired" + - Policy Document: data.policy_document + - Route Table IDs: data.route_table_ids + - Subnet IDs: data.subnet_ids + - Groups: data.groups + - Private DNS Enabled: data.private_dns_enabled + data_type: "boolean" + - Requester Managed: data.requester_managed + data_type: "boolean" + - Network Interface IDs: data.network_interface_ids + - DNS Entries: data.dns_entries + - Creation Timestamp: data.creation_timestamp + data_type: "datetime" + - AWS Account ID: account + +table: + sort: + key: data.vpc_endpoint_id + desc: true + fields: + - VPC Endpoint ID: data.vpc_endpoint_id + - VPC Endpoint Type: data.vpc_endpoint_type + - VPC ID: data.vpc_id + - Service Name: data.service_name + - State: data.state + type: enum + enums: + - pendingAcceptance: yellow.500 + type: state + - pending: yellow.500 + type: state + - available: green.500 + type: state + - deleting: yellow.500 + type: state + - deleted: gray.400 + type: state + - rejected: red.500 + type: state + - failed: red.500 + type: state + - expired: gray.400 + type: state + - Private DNS Enabled: data.private_dns_enabled + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Endpoint + type: item + fields: + - VPC Endpoint ID: data.vpc_endpoint_id + - VPC Endpoint Type: data.vpc_endpoint_type + - VPC ID: data.vpc_id + - Service Name: data.service_name + - State: data.state + type: enum + enums: + - pendingAcceptance: yellow.500 + type: state + - pending: yellow.500 + type: state + - available: green.500 + type: state + - deleting: yellow.500 + type: state + - deleted: gray.400 + type: state + - rejected: red.500 + type: state + - failed: red.500 + type: state + - expired: gray.400 + type: state + - Policy Document: data.policy_document + - Route Table IDs: data.route_table_ids + type: badge + outline_color: violet.500 + - Subnet IDs: data.subnet_ids + type: badge + outline_color: violet.500 + - Groups: data.groups + type: badge + outline_color: violet.500 + - Private DNS Enabled: data.private_dns_enabled + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Requester Managed: data.requester_managed + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Network Interface IDs: data.network_interface_ids + type: badge + outline_color: violet.500 + - DNS Entries: data.dns_entries + type: badge + outline_color: violet.500 + - Creation Timestamp: data.creation_timestamp + type: datetime + source_type: iso8601 diff --git a/src/plugin/metadata/vpc/internet_gateway.yaml b/src/plugin/metadata/vpc/internet_gateway.yaml new file mode 100644 index 0000000..b08f027 --- /dev/null +++ b/src/plugin/metadata/vpc/internet_gateway.yaml @@ -0,0 +1,68 @@ +search: + fields: + - Internet Gateway ID: data.internet_gateway_id + - State: data.state + type: text + labels: + - available: "Available" + - pending: "Pending" + - attaching: "Attaching" + - attached: "Attached" + - detaching: "Detaching" + - detached: "Detached" + - VPC ID: data.vpc_id + - Owner ID: data.owner_id + - Internet Gateway ARN: data.internet_gateway_arn + - AWS Account ID: account + +table: + sort: + key: data.internet_gateway_id + desc: true + fields: + - Internet Gateway ID: data.internet_gateway_id + - State: data.state + type: enum + enums: + - available: green.500 + type: state + - pending: yellow.500 + type: state + - attaching: yellow.500 + type: state + - attached: green.500 + type: state + - detaching: yellow.500 + type: state + - detached: gray.400 + type: state + - VPC ID: data.vpc_id + - Owner ID: data.owner_id + - Internet Gateway ARN: data.internet_gateway_arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Internet Gateway + type: item + fields: + - Internet Gateway ID: data.internet_gateway_id + - State: data.state + type: enum + enums: + - available: green.500 + type: state + - pending: yellow.500 + type: state + - attaching: yellow.500 + type: state + - attached: green.500 + type: state + - detaching: yellow.500 + type: state + - detached: gray.400 + type: state + - VPC ID: data.vpc_id + - Owner ID: data.owner_id + - Internet Gateway ARN: data.internet_gateway_arn diff --git a/src/plugin/metadata/vpc/nat_gateway.yaml b/src/plugin/metadata/vpc/nat_gateway.yaml new file mode 100644 index 0000000..dfd8ca6 --- /dev/null +++ b/src/plugin/metadata/vpc/nat_gateway.yaml @@ -0,0 +1,76 @@ +search: + fields: + - NAT Gateway ID: data.nat_gateway_id + - State: data.state + type: text + labels: + - pending: "Pending" + - failed: "Failed" + - available: "Available" + - deleting: "Deleting" + - deleted: "Deleted" + - VPC ID: data.vpc_id + - Subnet ID: data.subnet_id + - NAT Gateway Addresses: data.nat_gateway_addresses + - Create Time: data.create_time + data_type: "datetime" + - Delete Time: data.delete_time + data_type: "datetime" + - AWS Account ID: account + +table: + sort: + key: data.nat_gateway_id + desc: true + fields: + - NAT Gateway ID: data.nat_gateway_id + - State: data.state + type: enum + enums: + - pending: yellow.500 + type: state + - failed: red.500 + type: state + - available: green.500 + type: state + - deleting: yellow.500 + type: state + - deleted: gray.400 + type: state + - VPC ID: data.vpc_id + - Subnet ID: data.subnet_id + - NAT Gateway Addresses: data.nat_gateway_addresses + type: badge + outline_color: violet.500 + - AWS Account ID: account + is_optional: true + +tabs.0: + name: NAT Gateway + type: item + fields: + - NAT Gateway ID: data.nat_gateway_id + - State: data.state + type: enum + enums: + - pending: yellow.500 + type: state + - failed: red.500 + type: state + - available: green.500 + type: state + - deleting: yellow.500 + type: state + - deleted: gray.400 + type: state + - VPC ID: data.vpc_id + - Subnet ID: data.subnet_id + - NAT Gateway Addresses: data.nat_gateway_addresses + type: badge + outline_color: violet.500 + - Create Time: data.create_time + type: datetime + source_type: iso8601 + - Delete Time: data.delete_time + type: datetime + source_type: iso8601 diff --git a/src/plugin/metadata/vpc/network_acl.yaml b/src/plugin/metadata/vpc/network_acl.yaml new file mode 100644 index 0000000..ef3f6a1 --- /dev/null +++ b/src/plugin/metadata/vpc/network_acl.yaml @@ -0,0 +1,54 @@ +search: + fields: + - Network ACL ID: data.network_acl_id + - VPC ID: data.vpc_id + - Default: data.default + data_type: "boolean" + - Entries: data.entries + - Associations: data.associations + - Owner ID: data.owner_id + - Network ACL ARN: data.network_acl_arn + - AWS Account ID: account + +table: + sort: + key: data.network_acl_id + desc: true + fields: + - Network ACL ID: data.network_acl_id + - VPC ID: data.vpc_id + - Default: data.default + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Entries: data.entries + type: badge + outline_color: violet.500 + - Associations: data.associations + type: badge + outline_color: violet.500 + - Network ACL ARN: data.network_acl_arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Network ACL + type: item + fields: + - Network ACL ID: data.network_acl_id + - VPC ID: data.vpc_id + - Default: data.default + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Entries: data.entries + type: badge + outline_color: violet.500 + - Associations: data.associations + type: badge + outline_color: violet.500 + - Owner ID: data.owner_id + - Network ACL ARN: data.network_acl_arn diff --git a/src/plugin/metadata/vpc/peering_connection.yaml b/src/plugin/metadata/vpc/peering_connection.yaml new file mode 100644 index 0000000..a08830a --- /dev/null +++ b/src/plugin/metadata/vpc/peering_connection.yaml @@ -0,0 +1,84 @@ +search: + fields: + - VPC Peering Connection ID: data.vpc_peering_connection_id + - Status: data.status + type: text + labels: + - initiating-request: "Initiating Request" + - pending-acceptance: "Pending Acceptance" + - active: "Active" + - deleted: "Deleted" + - rejected: "Rejected" + - failed: "Failed" + - expired: "Expired" + - provisioning: "Provisioning" + - deleting: "Deleting" + - Requester VPC Info: data.requester_vpc_info + - Accepter VPC Info: data.accepter_vpc_info + - Expiration Time: data.expiration_time + data_type: "datetime" + - AWS Account ID: account + +table: + sort: + key: data.vpc_peering_connection_id + desc: true + fields: + - VPC Peering Connection ID: data.vpc_peering_connection_id + - Status: data.status + type: enum + enums: + - initiating-request: yellow.500 + type: state + - pending-acceptance: yellow.500 + type: state + - active: green.500 + type: state + - deleted: gray.400 + type: state + - rejected: red.500 + type: state + - failed: red.500 + type: state + - expired: gray.400 + type: state + - provisioning: yellow.500 + type: state + - deleting: yellow.500 + type: state + - Requester VPC Info: data.requester_vpc_info + - Accepter VPC Info: data.accepter_vpc_info + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Peering Connection + type: item + fields: + - VPC Peering Connection ID: data.vpc_peering_connection_id + - Status: data.status + type: enum + enums: + - initiating-request: yellow.500 + type: state + - pending-acceptance: yellow.500 + type: state + - active: green.500 + type: state + - deleted: gray.400 + type: state + - rejected: red.500 + type: state + - failed: red.500 + type: state + - expired: gray.400 + type: state + - provisioning: yellow.500 + type: state + - deleting: yellow.500 + type: state + - Requester VPC Info: data.requester_vpc_info + - Accepter VPC Info: data.accepter_vpc_info + - Expiration Time: data.expiration_time + type: datetime + source_type: iso8601 diff --git a/src/plugin/metadata/vpc/route_table.yaml b/src/plugin/metadata/vpc/route_table.yaml new file mode 100644 index 0000000..d6f078f --- /dev/null +++ b/src/plugin/metadata/vpc/route_table.yaml @@ -0,0 +1,54 @@ +search: + fields: + - Route Table ID: data.route_table_id + - VPC ID: data.vpc_id + - Main: data.main + data_type: "boolean" + - Routes: data.routes + - Associations: data.associations + - Owner ID: data.owner_id + - Route Table ARN: data.route_table_arn + - AWS Account ID: account + +table: + sort: + key: data.route_table_id + desc: true + fields: + - Route Table ID: data.route_table_id + - VPC ID: data.vpc_id + - Main: data.main + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Routes: data.routes + type: badge + outline_color: violet.500 + - Associations: data.associations + type: badge + outline_color: violet.500 + - Route Table ARN: data.route_table_arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Route Table + type: item + fields: + - Route Table ID: data.route_table_id + - VPC ID: data.vpc_id + - Main: data.main + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Routes: data.routes + type: badge + outline_color: violet.500 + - Associations: data.associations + type: badge + outline_color: violet.500 + - Owner ID: data.owner_id + - Route Table ARN: data.route_table_arn diff --git a/src/plugin/metadata/vpc/subnet.yaml b/src/plugin/metadata/vpc/subnet.yaml new file mode 100644 index 0000000..2c57fdc --- /dev/null +++ b/src/plugin/metadata/vpc/subnet.yaml @@ -0,0 +1,94 @@ +search: + fields: + - Subnet ID: data.subnet_id + - VPC ID: data.vpc_id + - State: data.state + type: text + labels: + - available: "Available" + - pending: "Pending" + - CIDR Block: data.cidr_block + - Availability Zone: data.availability_zone + - Availability Zone ID: data.availability_zone_id + - Available IP Address Count: data.available_ip_address_count + data_type: "integer" + - Default For AZ: data.default_for_az + data_type: "boolean" + - Map Public IP On Launch: data.map_public_ip_on_launch + data_type: "boolean" + - Owner ID: data.owner_id + - Assign IPv6 Address On Creation: data.assign_ipv6_address_on_creation + data_type: "boolean" + - IPv6 CIDR Block Association Set: data.ipv6_cidr_block_association_set + - Subnet ARN: data.subnet_arn + - Outpost ARN: data.outpost_arn + - AWS Account ID: account + +table: + sort: + key: data.subnet_id + desc: true + fields: + - Subnet ID: data.subnet_id + - VPC ID: data.vpc_id + - State: data.state + type: enum + enums: + - available: green.500 + type: state + - pending: yellow.500 + type: state + - CIDR Block: data.cidr_block + - Availability Zone: data.availability_zone + - Available IP Address Count: data.available_ip_address_count + - Default For AZ: data.default_for_az + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Map Public IP On Launch: data.map_public_ip_on_launch + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Subnet ARN: data.subnet_arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Subnet + type: item + fields: + - Subnet ID: data.subnet_id + - VPC ID: data.vpc_id + - State: data.state + type: enum + enums: + - available: green.500 + type: state + - pending: yellow.500 + type: state + - CIDR Block: data.cidr_block + - Availability Zone: data.availability_zone + - Availability Zone ID: data.availability_zone_id + - Available IP Address Count: data.available_ip_address_count + - Default For AZ: data.default_for_az + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Map Public IP On Launch: data.map_public_ip_on_launch + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Owner ID: data.owner_id + - Assign IPv6 Address On Creation: data.assign_ipv6_address_on_creation + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - IPv6 CIDR Block Association Set: data.ipv6_cidr_block_association_set + - Subnet ARN: data.subnet_arn + - Outpost ARN: data.outpost_arn diff --git a/src/plugin/metadata/vpc/transit_gateway.yaml b/src/plugin/metadata/vpc/transit_gateway.yaml new file mode 100644 index 0000000..551ff6e --- /dev/null +++ b/src/plugin/metadata/vpc/transit_gateway.yaml @@ -0,0 +1,64 @@ +search: + fields: + - Transit Gateway ID: data.transit_gateway_id + - State: data.state + type: text + labels: + - pending: "Pending" + - available: "Available" + - modifying: "Modifying" + - deleting: "Deleting" + - deleted: "Deleted" + - Owner ID: data.owner_id + - Description: data.description + - Creation Time: data.creation_time + data_type: "datetime" + - AWS Account ID: account + +table: + sort: + key: data.transit_gateway_id + desc: true + fields: + - Transit Gateway ID: data.transit_gateway_id + - State: data.state + type: enum + enums: + - pending: yellow.500 + type: state + - available: green.500 + type: state + - modifying: yellow.500 + type: state + - deleting: yellow.500 + type: state + - deleted: gray.400 + type: state + - Owner ID: data.owner_id + - Description: data.description + - AWS Account ID: account + is_optional: true + +tabs.0: + name: Transit Gateway + type: item + fields: + - Transit Gateway ID: data.transit_gateway_id + - State: data.state + type: enum + enums: + - pending: yellow.500 + type: state + - available: green.500 + type: state + - modifying: yellow.500 + type: state + - deleting: yellow.500 + type: state + - deleted: gray.400 + type: state + - Owner ID: data.owner_id + - Description: data.description + - Creation Time: data.creation_time + type: datetime + source_type: iso8601 diff --git a/src/plugin/metadata/vpc/vpc.yaml b/src/plugin/metadata/vpc/vpc.yaml new file mode 100644 index 0000000..fdd4f5c --- /dev/null +++ b/src/plugin/metadata/vpc/vpc.yaml @@ -0,0 +1,130 @@ +search: + fields: + - VPC ID: data.vpc_id + - State: data.state + type: text + labels: + - available: "Available" + - pending: "Pending" + - CIDR: data.cidr_blocks.cidr_block + - Main Route Table: data.main_route_table_id + - Main Network ACL: data.main_network_acl_id + - Tenancy: data.instance_tenancy + - Default VPC: data.is_default + data_type: "boolean" + - Owner: data.owner_id + - ARN: data.arn + - DHCP Options ID: data.dhcp_options_id + - Enable DNS Hostnames: data.enable_dns_hostnames + data_type: "boolean" + - Enable DNS Support: data.enable_dns_support + data_type: "boolean" + - Subnet ARNs: data.subnets.subnet_arn + - Subnet IDs: data.subnets.subnet_id + - Subnet Names: data.subnets.name + - Subnet CIDRs: data.subnets.cidr_block + - Subnet Availability Zones: data.subnets.availability_zone + - AWS Account ID: account + +table: + sort: + key: data.vpc_id + desc: true + fields: + - VPC ID: data.vpc_id + - State: data.state + type: enum + enums: + - available: green.500 + type: state + - pending: yellow.500 + type: state + - CIDR: data.cidr_blocks.cidr_block + type: badge + outline_color: violet.500 + - Tenancy: data.instance_tenancy + - Default VPC: data.is_default + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Owner: data.owner_id + - ARN: data.arn + is_optional: true + - AWS Account ID: account + is_optional: true + +tabs.0: + name: VPC + type: item + fields: + - VPC ID: data.vpc_id + - State: data.state + type: enum + enums: + - available: green.500 + type: state + - pending: yellow.500 + type: state + - IPv4 CIDR: data.cidr_blocks.cidr_block + type: badge + outline_color: violet.500 + - IPv6 CIDR: data.ipv6_cidr_block_association_set.ipv6_cidr_block + type: badge + outline_color: violet.500 + - DNS resolution: data.enable_dns_support + type: enum + enums: + - Enabled: indigo.500 + - Disabled: coral.600 + - DNS hostnames: data.enable_dns_hostnames + type: enum + enums: + - Enabled: indigo.500 + - Disabled: coral.600 + - DHCP Options set: data.dhcp_options_id + - Tenancy: data.instance_tenancy + type: badge + outline_color: violet.500 + - Default VPC: data.is_default + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Owner: data.owner_id + +tabs.1: + name: Subnet + type: table + root_path: data.subnets + fields: + - Subnet ID: subnet_id + - State: state + type: enum + enums: + - available: green.500 + type: state + - pending: yellow.500 + type: state + - IPv4 CIDR: cidr_block + - Availability Zone: availability_zone + - Auto-assign Public IP: map_public_ip_on_launch + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + +tabs.2: + name: Route Tables + type: table + root_path: data.route_tables + fields: + - Route Table ID: route_table_id + - Main: main + type: enum + enums: + - "true": indigo.500 + - "false": coral.600 + - Routes: routes + type: badge + outline_color: violet.500 diff --git a/src/plugin/metadata/vpc/vpn_connection.yaml b/src/plugin/metadata/vpc/vpn_connection.yaml new file mode 100644 index 0000000..dea7d42 --- /dev/null +++ b/src/plugin/metadata/vpc/vpn_connection.yaml @@ -0,0 +1,63 @@ +search: + fields: + - VPN Connection ID: data.vpn_connection_id + - State: data.state + type: text + labels: + - pending: "Pending" + - available: "Available" + - deleting: "Deleting" + - deleted: "Deleted" + - Type: data.type + - Customer Gateway ID: data.customer_gateway_id + - VPN Gateway ID: data.vpn_gateway_id + - Transit Gateway ID: data.transit_gateway_id + - Category: data.category + - AWS Account ID: account + +table: + sort: + key: data.vpn_connection_id + desc: true + fields: + - VPN Connection ID: data.vpn_connection_id + - State: data.state + type: enum + enums: + - pending: yellow.500 + type: state + - available: green.500 + type: state + - deleting: yellow.500 + type: state + - deleted: gray.400 + type: state + - Type: data.type + - Customer Gateway ID: data.customer_gateway_id + - VPN Gateway ID: data.vpn_gateway_id + - Transit Gateway ID: data.transit_gateway_id + - Category: data.category + - AWS Account ID: account + is_optional: true + +tabs.0: + name: VPN Connection + type: item + fields: + - VPN Connection ID: data.vpn_connection_id + - State: data.state + type: enum + enums: + - pending: yellow.500 + type: state + - available: green.500 + type: state + - deleting: yellow.500 + type: state + - deleted: gray.400 + type: state + - Type: data.type + - Customer Gateway ID: data.customer_gateway_id + - VPN Gateway ID: data.vpn_gateway_id + - Transit Gateway ID: data.transit_gateway_id + - Category: data.category diff --git a/src/plugin/metadata/vpc/vpn_gateway.yaml b/src/plugin/metadata/vpc/vpn_gateway.yaml new file mode 100644 index 0000000..7324b1e --- /dev/null +++ b/src/plugin/metadata/vpc/vpn_gateway.yaml @@ -0,0 +1,57 @@ +search: + fields: + - VPN Gateway ID: data.vpn_gateway_id + - State: data.state + type: text + labels: + - pending: "Pending" + - available: "Available" + - deleting: "Deleting" + - deleted: "Deleted" + - Type: data.type + - VPC ID: data.vpc_id + - Amazon Side ASN: data.amazon_side_asn + - AWS Account ID: account + +table: + sort: + key: data.vpn_gateway_id + desc: true + fields: + - VPN Gateway ID: data.vpn_gateway_id + - State: data.state + type: enum + enums: + - pending: yellow.500 + type: state + - available: green.500 + type: state + - deleting: yellow.500 + type: state + - deleted: gray.400 + type: state + - Type: data.type + - VPC ID: data.vpc_id + - Amazon Side ASN: data.amazon_side_asn + - AWS Account ID: account + is_optional: true + +tabs.0: + name: VPN Gateway + type: item + fields: + - VPN Gateway ID: data.vpn_gateway_id + - State: data.state + type: enum + enums: + - pending: yellow.500 + type: state + - available: green.500 + type: state + - deleting: yellow.500 + type: state + - deleted: gray.400 + type: state + - Type: data.type + - VPC ID: data.vpc_id + - Amazon Side ASN: data.amazon_side_asn diff --git a/src/plugin/metrics/APIGateway/API/api_count.yaml b/src/plugin/metrics/APIGateway/API/api_count.yaml new file mode 100644 index 0000000..59566fe --- /dev/null +++ b/src/plugin/metrics/APIGateway/API/api_count.yaml @@ -0,0 +1,31 @@ +--- +metric_id: metric-aws-apigateway-api-count +name: API Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.APIGateway.API +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: instance_type + name: Protocol + default: true + - key: data.endpoint_type + name: Endpoint Type + - key: data.api_key_source + name: API Key Source + - key: data.description + name: Description + - key: data.resources.path + name: Resource Paths + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-apigateway-api +version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/APIGateway/API/namespace.yaml b/src/plugin/metrics/APIGateway/API/namespace.yaml new file mode 100644 index 0000000..3d7d4f3 --- /dev/null +++ b/src/plugin/metrics/APIGateway/API/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-apigateway-api +name: APIGateway/API +category: ASSET +resource_type: inventory.CloudService:aws.APIGateway.API +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-api-gateway.svg' +version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/AutoScaling/AutoScalingGroup/auto_scaling_group_count.yaml b/src/plugin/metrics/AutoScaling/AutoScalingGroup/auto_scaling_group_count.yaml new file mode 100644 index 0000000..88a8235 --- /dev/null +++ b/src/plugin/metrics/AutoScaling/AutoScalingGroup/auto_scaling_group_count.yaml @@ -0,0 +1,60 @@ +--- +metric_id: metric-aws-autoscaling-autoscalinggroup-count +name: Auto Scaling Group Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.AutoScaling.AutoScalingGroup +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.desired_capacity + name: Desired Capacity + - key: data.min_size + name: Min Size + - key: data.max_size + name: Max Size + - key: data.display_launch_configuration_template + name: Launch Template/Configuration + - key: data.availability_zones + name: Availability Zones + - key: data.health_check_type + name: Health Check Type + - key: data.new_instances_protected_from_scale_in + name: Instance Protected from Scale In + - key: data.default_cooldown + name: Default CoolDown + - key: data.health_check_grace_period + name: Health Check Grace Period + - key: data.instances.instance_id + name: Instances ID + - key: data.instances.lifecycle + name: Instances Lifecycle + - key: data.instances.health_status + name: Instances Status + - key: data.instances.instance_type + name: Instances Type + - key: data.instances.availability_zone + name: Instances Availability Zone + - key: data.load_balancer_arns + name: LoadBalancers ARNs + - key: data.load_balancers.name + name: LoadBalancers Name + - key: data.load_balancers.endpoint + name: LoadBalancers Endpoint + - key: data.target_group_arns + name: Target Group ARNs + - key: data.policies.policy_arn + name: Policy ARNs + - key: data.policies.policy_name + name: Policy Names + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-autoscaling-autoscalinggroup +version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/AutoScaling/AutoScalingGroup/namespace.yaml b/src/plugin/metrics/AutoScaling/AutoScalingGroup/namespace.yaml new file mode 100644 index 0000000..c2e9427 --- /dev/null +++ b/src/plugin/metrics/AutoScaling/AutoScalingGroup/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-autoscaling-autoscalinggroup +name: AutoScaling/AutoScalingGroup +category: ASSET +resource_type: inventory.CloudService:aws.AutoScaling.AutoScalingGroup +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-ec2-auto-scaling.svg' +version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/AutoScaling/AutoScalingGroup/related_elb_count.yaml b/src/plugin/metrics/AutoScaling/AutoScalingGroup/related_elb_count.yaml new file mode 100644 index 0000000..1b2e294 --- /dev/null +++ b/src/plugin/metrics/AutoScaling/AutoScalingGroup/related_elb_count.yaml @@ -0,0 +1,27 @@ +--- +metric_id: metric-aws-autoscaling-autoscalinggroup-related-elb-count +name: Related ELB Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.AutoScaling.AutoScalingGroup +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.load_balancers.name + name: LoadBalancer Name + - key: data.load_balancers.endpoint + name: LoadBalancer Endpoint + - key: data.load_balancer_arns + name: LoadBalancer ARNs + fields: + value: + operator: count + key: data.load_balancers +unit: Count +namespace_id: ns-aws-autoscaling-autoscalinggroup +version: '1.0' diff --git a/src/plugin/metrics/AutoScaling/AutoScalingGroup/related_instance_count.yaml b/src/plugin/metrics/AutoScaling/AutoScalingGroup/related_instance_count.yaml new file mode 100644 index 0000000..16f018f --- /dev/null +++ b/src/plugin/metrics/AutoScaling/AutoScalingGroup/related_instance_count.yaml @@ -0,0 +1,31 @@ +--- +metric_id: metric-aws-autoscaling-autoscalinggroup-related-instance-count +name: Related Instance Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.AutoScaling.AutoScalingGroup +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.instances.instance_id + name: Instance ID + - key: data.instances.lifecycle + name: Instance Lifecycle + - key: data.instances.health_status + name: Instance Health Status + - key: data.instances.instance_type + name: Instance Type + - key: data.instances.availability_zone + name: Instance Availability Zone + fields: + value: + operator: count + key: data.instances +unit: Count +namespace_id: ns-aws-autoscaling-autoscalinggroup +version: '1.0' diff --git a/src/plugin/metrics/CertificateManager/Certificate/certificate_count.yaml b/src/plugin/metrics/CertificateManager/Certificate/certificate_count.yaml index 1769890..988922f 100644 --- a/src/plugin/metrics/CertificateManager/Certificate/certificate_count.yaml +++ b/src/plugin/metrics/CertificateManager/Certificate/certificate_count.yaml @@ -1,5 +1,5 @@ --- -metric_id: metric-aws-certificate-manager-certificate-count +metric_id: metric-aws-certificatemanager-certificate-count name: Certificate Count metric_type: GAUGE resource_type: inventory.CloudService:aws.CertificateManager.Certificate @@ -15,13 +15,29 @@ query_options: - key: data.status name: Status default: true + - key: instance_type + name: Type - key: data.in_use_display name: In Use - key: data.renewal_eligibility_display name: Renewal Eligibility + - key: data.additional_names_display + name: Additional Names + - key: data.issuer + name: Issuer + - key: data.subject + name: Subject + - key: data.serial + name: Serial + - key: data.signature_algorithm + name: Signature Algorithm + - key: data.key_algorithm + name: Key Algorithm + - key: data.in_use_by + name: Associated Resources fields: value: operator: count unit: Count -namespace_id: ns-aws-certificate-manager-certificate +namespace_id: ns-aws-certificatemanager-certificate version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/CertificateManager/Certificate/namespace.yaml b/src/plugin/metrics/CertificateManager/Certificate/namespace.yaml index 4c5ae72..9d2be09 100644 --- a/src/plugin/metrics/CertificateManager/Certificate/namespace.yaml +++ b/src/plugin/metrics/CertificateManager/Certificate/namespace.yaml @@ -1,8 +1,8 @@ --- -namespace_id: ns-aws-certificate-manager-certificate +namespace_id: ns-aws-certificatemanager-certificate name: CertificateManager/Certificate category: ASSET resource_type: inventory.CloudService:aws.CertificateManager.Certificate group: aws -icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/cloud-services/aws/AWS-Certificate-Manager.svg' +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-certificate-manager.svg' version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/CloudFront/Distribution/distribution_count.yaml b/src/plugin/metrics/CloudFront/Distribution/distribution_count.yaml index 8efc30e..482157c 100644 --- a/src/plugin/metrics/CloudFront/Distribution/distribution_count.yaml +++ b/src/plugin/metrics/CloudFront/Distribution/distribution_count.yaml @@ -7,14 +7,28 @@ query_options: group_by: - key: account name: Account ID - - key: data.id - name: ID - - key: data.viewer_certificate.minimum_protocol_version - name: SSL version + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code - key: data.status name: Distribution Status + default: true - key: data.state_display name: Status + - key: data.alias_icp_recordals.cname + name: CNAME + - key: data.viewer_certificate.minimum_protocol_version + name: Security Policy + - key: data.comment + name: Comment + - key: data.price_class + name: Price Class + - key: data.http_version + name: HTTP Version + - key: data.origins.items + name: Origins fields: value: operator: count diff --git a/src/plugin/metrics/CloudFront/Distribution/namespace.yaml b/src/plugin/metrics/CloudFront/Distribution/namespace.yaml index 201603e..89e40bc 100644 --- a/src/plugin/metrics/CloudFront/Distribution/namespace.yaml +++ b/src/plugin/metrics/CloudFront/Distribution/namespace.yaml @@ -4,5 +4,5 @@ name: CloudFront/Distribution category: ASSET resource_type: inventory.CloudService:aws.CloudFront.Distribution group: aws -icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/cloud-services/aws/Amazon-CloudFront.svg' +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-cloudfront.svg' version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/CloudFront/Distribution/origin_count.yaml b/src/plugin/metrics/CloudFront/Distribution/origin_count.yaml new file mode 100644 index 0000000..3992db8 --- /dev/null +++ b/src/plugin/metrics/CloudFront/Distribution/origin_count.yaml @@ -0,0 +1,29 @@ +--- +metric_id: metric-aws-cloudfront-distribution-origin-count +name: Origin Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.CloudFront.Distribution +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.origins.items.domain_name + name: Origin Domain Name + - key: data.origins.items.origin_path + name: Origin Path + - key: data.origins.items.custom_origin_config + name: Custom Origin Config + - key: data.origins.items.s3_origin_config + name: S3 Origin Config + fields: + value: + operator: count + key: data.origins.items +unit: Count +namespace_id: ns-aws-cloudfront-distribution +version: '1.0' diff --git a/src/plugin/metrics/CloudTrail/Trail/namespace.yaml b/src/plugin/metrics/CloudTrail/Trail/namespace.yaml index 82fd41f..0f09f73 100644 --- a/src/plugin/metrics/CloudTrail/Trail/namespace.yaml +++ b/src/plugin/metrics/CloudTrail/Trail/namespace.yaml @@ -4,5 +4,5 @@ name: CloudTrail/Trail category: ASSET resource_type: inventory.CloudService:aws.CloudTrail.Trail group: aws -icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/cloud-services/aws/AWS-Cloudtrail.svg' +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-cloudtrail.svg' version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/CloudTrail/Trail/trail_count.yaml b/src/plugin/metrics/CloudTrail/Trail/trail_count.yaml index 629ea61..532d92b 100644 --- a/src/plugin/metrics/CloudTrail/Trail/trail_count.yaml +++ b/src/plugin/metrics/CloudTrail/Trail/trail_count.yaml @@ -7,13 +7,35 @@ query_options: group_by: - key: account name: Account ID - search_key: account - key: region_code name: Region - search_key: region_code reference: resource_type: inventory.Region reference_key: region_code + - key: data.home_region + name: Home Region + - key: data.is_multi_region_trail + name: Multi-Region Trail + - key: data.has_insight_selectors + name: Insight + - key: data.is_organization_trail + name: Organization Trail + - key: data.s3_bucket_name + name: S3 Bucket + - key: data.s3_key_prefix + name: Log file Prefix + - key: data.log_file_validation_enabled + name: Log file Validation Enabled + - key: data.cloud_watch_logs_log_group_arn + name: CloudWatch Logs Log group + - key: data.sns_topic_name + name: SNS Topic name + - key: data.sns_topic_arn + name: SNS Topic ARN + - key: data.kms_key_id + name: KMS Key ID + - key: data.include_global_service_events + name: Include Global Service Events fields: value: operator: count diff --git a/src/plugin/metrics/CloudWatch/CloudWatch/cloudwatch_count.yaml b/src/plugin/metrics/CloudWatch/CloudWatch/cloudwatch_count.yaml new file mode 100644 index 0000000..fb3483d --- /dev/null +++ b/src/plugin/metrics/CloudWatch/CloudWatch/cloudwatch_count.yaml @@ -0,0 +1,36 @@ +--- +metric_id: metric-aws-cloudwatch-cloudwatch-count +name: CloudWatch Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.CloudWatch.CloudWatch +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.state_value + name: State + - key: data.state_updated_timestamp + name: Last State Update + - key: data.conditions + name: Conditions + - key: data.actions_enabled + name: Actions + - key: data.metric_name + name: MetricName + - key: data.namespace + name: Namespace + - key: data.statistic + name: Statistic + - key: data.period + name: Period + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-cloudwatch-cloudwatch +version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/CloudWatch/CloudWatch/namespace.yaml b/src/plugin/metrics/CloudWatch/CloudWatch/namespace.yaml new file mode 100644 index 0000000..f78c7e2 --- /dev/null +++ b/src/plugin/metrics/CloudWatch/CloudWatch/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-cloudwatch-cloudwatch +name: CloudWatch/CloudWatch +category: ASSET +resource_type: inventory.CloudService:aws.CloudWatch.CloudWatch +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-cloud-watch.svg' +version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/DirectConnect/Connection/connection_count.yaml b/src/plugin/metrics/DirectConnect/Connection/connection_count.yaml new file mode 100644 index 0000000..be974a8 --- /dev/null +++ b/src/plugin/metrics/DirectConnect/Connection/connection_count.yaml @@ -0,0 +1,41 @@ +--- +metric_id: metric-aws-directconnect-connection-count +name: Connection Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.DirectConnect.Connection +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.connection_state + name: Connection State + - key: data.location + name: Location + - key: data.bandwidth + name: Bandwidth + default: true + - key: data.has_logical_redundancy + name: Logical Redundancy + - key: data.vlan + name: VLAN + - key: data.lag_id + name: LAG ID + - key: data.jumbo_frame_capable + name: Jumbo Frame Capable + - key: data.partner_name + name: Partner Name + - key: data.aws_device + name: AWS Device + - key: data.aws_device_v2 + name: AWS Device V2 + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-directconnect-connection +version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/DirectConnect/Connection/namespace.yaml b/src/plugin/metrics/DirectConnect/Connection/namespace.yaml new file mode 100644 index 0000000..0f0b7ae --- /dev/null +++ b/src/plugin/metrics/DirectConnect/Connection/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-directconnect-connection +name: DirectConnect/Connection +category: ASSET +resource_type: inventory.CloudService:aws.DirectConnect.Connection +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-direct-connect.svg' +version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/DirectConnect/DirectConnectGateway/directconnectgateway_count.yaml b/src/plugin/metrics/DirectConnect/DirectConnectGateway/directconnectgateway_count.yaml new file mode 100644 index 0000000..73b242a --- /dev/null +++ b/src/plugin/metrics/DirectConnect/DirectConnectGateway/directconnectgateway_count.yaml @@ -0,0 +1,32 @@ +--- +metric_id: metric-aws-directconnect-directconnectgateway-count +name: Direct Connect Gateway Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.DirectConnect.DirectConnectGateway +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.state + name: State + - key: data.direct_connect_gateway_name + name: Direct Connect Gateway Name + - key: data.amazon_side_asn + name: Amazon Side ASN + - key: data.owner_account + name: Owner Account + - key: data.direct_connect_gateway_state + name: Direct Connect Gateway State + - key: data.tags + name: Tags + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-directconnect-directconnectgateway +version: '1.0' diff --git a/src/plugin/metrics/DirectConnect/DirectConnectGateway/namespace.yaml b/src/plugin/metrics/DirectConnect/DirectConnectGateway/namespace.yaml new file mode 100644 index 0000000..2274b63 --- /dev/null +++ b/src/plugin/metrics/DirectConnect/DirectConnectGateway/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-directconnect-directconnectgateway +name: DirectConnect/DirectConnectGateway +category: ASSET +resource_type: inventory.CloudService:aws.DirectConnect.DirectConnectGateway +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-direct-connect.svg' +version: '1.1' diff --git a/src/plugin/metrics/DirectConnect/LAG/lag_count.yaml b/src/plugin/metrics/DirectConnect/LAG/lag_count.yaml new file mode 100644 index 0000000..3e1d2e5 --- /dev/null +++ b/src/plugin/metrics/DirectConnect/LAG/lag_count.yaml @@ -0,0 +1,37 @@ +--- +metric_id: metric-aws-directconnect-lag-count +name: LAG Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.DirectConnect.LAG +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.lag_state + name: LAG State + - key: data.location + name: Location + - key: data.bandwidth + name: Bandwidth + default: true + - key: data.number_of_connections + name: Number of Connections + - key: data.jumbo_frame_capable + name: Jumbo Frame Capable + - key: data.has_logical_redundancy + name: Logical Redundancy + - key: data.aws_device + name: AWS Device + - key: data.aws_device_v2 + name: AWS Device V2 + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-directconnect-lag +version: '1.0' diff --git a/src/plugin/metrics/DirectConnect/LAG/namespace.yaml b/src/plugin/metrics/DirectConnect/LAG/namespace.yaml new file mode 100644 index 0000000..398f7fa --- /dev/null +++ b/src/plugin/metrics/DirectConnect/LAG/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-directconnect-lag +name: DirectConnect/LAG +category: ASSET +resource_type: inventory.CloudService:aws.DirectConnect.LAG +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-direct-connect.svg' +version: '1.1' diff --git a/src/plugin/metrics/DirectConnect/VirtualPrivateGateway/namespace.yaml b/src/plugin/metrics/DirectConnect/VirtualPrivateGateway/namespace.yaml new file mode 100644 index 0000000..2e41e71 --- /dev/null +++ b/src/plugin/metrics/DirectConnect/VirtualPrivateGateway/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-directconnect-virtualprivategateway +name: DirectConnect/VirtualPrivateGateway +category: ASSET +resource_type: inventory.CloudService:aws.DirectConnect.VirtualPrivateGateway +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-direct-connect.svg' +version: '1.1' diff --git a/src/plugin/metrics/DirectConnect/VirtualPrivateGateway/virtualprivategateway_count.yaml b/src/plugin/metrics/DirectConnect/VirtualPrivateGateway/virtualprivategateway_count.yaml new file mode 100644 index 0000000..206d30f --- /dev/null +++ b/src/plugin/metrics/DirectConnect/VirtualPrivateGateway/virtualprivategateway_count.yaml @@ -0,0 +1,32 @@ +--- +metric_id: metric-aws-directconnect-virtualprivategateway-count +name: Virtual Private Gateway Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.DirectConnect.VirtualPrivateGateway +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.state + name: State + - key: data.vpn_gateway_id + name: VPN Gateway ID + - key: data.vpc_id + name: VPC ID + - key: data.vpn_gateway_type + name: VPN Gateway Type + - key: data.amazon_side_asn + name: Amazon Side ASN + - key: data.tags + name: Tags + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-directconnect-virtualprivategateway +version: '1.0' diff --git a/src/plugin/metrics/DocumentDB/Cluster/documentdb_count.yaml b/src/plugin/metrics/DocumentDB/Cluster/documentdb_count.yaml index 3bd424e..097592c 100644 --- a/src/plugin/metrics/DocumentDB/Cluster/documentdb_count.yaml +++ b/src/plugin/metrics/DocumentDB/Cluster/documentdb_count.yaml @@ -1,6 +1,6 @@ --- metric_id: metric-aws-documentdb-cluster-count -name: Cluster Count +name: DocumentDB Cluster Count metric_type: GAUGE resource_type: inventory.CloudService:aws.DocumentDB.Cluster query_options: @@ -14,10 +14,33 @@ query_options: reference_key: region_code - key: data.status name: Status + default: true - key: data.engine name: Engine - key: data.engine_version name: Version + - key: data.instance_count + name: Instances + - key: data.endpoint + name: Endpoint + - key: data.reader_endpoint + name: Reader Endpoint + - key: data.port + name: Port + - key: data.multi_az + name: Multi AZ + - key: data.availability_zones + name: Availability Zones + - key: data.parameter_group + name: DB Cluster Parameter Group + - key: data.db_cluster_parameter_group + name: Parameter Group + - key: data.subnet_group + name: Subnet Group + - key: data.db_subnet_group + name: DB Subnet Group + - key: data.master_username + name: Master Username fields: value: operator: count diff --git a/src/plugin/metrics/DocumentDB/Cluster/instance_count.yaml b/src/plugin/metrics/DocumentDB/Cluster/instance_count.yaml index 3ec599b..8dedf1f 100644 --- a/src/plugin/metrics/DocumentDB/Cluster/instance_count.yaml +++ b/src/plugin/metrics/DocumentDB/Cluster/instance_count.yaml @@ -1,6 +1,6 @@ --- -metric_id: metric-aws-documentdb-instance-count -name: Instance Count +metric_id: metric-aws-documentdb-cluster-instance-count +name: DocumentDB Instance Count metric_type: GAUGE resource_type: inventory.CloudService:aws.DocumentDB.Cluster query_options: @@ -12,16 +12,18 @@ query_options: reference: resource_type: inventory.Region reference_key: region_code - - key: data.status - name: Status - - key: data.engine - name: Engine - - key: data.engine_version - name: Version + - key: data.instances.db_instance_arn + name: Instance ARN + - key: data.instances.db_instance_identifier + name: Instance Identifier + - key: data.instances.availability_zone + name: Instance Availability Zone + - key: data.instances.db_instance_class + name: Instance Type fields: value: - key: instance_size - operator: sum + operator: count + key: data.instances unit: Count namespace_id: ns-aws-documentdb-cluster version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/DocumentDB/Cluster/namespace.yaml b/src/plugin/metrics/DocumentDB/Cluster/namespace.yaml index 5bf4add..7744fa2 100644 --- a/src/plugin/metrics/DocumentDB/Cluster/namespace.yaml +++ b/src/plugin/metrics/DocumentDB/Cluster/namespace.yaml @@ -4,5 +4,5 @@ name: DocumentDB/Cluster category: ASSET resource_type: inventory.CloudService:aws.DocumentDB.Cluster group: aws -icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/cloud-services/aws/Amazon-DocumentDB.svg' +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-documentdb.svg' version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/DynamoDB/Table/item_count.yaml b/src/plugin/metrics/DynamoDB/Table/item_count.yaml new file mode 100644 index 0000000..d4fe75d --- /dev/null +++ b/src/plugin/metrics/DynamoDB/Table/item_count.yaml @@ -0,0 +1,33 @@ +--- +metric_id: metric-aws-dynamodb-table-item-count +name: Item Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.DynamoDB.Table +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.table_status + name: Status + - key: data.partition_key_display + name: Partition Key + - key: data.sort_key_display + name: Sort Key + - key: data.index_count + name: Indexes + - key: data.encryption_type + name: Encryption Type + - key: data.billing_mode_summary.billing_mode + name: Billing Mode + fields: + value: + operator: sum + key: data.item_count +unit: Count +namespace_id: ns-aws-dynamodb-table +version: '1.0' diff --git a/src/plugin/metrics/DynamoDB/Table/namespace.yaml b/src/plugin/metrics/DynamoDB/Table/namespace.yaml new file mode 100644 index 0000000..10507de --- /dev/null +++ b/src/plugin/metrics/DynamoDB/Table/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-dynamodb-table +name: DynamoDB/Table +category: ASSET +resource_type: inventory.CloudService:aws.DynamoDB.Table +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-dynamodb.svg' +version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/DynamoDB/Table/read_capacity.yaml b/src/plugin/metrics/DynamoDB/Table/read_capacity.yaml new file mode 100644 index 0000000..7cc7f72 --- /dev/null +++ b/src/plugin/metrics/DynamoDB/Table/read_capacity.yaml @@ -0,0 +1,33 @@ +--- +metric_id: metric-aws-dynamodb-table-read-capacity +name: Read Capacity +metric_type: GAUGE +resource_type: inventory.CloudService:aws.DynamoDB.Table +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.table_status + name: Status + - key: data.partition_key_display + name: Partition Key + - key: data.sort_key_display + name: Sort Key + - key: data.index_count + name: Indexes + - key: data.encryption_type + name: Encryption Type + - key: data.billing_mode_summary.billing_mode + name: Billing Mode + fields: + value: + operator: sum + key: data.total_read_capacity +unit: Count +namespace_id: ns-aws-dynamodb-table +version: '1.0' diff --git a/src/plugin/metrics/DynamoDB/Table/storage_size.yaml b/src/plugin/metrics/DynamoDB/Table/storage_size.yaml new file mode 100644 index 0000000..89bd7e0 --- /dev/null +++ b/src/plugin/metrics/DynamoDB/Table/storage_size.yaml @@ -0,0 +1,33 @@ +--- +metric_id: metric-aws-dynamodb-table-storage-size +name: Storage Size +metric_type: GAUGE +resource_type: inventory.CloudService:aws.DynamoDB.Table +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.table_status + name: Status + - key: data.partition_key_display + name: Partition Key + - key: data.sort_key_display + name: Sort Key + - key: data.index_count + name: Indexes + - key: data.encryption_type + name: Encryption Type + - key: data.billing_mode_summary.billing_mode + name: Billing Mode + fields: + value: + operator: sum + key: instance_size +unit: Bytes +namespace_id: ns-aws-dynamodb-table +version: '1.0' diff --git a/src/plugin/metrics/DynamoDB/Table/table_count.yaml b/src/plugin/metrics/DynamoDB/Table/table_count.yaml new file mode 100644 index 0000000..18f9777 --- /dev/null +++ b/src/plugin/metrics/DynamoDB/Table/table_count.yaml @@ -0,0 +1,43 @@ +--- +metric_id: metric-aws-dynamodb-table-count +name: Table Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.DynamoDB.Table +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.table_status + name: Status + default: true + - key: data.partition_key_display + name: Partition Key + - key: data.sort_key_display + name: Sort Key + - key: data.index_count + name: Indexes + - key: data.total_read_capacity + name: Total Read Capacity + - key: data.total_write_capacity + name: Total Write Capacity + - key: data.auto_scaling_policies + name: Auto Scaling + - key: data.encryption_type + name: Encryption Type + - key: data.item_count + name: Item Count + - key: data.time_to_live.time_to_live_status + name: Time to Live Status + - key: data.billing_mode_summary.billing_mode + name: Billing Mode + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-dynamodb-table +version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/DynamoDB/Table/write_capacity.yaml b/src/plugin/metrics/DynamoDB/Table/write_capacity.yaml new file mode 100644 index 0000000..945914a --- /dev/null +++ b/src/plugin/metrics/DynamoDB/Table/write_capacity.yaml @@ -0,0 +1,33 @@ +--- +metric_id: metric-aws-dynamodb-table-write-capacity +name: Write Capacity +metric_type: GAUGE +resource_type: inventory.CloudService:aws.DynamoDB.Table +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.table_status + name: Status + - key: data.partition_key_display + name: Partition Key + - key: data.sort_key_display + name: Sort Key + - key: data.index_count + name: Indexes + - key: data.encryption_type + name: Encryption Type + - key: data.billing_mode_summary.billing_mode + name: Billing Mode + fields: + value: + operator: sum + key: data.total_write_capacity +unit: Count +namespace_id: ns-aws-dynamodb-table +version: '1.0' diff --git a/src/plugin/metrics/EBS/Snapshot/namespace.yaml b/src/plugin/metrics/EBS/Snapshot/namespace.yaml new file mode 100644 index 0000000..5767cd5 --- /dev/null +++ b/src/plugin/metrics/EBS/Snapshot/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-ebs-snapshot +name: EBS/Snapshot +category: ASSET +resource_type: inventory.CloudService:aws.EBS.Snapshot +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-ebs.svg' +version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/EBS/Snapshot/snapshot_count.yaml b/src/plugin/metrics/EBS/Snapshot/snapshot_count.yaml new file mode 100644 index 0000000..2e04910 --- /dev/null +++ b/src/plugin/metrics/EBS/Snapshot/snapshot_count.yaml @@ -0,0 +1,39 @@ +--- +metric_id: metric-aws-ebs-snapshot-count +name: Snapshot Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.EBS.Snapshot +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.state + name: State + default: true + - key: data.volume_id + name: Volume ID + - key: data.volume_size + name: Volume Size + - key: data.encrypted + name: Encrypted + - key: data.kms_key_id + name: KMS Key ID + - key: data.owner_id + name: Owner ID + - key: data.owner_alias + name: Owner Alias + - key: data.progress + name: Progress + - key: data.description + name: Description + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-ebs-snapshot +version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/EBS/Snapshot/snapshot_size.yaml b/src/plugin/metrics/EBS/Snapshot/snapshot_size.yaml new file mode 100644 index 0000000..bc30f93 --- /dev/null +++ b/src/plugin/metrics/EBS/Snapshot/snapshot_size.yaml @@ -0,0 +1,39 @@ +--- +metric_id: metric-aws-ebs-snapshot-size +name: Snapshot Size +metric_type: GAUGE +resource_type: inventory.CloudService:aws.EBS.Snapshot +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.state + name: State + - key: data.volume_id + name: Volume ID + - key: data.volume_size + name: Volume Size + - key: data.encrypted + name: Encrypted + - key: data.kms_key_id + name: KMS Key ID + - key: data.owner_id + name: Owner ID + - key: data.owner_alias + name: Owner Alias + - key: data.progress + name: Progress + - key: data.description + name: Description + fields: + value: + operator: sum + key: instance_size +unit: Bytes +namespace_id: ns-aws-ebs-snapshot +version: '1.0' diff --git a/src/plugin/metrics/EBS/Volume/namespace.yaml b/src/plugin/metrics/EBS/Volume/namespace.yaml new file mode 100644 index 0000000..7c00a4c --- /dev/null +++ b/src/plugin/metrics/EBS/Volume/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-ebs-volume +name: EBS/Volume +category: ASSET +resource_type: inventory.CloudService:aws.EBS.Volume +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-ebs.svg' +version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/EBS/Volume/volume_count.yaml b/src/plugin/metrics/EBS/Volume/volume_count.yaml new file mode 100644 index 0000000..b6fd807 --- /dev/null +++ b/src/plugin/metrics/EBS/Volume/volume_count.yaml @@ -0,0 +1,39 @@ +--- +metric_id: metric-aws-ebs-volume-count +name: Volume Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.EBS.Volume +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.state + name: State + default: true + - key: instance_type + name: Volume Type + - key: data.iops + name: IOPS + - key: data.snapshot_id + name: From Snapshot + - key: data.availability_zone + name: Availability Zone + - key: data.encrypted + name: Encrypted + - key: data.kms_key_id + name: KMS Key ID + - key: data.multi_attach_enabled + name: Multi Attach Enabled + - key: data.attachments.instance_id + name: Attached Instance ID + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-ebs-volume +version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/EBS/Volume/volume_size.yaml b/src/plugin/metrics/EBS/Volume/volume_size.yaml new file mode 100644 index 0000000..714698e --- /dev/null +++ b/src/plugin/metrics/EBS/Volume/volume_size.yaml @@ -0,0 +1,39 @@ +--- +metric_id: metric-aws-ebs-volume-size +name: Volume Size +metric_type: GAUGE +resource_type: inventory.CloudService:aws.EBS.Volume +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.state + name: State + - key: instance_type + name: Volume Type + - key: data.iops + name: IOPS + - key: data.snapshot_id + name: From Snapshot + - key: data.availability_zone + name: Availability Zone + - key: data.encrypted + name: Encrypted + - key: data.kms_key_id + name: KMS Key ID + - key: data.multi_attach_enabled + name: Multi Attach Enabled + - key: data.attachments.instance_id + name: Attached Instance ID + fields: + value: + operator: sum + key: instance_size +unit: Bytes +namespace_id: ns-aws-ebs-volume +version: '1.0' diff --git a/src/plugin/metrics/EC2/Ami/ami_count.yaml b/src/plugin/metrics/EC2/Ami/ami_count.yaml index 053cc27..92d108a 100644 --- a/src/plugin/metrics/EC2/Ami/ami_count.yaml +++ b/src/plugin/metrics/EC2/Ami/ami_count.yaml @@ -12,15 +12,37 @@ query_options: reference: resource_type: inventory.Region reference_key: region_code - - key: data.Public - name: Is Public - - key: data.State - name: Status - - key: data.Platform + - key: data.state + name: State + - key: data.architecture + name: Architecture + - key: data.platform name: Platform + - key: data.image_type + name: Image Type + - key: data.owner_id + name: Owner ID + - key: data.owner_alias + name: Owner Alias + - key: data.name + name: Name + - key: data.description + name: Description + - key: data.creation_date + name: Creation Date + - key: data.public + name: Public + - key: data.virtualization_type + name: Virtualization Type + - key: data.hypervisor + name: Hypervisor + - key: data.root_device_type + name: Root Device Type + - key: data.root_device_name + name: Root Device Name fields: value: operator: count -unit: count +unit: Count namespace_id: ns-aws-ec2-ami version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/EC2/Ami/namespace.yaml b/src/plugin/metrics/EC2/Ami/namespace.yaml index d02d191..7d5bfa4 100644 --- a/src/plugin/metrics/EC2/Ami/namespace.yaml +++ b/src/plugin/metrics/EC2/Ami/namespace.yaml @@ -2,7 +2,7 @@ namespace_id: ns-aws-ec2-ami name: EC2/AMI category: ASSET -resource_type: inventory.CloudService:aws.EC2.Ami +resource_type: inventory.CloudService:aws.EC2.AMI group: aws -icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/cloud-services/aws/Amazon-AMI.svg' +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-ec2.svg' version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/EC2/SecurityGroup/inbound_rule_count.yaml b/src/plugin/metrics/EC2/SecurityGroup/inbound_rule_count.yaml new file mode 100644 index 0000000..5ef3806 --- /dev/null +++ b/src/plugin/metrics/EC2/SecurityGroup/inbound_rule_count.yaml @@ -0,0 +1,27 @@ +--- +metric_id: metric-aws-ec2-securitygroup-inbound-rule-count +name: Inbound Rule Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.EC2.SecurityGroup +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.ip_permissions.protocol_display + name: Protocol + - key: data.ip_permissions.port_display + name: Port Range + - key: data.ip_permissions.source_display + name: Source + fields: + value: + operator: count + key: data.ip_permissions +unit: Count +namespace_id: ns-aws-ec2-securitygroup +version: '1.0' diff --git a/src/plugin/metrics/EC2/SecurityGroup/namespace.yaml b/src/plugin/metrics/EC2/SecurityGroup/namespace.yaml index 5b11cce..590e078 100644 --- a/src/plugin/metrics/EC2/SecurityGroup/namespace.yaml +++ b/src/plugin/metrics/EC2/SecurityGroup/namespace.yaml @@ -1,8 +1,8 @@ --- -namespace_id: ns-aws-ec2-sg +namespace_id: ns-aws-ec2-securitygroup name: EC2/SecurityGroup category: ASSET resource_type: inventory.CloudService:aws.EC2.SecurityGroup group: aws -icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/cloud-services/aws/Amazon-VPC_VPN-Gateway_dark-bg.svg' +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-ec2.svg' version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/EC2/SecurityGroup/outbound_rule_count.yaml b/src/plugin/metrics/EC2/SecurityGroup/outbound_rule_count.yaml new file mode 100644 index 0000000..70ba9ae --- /dev/null +++ b/src/plugin/metrics/EC2/SecurityGroup/outbound_rule_count.yaml @@ -0,0 +1,27 @@ +--- +metric_id: metric-aws-ec2-securitygroup-outbound-rule-count +name: Outbound Rule Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.EC2.SecurityGroup +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.ip_permissions_egress.protocol_display + name: Protocol + - key: data.ip_permissions_egress.port_display + name: Port Range + - key: data.ip_permissions_egress.source_display + name: Source + fields: + value: + operator: count + key: data.ip_permissions_egress +unit: Count +namespace_id: ns-aws-ec2-securitygroup +version: '1.0' diff --git a/src/plugin/metrics/EC2/SecurityGroup/related_instance_count.yaml b/src/plugin/metrics/EC2/SecurityGroup/related_instance_count.yaml new file mode 100644 index 0000000..3536194 --- /dev/null +++ b/src/plugin/metrics/EC2/SecurityGroup/related_instance_count.yaml @@ -0,0 +1,27 @@ +--- +metric_id: metric-aws-ec2-securitygroup-related-instance-count +name: Related Instance Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.EC2.SecurityGroup +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.instances.instance_id + name: Instance ID + - key: data.instances.instance_type + name: Instance Type + - key: data.instances.availability_zone + name: Availability Zone + fields: + value: + operator: count + key: data.instances +unit: Count +namespace_id: ns-aws-ec2-securitygroup +version: '1.0' diff --git a/src/plugin/metrics/EC2/SecurityGroup/sg_count.yaml b/src/plugin/metrics/EC2/SecurityGroup/sg_count.yaml index 8b55a23..777b4e4 100644 --- a/src/plugin/metrics/EC2/SecurityGroup/sg_count.yaml +++ b/src/plugin/metrics/EC2/SecurityGroup/sg_count.yaml @@ -1,6 +1,6 @@ --- -metric_id: metric-aws-ec2-sg-count -name: Security Groups Count +metric_id: metric-aws-ec2-securitygroup-count +name: Security Group Count metric_type: GAUGE resource_type: inventory.CloudService:aws.EC2.SecurityGroup query_options: @@ -12,11 +12,27 @@ query_options: reference: resource_type: inventory.Region reference_key: region_code - - key: data.VpcId - name: VPC + - key: data.group_id + name: Security Group ID + - key: data.vpc_id + name: VPC ID + - key: data.description + name: Description + - key: data.ip_permissions.protocol_display + name: Inbound Protocol + - key: data.ip_permissions.port_display + name: Inbound Port Range + - key: data.ip_permissions.source_display + name: Inbound Source + - key: data.ip_permissions_egress.protocol_display + name: Outbound Protocol + - key: data.ip_permissions_egress.port_display + name: Outbound Port Range + - key: data.ip_permissions_egress.source_display + name: Outbound Source fields: value: operator: count unit: Count -namespace_id: ns-aws-ec2-sg +namespace_id: ns-aws-ec2-securitygroup version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/ECR/Repository/image_count.yaml b/src/plugin/metrics/ECR/Repository/image_count.yaml new file mode 100644 index 0000000..65b52f0 --- /dev/null +++ b/src/plugin/metrics/ECR/Repository/image_count.yaml @@ -0,0 +1,31 @@ +--- +metric_id: metric-aws-ecr-repository-image-count +name: Image Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.ECR.Repository +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.images.image_uri + name: Image URI + - key: data.images.image_tag + name: Image Tag + - key: data.images.image_digest + name: Image Digest + - key: data.images.image_pushed_at + name: Image Pushed At + - key: data.images.image_size_in_bytes + name: Image Size + fields: + value: + operator: count + key: data.images +unit: Count +namespace_id: ns-aws-ecr-repository +version: '1.0' diff --git a/src/plugin/metrics/ECR/Repository/image_size.yaml b/src/plugin/metrics/ECR/Repository/image_size.yaml new file mode 100644 index 0000000..23bae74 --- /dev/null +++ b/src/plugin/metrics/ECR/Repository/image_size.yaml @@ -0,0 +1,29 @@ +--- +metric_id: metric-aws-ecr-repository-image-size +name: Image Size +metric_type: GAUGE +resource_type: inventory.CloudService:aws.ECR.Repository +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.images.image_uri + name: Image URI + - key: data.images.image_tag + name: Image Tag + - key: data.images.image_digest + name: Image Digest + - key: data.images.image_pushed_at + name: Image Pushed At + fields: + value: + operator: sum + key: data.images.image_size_in_bytes +unit: Bytes +namespace_id: ns-aws-ecr-repository +version: '1.0' diff --git a/src/plugin/metrics/ECR/Repository/namespace.yaml b/src/plugin/metrics/ECR/Repository/namespace.yaml index 4ca9842..fca394a 100644 --- a/src/plugin/metrics/ECR/Repository/namespace.yaml +++ b/src/plugin/metrics/ECR/Repository/namespace.yaml @@ -4,5 +4,5 @@ name: ECR/Repository category: ASSET resource_type: inventory.CloudService:aws.ECR.Repository group: aws -icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/cloud-services/aws/Amazon-EC2-Container-Registry.svg' +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-ecr.svg' version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/ECR/Repository/repository_count.yaml b/src/plugin/metrics/ECR/Repository/repository_count.yaml index 825104b..119cac2 100644 --- a/src/plugin/metrics/ECR/Repository/repository_count.yaml +++ b/src/plugin/metrics/ECR/Repository/repository_count.yaml @@ -12,6 +12,16 @@ query_options: reference: resource_type: inventory.Region reference_key: region_code + - key: data.repository_uri + name: URI + - key: data.repository_arn + name: Registry ARN + - key: data.image_tag_mutability + name: Image Tag Mutability + - key: data.image_scanning_configuration.scan_on_push + name: Image Scanning on Push + - key: data.registry_id + name: Repository ID fields: value: operator: count diff --git a/src/plugin/metrics/ECS/Cluster/active_service_count.yaml b/src/plugin/metrics/ECS/Cluster/active_service_count.yaml new file mode 100644 index 0000000..48be08b --- /dev/null +++ b/src/plugin/metrics/ECS/Cluster/active_service_count.yaml @@ -0,0 +1,31 @@ +--- +metric_id: metric-aws-ecs-cluster-active-service-count +name: Active Service Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.ECS.Cluster +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.services.service_arn + name: Service ARN + - key: data.services.service_name + name: Service Name + - key: data.services.launch_type + name: Launch Type + - key: data.services.role_arn + name: Role ARN + - key: data.services.scheduling_strategy + name: Scheduling Strategy + fields: + value: + operator: count + key: data.services +unit: Count +namespace_id: ns-aws-ecs-cluster +version: '1.0' diff --git a/src/plugin/metrics/ECS/Cluster/cluster_count.yaml b/src/plugin/metrics/ECS/Cluster/cluster_count.yaml new file mode 100644 index 0000000..e699052 --- /dev/null +++ b/src/plugin/metrics/ECS/Cluster/cluster_count.yaml @@ -0,0 +1,55 @@ +--- +metric_id: metric-aws-ecs-cluster-count +name: Cluster Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.ECS.Cluster +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.status + name: Status + default: true + - key: data.active_services_count + name: Active Services + - key: data.running_tasks_count + name: Running Tasks + - key: data.pending_tasks_count + name: Pending Tasks + - key: data.registered_container_instances_count + name: Registered Instances + - key: data.cluster_arn + name: Cluster ARN + - key: data.services.service_arn + name: Services ARN + - key: data.services.service_name + name: Services Name + - key: data.services.launch_type + name: Services Launch Type + - key: data.services.role_arn + name: Services Role ARN + - key: data.services.scheduling_strategy + name: Services Scheduling Strategy + - key: data.tasks.task_arn + name: Tasks ARN + - key: data.tasks.task + name: Tasks Name + - key: data.tasks.availability_zone + name: Tasks Availability Zone + - key: data.tasks.health_status + name: Tasks Health Status + - key: data.tasks.cpu + name: Tasks CPU + - key: data.tasks.memory + name: Tasks Memory + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-ecs-cluster +version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/ECS/Cluster/namespace.yaml b/src/plugin/metrics/ECS/Cluster/namespace.yaml new file mode 100644 index 0000000..9982a93 --- /dev/null +++ b/src/plugin/metrics/ECS/Cluster/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-ecs-cluster +name: ECS/Cluster +category: ASSET +resource_type: inventory.CloudService:aws.ECS.Cluster +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-ecs.svg' +version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/ECS/Cluster/running_task_count.yaml b/src/plugin/metrics/ECS/Cluster/running_task_count.yaml new file mode 100644 index 0000000..a995be8 --- /dev/null +++ b/src/plugin/metrics/ECS/Cluster/running_task_count.yaml @@ -0,0 +1,33 @@ +--- +metric_id: metric-aws-ecs-cluster-running-task-count +name: Running Task Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.ECS.Cluster +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.tasks.task_arn + name: Task ARN + - key: data.tasks.task + name: Task Name + - key: data.tasks.availability_zone + name: Availability Zone + - key: data.tasks.health_status + name: Health Status + - key: data.tasks.cpu + name: CPU + - key: data.tasks.memory + name: Memory + fields: + value: + operator: count + key: data.tasks +unit: Count +namespace_id: ns-aws-ecs-cluster +version: '1.0' diff --git a/src/plugin/metrics/EFS/FileSystem/file_system_count.yaml b/src/plugin/metrics/EFS/FileSystem/file_system_count.yaml index 2933d74..7bb123f 100644 --- a/src/plugin/metrics/EFS/FileSystem/file_system_count.yaml +++ b/src/plugin/metrics/EFS/FileSystem/file_system_count.yaml @@ -1,6 +1,6 @@ --- -metric_id: metric-aws-efs-file-system-count -name: FileSystem Count +metric_id: metric-aws-efs-filesystem-count +name: File System Count metric_type: GAUGE resource_type: inventory.CloudService:aws.EFS.FileSystem query_options: @@ -15,9 +15,31 @@ query_options: - key: data.life_cycle_state name: State default: true + - key: data.number_of_mount_targets + name: Mount Targets + - key: data.file_system_id + name: File System ID + - key: data.arn + name: ARN + - key: data.throughput_mode + name: Throughput Mode + - key: data.performance_mode + name: Performance Mode + - key: data.encrypted + name: Encrypted + - key: data.kms_key_id + name: KMS Key ARN + - key: data.mount_targets.mount_target_id + name: Mount Target IDs + - key: data.mount_targets.ip_address + name: Mount Target IP + - key: data.mount_targets.life_cycle_state + name: Mount Target State + - key: data.mount_targets.availability_zone_name + name: Mount Target AZ fields: value: operator: count unit: Count -namespace_id: ns-aws-efs-file-system +namespace_id: ns-aws-efs-filesystem version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/EFS/FileSystem/file_system_size.yaml b/src/plugin/metrics/EFS/FileSystem/file_system_size.yaml index 0328f5a..eb26f2a 100644 --- a/src/plugin/metrics/EFS/FileSystem/file_system_size.yaml +++ b/src/plugin/metrics/EFS/FileSystem/file_system_size.yaml @@ -1,6 +1,6 @@ --- -metric_id: metric-aws-efs-file-system-size -name: FileSystem Size +metric_id: metric-aws-efs-filesystem-size +name: File System Size metric_type: GAUGE resource_type: inventory.CloudService:aws.EFS.FileSystem query_options: @@ -14,11 +14,32 @@ query_options: reference_key: region_code - key: data.life_cycle_state name: State - default: true + - key: data.number_of_mount_targets + name: Mount Targets + - key: data.file_system_id + name: File System ID + - key: data.arn + name: ARN + - key: data.throughput_mode + name: Throughput Mode + - key: data.performance_mode + name: Performance Mode + - key: data.encrypted + name: Encrypted + - key: data.kms_key_id + name: KMS Key ARN + - key: data.mount_targets.mount_target_id + name: Mount Target IDs + - key: data.mount_targets.ip_address + name: Mount Target IP + - key: data.mount_targets.life_cycle_state + name: Mount Target State + - key: data.mount_targets.availability_zone_name + name: Mount Target AZ fields: value: operator: sum - key: data.size + key: instance_size unit: Bytes -namespace_id: ns-aws-efs-file-system +namespace_id: ns-aws-efs-filesystem version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/EFS/FileSystem/mount_target_count.yaml b/src/plugin/metrics/EFS/FileSystem/mount_target_count.yaml new file mode 100644 index 0000000..03a933e --- /dev/null +++ b/src/plugin/metrics/EFS/FileSystem/mount_target_count.yaml @@ -0,0 +1,29 @@ +--- +metric_id: metric-aws-efs-filesystem-mount-target-count +name: Mount Target Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.EFS.FileSystem +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.mount_targets.mount_target_id + name: Mount Target ID + - key: data.mount_targets.ip_address + name: Mount Target IP + - key: data.mount_targets.life_cycle_state + name: Mount Target State + - key: data.mount_targets.availability_zone_name + name: Mount Target AZ + fields: + value: + operator: count + key: data.mount_targets +unit: Count +namespace_id: ns-aws-efs-filesystem +version: '1.0' diff --git a/src/plugin/metrics/EFS/FileSystem/namespace.yaml b/src/plugin/metrics/EFS/FileSystem/namespace.yaml index 22e9b5e..18119c5 100644 --- a/src/plugin/metrics/EFS/FileSystem/namespace.yaml +++ b/src/plugin/metrics/EFS/FileSystem/namespace.yaml @@ -1,8 +1,8 @@ --- -namespace_id: ns-aws-efs-file-system +namespace_id: ns-aws-efs-filesystem name: EFS/FileSystem category: ASSET resource_type: inventory.CloudService:aws.EFS.FileSystem group: aws -icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/cloud-services/aws/Amazon-Elastic-File-System_EFS.svg' +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-efs.svg' version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/EIP/EIP/eip_count.yaml b/src/plugin/metrics/EIP/EIP/eip_count.yaml new file mode 100644 index 0000000..0df2d7a --- /dev/null +++ b/src/plugin/metrics/EIP/EIP/eip_count.yaml @@ -0,0 +1,41 @@ +--- +metric_id: metric-aws-eip-eip-count +name: EIP Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.EIP.EIP +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.public_ip + name: Public IP + - key: data.private_ip_address + name: Private IP + - key: data.public_ipv4_pool + name: Address Pool + - key: data.domain + name: Scope + default: true + - key: data.instance_id + name: Associate Instance ID + - key: data.public_dns + name: Public DNS + - key: data.nat_gateway_id + name: NAT Gateway ID + - key: data.association_id + name: Association ID + - key: data.allocation_id + name: Allocation ID + - key: data.allocation_status + name: Allocation Status + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-eip-eip +version: '1.0' diff --git a/src/plugin/metrics/EIP/EIP/namespace.yaml b/src/plugin/metrics/EIP/EIP/namespace.yaml new file mode 100644 index 0000000..f980996 --- /dev/null +++ b/src/plugin/metrics/EIP/EIP/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-eip-eip +name: EIP/EIP +category: ASSET +resource_type: inventory.CloudService:aws.EIP.EIP +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-eip.svg' +version: '1.1' diff --git a/src/plugin/metrics/EKS/Cluster/cluster_count.yaml b/src/plugin/metrics/EKS/Cluster/cluster_count.yaml index cde38b6..7f552d9 100644 --- a/src/plugin/metrics/EKS/Cluster/cluster_count.yaml +++ b/src/plugin/metrics/EKS/Cluster/cluster_count.yaml @@ -12,10 +12,41 @@ query_options: reference: resource_type: inventory.Region reference_key: region_code - - key: data.status - name: Status - key: data.version name: Version + - key: data.status + name: Status + default: true + - key: data.arn + name: ARN + - key: data.role_arn + name: Role ARN + - key: data.endpoint + name: Endpoint + - key: data.node_groups.nodegroup_arn + name: Node Group ARNs + - key: data.node_groups.nodegroup_name + name: Node Group Names + - key: data.node_groups.node_role + name: Node Role ARNs + - key: data.resources_vpc_config.vpc_id + name: VPC ID + - key: data.resources_vpc_config.subnet_ids + name: Subnets + - key: data.resources_vpc_config.public_access_cidrs + name: Public Access CIDRs + - key: data.resources_vpc_config.cluster_security_group_id + name: Cluster Security Group ID + - key: data.resources_vpc_config.endpoint_public_access + name: Endpoint Public Access + - key: data.resources_vpc_config.endpoint_private_access + name: Endpoint Private Access + - key: data.logging.cluster_logging.enabled + name: Cluster Logging Enabled + - key: data.identity.oidc.issuer + name: OIDC Issuer + - key: data.platform_version + name: Platform Version fields: value: operator: count diff --git a/src/plugin/metrics/EKS/Cluster/namespace.yaml b/src/plugin/metrics/EKS/Cluster/namespace.yaml index 7390a2d..58205f5 100644 --- a/src/plugin/metrics/EKS/Cluster/namespace.yaml +++ b/src/plugin/metrics/EKS/Cluster/namespace.yaml @@ -4,5 +4,5 @@ name: EKS/Cluster category: ASSET resource_type: inventory.CloudService:aws.EKS.Cluster group: aws -icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/cloud-services/aws/Amazon-Elastic-Kubernetes-Service.svg' +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-eks.svg' version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/EKS/NodeGroup/namespace.yaml b/src/plugin/metrics/EKS/NodeGroup/namespace.yaml index bee53e5..705c8af 100644 --- a/src/plugin/metrics/EKS/NodeGroup/namespace.yaml +++ b/src/plugin/metrics/EKS/NodeGroup/namespace.yaml @@ -4,5 +4,5 @@ name: EKS/NodeGroup category: ASSET resource_type: inventory.CloudService:aws.EKS.NodeGroup group: aws -icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/cloud-services/aws/Amazon-Elastic-Kubernetes-Service.svg' +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-eks.svg' version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/EKS/NodeGroup/node_group_count.yaml b/src/plugin/metrics/EKS/NodeGroup/node_group_count.yaml index 2bd0c64..3ce341b 100644 --- a/src/plugin/metrics/EKS/NodeGroup/node_group_count.yaml +++ b/src/plugin/metrics/EKS/NodeGroup/node_group_count.yaml @@ -1,6 +1,6 @@ --- metric_id: metric-aws-eks-nodegroup-count -name: NodeGroup Count +name: Node Group Count metric_type: GAUGE resource_type: inventory.CloudService:aws.EKS.NodeGroup query_options: @@ -12,12 +12,41 @@ query_options: reference: resource_type: inventory.Region reference_key: region_code - - key: data.cluster_name - name: Cluster - key: data.status name: Status - - key: data.version - name: Version + default: true + - key: data.nodegroup_name + name: Node Group Name + - key: data.nodegroup_arn + name: Node Group ARN + - key: data.cluster_name + name: Cluster Name + - key: data.node_role + name: Node Role + - key: data.ami_type + name: AMI Type + - key: data.capacity_type + name: Capacity Type + - key: data.instance_types + name: Instance Types + - key: data.scaling_config.desired_size + name: Desired Size + - key: data.scaling_config.min_size + name: Min Size + - key: data.scaling_config.max_size + name: Max Size + - key: data.disk_size + name: Disk Size + - key: data.subnets + name: Subnets + - key: data.remote_access.ec2_ssh_key + name: EC2 SSH Key + - key: data.remote_access.source_security_groups + name: Source Security Groups + - key: data.launch_template + name: Launch Template + - key: data.tags + name: Tags fields: value: operator: count diff --git a/src/plugin/metrics/ELB/LoadBalancer/listeners_count.yaml b/src/plugin/metrics/ELB/LoadBalancer/listeners_count.yaml index 553472c..5e89c27 100644 --- a/src/plugin/metrics/ELB/LoadBalancer/listeners_count.yaml +++ b/src/plugin/metrics/ELB/LoadBalancer/listeners_count.yaml @@ -1,11 +1,9 @@ --- -metric_id: metric-aws-elb-listeners-count +metric_id: metric-aws-elb-loadbalancer-listeners-count name: Listeners Count metric_type: GAUGE resource_type: inventory.CloudService:aws.ELB.LoadBalancer query_options: - unwind: - path: data.listeners group_by: - key: account name: Account ID @@ -14,17 +12,18 @@ query_options: reference: resource_type: inventory.Region reference_key: region_code - - key: data.state.code - name: State - - key: data.type - name: Type - - key: data.scheme - name: Scheme + - key: data.listeners.listener_arn + name: Listener ARN + - key: data.listeners.protocol + name: Listener Protocol + - key: data.listeners.port + name: Listener Port - key: data.listeners.ssl_policy - name: SSL Policy + name: Listener SSL Policy fields: value: operator: count + key: data.listeners unit: Count namespace_id: ns-aws-elb-loadbalancer version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/ELB/LoadBalancer/loadbalancer_count.yaml b/src/plugin/metrics/ELB/LoadBalancer/loadbalancer_count.yaml index ab77337..2d01edb 100644 --- a/src/plugin/metrics/ELB/LoadBalancer/loadbalancer_count.yaml +++ b/src/plugin/metrics/ELB/LoadBalancer/loadbalancer_count.yaml @@ -1,6 +1,6 @@ --- metric_id: metric-aws-elb-loadbalancer-count -name: LoadBalancer Count +name: Load Balancer Count metric_type: GAUGE resource_type: inventory.CloudService:aws.ELB.LoadBalancer query_options: @@ -12,12 +12,93 @@ query_options: reference: resource_type: inventory.Region reference_key: region_code + - key: data.dns_name + name: DNS Name - key: data.state.code name: State - - key: data.type + - key: instance_type name: Type + default: true + - key: data.availability_zones.zone_name + name: Availability Zones + - key: data.listeners.ssl_policy + name: Security Policy + - key: data.load_balancer_arn + name: ARN - key: data.scheme name: Scheme + - key: data.vpc_id + name: VPC ID + - key: data.availability_zones.subnet_id + name: Subnet ID + - key: data.canonical_hosted_zone_id + name: Hosted Zone ID + - key: data.security_groups + name: Security Groups + - key: data.listeners.listener_arn + name: Listener IDs + - key: data.listeners.protocol + name: Listener Protocol + - key: data.listeners.port + name: Listener Port + - key: data.listeners.ssl_policy + name: Listener SSL Policy + - key: data.target_groups.target_group_arn + name: Target Group ARNs + - key: data.target_groups.target_group_name + name: Target Group Names + - key: data.target_groups.protocol + name: Target Group Protocol + - key: data.target_groups.port + name: Target Group Port + - key: data.target_groups.health_check_protocol + name: Target Group Health Check Protocol + - key: data.target_groups.health_check_port + name: Target Group Health Check Port + - key: data.target_groups.health_check_path + name: Target Group Health Check Path + - key: data.target_groups.health_check_interval_seconds + name: Target Group Health Check Interval + - key: data.target_groups.health_check_timeout_seconds + name: Target Group Health Check Timeout + - key: data.target_groups.healthy_threshold_count + name: Target Group Healthy Threshold + - key: data.target_groups.unhealthy_threshold_count + name: Target Group Unhealthy Threshold + - key: data.target_groups.target_type + name: Target Group Target Type + - key: data.target_groups.vpc_id + name: Target Group VPC ID + - key: data.target_groups.load_balancer_arns + name: Target Group Load Balancer ARNs + - key: data.target_groups.instances.instance_id + name: Target Group Instance IDs + - key: data.target_groups.instances.port + name: Target Group Instance Ports + - key: data.target_groups.instances.availability_zone + name: Target Group Instance Availability Zones + - key: data.target_groups.instances.health_status + name: Target Group Instance Health Status + - key: data.target_groups.instances.target_health_description + name: Target Group Instance Health Description + - key: data.target_groups.instances.target_health_reason + name: Target Group Instance Health Reason + - key: data.target_groups.instances.target_health_state + name: Target Group Instance Health State + - key: data.instances.instance_id + name: Instance IDs + - key: data.instances.port + name: Instance Ports + - key: data.instances.availability_zone + name: Instance Availability Zones + - key: data.instances.health_status + name: Instance Health Status + - key: data.instances.target_health_description + name: Instance Health Description + - key: data.instances.target_health_reason + name: Instance Health Reason + - key: data.instances.target_health_state + name: Instance Health State fields: value: operator: count diff --git a/src/plugin/metrics/ELB/LoadBalancer/namespace.yaml b/src/plugin/metrics/ELB/LoadBalancer/namespace.yaml index 10a7362..4520ac8 100644 --- a/src/plugin/metrics/ELB/LoadBalancer/namespace.yaml +++ b/src/plugin/metrics/ELB/LoadBalancer/namespace.yaml @@ -4,5 +4,5 @@ name: ELB/LoadBalancer category: ASSET resource_type: inventory.CloudService:aws.ELB.LoadBalancer group: aws -icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/cloud-services/aws/Elastic-Load-Balancing.svg' +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-elb.svg' version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/ELB/LoadBalancer/related_instance_count.yaml b/src/plugin/metrics/ELB/LoadBalancer/related_instance_count.yaml index bdeef5c..6d83eda 100644 --- a/src/plugin/metrics/ELB/LoadBalancer/related_instance_count.yaml +++ b/src/plugin/metrics/ELB/LoadBalancer/related_instance_count.yaml @@ -1,5 +1,5 @@ --- -metric_id: metric-aws-elb-loadbalancer-instance-count +metric_id: metric-aws-elb-loadbalancer-related-instance-count name: Related Instance Count metric_type: GAUGE resource_type: inventory.CloudService:aws.ELB.LoadBalancer @@ -12,16 +12,24 @@ query_options: reference: resource_type: inventory.Region reference_key: region_code - - key: data.state.code - name: State - - key: data.type - name: Type - - key: data.scheme - name: Scheme + - key: data.instances.instance_id + name: Instance ID + - key: data.instances.port + name: Instance Port + - key: data.instances.availability_zone + name: Instance Availability Zone + - key: data.instances.health_status + name: Instance Health Status + - key: data.instances.target_health_description + name: Instance Health Description + - key: data.instances.target_health_reason + name: Instance Health Reason + - key: data.instances.target_health_state + name: Instance Health State fields: value: - operator: sum - key: data.stats.instances_size + operator: count + key: data.instances unit: Count namespace_id: ns-aws-elb-loadbalancer version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/ELB/TargetGroup/namespace.yaml b/src/plugin/metrics/ELB/TargetGroup/namespace.yaml index 731d49a..38a7845 100644 --- a/src/plugin/metrics/ELB/TargetGroup/namespace.yaml +++ b/src/plugin/metrics/ELB/TargetGroup/namespace.yaml @@ -1,8 +1,8 @@ --- -namespace_id: ns-aws-elb-target-group +namespace_id: ns-aws-elb-targetgroup name: ELB/TargetGroup category: ASSET resource_type: inventory.CloudService:aws.ELB.TargetGroup group: aws -icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/cloud-services/aws/Elastic-Load-Balancing.svg' +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-elb.svg' version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/ELB/TargetGroup/targetgroup_count.yaml b/src/plugin/metrics/ELB/TargetGroup/targetgroup_count.yaml index d32cf5f..d34ad30 100644 --- a/src/plugin/metrics/ELB/TargetGroup/targetgroup_count.yaml +++ b/src/plugin/metrics/ELB/TargetGroup/targetgroup_count.yaml @@ -1,5 +1,5 @@ --- -metric_id: metric-aws-elb-target-group-count +metric_id: metric-aws-elb-targetgroup-count name: Target Group Count metric_type: GAUGE resource_type: inventory.CloudService:aws.ELB.TargetGroup @@ -12,13 +12,51 @@ query_options: reference: resource_type: inventory.Region reference_key: region_code + - key: data.target_group_arn + name: Target Group ARN + - key: data.target_group_name + name: Target Group Name - key: data.protocol name: Protocol + - key: data.port + name: Port + - key: data.health_check_protocol + name: Health Check Protocol + - key: data.health_check_port + name: Health Check Port + - key: data.health_check_path + name: Health Check Path + - key: data.health_check_interval_seconds + name: Health Check Interval + - key: data.health_check_timeout_seconds + name: Health Check Timeout + - key: data.healthy_threshold_count + name: Healthy Threshold + - key: data.unhealthy_threshold_count + name: Unhealthy Threshold - key: data.target_type name: Target Type + - key: data.vpc_id + name: VPC ID + - key: data.load_balancer_arns + name: Load Balancer ARNs + - key: data.instances.instance_id + name: Instance IDs + - key: data.instances.port + name: Instance Ports + - key: data.instances.availability_zone + name: Instance Availability Zones + - key: data.instances.health_status + name: Instance Health Status + - key: data.instances.target_health_description + name: Instance Health Description + - key: data.instances.target_health_reason + name: Instance Health Reason + - key: data.instances.target_health_state + name: Instance Health State fields: value: operator: count unit: Count -namespace_id: ns-aws-elb-target-group +namespace_id: ns-aws-elb-targetgroup version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/ElastiCache/Memcached/memcached_count.yaml b/src/plugin/metrics/ElastiCache/Memcached/memcached_count.yaml new file mode 100644 index 0000000..f5a57a5 --- /dev/null +++ b/src/plugin/metrics/ElastiCache/Memcached/memcached_count.yaml @@ -0,0 +1,53 @@ +--- +metric_id: metric-aws-elasticache-memcached-count +name: Memcached Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.ElastiCache.Memcached +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.cache_cluster_status + name: Status + default: true + - key: data.num_cache_nodes + name: Nodes + - key: data.cache_node_type + name: Node Type + - key: data.preferred_availability_zone + name: Zone + - key: data.configuration_endpoint_display + name: Configuration Endpoint + - key: data.arn + name: ARN + - key: data.engine_version + name: Engine Version + - key: data.description + name: Description + - key: data.automatic_failover + name: Automatic Failover + - key: data.configuration_endpoint.address + name: Endpoint Address + - key: data.configuration_endpoint.port + name: Port + - key: data.snapshot_retention_limit + name: Snapshot Retention Limit + - key: data.replication_group_id + name: Replication Group ID + - key: data.snapshot_window + name: Snapshot Window + - key: data.cache_subnet_group_name + name: Subnet Group Name + - key: data.auth_token_enabled + name: Auth Token Enabled + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-elasticache-memcached +version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/ElastiCache/Memcached/namespace.yaml b/src/plugin/metrics/ElastiCache/Memcached/namespace.yaml new file mode 100644 index 0000000..e4094ba --- /dev/null +++ b/src/plugin/metrics/ElastiCache/Memcached/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-elasticache-memcached +name: ElastiCache/Memcached +category: ASSET +resource_type: inventory.CloudService:aws.ElastiCache.Memcached +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-elasticache.svg' +version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/ElastiCache/Redis/namespace.yaml b/src/plugin/metrics/ElastiCache/Redis/namespace.yaml new file mode 100644 index 0000000..8779ac0 --- /dev/null +++ b/src/plugin/metrics/ElastiCache/Redis/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-elasticache-redis +name: ElastiCache/Redis +category: ASSET +resource_type: inventory.CloudService:aws.ElastiCache.Redis +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-elasticache.svg' +version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/ElastiCache/Redis/redis_count.yaml b/src/plugin/metrics/ElastiCache/Redis/redis_count.yaml new file mode 100644 index 0000000..9dd3911 --- /dev/null +++ b/src/plugin/metrics/ElastiCache/Redis/redis_count.yaml @@ -0,0 +1,55 @@ +--- +metric_id: metric-aws-elasticache-redis-count +name: Redis Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.ElastiCache.Redis +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.mode + name: Mode + - key: data.status + name: Status + default: true + - key: data.num_cache_nodes + name: Nodes + - key: data.cache_node_type + name: Node Type + - key: data.preferred_availability_zone + name: Zone + - key: data.configuration_endpoint_display + name: Configuration Endpoint + - key: data.arn + name: ARN + - key: data.engine_version + name: Engine Version + - key: data.description + name: Description + - key: data.automatic_failover + name: Automatic Failover + - key: data.configuration_endpoint.address + name: Endpoint Address + - key: data.configuration_endpoint.port + name: Port + - key: data.snapshot_retention_limit + name: Snapshot Retention Limit + - key: data.replication_group_id + name: Replication Group ID + - key: data.snapshot_window + name: Snapshot Window + - key: data.cache_subnet_group_name + name: Subnet Group Name + - key: data.auth_token_enabled + name: Auth Token Enabled + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-elasticache-redis +version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/IAM/User/access_key_age_30_count.yaml b/src/plugin/metrics/IAM/User/access_key_age_30_count.yaml new file mode 100644 index 0000000..0f7b732 --- /dev/null +++ b/src/plugin/metrics/IAM/User/access_key_age_30_count.yaml @@ -0,0 +1,35 @@ +--- +metric_id: metric-aws-iam-user-access-key-age-30-count +name: Access Key Age 30+ Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.IAM.User +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.access_key.access_key_id + name: Access Key ID + - key: data.access_key.status + name: Access Key Status + - key: data.access_key.create_date + name: Access Key Creation Date + - key: data.access_key.last_used_date + name: Access Key Last Used Date + - key: data.access_key.last_used_service + name: Access Key Last Used Service + - key: data.access_key.last_used_region + name: Access Key Last Used Region + - key: data.access_key_age + name: Access Key Age + fields: + value: + operator: count + key: data.access_key +unit: Count +namespace_id: ns-aws-iam-user +version: '1.0' diff --git a/src/plugin/metrics/IAM/User/access_key_age_ratio.yaml b/src/plugin/metrics/IAM/User/access_key_age_ratio.yaml new file mode 100644 index 0000000..608b74f --- /dev/null +++ b/src/plugin/metrics/IAM/User/access_key_age_ratio.yaml @@ -0,0 +1,35 @@ +--- +metric_id: metric-aws-iam-user-access-key-age-ratio +name: Access Key Age Ratio +metric_type: GAUGE +resource_type: inventory.CloudService:aws.IAM.User +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.access_key.access_key_id + name: Access Key ID + - key: data.access_key.status + name: Access Key Status + - key: data.access_key.create_date + name: Access Key Creation Date + - key: data.access_key.last_used_date + name: Access Key Last Used Date + - key: data.access_key.last_used_service + name: Access Key Last Used Service + - key: data.access_key.last_used_region + name: Access Key Last Used Region + - key: data.access_key_age + name: Access Key Age + fields: + value: + operator: count + key: data.access_key +unit: Count +namespace_id: ns-aws-iam-user +version: '1.0' diff --git a/src/plugin/metrics/IAM/User/access_key_count.yaml b/src/plugin/metrics/IAM/User/access_key_count.yaml new file mode 100644 index 0000000..7fb83c0 --- /dev/null +++ b/src/plugin/metrics/IAM/User/access_key_count.yaml @@ -0,0 +1,35 @@ +--- +metric_id: metric-aws-iam-user-access-key-count +name: Access Key Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.IAM.User +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.access_key.access_key_id + name: Access Key ID + - key: data.access_key.status + name: Access Key Status + - key: data.access_key.create_date + name: Access Key Creation Date + - key: data.access_key.last_used_date + name: Access Key Last Used Date + - key: data.access_key.last_used_service + name: Access Key Last Used Service + - key: data.access_key.last_used_region + name: Access Key Last Used Region + - key: data.access_key_age + name: Access Key Age + fields: + value: + operator: count + key: data.access_key +unit: Count +namespace_id: ns-aws-iam-user +version: '1.0' diff --git a/src/plugin/metrics/IAM/User/mfa_unused_count.yaml b/src/plugin/metrics/IAM/User/mfa_unused_count.yaml new file mode 100644 index 0000000..4f7f7e6 --- /dev/null +++ b/src/plugin/metrics/IAM/User/mfa_unused_count.yaml @@ -0,0 +1,38 @@ +--- +metric_id: metric-aws-iam-user-mfa-unused-count +name: MFA Unused Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.IAM.User +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.user_name + name: User Name + - key: data.arn + name: ARN + - key: data.user_id + name: User ID + - key: data.path + name: Path + - key: data.create_date + name: Creation Date + - key: data.password_last_used + name: Password Last Used + - key: data.access_key_last_used + name: Access Key Last Used + - key: data.sign_in_credential.console_password + name: Console Password + - key: data.mfa_device + name: MFA Device + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-iam-user +version: '1.0' diff --git a/src/plugin/metrics/IAM/User/namespace.yaml b/src/plugin/metrics/IAM/User/namespace.yaml index 35ac7f4..f8261b8 100644 --- a/src/plugin/metrics/IAM/User/namespace.yaml +++ b/src/plugin/metrics/IAM/User/namespace.yaml @@ -4,5 +4,5 @@ name: IAM/User category: ASSET resource_type: inventory.CloudService:aws.IAM.User group: aws -icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/cloud-services/aws/AWS-Identity-and-Access-Management_IAM.svg' +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-iam.svg' version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/IAM/User/user_count.yaml b/src/plugin/metrics/IAM/User/user_count.yaml index 98900ff..514ea2b 100644 --- a/src/plugin/metrics/IAM/User/user_count.yaml +++ b/src/plugin/metrics/IAM/User/user_count.yaml @@ -12,10 +12,60 @@ query_options: reference: resource_type: inventory.Region reference_key: region_code + - key: data.user_name + name: User Name + - key: data.arn + name: ARN + - key: data.user_id + name: User ID + - key: data.path + name: Path + - key: data.create_date + name: Creation Date + - key: data.password_last_used + name: Password Last Used + - key: data.access_key_last_used + name: Access Key Last Used + - key: data.sign_in_credential.console_password + name: Console Password - key: data.mfa_device - name: MFA - - key: data.access_key_age_status - name: AccessKey Status + name: MFA Device + - key: data.access_key.access_key_id + name: Access Key ID + - key: data.access_key.status + name: Access Key Status + - key: data.access_key.create_date + name: Access Key Creation Date + - key: data.access_key.last_used_date + name: Access Key Last Used Date + - key: data.access_key.last_used_service + name: Access Key Last Used Service + - key: data.access_key.last_used_region + name: Access Key Last Used Region + - key: data.access_key_age + name: Access Key Age + - key: data.attached_permission.policy_name + name: Attached Policy Names + - key: data.attached_permission.policy_id + name: Attached Policy IDs + - key: data.attached_permission.arn + name: Attached Policy ARNs + - key: data.groups.group_name + name: Group Names + - key: data.groups.arn + name: Group ARNs + - key: data.groups.create_date + name: Group Creation Dates + - key: data.groups.path + name: Group Paths + - key: data.groups.user_count + name: Group User Counts + - key: data.groups.users.user_name + name: Group User Names + - key: data.groups.users.last_activity + name: Group User Last Activities + - key: data.groups.users.access_key_age_display + name: Group User Access Key Ages fields: value: operator: count diff --git a/src/plugin/metrics/KMS/Key/key_count.yaml b/src/plugin/metrics/KMS/Key/key_count.yaml index 2d0d379..d612da3 100644 --- a/src/plugin/metrics/KMS/Key/key_count.yaml +++ b/src/plugin/metrics/KMS/Key/key_count.yaml @@ -12,6 +12,37 @@ query_options: reference: resource_type: inventory.Region reference_key: region_code + - key: data.key_id + name: Key ID + - key: data.key_state + name: Status + - key: data.enabled + name: Enabled + default: true + - key: data.arn + name: ARN + - key: data.key_usage + name: Key Usage + - key: data.origin + name: Origin + - key: data.key_rotated + name: Key Rotated + - key: data.customer_master_key_spec + name: Customer Master Key Spec + - key: data.custom_key_store_id + name: Custom Key ID + - key: data.signing_algorithms + name: Signing Algorithms + - key: data.cloud_hsm_cluster_id + name: Cloud HSM Cluster ID + - key: data.encryption_algorithms + name: Encryption Algorithms + - key: data.key_type_path + name: Key Type Path + - key: data.key_manager + name: Key Manager + - key: data.description + name: Description fields: value: operator: count diff --git a/src/plugin/metrics/KMS/Key/namespace.yaml b/src/plugin/metrics/KMS/Key/namespace.yaml index 3cf0d78..fff91d2 100644 --- a/src/plugin/metrics/KMS/Key/namespace.yaml +++ b/src/plugin/metrics/KMS/Key/namespace.yaml @@ -4,5 +4,5 @@ name: KMS/Key category: ASSET resource_type: inventory.CloudService:aws.KMS.Key group: aws -icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/cloud-services/aws/AWS-Key-Management-Service.svg' +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-kms.svg' version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/Kinesis/DataStream/data_stream_count.yaml b/src/plugin/metrics/Kinesis/DataStream/data_stream_count.yaml new file mode 100644 index 0000000..8785f57 --- /dev/null +++ b/src/plugin/metrics/Kinesis/DataStream/data_stream_count.yaml @@ -0,0 +1,51 @@ +--- +metric_id: metric-aws-kinesis-datastream-count +name: Data Stream Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.Kinesis.DataStream +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.stream_status_display + name: Status + default: true + - key: instance_size + name: Open Shards + - key: data.retention_period_display + name: Data Retention Period + - key: data.encryption_display + name: Encryption + - key: data.consumers_vo.num_of_consumers + name: Consumers with Enhanced Fan-out + - key: data.stream_arn + name: ARN + - key: data.encryption_type + name: Encryption Type + - key: data.key_id + name: Encryption Key ID + - key: data.closed_shards_num + name: Closed Shards + - key: data.shards.shard_id + name: Shard IDs + - key: data.shards.parent_shard_id + name: Parent Shard IDs + - key: data.retention_period_hours + name: Retention Hours + - key: data.retention_period_days + name: Retention Days + - key: data.consumers_vo.consumer_name + name: Consumer Names + - key: data.consumers_vo.consumer_arn + name: Consumer ARNs + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-kinesis-datastream +version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/Kinesis/DataStream/namespace.yaml b/src/plugin/metrics/Kinesis/DataStream/namespace.yaml new file mode 100644 index 0000000..671141e --- /dev/null +++ b/src/plugin/metrics/Kinesis/DataStream/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-kinesis-datastream +name: Kinesis/DataStream +category: ASSET +resource_type: inventory.CloudService:aws.Kinesis.DataStream +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-kinesis.svg' +version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/Kinesis/DataStream/open_shard_count.yaml b/src/plugin/metrics/Kinesis/DataStream/open_shard_count.yaml new file mode 100644 index 0000000..684d22a --- /dev/null +++ b/src/plugin/metrics/Kinesis/DataStream/open_shard_count.yaml @@ -0,0 +1,49 @@ +--- +metric_id: metric-aws-kinesis-datastream-open-shard-count +name: Open Shard Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.Kinesis.DataStream +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.stream_status_display + name: Status + - key: data.retention_period_display + name: Data Retention Period + - key: data.encryption_display + name: Encryption + - key: data.consumers_vo.num_of_consumers + name: Consumers with Enhanced Fan-out + - key: data.stream_arn + name: ARN + - key: data.encryption_type + name: Encryption Type + - key: data.key_id + name: Encryption Key ID + - key: data.closed_shards_num + name: Closed Shards + - key: data.shards.shard_id + name: Shard IDs + - key: data.shards.parent_shard_id + name: Parent Shard IDs + - key: data.retention_period_hours + name: Retention Hours + - key: data.retention_period_days + name: Retention Days + - key: data.consumers_vo.consumer_name + name: Consumer Names + - key: data.consumers_vo.consumer_arn + name: Consumer ARNs + fields: + value: + operator: sum + key: data.open_shards_num +unit: Count +namespace_id: ns-aws-kinesis-datastream +version: '1.0' diff --git a/src/plugin/metrics/Kinesis/DeliveryStream/delivery_stream_count.yaml b/src/plugin/metrics/Kinesis/DeliveryStream/delivery_stream_count.yaml new file mode 100644 index 0000000..dbf48c7 --- /dev/null +++ b/src/plugin/metrics/Kinesis/DeliveryStream/delivery_stream_count.yaml @@ -0,0 +1,39 @@ +--- +metric_id: metric-aws-kinesis-deliverystream-count +name: Delivery Stream Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.Kinesis.DeliveryStream +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.delivery_stream_status + name: Status + default: true + - key: data.source.source_name + name: Source + - key: data.destinations.destination_id + name: Destination + - key: data.create_timestamp + name: Creation Time + - key: data.delivery_stream_arn + name: ARN + - key: data.delivery_stream_type + name: Type + - key: data.version_id + name: Version ID + - key: data.delivery_stream_encryption_configuration.status + name: Encryption Configuration Status + - key: data.failure_description + name: Failure Description + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-kinesis-deliverystream +version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/Kinesis/DeliveryStream/namespace.yaml b/src/plugin/metrics/Kinesis/DeliveryStream/namespace.yaml new file mode 100644 index 0000000..8c2be7d --- /dev/null +++ b/src/plugin/metrics/Kinesis/DeliveryStream/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-kinesis-deliverystream +name: Kinesis/DeliveryStream +category: ASSET +resource_type: inventory.CloudService:aws.Kinesis.DeliveryStream +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-kinesis-firehose.svg' +version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/Lambda/Function/function_code_size.yaml b/src/plugin/metrics/Lambda/Function/function_code_size.yaml index 6d3527f..e50c56a 100644 --- a/src/plugin/metrics/Lambda/Function/function_code_size.yaml +++ b/src/plugin/metrics/Lambda/Function/function_code_size.yaml @@ -1,5 +1,5 @@ --- -metric_id: metric-aws-lambda-function-code-size +metric_id: metric-aws-lambda_model-function-code-size name: Function Code Size metric_type: GAUGE resource_type: inventory.CloudService:aws.Lambda.Function @@ -12,14 +12,42 @@ query_options: reference: resource_type: inventory.Region reference_key: region_code - - key: data.runtime - name: Runtime - key: data.package_type name: Package Type + - key: data.runtime + name: Runtime + - key: data.description + name: Description + - key: data.arn + name: ARN + - key: data.version + name: Version + - key: data.role + name: Role ARN + - key: data.handler + name: Handler + - key: data.vpc_config.vpc_id + name: VPC ID + - key: data.vpc_config.subnet_ids + name: Subnet IDs + - key: data.vpc_config.security_group_ids + name: Security Group IDs + - key: data.code_sha256 + name: Code SHA256 + - key: data.layers.arn + name: Layers ARN + - key: data.kms_key_arn + name: KMS Key ARN + - key: data.dead_letter_config.target_name + name: Dead Letter Target Name + - key: data.dead_letter_config.target_arn + name: Dead Letter Target ARN + - key: data.trace_config.mode + name: Trace Config Mode fields: value: operator: sum - key: data.code_size + key: instance_size unit: Bytes -namespace_id: ns-aws-lambda-function +namespace_id: ns-aws-lambda_model-function version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/Lambda/Function/function_count.yaml b/src/plugin/metrics/Lambda/Function/function_count.yaml index 8f1e2d9..533a30b 100644 --- a/src/plugin/metrics/Lambda/Function/function_count.yaml +++ b/src/plugin/metrics/Lambda/Function/function_count.yaml @@ -1,5 +1,5 @@ --- -metric_id: metric-aws-lambda-function-count +metric_id: metric-aws-lambda_model-function-count name: Function Count metric_type: GAUGE resource_type: inventory.CloudService:aws.Lambda.Function @@ -12,13 +12,42 @@ query_options: reference: resource_type: inventory.Region reference_key: region_code - - key: data.runtime - name: Runtime - key: data.package_type name: Package Type + - key: data.runtime + name: Runtime + default: true + - key: data.description + name: Description + - key: data.arn + name: ARN + - key: data.version + name: Version + - key: data.role + name: Role ARN + - key: data.handler + name: Handler + - key: data.vpc_config.vpc_id + name: VPC ID + - key: data.vpc_config.subnet_ids + name: Subnet IDs + - key: data.vpc_config.security_group_ids + name: Security Group IDs + - key: data.code_sha256 + name: Code SHA256 + - key: data.layers.arn + name: Layers ARN + - key: data.kms_key_arn + name: KMS Key ARN + - key: data.dead_letter_config.target_name + name: Dead Letter Target Name + - key: data.dead_letter_config.target_arn + name: Dead Letter Target ARN + - key: data.trace_config.mode + name: Trace Config Mode fields: value: operator: count unit: Count -namespace_id: ns-aws-lambda-function +namespace_id: ns-aws-lambda_model-function version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/Lambda/Function/function_memory_size.yaml b/src/plugin/metrics/Lambda/Function/function_memory_size.yaml index ce8f0bf..9600486 100644 --- a/src/plugin/metrics/Lambda/Function/function_memory_size.yaml +++ b/src/plugin/metrics/Lambda/Function/function_memory_size.yaml @@ -1,5 +1,5 @@ --- -metric_id: metric-aws-lambda-function-memory-size +metric_id: metric-aws-lambda_model-function-memory-size name: Function Memory Size metric_type: GAUGE resource_type: inventory.CloudService:aws.Lambda.Function @@ -12,14 +12,42 @@ query_options: reference: resource_type: inventory.Region reference_key: region_code - - key: data.runtime - name: Runtime - key: data.package_type name: Package Type + - key: data.runtime + name: Runtime + - key: data.description + name: Description + - key: data.arn + name: ARN + - key: data.version + name: Version + - key: data.role + name: Role ARN + - key: data.handler + name: Handler + - key: data.vpc_config.vpc_id + name: VPC ID + - key: data.vpc_config.subnet_ids + name: Subnet IDs + - key: data.vpc_config.security_group_ids + name: Security Group IDs + - key: data.code_sha256 + name: Code SHA256 + - key: data.layers.arn + name: Layers ARN + - key: data.kms_key_arn + name: KMS Key ARN + - key: data.dead_letter_config.target_name + name: Dead Letter Target Name + - key: data.dead_letter_config.target_arn + name: Dead Letter Target ARN + - key: data.trace_config.mode + name: Trace Config Mode fields: value: operator: sum key: data.memory_size -unit: Bytes -namespace_id: ns-aws-lambda-function +unit: MB +namespace_id: ns-aws-lambda_model-function version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/Lambda/Function/namespace.yaml b/src/plugin/metrics/Lambda/Function/namespace.yaml index 9682b2b..a1998de 100644 --- a/src/plugin/metrics/Lambda/Function/namespace.yaml +++ b/src/plugin/metrics/Lambda/Function/namespace.yaml @@ -1,8 +1,8 @@ --- -namespace_id: ns-aws-lambda-function +namespace_id: ns-aws-lambda_model-function name: Lambda/Function category: ASSET resource_type: inventory.CloudService:aws.Lambda.Function group: aws -icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/cloud-services/aws/AWS-Lambda.svg' +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-lambda.svg' version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/Lightsail/Bucket/bucket_count.yaml b/src/plugin/metrics/Lightsail/Bucket/bucket_count.yaml new file mode 100644 index 0000000..921e565 --- /dev/null +++ b/src/plugin/metrics/Lightsail/Bucket/bucket_count.yaml @@ -0,0 +1,65 @@ +--- +metric_id: metric-aws-lightsail-bucket-count +name: Bucket Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.Lightsail.Bucket +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.state.name + name: State + default: true + - key: data.arn + name: ARN + - key: data.resource_type + name: Resource Type + - key: data.support_code + name: Support Code + - key: data.location.availability_zone + name: Availability Zone + - key: data.location.region_name + name: Region + - key: data.object_versioning + name: Object Versioning + - key: data.readonly_access_accounts + name: Readonly Access Accounts + - key: data.readwrite_access_accounts + name: Readwrite Access Accounts + - key: data.url + name: URL + - key: data.able_to_update_bundle + name: Able To Update Bundle + - key: data.bundle_id + name: Bundle ID + - key: data.created_at + name: Created At + - key: data.location.region_name + name: Region + - key: data.name + name: Name + - key: data.primary_endpoint + name: Primary Endpoint + - key: data.resource_type + name: Resource Type + - key: data.state.code + name: State Code + - key: data.state.name + name: State Name + - key: data.support_code + name: Support Code + - key: data.tags + name: Tags + - key: data.url + name: URL + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-lightsail-bucket +version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/Lightsail/Bucket/namespace.yaml b/src/plugin/metrics/Lightsail/Bucket/namespace.yaml new file mode 100644 index 0000000..f6d5213 --- /dev/null +++ b/src/plugin/metrics/Lightsail/Bucket/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-lightsail-bucket +name: Lightsail/Bucket +category: ASSET +resource_type: inventory.CloudService:aws.Lightsail.Bucket +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-lightsail.svg' +version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/Lightsail/Bucket/object_count.yaml b/src/plugin/metrics/Lightsail/Bucket/object_count.yaml new file mode 100644 index 0000000..bb56018 --- /dev/null +++ b/src/plugin/metrics/Lightsail/Bucket/object_count.yaml @@ -0,0 +1,25 @@ +--- +metric_id: metric-aws-lightsail-bucket-object-count +name: Object Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.Lightsail.Bucket +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.bundle_id + name: Bundle ID + - key: data.state.code + name: State + fields: + value: + operator: sum + key: data.object_count +unit: Count +namespace_id: ns-aws-lightsail-bucket +version: '1.0' diff --git a/src/plugin/metrics/Lightsail/Bucket/object_size.yaml b/src/plugin/metrics/Lightsail/Bucket/object_size.yaml new file mode 100644 index 0000000..0f7f410 --- /dev/null +++ b/src/plugin/metrics/Lightsail/Bucket/object_size.yaml @@ -0,0 +1,25 @@ +--- +metric_id: metric-aws-lightsail-bucket-object-size +name: Object Size +metric_type: GAUGE +resource_type: inventory.CloudService:aws.Lightsail.Bucket +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.bundle_id + name: Bundle ID + - key: data.state.code + name: State + fields: + value: + operator: sum + key: data.object_count +unit: Bytes +namespace_id: ns-aws-lightsail-bucket +version: '1.0' diff --git a/src/plugin/metrics/Lightsail/Container/container_count.yaml b/src/plugin/metrics/Lightsail/Container/container_count.yaml new file mode 100644 index 0000000..e46dff1 --- /dev/null +++ b/src/plugin/metrics/Lightsail/Container/container_count.yaml @@ -0,0 +1,24 @@ +--- +metric_id: metric-aws-lightsail-container-count +name: Container Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.Lightsail.Container +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.state.code + name: State + - key: data.power + name: Power + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-lightsail-container +version: '1.0' diff --git a/src/plugin/metrics/Lightsail/Container/namespace.yaml b/src/plugin/metrics/Lightsail/Container/namespace.yaml new file mode 100644 index 0000000..7bff40f --- /dev/null +++ b/src/plugin/metrics/Lightsail/Container/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-lightsail-container +name: Lightsail/Container +category: ASSET +resource_type: inventory.CloudService:aws.Lightsail.Container +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-lightsail.svg' +version: '1.1' diff --git a/src/plugin/metrics/Lightsail/Database/cpu_count.yaml b/src/plugin/metrics/Lightsail/Database/cpu_count.yaml new file mode 100644 index 0000000..3f797a9 --- /dev/null +++ b/src/plugin/metrics/Lightsail/Database/cpu_count.yaml @@ -0,0 +1,25 @@ +--- +metric_id: metric-aws-lightsail-database-cpu-count +name: CPU Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.Lightsail.Database +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.state + name: State + - key: data.engine + name: Engine + fields: + value: + operator: sum + key: data.hardware.cpu_count +unit: Count +namespace_id: ns-aws-lightsail-database +version: '1.0' diff --git a/src/plugin/metrics/Lightsail/Database/database_count.yaml b/src/plugin/metrics/Lightsail/Database/database_count.yaml new file mode 100644 index 0000000..f3e9c26 --- /dev/null +++ b/src/plugin/metrics/Lightsail/Database/database_count.yaml @@ -0,0 +1,24 @@ +--- +metric_id: metric-aws-lightsail-database-count +name: Database Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.Lightsail.Database +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.state + name: State + - key: data.engine + name: Engine + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-lightsail-database +version: '1.0' diff --git a/src/plugin/metrics/Lightsail/Database/disk_size.yaml b/src/plugin/metrics/Lightsail/Database/disk_size.yaml new file mode 100644 index 0000000..12e7be8 --- /dev/null +++ b/src/plugin/metrics/Lightsail/Database/disk_size.yaml @@ -0,0 +1,25 @@ +--- +metric_id: metric-aws-lightsail-database-disk-size +name: Disk Size +metric_type: GAUGE +resource_type: inventory.CloudService:aws.Lightsail.Database +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.state + name: State + - key: data.engine + name: Engine + fields: + value: + operator: sum + key: data.hardware.disk_size_in_gb +unit: GB +namespace_id: ns-aws-lightsail-database +version: '1.0' diff --git a/src/plugin/metrics/Lightsail/Database/memory_size.yaml b/src/plugin/metrics/Lightsail/Database/memory_size.yaml new file mode 100644 index 0000000..93796e8 --- /dev/null +++ b/src/plugin/metrics/Lightsail/Database/memory_size.yaml @@ -0,0 +1,25 @@ +--- +metric_id: metric-aws-lightsail-database-memory-size +name: Memory Size +metric_type: GAUGE +resource_type: inventory.CloudService:aws.Lightsail.Database +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.state + name: State + - key: data.engine + name: Engine + fields: + value: + operator: sum + key: data.hardware.ram_size_in_gb +unit: GB +namespace_id: ns-aws-lightsail-database +version: '1.0' diff --git a/src/plugin/metrics/Lightsail/Database/namespace.yaml b/src/plugin/metrics/Lightsail/Database/namespace.yaml new file mode 100644 index 0000000..f263428 --- /dev/null +++ b/src/plugin/metrics/Lightsail/Database/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-lightsail-database +name: Lightsail/Database +category: ASSET +resource_type: inventory.CloudService:aws.Lightsail.Database +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-lightsail.svg' +version: '1.1' diff --git a/src/plugin/metrics/Lightsail/Distribution/distribution_count.yaml b/src/plugin/metrics/Lightsail/Distribution/distribution_count.yaml new file mode 100644 index 0000000..9944e5b --- /dev/null +++ b/src/plugin/metrics/Lightsail/Distribution/distribution_count.yaml @@ -0,0 +1,24 @@ +--- +metric_id: metric-aws-lightsail-distribution-count +name: Distribution Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.Lightsail.Distribution +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.status + name: Status + - key: data.bundle_id + name: Bundle ID + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-lightsail-distribution +version: '1.0' diff --git a/src/plugin/metrics/Lightsail/Distribution/namespace.yaml b/src/plugin/metrics/Lightsail/Distribution/namespace.yaml new file mode 100644 index 0000000..fe480c9 --- /dev/null +++ b/src/plugin/metrics/Lightsail/Distribution/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-lightsail-distribution +name: Lightsail/Distribution +category: ASSET +resource_type: inventory.CloudService:aws.Lightsail.Distribution +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-lightsail.svg' +version: '1.1' diff --git a/src/plugin/metrics/Lightsail/Domain/domain_count.yaml b/src/plugin/metrics/Lightsail/Domain/domain_count.yaml new file mode 100644 index 0000000..06b4da3 --- /dev/null +++ b/src/plugin/metrics/Lightsail/Domain/domain_count.yaml @@ -0,0 +1,24 @@ +--- +metric_id: metric-aws-lightsail-domain-count +name: Domain Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.Lightsail.Domain +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.domain_name + name: Domain Name + - key: data.auto_renew + name: Auto Renew + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-lightsail-domain +version: '1.0' diff --git a/src/plugin/metrics/Lightsail/Domain/namespace.yaml b/src/plugin/metrics/Lightsail/Domain/namespace.yaml new file mode 100644 index 0000000..32ef843 --- /dev/null +++ b/src/plugin/metrics/Lightsail/Domain/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-lightsail-domain +name: Lightsail/Domain +category: ASSET +resource_type: inventory.CloudService:aws.Lightsail.Domain +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-lightsail.svg' +version: '1.1' diff --git a/src/plugin/metrics/Lightsail/Instance/instance_count.yaml b/src/plugin/metrics/Lightsail/Instance/instance_count.yaml new file mode 100644 index 0000000..db30923 --- /dev/null +++ b/src/plugin/metrics/Lightsail/Instance/instance_count.yaml @@ -0,0 +1,49 @@ +--- +metric_id: metric-aws-lightsail-instance-count +name: Instance Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.Lightsail.Instance +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.state.name + name: State + default: true + - key: data.hardware.cpu_count + name: Core + - key: data.hardware.ram_size_in_gb + name: Memory + - key: data.location.availability_zone + name: Availability Zone + - key: data.public_ip_address + name: Public IP + - key: data.private_ip_address + name: Private IP + - key: data.blueprint_name + name: Blueprint + - key: data.bundle_id + name: Bundle ID + - key: data.arn + name: ARN + - key: data.support_code + name: Support Code + - key: data.location.region_name + name: Region + - key: data.is_static_ip + name: Is Static IP + - key: data.username + name: Username + - key: data.ssh_key_name + name: SSH Key Name + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-lightsail-instance +version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/Lightsail/Instance/namespace.yaml b/src/plugin/metrics/Lightsail/Instance/namespace.yaml new file mode 100644 index 0000000..da0f7d5 --- /dev/null +++ b/src/plugin/metrics/Lightsail/Instance/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-lightsail-instance +name: Lightsail/Instance +category: ASSET +resource_type: inventory.CloudService:aws.Lightsail.Instance +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-lightsail.svg' +version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/Lightsail/LoadBalancer/loadbalancer_count.yaml b/src/plugin/metrics/Lightsail/LoadBalancer/loadbalancer_count.yaml new file mode 100644 index 0000000..63c9301 --- /dev/null +++ b/src/plugin/metrics/Lightsail/LoadBalancer/loadbalancer_count.yaml @@ -0,0 +1,24 @@ +--- +metric_id: metric-aws-lightsail-loadbalancer-count +name: Load Balancer Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.Lightsail.LoadBalancer +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.state.code + name: State + - key: data.health_check_path + name: Health Check Path + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-lightsail-loadbalancer +version: '1.0' diff --git a/src/plugin/metrics/Lightsail/LoadBalancer/namespace.yaml b/src/plugin/metrics/Lightsail/LoadBalancer/namespace.yaml new file mode 100644 index 0000000..ac41809 --- /dev/null +++ b/src/plugin/metrics/Lightsail/LoadBalancer/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-lightsail-loadbalancer +name: Lightsail/LoadBalancer +category: ASSET +resource_type: inventory.CloudService:aws.Lightsail.LoadBalancer +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-lightsail.svg' +version: '1.1' diff --git a/src/plugin/metrics/Lightsail/Snapshot/namespace.yaml b/src/plugin/metrics/Lightsail/Snapshot/namespace.yaml new file mode 100644 index 0000000..bad2d30 --- /dev/null +++ b/src/plugin/metrics/Lightsail/Snapshot/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-lightsail-snapshot +name: Lightsail/Snapshot +category: ASSET +resource_type: inventory.CloudService:aws.Lightsail.Snapshot +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-lightsail.svg' +version: '1.1' diff --git a/src/plugin/metrics/Lightsail/Snapshot/snapshot_count.yaml b/src/plugin/metrics/Lightsail/Snapshot/snapshot_count.yaml new file mode 100644 index 0000000..362da97 --- /dev/null +++ b/src/plugin/metrics/Lightsail/Snapshot/snapshot_count.yaml @@ -0,0 +1,24 @@ +--- +metric_id: metric-aws-lightsail-snapshot-count +name: Snapshot Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.Lightsail.Snapshot +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.state + name: State + - key: data.resource_type + name: Resource Type + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-lightsail-snapshot +version: '1.0' diff --git a/src/plugin/metrics/Lightsail/Snapshot/snapshot_size.yaml b/src/plugin/metrics/Lightsail/Snapshot/snapshot_size.yaml new file mode 100644 index 0000000..da5d481 --- /dev/null +++ b/src/plugin/metrics/Lightsail/Snapshot/snapshot_size.yaml @@ -0,0 +1,25 @@ +--- +metric_id: metric-aws-lightsail-snapshot-size +name: Snapshot Size +metric_type: GAUGE +resource_type: inventory.CloudService:aws.Lightsail.Snapshot +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.state + name: State + - key: data.resource_type + name: Resource Type + fields: + value: + operator: sum + key: data.size_in_gb +unit: GB +namespace_id: ns-aws-lightsail-snapshot +version: '1.0' diff --git a/src/plugin/metrics/Lightsail/StaticIP/namespace.yaml b/src/plugin/metrics/Lightsail/StaticIP/namespace.yaml new file mode 100644 index 0000000..f553a99 --- /dev/null +++ b/src/plugin/metrics/Lightsail/StaticIP/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-lightsail-staticip +name: Lightsail/StaticIP +category: ASSET +resource_type: inventory.CloudService:aws.Lightsail.StaticIP +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-lightsail.svg' +version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/Lightsail/StaticIP/static_ip_count.yaml b/src/plugin/metrics/Lightsail/StaticIP/static_ip_count.yaml new file mode 100644 index 0000000..d9b97fb --- /dev/null +++ b/src/plugin/metrics/Lightsail/StaticIP/static_ip_count.yaml @@ -0,0 +1,41 @@ +--- +metric_id: metric-aws-lightsail-staticip-count +name: Static IP Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.Lightsail.StaticIP +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.state.name + name: State + default: true + - key: data.ip_address + name: IP Address + - key: data.arn + name: ARN + - key: data.attached_to + name: Attached To + - key: data.is_attached + name: Is Attached + - key: data.location.availability_zone + name: Availability Zone + - key: data.location.region_name + name: Region + - key: data.name + name: Name + - key: data.resource_type + name: Resource Type + - key: data.support_code + name: Support Code + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-lightsail-staticip +version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/Lightsail/StaticIP/static_ip_usage_count.yaml b/src/plugin/metrics/Lightsail/StaticIP/static_ip_usage_count.yaml new file mode 100644 index 0000000..ef8fca2 --- /dev/null +++ b/src/plugin/metrics/Lightsail/StaticIP/static_ip_usage_count.yaml @@ -0,0 +1,24 @@ +--- +metric_id: metric-aws-lightsail-static-ip-usage-count +name: Static IP Usage Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.Lightsail.StaticIP +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.is_attached + name: Is Attached + - key: data.attached_to + name: Attached To + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-lightsail-static-ip +version: '1.0' diff --git a/src/plugin/metrics/MSK/Cluster/cluster_count.yaml b/src/plugin/metrics/MSK/Cluster/cluster_count.yaml new file mode 100644 index 0000000..9b02d69 --- /dev/null +++ b/src/plugin/metrics/MSK/Cluster/cluster_count.yaml @@ -0,0 +1,59 @@ +--- +metric_id: metric-aws-msk-cluster-count +name: Cluster Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.MSK.Cluster +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.state + name: Status + default: true + - key: data.current_broker_software_info.kafka_version + name: Kafka Version + - key: data.broker_node_group_info.instance_type + name: Broker Type + - key: data.number_of_broker_nodes + name: Number Of Broker Nodes + - key: data.cluster_arn + name: ARN + - key: data.active_operation_arn + name: Active Operation ARN + - key: data.zookeeper_connect_string_tls + name: Zookeeper Connect String TLS + - key: data.zookeeper_connect_string + name: Zookeeper Connect String + - key: data.node_info_list.node_arn + name: Nodes ARN + - key: data.client_authentication.sasl + name: Client Auth SASL + - key: data.client_authentication.tls + name: Client Auth TLS + - key: data.encryption_info.encryption_at_rest.data_volume_kms_key_id + name: Encryption At Rest + - key: data.encryption_info.encryption_in_transit.client_broker + name: Encryption In Transit + - key: data.enhanced_monitoring + name: Enhance Monitoring + - key: data.open_monitoring.prometheus.jmx_exporter + name: Prometheus JMX Exporter + - key: data.open_monitoring.prometheus.node_exporter + name: Prometheus Node Exporter + - key: data.logging_info.s3.bucket + name: Logging S3 Bucket + - key: data.logging_info.firehose.delivery_stream + name: Logging Firehose + - key: data.logging_info.broker_logs.cloud_watch_logs + name: Logging Cloudwatch + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-msk-cluster +version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/MSK/Cluster/namespace.yaml b/src/plugin/metrics/MSK/Cluster/namespace.yaml new file mode 100644 index 0000000..790d85e --- /dev/null +++ b/src/plugin/metrics/MSK/Cluster/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-msk-cluster +name: MSK/Cluster +category: ASSET +resource_type: inventory.CloudService:aws.MSK.Cluster +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-msk.svg' +version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/MSK/ClusterConfiguration/cluster_configuration_count.yaml b/src/plugin/metrics/MSK/ClusterConfiguration/cluster_configuration_count.yaml new file mode 100644 index 0000000..31ca365 --- /dev/null +++ b/src/plugin/metrics/MSK/ClusterConfiguration/cluster_configuration_count.yaml @@ -0,0 +1,38 @@ +--- +metric_id: metric-aws-msk-clusterconfiguration-count +name: Cluster Configuration Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.MSK.ClusterConfiguration +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.arn + name: ARN + - key: data.name + name: Name + - key: data.description + name: Description + - key: data.kafka_versions_list + name: Kafka Versions List + - key: data.server_properties + name: Server Properties + - key: data.revision + name: Revision + - key: data.creation_time + name: Creation Time + - key: data.latest_revision + name: Latest Revision + - key: data.state + name: State + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-msk-clusterconfiguration +version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/MSK/ClusterConfiguration/namespace.yaml b/src/plugin/metrics/MSK/ClusterConfiguration/namespace.yaml new file mode 100644 index 0000000..968aad0 --- /dev/null +++ b/src/plugin/metrics/MSK/ClusterConfiguration/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-msk-clusterconfiguration +name: MSK/ClusterConfiguration +category: ASSET +resource_type: inventory.CloudService:aws.MSK.ClusterConfiguration +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-msk.svg' +version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/RDS/Database/database_count.yaml b/src/plugin/metrics/RDS/Database/database_count.yaml new file mode 100644 index 0000000..1fbb210 --- /dev/null +++ b/src/plugin/metrics/RDS/Database/database_count.yaml @@ -0,0 +1,24 @@ +--- +metric_id: metric-aws-rds-database-count +name: Database Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.RDS.Database +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.db_instance_status + name: Status + - key: data.engine + name: Engine + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-rds-database +version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/RDS/Database/namespace.yaml b/src/plugin/metrics/RDS/Database/namespace.yaml new file mode 100644 index 0000000..7a136e2 --- /dev/null +++ b/src/plugin/metrics/RDS/Database/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-rds-database +name: RDS/Database +category: ASSET +resource_type: inventory.CloudService:aws.RDS.Database +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-rds.svg' +version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/RDS/Instance/instance_count.yaml b/src/plugin/metrics/RDS/Instance/instance_count.yaml new file mode 100644 index 0000000..719d62b --- /dev/null +++ b/src/plugin/metrics/RDS/Instance/instance_count.yaml @@ -0,0 +1,24 @@ +--- +metric_id: metric-aws-rds-instance-count +name: Instance Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.RDS.Instance +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.db_instance_status + name: Status + - key: data.db_instance_class + name: Instance Class + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-rds-instance +version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/RDS/Instance/namespace.yaml b/src/plugin/metrics/RDS/Instance/namespace.yaml new file mode 100644 index 0000000..3c8034a --- /dev/null +++ b/src/plugin/metrics/RDS/Instance/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-rds-instance +name: RDS/Instance +category: ASSET +resource_type: inventory.CloudService:aws.RDS.Instance +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-rds.svg' +version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/RDS/OptionGroup/namespace.yaml b/src/plugin/metrics/RDS/OptionGroup/namespace.yaml new file mode 100644 index 0000000..67180ec --- /dev/null +++ b/src/plugin/metrics/RDS/OptionGroup/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-rds-option-group +name: RDS/OptionGroup +category: ASSET +resource_type: inventory.CloudService:aws.RDS.OptionGroup +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-rds.svg' +version: '1.1' diff --git a/src/plugin/metrics/RDS/OptionGroup/option_group_count.yaml b/src/plugin/metrics/RDS/OptionGroup/option_group_count.yaml new file mode 100644 index 0000000..ff76485 --- /dev/null +++ b/src/plugin/metrics/RDS/OptionGroup/option_group_count.yaml @@ -0,0 +1,24 @@ +--- +metric_id: metric-aws-rds-option-group-count +name: Option Group Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.RDS.OptionGroup +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.option_group_name + name: Option Group Name + - key: data.engine_name + name: Engine Name + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-rds-option-group +version: '1.0' diff --git a/src/plugin/metrics/RDS/ParameterGroup/namespace.yaml b/src/plugin/metrics/RDS/ParameterGroup/namespace.yaml new file mode 100644 index 0000000..fd075af --- /dev/null +++ b/src/plugin/metrics/RDS/ParameterGroup/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-rds-parameter-group +name: RDS/ParameterGroup +category: ASSET +resource_type: inventory.CloudService:aws.RDS.ParameterGroup +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-rds.svg' +version: '1.1' diff --git a/src/plugin/metrics/RDS/ParameterGroup/parameter_group_count.yaml b/src/plugin/metrics/RDS/ParameterGroup/parameter_group_count.yaml new file mode 100644 index 0000000..3960b4b --- /dev/null +++ b/src/plugin/metrics/RDS/ParameterGroup/parameter_group_count.yaml @@ -0,0 +1,24 @@ +--- +metric_id: metric-aws-rds-parameter-group-count +name: Parameter Group Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.RDS.ParameterGroup +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.db_parameter_group_name + name: Parameter Group Name + - key: data.db_parameter_group_family + name: Parameter Group Family + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-rds-parameter-group +version: '1.0' diff --git a/src/plugin/metrics/RDS/Snapshot/namespace.yaml b/src/plugin/metrics/RDS/Snapshot/namespace.yaml new file mode 100644 index 0000000..1c4d66b --- /dev/null +++ b/src/plugin/metrics/RDS/Snapshot/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-rds-snapshot +name: RDS/Snapshot +category: ASSET +resource_type: inventory.CloudService:aws.RDS.Snapshot +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-rds.svg' +version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/RDS/Snapshot/snapshot_count.yaml b/src/plugin/metrics/RDS/Snapshot/snapshot_count.yaml new file mode 100644 index 0000000..5eb8cd4 --- /dev/null +++ b/src/plugin/metrics/RDS/Snapshot/snapshot_count.yaml @@ -0,0 +1,24 @@ +--- +metric_id: metric-aws-rds-snapshot-count +name: Snapshot Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.RDS.Snapshot +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.status + name: Status + - key: data.snapshot_type + name: Snapshot Type + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-rds-snapshot +version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/RDS/SubnetGroup/namespace.yaml b/src/plugin/metrics/RDS/SubnetGroup/namespace.yaml new file mode 100644 index 0000000..3565f4e --- /dev/null +++ b/src/plugin/metrics/RDS/SubnetGroup/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-rds-subnet-group +name: RDS/SubnetGroup +category: ASSET +resource_type: inventory.CloudService:aws.RDS.SubnetGroup +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-rds.svg' +version: '1.1' diff --git a/src/plugin/metrics/RDS/SubnetGroup/subnet_group_count.yaml b/src/plugin/metrics/RDS/SubnetGroup/subnet_group_count.yaml new file mode 100644 index 0000000..ece213c --- /dev/null +++ b/src/plugin/metrics/RDS/SubnetGroup/subnet_group_count.yaml @@ -0,0 +1,24 @@ +--- +metric_id: metric-aws-rds-subnet-group-count +name: Subnet Group Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.RDS.SubnetGroup +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.db_subnet_group_name + name: Subnet Group Name + - key: data.vpc_id + name: VPC ID + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-rds-subnet-group +version: '1.0' diff --git a/src/plugin/metrics/Redshift/Cluster/cluster_count.yaml b/src/plugin/metrics/Redshift/Cluster/cluster_count.yaml new file mode 100644 index 0000000..a8d863b --- /dev/null +++ b/src/plugin/metrics/Redshift/Cluster/cluster_count.yaml @@ -0,0 +1,24 @@ +--- +metric_id: metric-aws-redshift-cluster-count +name: Cluster Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.Redshift.Cluster +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.cluster_status + name: Status + - key: data.node_type + name: Node Type + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-redshift-cluster +version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/Redshift/Cluster/namespace.yaml b/src/plugin/metrics/Redshift/Cluster/namespace.yaml new file mode 100644 index 0000000..97f0b82 --- /dev/null +++ b/src/plugin/metrics/Redshift/Cluster/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-redshift-cluster +name: Redshift/Cluster +category: ASSET +resource_type: inventory.CloudService:aws.Redshift.Cluster +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-redshift.svg' +version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/S3/Bucket/bucket_count.yaml b/src/plugin/metrics/S3/Bucket/bucket_count.yaml index 1eaf99a..5c58858 100644 --- a/src/plugin/metrics/S3/Bucket/bucket_count.yaml +++ b/src/plugin/metrics/S3/Bucket/bucket_count.yaml @@ -12,8 +12,10 @@ query_options: reference: resource_type: inventory.Region reference_key: region_code - - key: data.public_access - name: Access + - key: data.public_access_block_configuration.block_public_acls + name: Block Public ACLs + - key: data.versioning.status + name: Versioning Status fields: value: operator: count diff --git a/src/plugin/metrics/S3/Bucket/namespace.yaml b/src/plugin/metrics/S3/Bucket/namespace.yaml index cb8df95..e3add9e 100644 --- a/src/plugin/metrics/S3/Bucket/namespace.yaml +++ b/src/plugin/metrics/S3/Bucket/namespace.yaml @@ -4,5 +4,5 @@ name: S3/Bucket category: ASSET resource_type: inventory.CloudService:aws.S3.Bucket group: aws -icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/cloud-services/aws/Amazon-S3.svg' +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-s3.svg' version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/S3/Bucket/object_count.yaml b/src/plugin/metrics/S3/Bucket/object_count.yaml index 60338cc..e084105 100644 --- a/src/plugin/metrics/S3/Bucket/object_count.yaml +++ b/src/plugin/metrics/S3/Bucket/object_count.yaml @@ -12,8 +12,8 @@ query_options: reference: resource_type: inventory.Region reference_key: region_code - - key: data.public_access - name: Access + - key: data.public_access_block_configuration.block_public_acls + name: Block Public ACLs fields: value: operator: sum diff --git a/src/plugin/metrics/S3/Bucket/object_size.yaml b/src/plugin/metrics/S3/Bucket/object_size.yaml index 8dbc956..dc3d84b 100644 --- a/src/plugin/metrics/S3/Bucket/object_size.yaml +++ b/src/plugin/metrics/S3/Bucket/object_size.yaml @@ -12,12 +12,12 @@ query_options: reference: resource_type: inventory.Region reference_key: region_code - - key: data.public_access - name: Access + - key: data.public_access_block_configuration.block_public_acls + name: Block Public ACLs fields: value: operator: sum - key: data.size + key: instance_size unit: Bytes namespace_id: ns-aws-s3-bucket version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/SNS/Topic/namespace.yaml b/src/plugin/metrics/SNS/Topic/namespace.yaml new file mode 100644 index 0000000..8286904 --- /dev/null +++ b/src/plugin/metrics/SNS/Topic/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-sns-topic +name: SNS/Topic +category: ASSET +resource_type: inventory.CloudService:aws.SNS.Topic +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-sns.svg' +version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/SNS/Topic/topic_count.yaml b/src/plugin/metrics/SNS/Topic/topic_count.yaml new file mode 100644 index 0000000..060caeb --- /dev/null +++ b/src/plugin/metrics/SNS/Topic/topic_count.yaml @@ -0,0 +1,24 @@ +--- +metric_id: metric-aws-sns-topic-count +name: Topic Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.SNS.Topic +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.display_name + name: Display Name + - key: data.subscriptions_confirmed + name: Subscriptions Confirmed + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-sns-topic +version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/SQS/Queue/max_message_size.yaml b/src/plugin/metrics/SQS/Queue/max_message_size.yaml new file mode 100644 index 0000000..ea51e98 --- /dev/null +++ b/src/plugin/metrics/SQS/Queue/max_message_size.yaml @@ -0,0 +1,23 @@ +--- +metric_id: metric-aws-sqs-queue-max-message-size +name: Max Message Size +metric_type: GAUGE +resource_type: inventory.CloudService:aws.SQS.Queue +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.queue_arn + name: Queue ARN + fields: + value: + operator: sum + key: data.maximum_message_size +unit: Bytes +namespace_id: ns-aws-sqs-queue +version: '1.0' diff --git a/src/plugin/metrics/SQS/Queue/namespace.yaml b/src/plugin/metrics/SQS/Queue/namespace.yaml new file mode 100644 index 0000000..2fcbc05 --- /dev/null +++ b/src/plugin/metrics/SQS/Queue/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-sqs-queue +name: SQS/Queue +category: ASSET +resource_type: inventory.CloudService:aws.SQS.Queue +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-sqs.svg' +version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/SQS/Queue/queue_count.yaml b/src/plugin/metrics/SQS/Queue/queue_count.yaml new file mode 100644 index 0000000..b0203b9 --- /dev/null +++ b/src/plugin/metrics/SQS/Queue/queue_count.yaml @@ -0,0 +1,24 @@ +--- +metric_id: metric-aws-sqs-queue-count +name: Queue Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.SQS.Queue +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.queue_arn + name: Queue ARN + - key: data.visibility_timeout_seconds + name: Visibility Timeout + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-sqs-queue +version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/SecretsManager/Secret/namespace.yaml b/src/plugin/metrics/SecretsManager/Secret/namespace.yaml new file mode 100644 index 0000000..69a9bf1 --- /dev/null +++ b/src/plugin/metrics/SecretsManager/Secret/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-secrets-manager-secret +name: SecretsManager/Secret +category: ASSET +resource_type: inventory.CloudService:aws.SecretsManager.Secret +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-secrets-manager.svg' +version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/SecretsManager/Secret/secret_count.yaml b/src/plugin/metrics/SecretsManager/Secret/secret_count.yaml new file mode 100644 index 0000000..bbcd969 --- /dev/null +++ b/src/plugin/metrics/SecretsManager/Secret/secret_count.yaml @@ -0,0 +1,24 @@ +--- +metric_id: metric-aws-secrets-manager-secret-count +name: Secret Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.SecretsManager.Secret +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.deleted_date + name: Deleted Date + - key: data.description + name: Description + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-secrets-manager-secret +version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/VPC/CustomerGateway/customer_gateway_count.yaml b/src/plugin/metrics/VPC/CustomerGateway/customer_gateway_count.yaml new file mode 100644 index 0000000..bf9a8c3 --- /dev/null +++ b/src/plugin/metrics/VPC/CustomerGateway/customer_gateway_count.yaml @@ -0,0 +1,24 @@ +--- +metric_id: metric-aws-vpc-customer-gateway-count +name: Customer Gateway Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.VPC.CustomerGateway +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.state + name: State + - key: data.type + name: Type + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-vpc-customer-gateway +version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/VPC/CustomerGateway/namespace.yaml b/src/plugin/metrics/VPC/CustomerGateway/namespace.yaml new file mode 100644 index 0000000..007ef7e --- /dev/null +++ b/src/plugin/metrics/VPC/CustomerGateway/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-vpc-customer-gateway +name: VPC/CustomerGateway +category: ASSET +resource_type: inventory.CloudService:aws.VPC.CustomerGateway +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-vpc.svg' +version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/VPC/EgressOnlyInternetGateway/egress_only_internet_gateway_count.yaml b/src/plugin/metrics/VPC/EgressOnlyInternetGateway/egress_only_internet_gateway_count.yaml new file mode 100644 index 0000000..07c4782 --- /dev/null +++ b/src/plugin/metrics/VPC/EgressOnlyInternetGateway/egress_only_internet_gateway_count.yaml @@ -0,0 +1,24 @@ +--- +metric_id: metric-aws-vpc-egress-only-internet-gateway-count +name: Egress Only Internet Gateway Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.VPC.EgressOnlyInternetGateway +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.attachments.vpc_id + name: VPC ID + - key: data.attachments.state + name: Attachment State + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-vpc-egress-only-internet-gateway +version: '1.0' diff --git a/src/plugin/metrics/VPC/EgressOnlyInternetGateway/namespace.yaml b/src/plugin/metrics/VPC/EgressOnlyInternetGateway/namespace.yaml new file mode 100644 index 0000000..d0711e1 --- /dev/null +++ b/src/plugin/metrics/VPC/EgressOnlyInternetGateway/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-vpc-egress-only-internet-gateway +name: VPC/EgressOnlyInternetGateway +category: ASSET +resource_type: inventory.CloudService:aws.VPC.EgressOnlyInternetGateway +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-vpc.svg' +version: '1.1' diff --git a/src/plugin/metrics/VPC/Endpoint/endpoint_count.yaml b/src/plugin/metrics/VPC/Endpoint/endpoint_count.yaml new file mode 100644 index 0000000..bf6a127 --- /dev/null +++ b/src/plugin/metrics/VPC/Endpoint/endpoint_count.yaml @@ -0,0 +1,24 @@ +--- +metric_id: metric-aws-vpc-endpoint-count +name: Endpoint Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.VPC.Endpoint +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.state + name: State + - key: data.vpc_endpoint_type + name: Endpoint Type + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-vpc-endpoint +version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/VPC/Endpoint/namespace.yaml b/src/plugin/metrics/VPC/Endpoint/namespace.yaml new file mode 100644 index 0000000..f39ebea --- /dev/null +++ b/src/plugin/metrics/VPC/Endpoint/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-vpc-endpoint +name: VPC/Endpoint +category: ASSET +resource_type: inventory.CloudService:aws.VPC.Endpoint +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-vpc.svg' +version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/VPC/InternetGateway/internet_gateway_count.yaml b/src/plugin/metrics/VPC/InternetGateway/internet_gateway_count.yaml new file mode 100644 index 0000000..75bc423 --- /dev/null +++ b/src/plugin/metrics/VPC/InternetGateway/internet_gateway_count.yaml @@ -0,0 +1,24 @@ +--- +metric_id: metric-aws-vpc-internet-gateway-count +name: Internet Gateway Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.VPC.InternetGateway +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.state + name: State + - key: data.attachments.vpc_id + name: VPC ID + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-vpc-internet-gateway +version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/VPC/InternetGateway/namespace.yaml b/src/plugin/metrics/VPC/InternetGateway/namespace.yaml new file mode 100644 index 0000000..9f8f5fc --- /dev/null +++ b/src/plugin/metrics/VPC/InternetGateway/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-vpc-internet-gateway +name: VPC/InternetGateway +category: ASSET +resource_type: inventory.CloudService:aws.VPC.InternetGateway +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-vpc.svg' +version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/VPC/NATGateway/namespace.yaml b/src/plugin/metrics/VPC/NATGateway/namespace.yaml new file mode 100644 index 0000000..b3f0975 --- /dev/null +++ b/src/plugin/metrics/VPC/NATGateway/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-vpc-nat-gateway +name: VPC/NATGateway +category: ASSET +resource_type: inventory.CloudService:aws.VPC.NATGateway +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-vpc.svg' +version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/VPC/NATGateway/nat_gateway_count.yaml b/src/plugin/metrics/VPC/NATGateway/nat_gateway_count.yaml new file mode 100644 index 0000000..7302d9e --- /dev/null +++ b/src/plugin/metrics/VPC/NATGateway/nat_gateway_count.yaml @@ -0,0 +1,24 @@ +--- +metric_id: metric-aws-vpc-nat-gateway-count +name: NAT Gateway Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.VPC.NATGateway +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.state + name: State + - key: data.vpc_id + name: VPC ID + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-vpc-nat-gateway +version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/VPC/NetworkACL/namespace.yaml b/src/plugin/metrics/VPC/NetworkACL/namespace.yaml new file mode 100644 index 0000000..c72449e --- /dev/null +++ b/src/plugin/metrics/VPC/NetworkACL/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-vpc-network-acl +name: VPC/NetworkACL +category: ASSET +resource_type: inventory.CloudService:aws.VPC.NetworkACL +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-vpc.svg' +version: '1.1' diff --git a/src/plugin/metrics/VPC/NetworkACL/network_acl_count.yaml b/src/plugin/metrics/VPC/NetworkACL/network_acl_count.yaml new file mode 100644 index 0000000..b2886fb --- /dev/null +++ b/src/plugin/metrics/VPC/NetworkACL/network_acl_count.yaml @@ -0,0 +1,24 @@ +--- +metric_id: metric-aws-vpc-network-acl-count +name: Network ACL Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.VPC.NetworkACL +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.vpc_id + name: VPC ID + - key: data.is_default + name: Default Network ACL + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-vpc-network-acl +version: '1.0' diff --git a/src/plugin/metrics/VPC/PeeringConnection/namespace.yaml b/src/plugin/metrics/VPC/PeeringConnection/namespace.yaml new file mode 100644 index 0000000..85db8d5 --- /dev/null +++ b/src/plugin/metrics/VPC/PeeringConnection/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-vpc-peering-connection +name: VPC/PeeringConnection +category: ASSET +resource_type: inventory.CloudService:aws.VPC.PeeringConnection +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-vpc.svg' +version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/VPC/PeeringConnection/peering_connection_count.yaml b/src/plugin/metrics/VPC/PeeringConnection/peering_connection_count.yaml new file mode 100644 index 0000000..eea108d --- /dev/null +++ b/src/plugin/metrics/VPC/PeeringConnection/peering_connection_count.yaml @@ -0,0 +1,24 @@ +--- +metric_id: metric-aws-vpc-peering-connection-count +name: Peering Connection Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.VPC.PeeringConnection +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.status.code + name: Status + - key: data.accepter_vpc_info.vpc_id + name: Accepter VPC ID + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-vpc-peering-connection +version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/VPC/RouteTable/namespace.yaml b/src/plugin/metrics/VPC/RouteTable/namespace.yaml new file mode 100644 index 0000000..a94dfaa --- /dev/null +++ b/src/plugin/metrics/VPC/RouteTable/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-vpc-route-table +name: VPC/RouteTable +category: ASSET +resource_type: inventory.CloudService:aws.VPC.RouteTable +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-vpc.svg' +version: '1.1' diff --git a/src/plugin/metrics/VPC/RouteTable/route_table_count.yaml b/src/plugin/metrics/VPC/RouteTable/route_table_count.yaml new file mode 100644 index 0000000..91c47c1 --- /dev/null +++ b/src/plugin/metrics/VPC/RouteTable/route_table_count.yaml @@ -0,0 +1,24 @@ +--- +metric_id: metric-aws-vpc-route-table-count +name: Route Table Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.VPC.RouteTable +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.vpc_id + name: VPC ID + - key: data.associations.main + name: Main Route Table + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-vpc-route-table +version: '1.0' diff --git a/src/plugin/metrics/VPC/Subnet/namespace.yaml b/src/plugin/metrics/VPC/Subnet/namespace.yaml new file mode 100644 index 0000000..aa265c2 --- /dev/null +++ b/src/plugin/metrics/VPC/Subnet/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-vpc-subnet +name: VPC/Subnet +category: ASSET +resource_type: inventory.CloudService:aws.VPC.Subnet +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-vpc.svg' +version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/VPC/Subnet/subnet_count.yaml b/src/plugin/metrics/VPC/Subnet/subnet_count.yaml new file mode 100644 index 0000000..3ba6c4f --- /dev/null +++ b/src/plugin/metrics/VPC/Subnet/subnet_count.yaml @@ -0,0 +1,24 @@ +--- +metric_id: metric-aws-vpc-subnet-count +name: Subnet Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.VPC.Subnet +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.state + name: State + - key: data.availability_zone + name: Availability Zone + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-vpc-subnet +version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/VPC/TransitGateway/namespace.yaml b/src/plugin/metrics/VPC/TransitGateway/namespace.yaml new file mode 100644 index 0000000..053335a --- /dev/null +++ b/src/plugin/metrics/VPC/TransitGateway/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-vpc-transit-gateway +name: VPC/TransitGateway +category: ASSET +resource_type: inventory.CloudService:aws.VPC.TransitGateway +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-vpc.svg' +version: '1.1' diff --git a/src/plugin/metrics/VPC/TransitGateway/transit_gateway_count.yaml b/src/plugin/metrics/VPC/TransitGateway/transit_gateway_count.yaml new file mode 100644 index 0000000..3ab1f05 --- /dev/null +++ b/src/plugin/metrics/VPC/TransitGateway/transit_gateway_count.yaml @@ -0,0 +1,24 @@ +--- +metric_id: metric-aws-vpc-transit-gateway-count +name: Transit Gateway Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.VPC.TransitGateway +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.state + name: State + - key: data.amazon_side_asn + name: Amazon Side ASN + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-vpc-transit-gateway +version: '1.0' diff --git a/src/plugin/metrics/VPC/VPC/namespace.yaml b/src/plugin/metrics/VPC/VPC/namespace.yaml new file mode 100644 index 0000000..27e73fe --- /dev/null +++ b/src/plugin/metrics/VPC/VPC/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-vpc-vpc +name: VPC/VPC +category: ASSET +resource_type: inventory.CloudService:aws.VPC.VPC +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-vpc.svg' +version: '1.1' \ No newline at end of file diff --git a/src/plugin/metrics/VPC/VPC/vpc_count.yaml b/src/plugin/metrics/VPC/VPC/vpc_count.yaml new file mode 100644 index 0000000..a800c40 --- /dev/null +++ b/src/plugin/metrics/VPC/VPC/vpc_count.yaml @@ -0,0 +1,24 @@ +--- +metric_id: metric-aws-vpc-vpc-count +name: VPC Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.VPC.VPC +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.state + name: State + - key: data.is_default + name: Default VPC + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-vpc-vpc +version: '1.0' \ No newline at end of file diff --git a/src/plugin/metrics/VPC/VPNConnection/namespace.yaml b/src/plugin/metrics/VPC/VPNConnection/namespace.yaml new file mode 100644 index 0000000..ebc97a1 --- /dev/null +++ b/src/plugin/metrics/VPC/VPNConnection/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-vpc-vpn-connection +name: VPC/VPNConnection +category: ASSET +resource_type: inventory.CloudService:aws.VPC.VPNConnection +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-vpc.svg' +version: '1.1' diff --git a/src/plugin/metrics/VPC/VPNConnection/vpn_connection_count.yaml b/src/plugin/metrics/VPC/VPNConnection/vpn_connection_count.yaml new file mode 100644 index 0000000..999b741 --- /dev/null +++ b/src/plugin/metrics/VPC/VPNConnection/vpn_connection_count.yaml @@ -0,0 +1,24 @@ +--- +metric_id: metric-aws-vpc-vpn-connection-count +name: VPN Connection Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.VPC.VPNConnection +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.state + name: State + - key: data.type + name: Type + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-vpc-vpn-connection +version: '1.0' diff --git a/src/plugin/metrics/VPC/VPNGateway/namespace.yaml b/src/plugin/metrics/VPC/VPNGateway/namespace.yaml new file mode 100644 index 0000000..a59f6c4 --- /dev/null +++ b/src/plugin/metrics/VPC/VPNGateway/namespace.yaml @@ -0,0 +1,8 @@ +--- +namespace_id: ns-aws-vpc-vpn-gateway +name: VPC/VPNGateway +category: ASSET +resource_type: inventory.CloudService:aws.VPC.VPNGateway +group: aws +icon: 'https://spaceone-custom-assets.s3.ap-northeast-2.amazonaws.com/console-assets/icons/aws-vpc.svg' +version: '1.1' diff --git a/src/plugin/metrics/VPC/VPNGateway/vpn_gateway_count.yaml b/src/plugin/metrics/VPC/VPNGateway/vpn_gateway_count.yaml new file mode 100644 index 0000000..ee1975e --- /dev/null +++ b/src/plugin/metrics/VPC/VPNGateway/vpn_gateway_count.yaml @@ -0,0 +1,24 @@ +--- +metric_id: metric-aws-vpc-vpn-gateway-count +name: VPN Gateway Count +metric_type: GAUGE +resource_type: inventory.CloudService:aws.VPC.VPNGateway +query_options: + group_by: + - key: account + name: Account ID + - key: region_code + name: Region + reference: + resource_type: inventory.Region + reference_key: region_code + - key: data.state + name: State + - key: data.type + name: Type + fields: + value: + operator: count +unit: Count +namespace_id: ns-aws-vpc-vpn-gateway +version: '1.0' diff --git a/src/plugin/model/__init__.py b/src/plugin/model/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/plugin/model/acm/__init__.py b/src/plugin/model/acm/__init__.py new file mode 100644 index 0000000..6de60e6 --- /dev/null +++ b/src/plugin/model/acm/__init__.py @@ -0,0 +1 @@ +from .certificate import Certificate diff --git a/src/plugin/model/acm/certificate.py b/src/plugin/model/acm/certificate.py new file mode 100644 index 0000000..5e73b30 --- /dev/null +++ b/src/plugin/model/acm/certificate.py @@ -0,0 +1,194 @@ +import logging + +from schematics import Model +from schematics.types import ModelType, StringType, DateTimeType, ListType + +_LOGGER = logging.getLogger(__name__) + + +class ResourceRecord(Model): + name = StringType(deserialize_from="Name") + type = StringType(deserialize_from="Type") + value = StringType(deserialize_from="Value") + + +class DomainValidationOptions(Model): + domain_name = StringType(deserialize_from="DomainName") + validation_emails = ListType(StringType, deserialize_from="ValidationEmails") + validation_domain = StringType(deserialize_from="ValidationDomain") + validation_status = StringType( + deserialize_from="ValidationStatus", + choices=("PENDING_VALIDATION", "SUCCESS", "FAILED"), + ) + resource_record = ModelType(ResourceRecord, deserialize_from="ResourceRecord") + validation_method = StringType( + deserialize_from="ValidationMethod", choices=("EMAIL", "DNS") + ) + + +class RenewalSummary(Model): + renewal_status = StringType( + deserialize_from="RenewalStatus", + choices=("PENDING_AUTO_RENEWAL", "PENDING_VALIDATION", "SUCCESS", "FAILED"), + ) + domain_validation_options = ListType( + ModelType(DomainValidationOptions), deserialize_from="DomainValidationOptions" + ) + renewal_status_reason = StringType( + deserialize_from="RenewalStatusReason", + choices=( + "NO_AVAILABLE_CONTACTS", + "ADDITIONAL_VERIFICATION_REQUIRED", + "DOMAIN_NOT_ALLOWED", + "INVALID_PUBLIC_DOMAIN", + "DOMAIN_VALIDATION_DENIED", + "CAA_ERROR", + "PCA_LIMIT_EXCEEDED", + "PCA_INVALID_ARN", + "PCA_INVALID_STATE", + "PCA_REQUEST_FAILED", + "PCA_NAME_CONSTRAINTS_VALIDATION", + "PCA_RESOURCE_NOT_FOUND", + "PCA_INVALID_ARGS", + "PCA_INVALID_DURATION", + "PCA_ACCESS_DENIED", + "SLR_NOT_FOUND", + "OTHER", + ), + ) + updated_at = DateTimeType(deserialize_from="UpdatedAt") + + +class ExtendedKeyUsagesName(Model): + name = StringType( + deserialize_from="Name", + choices=( + "TLS_WEB_SERVER_AUTHENTICATION", + "TLS_WEB_CLIENT_AUTHENTICATION", + "CODE_SIGNING", + "EMAIL_PROTECTION", + "TIME_STAMPING", + "OCSP_SIGNING", + "IPSEC_END_SYSTEM", + "IPSEC_TUNNEL", + "IPSEC_USER", + "ANY", + "NONE", + "CUSTOM", + ), + ) + oid = StringType(deserialize_from="OID") + + +class KeyUsagesName(Model): + name = StringType( + deserialize_from="Name", + choices=( + "DIGITAL_SIGNATURE", + "NON_REPUDIATION", + "KEY_ENCIPHERMENT", + "DATA_ENCIPHERMENT", + "KEY_AGREEMENT", + "KEY_CERT_SIGN", + "CRL_SIGN", + "ENCIPHER_ONLY", + "DECIPHER_ONLY", + "ANY", + "CUSTOM", + ), + ) + + +class Options(Model): + certificate_transparency_logging_preference = StringType(deserialize_from="CertificateTransparencyLoggingPreference", + choices=('ENABLED', 'DISABLED')) + + +class Certificate(Model): + certificate_arn = StringType(deserialize_from="CertificateArn") + identifier = StringType() + domain_name = StringType(deserialize_from="DomainName") + subject_alternative_names = ListType(StringType, deserialize_from="SubjectAlternativeNames") + additional_names_display = ListType(StringType) + domain_validation_options = ListType(ModelType(DomainValidationOptions), deserialize_from="DomainValidationOptions") + serial = StringType(deserialize_from="Serial") + subject = StringType(deserialize_from="Subject") + issuer = StringType(deserialize_from="Issuer") + created_at = DateTimeType(deserialize_from="CreatedAt") + issued_at = DateTimeType(deserialize_from="IssuedAt") + imported_at = DateTimeType(deserialize_from="ImportedAt") + status = StringType( + deserialize_from="Status", + choices=( + 'PENDING_VALIDATION', + 'ISSUED', + 'INACTIVE', + 'EXPIRED', + 'VALIDATION_TIMED_OUT', + 'REVOKED', + 'FAILED' + ) + ) + revoked_at = DateTimeType(deserialize_from="RevokedAt") + revocation_reason = StringType( + deserialize_from="RevocationReason", + choices=( + 'UNSPECIFIED', + 'KEY_COMPROMISE', + 'CA_COMPROMISE', + 'AFFILIATION_CHANGED', + 'SUPERCEDED', + 'CESSATION_OF_OPERATION', + 'CERTIFICATE_HOLD', + 'REMOVE_FROM_CRL', + 'PRIVILEGE_WITHDRAWN', + 'A_A_COMPROMISE' + ) + ) + not_before = DateTimeType(deserialize_from="NotBefore") + not_after = DateTimeType(deserialize_from="NotAfter") + key_algorithm = StringType( + deserialize_from="KeyAlgorithm", + choices=( + 'RSA_2048', + 'RSA_1024', + 'RSA_4096', + 'EC_prime256v1', + 'EC_secp384r1', + 'EC_secp521r1' + ) + ) + signature_algorithm = StringType(deserialize_from="SignatureAlgorithm") + in_use_by = ListType(StringType, deserialize_from="InUseBy") + in_use_display = StringType(choices=('Yes', 'No')) + failure_reason = StringType( + deserialize_from="FailureReason", + choices=( + 'NO_AVAILABLE_CONTACTS', + 'ADDITIONAL_VERIFICATION_REQUIRED', + 'DOMAIN_NOT_ALLOWED', + 'INVALID_PUBLIC_DOMAIN', + 'DOMAIN_VALIDATION_DENIED', + 'CAA_ERROR', + 'PCA_LIMIT_EXCEEDED', + 'PCA_INVALID_ARN', + 'PCA_INVALID_STATE', + 'PCA_REQUEST_FAILED', + 'PCA_NAME_CONSTRAINTS_VALIDATION', + 'PCA_RESOURCE_NOT_FOUND', + 'PCA_INVALID_ARGS', + 'PCA_INVALID_DURATION', + 'PCA_ACCESS_DENIED', + 'SLR_NOT_FOUND', + 'OTHER' + ) + ) + type = StringType(deserialize_from="Type", choices=('IMPORTED', 'AMAZON_ISSUED', 'PRIVATE')) + type_display = StringType() + renewal_summary = ModelType(RenewalSummary, deserialize_from="RenewalSummary") + key_usages = ListType(ModelType(KeyUsagesName), deserialize_from="KeyUsages") + extended_key_usages = ListType(ModelType(ExtendedKeyUsagesName), deserialize_from="ExtendedKeyUsages") + certificate_authority_arn = StringType(deserialize_from="CertificateAuthorityArn", serialize_when_none=False) + renewal_eligibility = StringType(deserialize_from="RenewalEligibility", choices=("ELIGIBLE", "INELIGIBLE")) + renewal_eligibility_display = StringType() + options = ModelType(Options, deserialize_from="Options") diff --git a/src/plugin/model/api_gateway/__init__.py b/src/plugin/model/api_gateway/__init__.py new file mode 100644 index 0000000..ca6e524 --- /dev/null +++ b/src/plugin/model/api_gateway/__init__.py @@ -0,0 +1 @@ +from .api_gateway import HTTPWebsocket, RestAPI \ No newline at end of file diff --git a/src/plugin/model/api_gateway/api_gateway.py b/src/plugin/model/api_gateway/api_gateway.py new file mode 100644 index 0000000..30beb69 --- /dev/null +++ b/src/plugin/model/api_gateway/api_gateway.py @@ -0,0 +1,141 @@ +import logging + +from schematics import Model +from schematics.types import ( + ModelType, + StringType, + IntType, + DateTimeType, + ListType, + BooleanType, + DictType, +) + +_LOGGER = logging.getLogger(__name__) + +''' +HTTP WEBSOCKET +''' +class CorsConfiguration(Model): + allow_credentials = BooleanType(deserialize_from="AllowCredentials", serialize_when_none=False) + allow_headers = ListType(StringType, deserialize_from="AllowHeaders", serialize_when_none=False) + allow_methods = ListType(StringType, deserialize_from="AllowMethods", serialize_when_none=False) + allow_origins = ListType(StringType, deserialize_from="AllowOrigins", serialize_when_none=False) + expose_headers = ListType(StringType, deserialize_from="ExposeHeaders", serialize_when_none=False) + max_age = IntType(deserialize_from="MaxAge", serialize_when_none=False) + + +class HTTPWebsocket(Model): + arn = StringType() + name = StringType(deserialize_from="Name") + api_endpoint = StringType(deserialize_from="ApiEndpoint", serialize_when_none=False) + id = StringType(deserialize_from="ApiId") + protocol = StringType(choices=('REST', 'HTTP', 'WEBSOCKET')) + endpoint_type = StringType() + api_key_selection_expression = StringType(deserialize_from="ApiKeySelectionExpression", serialize_when_none=False) + cors_configuration = ModelType(CorsConfiguration, deserialize_from="CorsConfiguration", serialize_when_none=False) + created_date = DateTimeType(deserialize_from="CreatedDate", serialize_when_none=False) + description = StringType(deserialize_from="Description", default="") + disable_schema_validation = BooleanType(deserialize_from="DisableSchemaValidation", serialize_when_none=False) + import_info = ListType(StringType,deserialize_from="ImportInfo", serialize_when_none=False) + protocol_type = StringType(deserialize_from="ProtocolType", choices=("WEBSOCKET", "HTTP")) + route_selection_expression = StringType(deserialize_from="RouteSelectionExpression", serialize_when_none=False) + version = StringType(deserialize_from="Version", serialize_when_none=False) + warnings = ListType(StringType, deserialize_from="Warnings", serialize_when_none=False) + launched_at = DateTimeType(deserialize_from="CreatedDate", serialize_when_none=False) + + def reference(self, region_code): + return { + "resource_id": self.arn, + "external_link": f"https://console.aws.amazon.com/apigateway/home?region={region_code}#/apis/{self.id}/routes" + } + +''' +REST API +''' +class EndpointConfiguration(Model): + types = ListType(StringType, deserialize_from="types", choices=("REGIONAL", "EDGE", "PRIVATE")) + vpc_endpoint_ids = ListType(StringType, deserialize_from="vpcEndpointIds", serialize_when_none=False) + + +class IntegrationResponsesInfo(Model): + status_code = StringType(deserialize_from="statusCode", serialize_when_none=False) + selection_pattern = StringType(deserialize_from="selectionPattern", serialize_when_none=False) + response_parameters = DictType(StringType, deserialize_from="responseParameters", serialize_when_none=False) + response_templates = DictType(StringType, deserialize_from="responseTemplates", serialize_when_none=False) + content_handling = StringType(deserialize_from="contentHandling", choices=("CONVERT_TO_BINARY", "CONVERT_TO_TEXT")) + + +class IntegrationResponses(Model): + method = ModelType(IntegrationResponsesInfo, deserialize_from="string", serialize_when_none=False) + + +class MethodIntegration(Model): + type = StringType(deserialize_from="type", choices=("HTTP", "AWS", "MOCK", "HTTP_PROXY", "AWS_PROXY")) + http_method = StringType(deserialize_from="httpMethod", serialize_when_none=False) + uri = StringType(deserialize_from="uri", serialize_when_none=False) + connection_type = StringType(deserialize_from="connectionType", choices=("INTERNET", "VPC_LINK")) + connection_id = StringType(deserialize_from="connectionId", serialize_when_none=False) + credentials = StringType(deserialize_from="credentials", serialize_when_none=False) + request_parameters = DictType(StringType, deserialize_from="requestParameters", serialize_when_none=False) + request_templates = DictType(StringType, deserialize_from="requestTemplates", serialize_when_none=False) + passthrough_behavior = StringType(deserialize_from="passthroughBehavior", serialize_when_none=False) + content_handling = StringType(deserialize_from="contentHandling", choices=("CONVERT_TO_BINARY", "CONVERT_TO_TEXT")) + timeout_in_millis = IntType(deserialize_from="timeoutInMillis", serialize_when_none=False) + cache_namespace = StringType(deserialize_from="cacheNamespace", serialize_when_none=False) + cache_key_parameters = ListType(StringType, deserialize_from="cacheKeyParameters", serialize_when_none=False) + integration_responses = ModelType(IntegrationResponses, deserialize_from="integrationResponses", + serialize_when_none=False) + + +class MethodResponsesInfo(Model): + status_code = StringType(deserialize_from="statusCode", serialize_when_none=False) + response_parameters = DictType(BooleanType, deserialize_from="responseParameters", serialize_when_none=False) + response_models = DictType(StringType, deserialize_from="responseModels", serialize_when_none=False) + + +class MethodResponses(Model): + method = ModelType(MethodResponsesInfo, deserialize_from="string", serialize_when_none=False) + + +class ResourceMethodInfo(Model): + http_method = StringType(deserialize_from="httpMethod", serialize_when_none=False) + authorization_type = StringType(deserialize_from="authorizationType", serialize_when_none=False) + authorizer_id = StringType(deserialize_from="authorizerId", serialize_when_none=False) + api_key_required = BooleanType(deserialize_from="apiKeyRequired", serialize_when_none=False) + request_validator_id = StringType(deserialize_from="requestValidatorId", serialize_when_none=False) + operation_name = StringType(deserialize_from="operationName", serialize_when_none=False) + request_parameters = DictType(BooleanType, deserialize_from="requestParameters", serialize_when_none=False) + request_models = DictType(StringType, deserialize_from="requestModels", serialize_when_none=False) + method_responses = ModelType(MethodResponses, deserialize_from="methodResponses", serialize_when_none=False) + method_integration = ModelType(MethodIntegration, deserialize_from="methodIntegration", serialize_when_none=False) + authorization_scopes = ListType(StringType, deserialize_from="authorizationScopes", serialize_when_none=False) + + +class Resource(Model): + id = StringType(deserialize_from="id") + parent_id = StringType(deserialize_from="parentId", serialize_when_none=False) + path_part = StringType(deserialize_from="pathPart", serialize_when_none=False) + path = StringType(deserialize_from="path", serialize_when_none=False) + display_methods = ListType(StringType(), default=[]) + resource_methods = DictType(ModelType(ResourceMethodInfo), deserialize_from="resourceMethods", default={}) + + +class RestAPI(Model): + arn = StringType(default="") + id = StringType(deserialize_from="id") + name = StringType(deserialize_from="name") + protocol = StringType(choices=('REST', 'HTTP', 'WEBSOCKET')) + endpoint_type = StringType() + description = StringType(deserialize_from="description", default="") + created_date = DateTimeType(deserialize_from="createdDate", serialize_when_none=False) + version = StringType(deserialize_from="version", serialize_when_none=False) + warnings = ListType(StringType, deserialize_from="warnings", serialize_when_none=False) + binary_media_types = ListType(StringType, deserialize_from="binaryMediaTypes", serialize_when_none=False) + minimum_compression_size = IntType(deserialize_from="minimumCompressionSize", serialize_when_none=False) + api_key_source = StringType(deserialize_from="apiKeySource", choices=("HEADER", "AUTHORIZER")) + endpoint_configuration = ModelType(EndpointConfiguration, deserialize_from="endpointConfiguration", + serialize_when_none=False) + policy = StringType(deserialize_from="policy", serialize_when_none=False) + resources = ListType(ModelType(Resource), default=[]) + launched_at = DateTimeType(deserialize_from="CreatedDate", serialize_when_none=False) diff --git a/src/plugin/model/cloudfront/__init__.py b/src/plugin/model/cloudfront/__init__.py new file mode 100644 index 0000000..5b957f0 --- /dev/null +++ b/src/plugin/model/cloudfront/__init__.py @@ -0,0 +1 @@ +from .distribution import Distribution diff --git a/src/plugin/model/cloudfront/distribution.py b/src/plugin/model/cloudfront/distribution.py new file mode 100644 index 0000000..d6051b4 --- /dev/null +++ b/src/plugin/model/cloudfront/distribution.py @@ -0,0 +1,473 @@ +import logging + +from schematics import Model +from schematics.types import ( + ModelType, + StringType, + IntType, + DateTimeType, + ListType, + BooleanType, +) + +_LOGGER = logging.getLogger(__name__) + + +class CustomHeadersItems(Model): + header_name = StringType(deserialize_from="HeaderName") + header_value = StringType(deserialize_from="HeaderValue") + + +class CustomHeaders(Model): + quantity = IntType(deserialize_from="Quantity") + items = ListType( + ModelType(CustomHeadersItems), + deserialize_from="Items", + serialize_when_none=False, + ) + + +class S3OriginConfig(Model): + origin_access_identity = StringType( + deserialize_from="OriginAccessIdentity", serialize_when_none=False + ) + + +class OriginSslProtocols(Model): + quantity = IntType(deserialize_from="Quantity") + items = ListType( + StringType, + deserialize_from="Items", + choices=("SSLv3", "TLSv1", "TLSv1.1", "TLSv1.2"), + ) + + +class CustomOriginConfig(Model): + http_port = IntType(deserialize_from="HTTPPort", serialize_when_none=False) + https_port = IntType(deserialize_from="HTTPSPort", serialize_when_none=False) + origin_protocol_policy = StringType( + deserialize_from="OriginProtocolPolicy", + choices=("http-only", "match-viewer", "https-only"), + ) + origin_ssl_protocols = ModelType( + OriginSslProtocols, + deserialize_from="OriginSslProtocols", + serialize_when_none=False, + ) + origin_read_timeout = IntType( + deserialize_from="OriginReadTimeout", serialize_when_none=False + ) + origin_keepalive_timeout = IntType( + deserialize_from="OriginKeepaliveTimeout", serialize_when_none=False + ) + + +class OriginShield(Model): + enabled = BooleanType(deserialize_from="Enabled") + origin_shield_region = StringType( + deserialize_from="OriginShieldRegion", serialize_when_none=False + ) + + +class OriginsItems(Model): + id = StringType(deserialize_from="Id") + domain_name = StringType(deserialize_from="DomainName", serialize_when_none=False) + origin_path = StringType(deserialize_from="OriginPath", serialize_when_none=False) + custom_headers = ModelType( + CustomHeaders, deserialize_from="CustomHeaders", serialize_when_none=False + ) + s3_origin_config = ModelType( + S3OriginConfig, deserialize_from="S3OriginConfig", serialize_when_none=False + ) + custom_origin_config = ModelType( + CustomOriginConfig, + deserialize_from="CustomOriginConfig", + serialize_when_none=False, + ) + connection_attempts = IntType( + deserialize_from="ConnectionAttempts", serialize_when_none=False + ) + connection_timeout = IntType( + deserialize_from="ConnectionTimeout", serialize_when_none=False + ) + origin_shield = ModelType( + OriginShield, deserialize_from="OriginShield", serialize_when_none=False + ) + + +class Origins(Model): + quantity = IntType(deserialize_from="Quantity") + items = ListType( + ModelType(OriginsItems), deserialize_from="Items", serialize_when_none=False + ) + + +class StatusCodes(Model): + quantity = IntType(deserialize_from="Quantity") + items = ListType(IntType, deserialize_from="Items", serialize_when_none=False) + + +class FailoverCriteria(Model): + status_codes = ModelType( + StatusCodes, deserialize_from="StatusCodes", serialize_when_none=False + ) + + +class MembersItems(Model): + origin_id = StringType(deserialize_from="OriginId", serialize_when_none=False) + + +class Members(Model): + quantity = IntType(deserialize_from="Quantity") + items = ListType( + ModelType(MembersItems), deserialize_from="Items", serialize_when_none=False + ) + + +class OriginGroupsItems(Model): + id = StringType(deserialize_from="Id") + failover_criteria = ModelType( + FailoverCriteria, deserialize_from="FailoverCriteria", serialize_when_none=False + ) + members = ModelType(Members, deserialize_from="Members", serialize_when_none=False) + + +class OriginGroups(Model): + quantity = IntType(deserialize_from="Quantity") + items = ListType( + ModelType(OriginGroupsItems), + deserialize_from="Items", + serialize_when_none=False, + ) + + +class WhitelistedNames(Model): + quantity = IntType(deserialize_from="Quantity") + items = ListType(StringType, deserialize_from="Items", serialize_when_none=False) + + +class Cookies(Model): + forward = StringType( + deserialize_from="Forward", choices=("none", "whitelist", "all") + ) + whitelisted_names = ModelType( + WhitelistedNames, deserialize_from="WhitelistedNames", serialize_when_none=False + ) + + +class Headers(Model): + quantity = IntType(deserialize_from="Quantity") + items = ListType(StringType, deserialize_from="Items", serialize_when_none=False) + + +class QueryStringCacheKeys(Model): + quantity = IntType(deserialize_from="Quantity") + items = ListType(StringType, deserialize_from="Items", serialize_when_none=False) + + +class ForwardedValues(Model): + query_string = BooleanType( + deserialize_from="QueryString", serialize_when_none=False + ) + cookies = ModelType(Cookies, deserialize_from="Cookies", serialize_when_none=False) + headers = ModelType(Headers, deserialize_from="Headers", serialize_when_none=False) + query_string_cache_keys = ModelType( + QueryStringCacheKeys, + deserialize_from="QueryStringCacheKeys", + serialize_when_none=False, + ) + + +class TrustedSigners(Model): + enabled = BooleanType(deserialize_from="Enabled") + quantity = IntType(deserialize_from="Quantity", serialize_when_none=False) + items = ListType(StringType, deserialize_from="Items", serialize_when_none=False) + + +class TrustedKeyGroups(Model): + enabled = BooleanType(deserialize_from="Enabled") + quantity = IntType(deserialize_from="Quantity", serialize_when_none=False) + items = ListType(StringType, deserialize_from="Items", serialize_when_none=False) + + +class CachedMethods(Model): + quantity = IntType(deserialize_from="Quantity") + items = ListType( + StringType, + deserialize_from="Items", + choices=("GET", "HEAD", "POST", "PUT", "PATCH", "OPTIONS", "DELETE"), + ) + + +class AllowedMethods(Model): + quantity = IntType(deserialize_from="Quantity") + items = ListType( + StringType, + deserialize_from="Items", + choices=("GET", "HEAD", "POST", "PUT", "PATCH", "OPTIONS", "DELETE"), + ) + cached_methods = ModelType( + CachedMethods, deserialize_from="CachedMethods", serialize_when_none=False + ) + + +class LambdaFunctionAssociationsItems(Model): + lambda_function_arn = StringType( + deserialize_from="LambdaFunctionARN", serialize_when_none=False + ) + event_type = StringType( + deserialize_from="EventType", + choices=( + "viewer-request", + "viewer-response", + "origin-request", + "origin-response", + ), + ) + include_body = BooleanType( + deserialize_from="IncludeBody", serialize_when_none=False + ) + + +class LambdaFunctionAssociations(Model): + quantity = IntType(deserialize_from="Quantity") + items = ListType( + ModelType(LambdaFunctionAssociationsItems), + deserialize_from="Items", + serialize_when_none=False, + ) + + +class DefaultCacheBehavior(Model): + target_origin_id = StringType( + deserialize_from="TargetOriginId", serialize_when_none=False + ) + trusted_signers = ModelType( + TrustedSigners, deserialize_from="TrustedSigners", serialize_when_none=False + ) + trusted_key_groups = ModelType( + TrustedKeyGroups, deserialize_from="TrustedKeyGroups", serialize_when_none=False + ) + viewer_protocol_policy = StringType( + deserialize_from="ViewerProtocolPolicy", + choices=("allow-all", "https-only", "redirect-to-https"), + ) + allowed_methods = ModelType( + AllowedMethods, deserialize_from="AllowedMethods", serialize_when_none=False + ) + smooth_streaming = BooleanType( + deserialize_from="SmoothStreaming", serialize_when_none=False + ) + compress = BooleanType(deserialize_from="Compress", serialize_when_none=False) + lambda_function_associations = ModelType( + LambdaFunctionAssociations, + deserialize_from="LambdaFunctionAssociations", + serialize_when_none=False, + ) + field_level_encryption_id = StringType( + deserialize_from="FieldLevelEncryptionId", serialize_when_none=False + ) + realtime_log_config_arn = StringType( + deserialize_from="RealtimeLogConfigArn", serialize_when_none=False + ) + cache_policy_id = StringType( + deserialize_from="CachePolicyId", serialize_when_none=False + ) + origin_request_policy_id = StringType( + deserialize_from="OriginRequestPolicyId", serialize_when_none=False + ) + forwarded_values = ModelType( + ForwardedValues, deserialize_from="ForwardedValues", serialize_when_none=False + ) + min_ttl = IntType(deserialize_from="MinTTL", serialize_when_none=False) + default_ttl = IntType(deserialize_from="DefaultTTL", serialize_when_none=False) + max_ttl = IntType(deserialize_from="MaxTTL", serialize_when_none=False) + + +class CacheBehaviorsItems(Model): + path_pattern = StringType(deserialize_from="PathPattern", serialize_when_none=False) + target_origin_id = StringType( + deserialize_from="TargetOriginId", serialize_when_none=False + ) + trusted_signers = ModelType( + TrustedSigners, deserialize_from="TrustedSigners", serialize_when_none=False + ) + trusted_key_groups = ModelType( + TrustedKeyGroups, deserialize_from="TrustedKeyGroups", serialize_when_none=False + ) + viewer_protocol_policy = StringType( + deserialize_from="ViewerProtocolPolicy", + choices=("allow-all", "https-only", "redirect-to-https"), + ) + allowed_methods = ModelType( + AllowedMethods, deserialize_from="AllowedMethods", serialize_when_none=False + ) + smooth_streaming = BooleanType( + deserialize_from="SmoothStreaming", serialize_when_none=False + ) + compress = BooleanType(deserialize_from="Compress", serialize_when_none=False) + lambda_function_associations = ModelType( + LambdaFunctionAssociations, + deserialize_from="LambdaFunctionAssociations", + serialize_when_none=False, + ) + field_level_encryption_id = StringType( + deserialize_from="FieldLevelEncryptionId", serialize_when_none=False + ) + realtime_log_config_arn = StringType( + deserialize_from="RealtimeLogConfigArn", serialize_when_none=False + ) + cache_policy_id = StringType( + deserialize_from="CachePolicyId", serialize_when_none=False + ) + origin_request_policy_id = StringType( + deserialize_from="OriginRequestPolicyId", serialize_when_none=False + ) + forwarded_values = ModelType( + ForwardedValues, deserialize_from="ForwardedValues", serialize_when_none=False + ) + min_ttl = IntType(deserialize_from="MinTTL", serialize_when_none=False) + default_ttl = IntType(deserialize_from="DefaultTTL", serialize_when_none=False) + max_ttl = IntType(deserialize_from="MaxTTL", serialize_when_none=False) + + +class CacheBehaviors(Model): + quantity = IntType(deserialize_from="Quantity") + items = ListType( + ModelType(CacheBehaviorsItems), + deserialize_from="Items", + serialize_when_none=False, + ) + + +class CustomErrorResponsesItems(Model): + error_code = IntType(deserialize_from="ErrorCode", serialize_when_none=False) + response_page_path = StringType( + deserialize_from="ResponsePagePath", serialize_when_none=False + ) + response_code = StringType( + deserialize_from="ResponseCode", serialize_when_none=False + ) + error_caching_min_ttl = IntType( + deserialize_from="ErrorCachingMinTTL", serialize_when_none=False + ) + + +class CustomErrorResponses(Model): + quantity = IntType(deserialize_from="Quantity") + items = ListType( + ModelType(CustomErrorResponsesItems), + deserialize_from="Items", + serialize_when_none=False, + ) + + +class GeoRestriction(Model): + restriction_type = StringType( + deserialize_from="RestrictionType", choices=("blacklist", "whitelist", "none") + ) + quantity = IntType(deserialize_from="Quantity") + items = ListType(StringType, deserialize_from="Items", serialize_when_none=False) + + +class Restrictions(Model): + geo_restriction = ModelType( + GeoRestriction, deserialize_from="GeoRestriction", serialize_when_none=False + ) + + +class AliasICPRecordals(Model): + cname = StringType(deserialize_from="CNAME", serialize_when_none=False) + icp_recordal_status = StringType( + deserialize_from="ICPRecordalStatus", + choices=("APPROVED", "SUSPENDED", "PENDING"), + ) + + +class Alias(Model): + quantity = IntType(deserialize_from="Quantity") + Items = ListType(StringType, deserialize_from="Items", serialize_when_none=False) + + +class ViewerCertificate(Model): + cloud_front_default_certificate = BooleanType( + deserialize_from="CloudFrontDefaultCertificate", serialize_when_none=False + ) + iam_certificate_id = StringType( + deserialize_from="IAMCertificateId", serialize_when_none=False + ) + acm_certificate_arn = StringType( + deserialize_from="ACMCertificateArn", serialize_when_none=False + ) + ssl_support_method = StringType( + deserialize_from="SSLSupportMethod", choices=("sni-only", "vip", "static-ip") + ) + minimum_protocol_version = StringType( + deserialize_from="MinimumProtocolVersion", + choices=( + "SSLv3", + "TLSv1", + "TLSv1_2016", + "TLSv1.1_2016", + "TLSv1.2_2018", + "TLSv1.2_2019", + "TLSv1.2_2021", + ), + ) + certificate = StringType(deserialize_from="Certificate", serialize_when_none=False) + certificate_source = StringType( + deserialize_from="CertificateSource", choices=("cloudfront", "iam", "acm") + ) + + +class DistributionData(Model): + id = StringType(deserialize_from="Id") + arn = StringType(deserialize_from="ARN") + status = StringType(deserialize_from="Status") + last_modified_time = DateTimeType(deserialize_from="LastModifiedTime") + domain_name = StringType(deserialize_from="DomainName", serialize_when_none=False) + aliases = ModelType(Alias, deserialize_from="Aliases", serialize_when_none=False) + origins = ModelType(Origins, deserialize_from="Origins", serialize_when_none=False) + origin_groups = ModelType( + OriginGroups, deserialize_from="OriginGroups", serialize_when_none=False + ) + default_cache_behavior = ModelType( + DefaultCacheBehavior, + deserialize_from="DefaultCacheBehavior", + serialize_when_none=False, + ) + cache_behavior = ModelType( + CacheBehaviors, deserialize_from="CacheBehaviors", serialize_when_none=False + ) + custom_error_responses = ModelType( + CustomErrorResponses, + deserialize_from="CustomErrorResponses", + serialize_when_none=False, + ) + comment = StringType(deserialize_from="Comment", serialize_when_none=False) + price_class = StringType( + deserialize_from="PriceClass", + choices=("PriceClass_100", "PriceClass_200", "PriceClass_All"), + ) + enabled = BooleanType(deserialize_from="Enabled", serialize_when_none=False) + state_display = StringType(choices=("Enabled", "Disabled")) + viewer_certificate = ModelType( + ViewerCertificate, + deserialize_from="ViewerCertificate", + serialize_when_none=False, + ) + restrictions = ModelType( + Restrictions, deserialize_from="Restrictions", serialize_when_none=False + ) + web_acl_id = StringType(deserialize_from="WebACLId", serialize_when_none=False) + http_version = StringType( + deserialize_from="HttpVersion", choices=("http1.1", "http2") + ) + is_ipv6_enabled = BooleanType( + deserialize_from="IsIPV6Enabled", serialize_when_none=False + ) + alias_icp_recordals = ListType( + ModelType(AliasICPRecordals), + deserialize_from="AliasICPRecordals", + serialize_when_none=False, + ) diff --git a/src/plugin/model/cloudtrail/__init__.py b/src/plugin/model/cloudtrail/__init__.py new file mode 100644 index 0000000..2b93d1e --- /dev/null +++ b/src/plugin/model/cloudtrail/__init__.py @@ -0,0 +1 @@ +from .trail import Trail diff --git a/src/plugin/model/cloudtrail/trail.py b/src/plugin/model/cloudtrail/trail.py new file mode 100644 index 0000000..d416b5b --- /dev/null +++ b/src/plugin/model/cloudtrail/trail.py @@ -0,0 +1,55 @@ +import logging +from schematics import Model +from schematics.types import ModelType, StringType, ListType, BooleanType, DateTimeType + +_LOGGER = logging.getLogger(__name__) + + +''' +INSIGHT SELECTOR +''' +class InsightSelector(Model): + insight_type = StringType(deserialize_from="InsightType", serialize_when_none=False) + + +''' +EVENT SELECTOR +''' +class EventSelectorDataResources(Model): + type = StringType(deserialize_from="Type", serialize_when_none=False) + values = ListType(StringType, deserialize_from="Values", serialize_when_none=False) + + +class EventSelector(Model): + read_write_type = StringType(deserialize_from="ReadWriteType", serialize_when_none=False, + choices=("ReadOnly", "WriteOnly", "All"), ) + include_management_events = BooleanType(deserialize_from="IncludeManagementEvents", + serialize_when_none=False) + data_resources = ListType(ModelType(EventSelectorDataResources), deserialize_from="DataResources", + serialize_when_none=False) + exclude_management_event_sources = ListType(StringType, deserialize_from="ExcludeManagementEventSources", + serialize_when_none=False) + + +''' +TRAIL +''' +class Trail(Model): + name = StringType(deserialize_from="Name", serialize_when_none=False) + s3_bucket_name = StringType(deserialize_from="S3BucketName", serialize_when_none=False) + s3_key_prefix = StringType(deserialize_from="S3KeyPrefix", serialize_when_none=False) + sns_topic_name = StringType(deserialize_from="SnsTopicName", serialize_when_none=False) + sns_topic_arn = StringType(deserialize_from="SnsTopicARN", serialize_when_none=False) + include_global_service_events = BooleanType(deserialize_from="IncludeGlobalServiceEvents", serialize_when_none=False) + is_multi_region_trail = BooleanType(deserialize_from="IsMultiRegionTrail", serialize_when_none=False) + home_region = StringType(deserialize_from="HomeRegion", serialize_when_none=False) + trail_arn = StringType(deserialize_from="TrailARN", serialize_when_none=False) + log_file_validation_enabled = BooleanType(deserialize_from="LogFileValidationEnabled", serialize_when_none=False) + cloud_watch_logs_log_group_arn = StringType(deserialize_from="CloudWatchLogsLogGroupArn", serialize_when_none=False) + cloud_watch_logs_role_arn = StringType(deserialize_from="CloudWatchLogsRoleArn", serialize_when_none=False) + kms_key_id = StringType(deserialize_from="KmsKeyId", serialize_when_none=False) + has_custom_event_selectors = BooleanType(deserialize_from="HasCustomEventSelectors", serialize_when_none=False) + has_insight_selectors = BooleanType(deserialize_from="HasInsightSelectors", serialize_when_none=False) + is_organization_trail = BooleanType(deserialize_from="IsOrganizationTrail", serialize_when_none=False) + event_selectors = ListType(ModelType(EventSelector), serialize_when_none=False) + insight_selectors = ModelType(InsightSelector, serialize_when_none=False) diff --git a/src/plugin/model/cloudwatch/__init__.py b/src/plugin/model/cloudwatch/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/plugin/model/cloudwatch/alarms.py b/src/plugin/model/cloudwatch/alarms.py new file mode 100644 index 0000000..85333f0 --- /dev/null +++ b/src/plugin/model/cloudwatch/alarms.py @@ -0,0 +1,47 @@ +import logging + +from schematics import Model +from schematics.types import StringType, ModelType, ListType, DateTimeType + +_LOGGER = logging.getLogger(__name__) + +""" +Alarms +""" + +class Action(Model): + type = StringType(deserialize_from="type") + arn = StringType(deserialize_from="arn") + + +class History(Model): + date = DateTimeType(deserialize_from="date") + type = StringType( + choices=("ConfigurationUpdate", "StateUpdate", "Action"), + deserialize_from="type", + ) + description = StringType(deserialize_from="description") + + +class Alarms(Model): + alarm_arn = StringType(deserialize_from="AlarmArn") + name = StringType(deserialize_from="AlarmName") + state_value = StringType( + choices=("OK", "ALARM", "INSUFFICIENT_DATA"), deserialize_from="StateValue" + ) + state_updated_timestamp = DateTimeType(deserialize_from="StateUpdatedTimestamp") + actions_enabled = StringType(deserialize_from="actions_enabled") + namespace = StringType(deserialize_from="Namespace") + metric_name = StringType(deserialize_from="MetricName") + statistic = StringType( + choices=("SampleCount", "Average", "Sum", "Minimum", "Maximum"), + deserialize_from="Statistic", + ) + period = StringType(deserialize_from="Period") + conditions = StringType(deserialize_from="conditions") + actions = ListType( + ModelType(Action, deserialize_from="action"), deserialize_from="actions" + ) + history = ListType( + ModelType(History, deserialize_from="history"), deserialize_from="history" + ) diff --git a/src/plugin/model/direct_connect/__init__.py b/src/plugin/model/direct_connect/__init__.py new file mode 100644 index 0000000..5878f6e --- /dev/null +++ b/src/plugin/model/direct_connect/__init__.py @@ -0,0 +1,4 @@ +from .connection import Connection +from .lag import LAG +from .virtual_private_gateway import VirtualPrivateGateway +from .direct_connect_gateway import DirectConnectGateway diff --git a/src/plugin/model/direct_connect/connection.py b/src/plugin/model/direct_connect/connection.py new file mode 100644 index 0000000..2523a87 --- /dev/null +++ b/src/plugin/model/direct_connect/connection.py @@ -0,0 +1,52 @@ +import logging +from schematics import Model +from schematics.types import ( + StringType, + IntType, + FloatType, + DateTimeType, + ListType, + BooleanType, +) + +_LOGGER = logging.getLogger(__name__) + + +class Connection(Model): + owner_account = StringType(deserialize_from="ownerAccount") + connection_id = StringType(deserialize_from="connectionId") + connection_name = StringType(deserialize_from="connectionName") + connection_state = StringType( + deserialize_from="connectionState", + choices=( + "ordering", + "requested", + "pending", + "available", + "down", + "deleting", + "deleted", + "rejected", + "unknown", + ), + ) + region = StringType(deserialize_from="region") + location = StringType(deserialize_from="location") + bandwidth = StringType(deserialize_from="bandwidth") + bandwidth_gbps = FloatType(serialize_when_none=False) + vlan = IntType(deserialize_from="vlan") + partner_name = StringType(deserialize_from="partnerName") + loa_issue_time = DateTimeType(deserialize_from="loaIssueTime") + lag_id = StringType(deserialize_from="lagId") + aws_device = StringType(deserialize_from="awsDevice") + jumbo_frame_capable = BooleanType(deserialize_from="jumboFrameCapable") + aws_device_v2 = StringType(deserialize_from="awsDeviceV2") + has_logical_redundancy = StringType( + deserialize_from="hasLogicalRedundancy", choices=("unknown", "yes", "no") + ) + tags = StringType(deserialize_from="Tags") + provider_name = StringType(deserialize_from="providerName") + mac_sec_capable = BooleanType(deserialize_from="macSecCapable") + port_encryption_status = StringType(deserialize_from="portEncryptionStatus") + encryption_mode = StringType(deserialize_from="encryptionMode") + mac_sec_keys = StringType(deserialize_from="macSecKeys") diff --git a/src/plugin/model/direct_connect/direct_connect_gateway.py b/src/plugin/model/direct_connect/direct_connect_gateway.py new file mode 100644 index 0000000..1d81948 --- /dev/null +++ b/src/plugin/model/direct_connect/direct_connect_gateway.py @@ -0,0 +1,20 @@ +import logging +from schematics import Model +from schematics.types import StringType, ListType + +_LOGGER = logging.getLogger(__name__) + + +class DirectConnectGateway(Model): + direct_connect_gateway_id = StringType(deserialize_from="directConnectGatewayId") + direct_connect_gateway_name = StringType( + deserialize_from="directConnectGatewayName" + ) + amazon_side_asn = StringType(deserialize_from="amazonSideAsn") + owner_account = StringType(deserialize_from="ownerAccount") + direct_connect_gateway_state = StringType( + deserialize_from="directConnectGatewayState", + choices=("pending", "available", "deleting", "deleted"), + ) + state_change_error = StringType(deserialize_from="stateChangeError") + tags = StringType(deserialize_from="Tags") diff --git a/src/plugin/model/direct_connect/lag.py b/src/plugin/model/direct_connect/lag.py new file mode 100644 index 0000000..36e4ea0 --- /dev/null +++ b/src/plugin/model/direct_connect/lag.py @@ -0,0 +1,48 @@ +import logging +from schematics import Model +from schematics.types import ( + StringType, + IntType, + FloatType, + DateTimeType, + ListType, + BooleanType, +) + +_LOGGER = logging.getLogger(__name__) + + +class LAG(Model): + connections_bandwidth = StringType(deserialize_from="connectionsBandwidth") + number_of_connections = IntType(deserialize_from="numberOfConnections") + lag_id = StringType(deserialize_from="lagId") + owner_account = StringType(deserialize_from="ownerAccount") + lag_name = StringType(deserialize_from="lagName") + lag_state = StringType( + deserialize_from="lagState", + choices=( + "requested", + "pending", + "available", + "down", + "deleting", + "deleted", + "unknown", + ), + ) + location = StringType(deserialize_from="location") + region = StringType(deserialize_from="region") + minimum_links = IntType(deserialize_from="minimumLinks") + aws_device = StringType(deserialize_from="awsDevice") + aws_device_v2 = StringType(deserialize_from="awsDeviceV2") + connections = StringType(deserialize_from="connections") + allows_hosted_connections = BooleanType(deserialize_from="allowsHostedConnections") + jumbo_frame_capable = BooleanType(deserialize_from="jumboFrameCapable") + has_logical_redundancy = StringType( + deserialize_from="hasLogicalRedundancy", choices=("unknown", "yes", "no") + ) + tags = StringType(deserialize_from="Tags") + provider_name = StringType(deserialize_from="providerName") + mac_sec_capable = BooleanType(deserialize_from="macSecCapable") + encryption_mode = StringType(deserialize_from="encryptionMode") + mac_sec_keys = StringType(deserialize_from="macSecKeys") diff --git a/src/plugin/model/direct_connect/virtual_private_gateway.py b/src/plugin/model/direct_connect/virtual_private_gateway.py new file mode 100644 index 0000000..ec94a93 --- /dev/null +++ b/src/plugin/model/direct_connect/virtual_private_gateway.py @@ -0,0 +1,11 @@ +import logging +from schematics import Model +from schematics.types import StringType, ListType + +_LOGGER = logging.getLogger(__name__) + + +class VirtualPrivateGateway(Model): + virtual_gateway_id = StringType(deserialize_from="virtualGatewayId") + virtual_gateway_state = StringType(deserialize_from="virtualGatewayState") + tags = StringType(deserialize_from="Tags") diff --git a/src/plugin/model/documentdb/__init__.py b/src/plugin/model/documentdb/__init__.py new file mode 100644 index 0000000..45157e7 --- /dev/null +++ b/src/plugin/model/documentdb/__init__.py @@ -0,0 +1,3 @@ +from .cluster import Cluster +from .parameter_group import ParameterGroup +from .subnet_group import SubnetGroup diff --git a/src/plugin/model/documentdb/cluster.py b/src/plugin/model/documentdb/cluster.py new file mode 100644 index 0000000..7ae8338 --- /dev/null +++ b/src/plugin/model/documentdb/cluster.py @@ -0,0 +1,57 @@ +import logging +from schematics import Model +from schematics.types import StringType, IntType, DateTimeType, ListType, BooleanType, DictType + +_LOGGER = logging.getLogger(__name__) + + +class Cluster(Model): + availability_zones = ListType(StringType, deserialize_from="AvailabilityZones") + backup_retention_period = IntType(deserialize_from="BackupRetentionPeriod") + db_cluster_identifier = StringType(deserialize_from="DBClusterIdentifier") + db_cluster_parameter_group = StringType(deserialize_from="DBClusterParameterGroup") + db_subnet_group = StringType(deserialize_from="DBSubnetGroup") + status = StringType(deserialize_from="Status") + percent_progress = StringType(deserialize_from="PercentProgress") + earliest_restorable_time = DateTimeType(deserialize_from="EarliestRestorableTime") + endpoint = StringType(deserialize_from="Endpoint") + reader_endpoint = StringType(deserialize_from="ReaderEndpoint") + multi_az = BooleanType(deserialize_from="MultiAZ") + engine = StringType(deserialize_from="Engine") + engine_version = StringType(deserialize_from="EngineVersion") + latest_restorable_time = DateTimeType(deserialize_from="LatestRestorableTime") + port = IntType(deserialize_from="Port") + master_username = StringType(deserialize_from="MasterUsername") + preferred_backup_window = StringType(deserialize_from="PreferredBackupWindow") + preferred_maintenance_window = StringType( + deserialize_from="PreferredMaintenanceWindow" + ) + replication_source_identifier = StringType( + deserialize_from="ReplicationSourceIdentifier" + ) + read_replica_identifiers = ListType( + StringType, deserialize_from="ReadReplicaIdentifiers" + ) + db_cluster_members = StringType(deserialize_from="DBClusterMembers") + vpc_security_groups = StringType(deserialize_from="VpcSecurityGroups") + hosted_zone_id = StringType(deserialize_from="HostedZoneId") + storage_encrypted = BooleanType(deserialize_from="StorageEncrypted") + kms_key_id = StringType(deserialize_from="KmsKeyId") + db_cluster_resource_id = StringType(deserialize_from="DbClusterResourceId") + db_cluster_arn = StringType(deserialize_from="DBClusterArn") + associated_roles = StringType(deserialize_from="AssociatedRoles") + iam_database_authentication_enabled = BooleanType( + deserialize_from="IAMDatabaseAuthenticationEnabled" + ) + clone_group_id = StringType(deserialize_from="CloneGroupId") + cluster_create_time = DateTimeType(deserialize_from="ClusterCreateTime") + copy_tags_to_snapshot = BooleanType(deserialize_from="CopyTagsToSnapshot") + enabled_cloudwatch_logs_exports = ListType( + StringType, deserialize_from="EnabledCloudwatchLogsExports" + ) + deletion_protection = BooleanType(deserialize_from="DeletionProtection") + tags = StringType(deserialize_from="Tags") + instances = ListType(StringType, deserialize_from="instances") + instance_count = IntType(deserialize_from="instance_count") + cloudwatch = DictType(StringType, deserialize_from="cloudwatch") + cloudtrail = DictType(StringType, deserialize_from="cloudtrail") diff --git a/src/plugin/model/documentdb/parameter_group.py b/src/plugin/model/documentdb/parameter_group.py new file mode 100644 index 0000000..c12cb62 --- /dev/null +++ b/src/plugin/model/documentdb/parameter_group.py @@ -0,0 +1,19 @@ +import logging +from schematics import Model +from schematics.types import StringType, ListType, DictType + +_LOGGER = logging.getLogger(__name__) + + +class ParameterGroup(Model): + db_cluster_parameter_group_name = StringType( + deserialize_from="DBClusterParameterGroupName" + ) + db_parameter_group_family = StringType(deserialize_from="DBParameterGroupFamily") + description = StringType(deserialize_from="Description") + db_cluster_parameter_group_arn = StringType( + deserialize_from="DBClusterParameterGroupArn" + ) + tags = StringType(deserialize_from="Tags") + parameters = ListType(DictType, deserialize_from="parameters") + cloudtrail = DictType(StringType, deserialize_from="cloudtrail") diff --git a/src/plugin/model/documentdb/subnet_group.py b/src/plugin/model/documentdb/subnet_group.py new file mode 100644 index 0000000..63254be --- /dev/null +++ b/src/plugin/model/documentdb/subnet_group.py @@ -0,0 +1,18 @@ +import logging +from schematics import Model +from schematics.types import StringType, DictType + +_LOGGER = logging.getLogger(__name__) + + +class SubnetGroup(Model): + db_subnet_group_name = StringType(deserialize_from="DBSubnetGroupName") + db_subnet_group_description = StringType( + deserialize_from="DBSubnetGroupDescription" + ) + vpc_id = StringType(deserialize_from="VpcId") + subnet_group_status = StringType(deserialize_from="SubnetGroupStatus") + subnets = StringType(deserialize_from="Subnets") + db_subnet_group_arn = StringType(deserialize_from="DBSubnetGroupArn") + tags = StringType(deserialize_from="Tags") + cloudtrail = DictType(StringType, deserialize_from="cloudtrail") diff --git a/src/plugin/model/dynamodb/__init__.py b/src/plugin/model/dynamodb/__init__.py new file mode 100644 index 0000000..2ea2d38 --- /dev/null +++ b/src/plugin/model/dynamodb/__init__.py @@ -0,0 +1 @@ +from .table import Table diff --git a/src/plugin/model/dynamodb/table.py b/src/plugin/model/dynamodb/table.py new file mode 100644 index 0000000..0ca628d --- /dev/null +++ b/src/plugin/model/dynamodb/table.py @@ -0,0 +1,41 @@ +import logging +from schematics import Model +from schematics.types import ( + StringType, + IntType, + DateTimeType, + ListType, + BooleanType, + ModelType, DictType, +) + +_LOGGER = logging.getLogger(__name__) + + +class Table(Model): + table_name = StringType(deserialize_from="TableName") + table_status = StringType( + deserialize_from="TableStatus", + choices=( + "CREATING", + "UPDATING", + "DELETING", + "ACTIVE", + "INACCESSIBLE_ENCRYPTION_CREDENTIALS", + "ARCHIVING", + "ARCHIVED", + ), + ) + creation_date_time = DateTimeType(deserialize_from="CreationDateTime") + table_size_bytes = IntType(deserialize_from="TableSizeBytes") + item_count = IntType(deserialize_from="ItemCount") + table_arn = StringType(deserialize_from="TableArn") + table_id = StringType(deserialize_from="TableId") + billing_mode_summary = StringType(deserialize_from="BillingModeSummary") + local_secondary_indexes = StringType(deserialize_from="LocalSecondaryIndexes") + global_secondary_indexes = StringType(deserialize_from="GlobalSecondaryIndexes") + stream_specification = StringType(deserialize_from="StreamSpecification") + sse_description = StringType(deserialize_from="SSEDescription") + tags = StringType(deserialize_from="Tags") + cloudwatch = DictType(StringType, deserialize_from="cloudwatch") + cloudtrail = DictType(StringType, deserialize_from="cloudtrail") diff --git a/src/plugin/model/ebs/__init__.py b/src/plugin/model/ebs/__init__.py new file mode 100644 index 0000000..11499e1 --- /dev/null +++ b/src/plugin/model/ebs/__init__.py @@ -0,0 +1,2 @@ +from .volume import Volume +from .snapshot import Snapshot diff --git a/src/plugin/model/ebs/snapshot.py b/src/plugin/model/ebs/snapshot.py new file mode 100644 index 0000000..329799e --- /dev/null +++ b/src/plugin/model/ebs/snapshot.py @@ -0,0 +1,28 @@ +# import logging +# from schematics import Model +# from schematics.types import StringType, IntType, DateTimeType, ListType, BooleanType +# +# _LOGGER = logging.getLogger(__name__) +# +# +# class Snapshot(Model): +# data_encryption_key_id = StringType(deserialize_from="DataEncryptionKeyId") +# description = StringType(deserialize_from="Description") +# encrypted = BooleanType(deserialize_from="Encrypted") +# kms_key_id = StringType(deserialize_from="KmsKeyId") +# owner_id = StringType(deserialize_from="OwnerId") +# progress = StringType(deserialize_from="Progress") +# snapshot_id = StringType(deserialize_from="SnapshotId") +# start_time = DateTimeType(deserialize_from="StartTime") +# state = StringType( +# deserialize_from="State", choices=("pending", "completed", "error") +# ) +# state_message = StringType(deserialize_from="StateMessage") +# volume_id = StringType(deserialize_from="VolumeId") +# volume_size = IntType(deserialize_from="VolumeSize") +# owner_alias = StringType(deserialize_from="OwnerAlias") +# tags = StringType(deserialize_from="Tags") +# storage_tier = StringType( +# deserialize_from="StorageTier", choices=("archive", "standard") +# ) +# restore_expiry_time = DateTimeType(deserialize_from="RestoreExpiryTime") diff --git a/src/plugin/model/ebs/volume.py b/src/plugin/model/ebs/volume.py new file mode 100644 index 0000000..1d86909 --- /dev/null +++ b/src/plugin/model/ebs/volume.py @@ -0,0 +1,34 @@ +# import logging +# from schematics import Model +# from schematics.types import StringType, IntType, DateTimeType, ListType, BooleanType +# +# _LOGGER = logging.getLogger(__name__) +# +# +# class Volume(Model): +# availability_zone = StringType(deserialize_from="AvailabilityZone") +# create_time = DateTimeType(deserialize_from="CreateTime") +# encrypted = BooleanType(deserialize_from="Encrypted") +# size = IntType(deserialize_from="Size") +# snapshot_id = StringType(deserialize_from="SnapshotId") +# state = StringType( +# deserialize_from="State", +# choices=("creating", "available", "in-use", "deleting", "deleted", "error"), +# ) +# volume_id = StringType(deserialize_from="VolumeId") +# iops = IntType(deserialize_from="Iops") +# tags = StringType(deserialize_from="Tags") +# volume_type = StringType( +# deserialize_from="VolumeType", +# choices=("standard", "io1", "io2", "gp2", "gp3", "sc1", "st1"), +# ) +# fast_restored = BooleanType(deserialize_from="FastRestored") +# multi_attach_enabled = BooleanType(deserialize_from="MultiAttachEnabled") +# throughput = IntType(deserialize_from="Throughput") +# outpost_arn = StringType(deserialize_from="OutpostArn") +# +# def reference(self, region_code): +# return { +# "resource_id": self.volume_id, +# "external_link": f"https://console.aws.amazon.com/ec2/v2/home?region={region_code}#Volumes:search={self.volume_id}", +# } diff --git a/src/plugin/model/ecr/__init__.py b/src/plugin/model/ecr/__init__.py new file mode 100644 index 0000000..a6021fd --- /dev/null +++ b/src/plugin/model/ecr/__init__.py @@ -0,0 +1 @@ +from .repository import Repository, Image diff --git a/src/plugin/model/ecr/repository.py b/src/plugin/model/ecr/repository.py new file mode 100644 index 0000000..76604a1 --- /dev/null +++ b/src/plugin/model/ecr/repository.py @@ -0,0 +1,45 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, ModelType, DictType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class imageScanStatus(Model): + status = StringType(deserialize_from="status", choices=("IN_PROGRESS", "COMPLETE", "FAILED")) + description = StringType(deserialize_from="description") + + +class imageScanFindingsSummary(Model): + image_scan_completed_at = DateTimeType(deserialize_from="imageScanCompletedAt") + vulnerability_source_updated_at = DateTimeType(deserialize_from="vulnerabilitySourceUpdatedAt") + finding_severity_counts = DictType(StringType, deserialize_from="findingSeverityCounts") + + +class Image(Model): + registry_id = StringType(deserialize_from="registryId") + repository_name = StringType(deserialize_from="repositoryName") + image_digest = StringType(deserialize_from="imageDigest") + image_tags = ListType(StringType, deserialize_from="imageTags") + image_tags_display = ListType(StringType) + image_uri = StringType(default='') + image_size_in_bytes = IntType(deserialize_from="imageSizeInBytes") + # image_size_in_megabytes = FloatType() + image_pushed_at = DateTimeType(deserialize_from="imagePushedAt") + image_scan_status = ModelType(imageScanStatus, deserialize_from="imageScanStatus") + image_scan_findings_summary = ModelType(imageScanFindingsSummary, deserialize_from="imageScanFindingsSummary") + + +class imageScanningConfiguration(Model): + scan_on_push = BooleanType(deserialize_from="scanOnPush") + + +class Repository(Model): + repository_arn = StringType(deserialize_from="repositoryArn") + registry_id = StringType(deserialize_from="registryId") + repository_name = StringType(deserialize_from="repositoryName") + repository_uri = StringType(deserialize_from="repositoryUri") + created_at = DateTimeType(deserialize_from="createdAt") + image_tag_mutability = StringType(deserialize_from="imageTagMutability", choices=("MUTABLE", "IMMUTABLE")) + image_scanning_configuration = ModelType(imageScanningConfiguration, deserialize_from="imageScanningConfiguration") + images = ListType(ModelType(Image)) diff --git a/src/plugin/model/ecs/__init__.py b/src/plugin/model/ecs/__init__.py new file mode 100644 index 0000000..758589f --- /dev/null +++ b/src/plugin/model/ecs/__init__.py @@ -0,0 +1 @@ +from .cluster import Cluster diff --git a/src/plugin/model/ecs/cluster.py b/src/plugin/model/ecs/cluster.py new file mode 100644 index 0000000..e8364c0 --- /dev/null +++ b/src/plugin/model/ecs/cluster.py @@ -0,0 +1,33 @@ +import logging +from schematics import Model +from schematics.types import StringType, IntType, DateTimeType, ListType, BooleanType + +_LOGGER = logging.getLogger(__name__) + + +class Cluster(Model): + cluster_arn = StringType(deserialize_from="clusterArn") + cluster_name = StringType(deserialize_from="clusterName") + status = StringType(deserialize_from="status") + running_tasks_count = IntType(deserialize_from="runningTasksCount") + pending_tasks_count = IntType(deserialize_from="pendingTasksCount") + active_services_count = IntType(deserialize_from="activeServicesCount") + registered_container_instances_count = IntType( + deserialize_from="registeredContainerInstancesCount" + ) + running_tasks_count = IntType(deserialize_from="runningTasksCount") + pending_tasks_count = IntType(deserialize_from="pendingTasksCount") + active_services_count = IntType(deserialize_from="activeServicesCount") + registered_container_instances_count = IntType( + deserialize_from="registeredContainerInstancesCount" + ) + capacity_providers = ListType(StringType, deserialize_from="capacityProviders") + default_capacity_provider_strategy = StringType( + deserialize_from="defaultCapacityProviderStrategy" + ) + tags = StringType(deserialize_from="Tags") + settings = StringType(deserialize_from="settings") + statistics = StringType(deserialize_from="statistics") + attachments = StringType(deserialize_from="attachments") + attachments_status = StringType(deserialize_from="attachmentsStatus") + service_connect_defaults = StringType(deserialize_from="serviceConnectDefaults") diff --git a/src/plugin/model/efs/__init__.py b/src/plugin/model/efs/__init__.py new file mode 100644 index 0000000..ba352dd --- /dev/null +++ b/src/plugin/model/efs/__init__.py @@ -0,0 +1 @@ +from .file_system import FileSystem diff --git a/src/plugin/model/efs/file_system.py b/src/plugin/model/efs/file_system.py new file mode 100644 index 0000000..961e37c --- /dev/null +++ b/src/plugin/model/efs/file_system.py @@ -0,0 +1,34 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType + +_LOGGER = logging.getLogger(__name__) + + +class FileSystem(Model): + owner_id = StringType(deserialize_from="OwnerId") + creation_token = StringType(deserialize_from="CreationToken") + file_system_id = StringType(deserialize_from="FileSystemId") + file_system_arn = StringType(deserialize_from="FileSystemArn") + creation_time = DateTimeType(deserialize_from="CreationTime") + life_cycle_state = StringType( + deserialize_from="LifeCycleState", + choices=("creating", "available", "updating", "deleting", "deleted", "error"), + ) + name = StringType(deserialize_from="Name") + number_of_mount_targets = IntType(deserialize_from="NumberOfMountTargets") + size_in_bytes = StringType(deserialize_from="SizeInBytes") + performance_mode = StringType( + deserialize_from="PerformanceMode", choices=("generalPurpose", "maxIO") + ) + encrypted = BooleanType(deserialize_from="Encrypted") + kms_key_id = StringType(deserialize_from="KmsKeyId") + throughput_mode = StringType( + deserialize_from="ThroughputMode", choices=("bursting", "provisioned") + ) + provisioned_throughput_in_mibps = StringType( + deserialize_from="ProvisionedThroughputInMibps" + ) + availability_zone_name = StringType(deserialize_from="AvailabilityZoneName") + availability_zone_id = StringType(deserialize_from="AvailabilityZoneId") + tags = StringType(deserialize_from="Tags") diff --git a/src/plugin/model/eip/__init__.py b/src/plugin/model/eip/__init__.py new file mode 100644 index 0000000..df80076 --- /dev/null +++ b/src/plugin/model/eip/__init__.py @@ -0,0 +1 @@ +from .eip import EIP diff --git a/src/plugin/model/eip/eip.py b/src/plugin/model/eip/eip.py new file mode 100644 index 0000000..4271a3d --- /dev/null +++ b/src/plugin/model/eip/eip.py @@ -0,0 +1,21 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType + +_LOGGER = logging.getLogger(__name__) + + +class EIP(Model): + public_ip = StringType(deserialize_from="PublicIp") + allocation_id = StringType(deserialize_from="AllocationId") + association_id = StringType(deserialize_from="AssociationId") + domain = StringType(deserialize_from="Domain", choices=("vpc", "standard")) + network_interface_id = StringType(deserialize_from="NetworkInterfaceId") + network_interface_owner_id = StringType(deserialize_from="NetworkInterfaceOwnerId") + private_ip_address = StringType(deserialize_from="PrivateIpAddress") + public_ipv4_pool = StringType(deserialize_from="PublicIpv4Pool") + network_border_group = StringType(deserialize_from="NetworkBorderGroup") + customer_owned_ip = StringType(deserialize_from="CustomerOwnedIp") + customer_owned_ipv4_pool = StringType(deserialize_from="CustomerOwnedIpv4Pool") + carrier_ip = StringType(deserialize_from="CarrierIp") + tags = StringType(deserialize_from="Tags") diff --git a/src/plugin/model/eks/__init__.py b/src/plugin/model/eks/__init__.py new file mode 100644 index 0000000..454b044 --- /dev/null +++ b/src/plugin/model/eks/__init__.py @@ -0,0 +1,2 @@ +from .cluster import Cluster +from .node_group import NodeGroup diff --git a/src/plugin/model/eks/cluster.py b/src/plugin/model/eks/cluster.py new file mode 100644 index 0000000..b8fff01 --- /dev/null +++ b/src/plugin/model/eks/cluster.py @@ -0,0 +1,32 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType + +_LOGGER = logging.getLogger(__name__) + + +class Cluster(Model): + name = StringType(deserialize_from="name") + arn = StringType(deserialize_from="arn") + created_at = DateTimeType(deserialize_from="createdAt") + version = StringType(deserialize_from="version") + endpoint = StringType(deserialize_from="endpoint") + role_arn = StringType(deserialize_from="roleArn") + resources_vpc_config = StringType(deserialize_from="resourcesVpcConfig") + kubernetes_network_config = StringType(deserialize_from="kubernetesNetworkConfig") + logging = StringType(deserialize_from="logging") + identity = StringType(deserialize_from="identity") + status = StringType( + deserialize_from="status", + choices=("CREATING", "ACTIVE", "DELETING", "FAILED", "UPDATING"), + ) + certificate_authority = StringType(deserialize_from="certificateAuthority") + client_request_token = StringType(deserialize_from="clientRequestToken") + platform_version = StringType(deserialize_from="platformVersion") + tags = StringType(deserialize_from="Tags") + encryption_config = StringType(deserialize_from="encryptionConfig") + connector_config = StringType(deserialize_from="connectorConfig") + id = StringType(deserialize_from="id") + health = StringType(deserialize_from="health") + outpost_config = StringType(deserialize_from="outpostConfig") + access_config = StringType(deserialize_from="accessConfig") diff --git a/src/plugin/model/eks/node_group.py b/src/plugin/model/eks/node_group.py new file mode 100644 index 0000000..2551e68 --- /dev/null +++ b/src/plugin/model/eks/node_group.py @@ -0,0 +1,63 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class NodeGroup(Model): + nodegroup_name = StringType(deserialize_from="nodegroupName") + nodegroup_arn = StringType(deserialize_from="nodegroupArn") + cluster_name = StringType(deserialize_from="clusterName") + version = StringType(deserialize_from="version") + release_version = StringType(deserialize_from="releaseVersion") + created_at = DateTimeType(deserialize_from="createdAt") + modified_at = DateTimeType(deserialize_from="modifiedAt") + status = StringType( + deserialize_from="status", + choices=( + "CREATING", + "ACTIVE", + "UPDATING", + "DELETING", + "CREATE_FAILED", + "DELETE_FAILED", + "DEGRADED", + ), + ) + capacity_type = StringType( + deserialize_from="capacityType", choices=("ON_DEMAND", "SPOT") + ) + scaling_config = StringType(deserialize_from="scalingConfig") + instance_types = ListType(StringType, deserialize_from="instanceTypes") + ami_type = StringType( + deserialize_from="amiType", + choices=( + "AL2_x86_64", + "AL2_x86_64_GPU", + "AL2_ARM_64", + "CUSTOM", + "BOTTLEROCKET_ARM_64", + "BOTTLEROCKET_x86_64", + "BOTTLEROCKET_ARM_64_NVIDIA", + "BOTTLEROCKET_x86_64_NVIDIA", + "WINDOWS_CORE_2019_x86_64", + "WINDOWS_FULL_2019_x86_64", + "WINDOWS_CORE_2022_x86_64", + "WINDOWS_FULL_2022_x86_64", + ), + ) + operating_system = StringType( + deserialize_from="operatingSystem", + choices=("Amazon Linux 2", "Windows", "Bottlerocket"), + ) + node_role = StringType(deserialize_from="nodeRole") + labels = StringType(deserialize_from="labels") + taints = StringType(deserialize_from="taints") + resources = StringType(deserialize_from="resources") + disk_size = IntType(deserialize_from="diskSize") + health = StringType(deserialize_from="health") + update_config = StringType(deserialize_from="updateConfig") + launch_template = StringType(deserialize_from="launchTemplate") + tags = StringType(deserialize_from="Tags") + remote_access = StringType(deserialize_from="remoteAccess") diff --git a/src/plugin/model/elasticache/__init__.py b/src/plugin/model/elasticache/__init__.py new file mode 100644 index 0000000..28cdc8e --- /dev/null +++ b/src/plugin/model/elasticache/__init__.py @@ -0,0 +1,2 @@ +from .redis import Redis +from .memcached import Memcached diff --git a/src/plugin/model/elasticache/memcached.py b/src/plugin/model/elasticache/memcached.py new file mode 100644 index 0000000..bdbef6f --- /dev/null +++ b/src/plugin/model/elasticache/memcached.py @@ -0,0 +1,76 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class Memcached(Model): + cache_cluster_id = StringType(deserialize_from="CacheClusterId") + configuration_endpoint = StringType(deserialize_from="ConfigurationEndpoint") + client_download_landing_page = StringType( + deserialize_from="ClientDownloadLandingPage" + ) + cache_node_type = StringType(deserialize_from="CacheNodeType") + engine = StringType(deserialize_from="Engine") + engine_version = StringType(deserialize_from="EngineVersion") + cache_parameter_group = StringType(deserialize_from="CacheParameterGroup") + cache_subnet_group_name = StringType(deserialize_from="CacheSubnetGroupName") + cache_cluster_status = StringType( + deserialize_from="CacheClusterStatus", + choices=( + "available", + "creating", + "deleting", + "incompatible-network", + "modifying", + "rebooting cluster", + "restore-failed", + "snapshotting", + ), + ) + num_cache_nodes = IntType(deserialize_from="NumCacheNodes") + preferred_availability_zone = StringType( + deserialize_from="PreferredAvailabilityZone" + ) + preferred_outpost_arn = StringType(deserialize_from="PreferredOutpostArn") + cache_cluster_create_time = DateTimeType(deserialize_from="CacheClusterCreateTime") + preferred_maintenance_window = StringType( + deserialize_from="PreferredMaintenanceWindow" + ) + pending_modified_values = StringType(deserialize_from="PendingModifiedValues") + notification_configuration = StringType( + deserialize_from="NotificationConfiguration" + ) + cache_security_groups = StringType(deserialize_from="CacheSecurityGroups") + cache_parameter_group = StringType(deserialize_from="CacheParameterGroup") + cache_subnet_group_name = StringType(deserialize_from="CacheSubnetGroupName") + cache_nodes = StringType(deserialize_from="CacheNodes") + auto_minor_version_upgrade = BooleanType(deserialize_from="AutoMinorVersionUpgrade") + security_groups = StringType(deserialize_from="SecurityGroups") + replication_group_id = StringType(deserialize_from="ReplicationGroupId") + snapshot_retention_limit = IntType(deserialize_from="SnapshotRetentionLimit") + snapshot_window = StringType(deserialize_from="SnapshotWindow") + auth_token_enabled = BooleanType(deserialize_from="AuthTokenEnabled") + auth_token_last_modified_date = DateTimeType( + deserialize_from="AuthTokenLastModifiedDate" + ) + log_delivery_configurations = StringType( + deserialize_from="LogDeliveryConfigurations" + ) + replication_group_log_delivery_enabled = BooleanType( + deserialize_from="ReplicationGroupLogDeliveryEnabled" + ) + network_type = StringType( + deserialize_from="NetworkType", choices=("ipv4", "ipv6", "dual_stack") + ) + ip_discovery = StringType(deserialize_from="IpDiscovery", choices=("ipv4", "ipv6")) + transit_encryption_enabled = BooleanType( + deserialize_from="TransitEncryptionEnabled" + ) + transit_encryption_mode = StringType( + deserialize_from="TransitEncryptionMode", choices=("preferred", "required") + ) + cluster_mode = StringType( + deserialize_from="ClusterMode", choices=("enabled", "disabled", "compatible") + ) diff --git a/src/plugin/model/elasticache/redis.py b/src/plugin/model/elasticache/redis.py new file mode 100644 index 0000000..994d432 --- /dev/null +++ b/src/plugin/model/elasticache/redis.py @@ -0,0 +1,76 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class Redis(Model): + cache_cluster_id = StringType(deserialize_from="CacheClusterId") + configuration_endpoint = StringType(deserialize_from="ConfigurationEndpoint") + client_download_landing_page = StringType( + deserialize_from="ClientDownloadLandingPage" + ) + cache_node_type = StringType(deserialize_from="CacheNodeType") + engine = StringType(deserialize_from="Engine") + engine_version = StringType(deserialize_from="EngineVersion") + cache_parameter_group = StringType(deserialize_from="CacheParameterGroup") + cache_subnet_group_name = StringType(deserialize_from="CacheSubnetGroupName") + cache_cluster_status = StringType( + deserialize_from="CacheClusterStatus", + choices=( + "available", + "creating", + "deleting", + "incompatible-network", + "modifying", + "rebooting cluster", + "restore-failed", + "snapshotting", + ), + ) + num_cache_nodes = IntType(deserialize_from="NumCacheNodes") + preferred_availability_zone = StringType( + deserialize_from="PreferredAvailabilityZone" + ) + preferred_outpost_arn = StringType(deserialize_from="PreferredOutpostArn") + cache_cluster_create_time = DateTimeType(deserialize_from="CacheClusterCreateTime") + preferred_maintenance_window = StringType( + deserialize_from="PreferredMaintenanceWindow" + ) + pending_modified_values = StringType(deserialize_from="PendingModifiedValues") + notification_configuration = StringType( + deserialize_from="NotificationConfiguration" + ) + cache_security_groups = StringType(deserialize_from="CacheSecurityGroups") + cache_parameter_group = StringType(deserialize_from="CacheParameterGroup") + cache_subnet_group_name = StringType(deserialize_from="CacheSubnetGroupName") + cache_nodes = StringType(deserialize_from="CacheNodes") + auto_minor_version_upgrade = BooleanType(deserialize_from="AutoMinorVersionUpgrade") + security_groups = StringType(deserialize_from="SecurityGroups") + replication_group_id = StringType(deserialize_from="ReplicationGroupId") + snapshot_retention_limit = IntType(deserialize_from="SnapshotRetentionLimit") + snapshot_window = StringType(deserialize_from="SnapshotWindow") + auth_token_enabled = BooleanType(deserialize_from="AuthTokenEnabled") + auth_token_last_modified_date = DateTimeType( + deserialize_from="AuthTokenLastModifiedDate" + ) + log_delivery_configurations = StringType( + deserialize_from="LogDeliveryConfigurations" + ) + replication_group_log_delivery_enabled = BooleanType( + deserialize_from="ReplicationGroupLogDeliveryEnabled" + ) + network_type = StringType( + deserialize_from="NetworkType", choices=("ipv4", "ipv6", "dual_stack") + ) + ip_discovery = StringType(deserialize_from="IpDiscovery", choices=("ipv4", "ipv6")) + transit_encryption_enabled = BooleanType( + deserialize_from="TransitEncryptionEnabled" + ) + transit_encryption_mode = StringType( + deserialize_from="TransitEncryptionMode", choices=("preferred", "required") + ) + cluster_mode = StringType( + deserialize_from="ClusterMode", choices=("enabled", "disabled", "compatible") + ) diff --git a/src/plugin/model/elb/__init__.py b/src/plugin/model/elb/__init__.py new file mode 100644 index 0000000..baf3d3d --- /dev/null +++ b/src/plugin/model/elb/__init__.py @@ -0,0 +1,2 @@ +from .loadbalancer import LoadBalancer +from .target_group import TargetGroup diff --git a/src/plugin/model/elb/loadbalancer.py b/src/plugin/model/elb/loadbalancer.py new file mode 100644 index 0000000..259a975 --- /dev/null +++ b/src/plugin/model/elb/loadbalancer.py @@ -0,0 +1,28 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType + +_LOGGER = logging.getLogger(__name__) + + +class LoadBalancer(Model): + load_balancer_arn = StringType(deserialize_from="LoadBalancerArn") + dns_name = StringType(deserialize_from="DNSName") + canonical_hosted_zone_id = StringType(deserialize_from="CanonicalHostedZoneId") + created_time = DateTimeType(deserialize_from="CreatedTime") + load_balancer_name = StringType(deserialize_from="LoadBalancerName") + scheme = StringType( + deserialize_from="Scheme", choices=("internet-facing", "internal") + ) + vpc_id = StringType(deserialize_from="VpcId") + state = StringType(deserialize_from="State") + type = StringType( + deserialize_from="Type", choices=("application", "network", "gateway") + ) + availability_zones = StringType(deserialize_from="AvailabilityZones") + security_groups = ListType(StringType, deserialize_from="SecurityGroups") + ip_address_type = StringType( + deserialize_from="IpAddressType", choices=("ipv4", "dualstack") + ) + customer_owned_ipv4_pool = StringType(deserialize_from="CustomerOwnedIpv4Pool") + tags = StringType(deserialize_from="Tags") diff --git a/src/plugin/model/elb/target_group.py b/src/plugin/model/elb/target_group.py new file mode 100644 index 0000000..df62b3f --- /dev/null +++ b/src/plugin/model/elb/target_group.py @@ -0,0 +1,36 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class TargetGroup(Model): + target_group_arn = StringType(deserialize_from="TargetGroupArn") + target_group_name = StringType(deserialize_from="TargetGroupName") + protocol = StringType( + deserialize_from="Protocol", + choices=("HTTP", "HTTPS", "TCP", "TLS", "UDP", "TCP_UDP", "GENEVE"), + ) + port = IntType(deserialize_from="Port") + vpc_id = StringType(deserialize_from="VpcId") + health_check_protocol = StringType( + deserialize_from="HealthCheckProtocol", + choices=("HTTP", "HTTPS", "TCP", "TLS", "UDP", "TCP_UDP", "GENEVE"), + ) + health_check_port = StringType(deserialize_from="HealthCheckPort") + health_check_enabled = BooleanType(deserialize_from="HealthCheckEnabled") + health_check_interval_seconds = IntType( + deserialize_from="HealthCheckIntervalSeconds" + ) + health_check_timeout_seconds = IntType(deserialize_from="HealthCheckTimeoutSeconds") + healthy_threshold_count = IntType(deserialize_from="HealthyThresholdCount") + unhealthy_threshold_count = IntType(deserialize_from="UnhealthyThresholdCount") + health_check_path = StringType(deserialize_from="HealthCheckPath") + matcher = StringType(deserialize_from="Matcher") + load_balancer_arns = ListType(StringType, deserialize_from="LoadBalancerArns") + target_type = StringType( + deserialize_from="TargetType", choices=("instance", "ip", "lambda_model", "alb") + ) + protocol_version = StringType(deserialize_from="ProtocolVersion") + tags = StringType(deserialize_from="Tags") diff --git a/src/plugin/model/iam/__init__.py b/src/plugin/model/iam/__init__.py new file mode 100644 index 0000000..2a0a969 --- /dev/null +++ b/src/plugin/model/iam/__init__.py @@ -0,0 +1,6 @@ +from .user import User +from .group import Group +from .role import Role +from .policy import Policy +from .access_key import AccessKey +from .identity_provider import IdentityProvider diff --git a/src/plugin/model/iam/access_key.py b/src/plugin/model/iam/access_key.py new file mode 100644 index 0000000..25bcd1a --- /dev/null +++ b/src/plugin/model/iam/access_key.py @@ -0,0 +1,13 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType + +_LOGGER = logging.getLogger(__name__) + + +class AccessKey(Model): + user_name = StringType(deserialize_from="UserName") + access_key_id = StringType(deserialize_from="AccessKeyId") + status = StringType(deserialize_from="Status", choices=("Active", "Inactive")) + secret_access_key = StringType(deserialize_from="SecretAccessKey") + create_date = DateTimeType(deserialize_from="CreateDate") diff --git a/src/plugin/model/iam/group.py b/src/plugin/model/iam/group.py new file mode 100644 index 0000000..d563cee --- /dev/null +++ b/src/plugin/model/iam/group.py @@ -0,0 +1,14 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType + +_LOGGER = logging.getLogger(__name__) + + +class Group(Model): + path = StringType(deserialize_from="Path") + group_name = StringType(deserialize_from="GroupName") + group_id = StringType(deserialize_from="GroupId") + arn = StringType(deserialize_from="Arn") + create_date = DateTimeType(deserialize_from="CreateDate") + tags = StringType(deserialize_from="Tags") diff --git a/src/plugin/model/iam/identity_provider.py b/src/plugin/model/iam/identity_provider.py new file mode 100644 index 0000000..5b4f261 --- /dev/null +++ b/src/plugin/model/iam/identity_provider.py @@ -0,0 +1,12 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType + +_LOGGER = logging.getLogger(__name__) + + +class IdentityProvider(Model): + url = StringType(deserialize_from="Url") + create_date = DateTimeType(deserialize_from="CreateDate") + thumbprint_list = ListType(StringType, deserialize_from="ThumbprintList") + tags = StringType(deserialize_from="Tags") diff --git a/src/plugin/model/iam/policy.py b/src/plugin/model/iam/policy.py new file mode 100644 index 0000000..ff2078e --- /dev/null +++ b/src/plugin/model/iam/policy.py @@ -0,0 +1,22 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType + +_LOGGER = logging.getLogger(__name__) + + +class Policy(Model): + policy_name = StringType(deserialize_from="PolicyName") + policy_id = StringType(deserialize_from="PolicyId") + arn = StringType(deserialize_from="Arn") + path = StringType(deserialize_from="Path") + default_version_id = StringType(deserialize_from="DefaultVersionId") + attachment_count = IntType(deserialize_from="AttachmentCount") + permissions_boundary_usage_count = IntType( + deserialize_from="PermissionsBoundaryUsageCount" + ) + is_attachable = BooleanType(deserialize_from="IsAttachable") + description = StringType(deserialize_from="Description") + create_date = DateTimeType(deserialize_from="CreateDate") + update_date = DateTimeType(deserialize_from="UpdateDate") + tags = StringType(deserialize_from="Tags") diff --git a/src/plugin/model/iam/role.py b/src/plugin/model/iam/role.py new file mode 100644 index 0000000..c1c29b3 --- /dev/null +++ b/src/plugin/model/iam/role.py @@ -0,0 +1,21 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType + +_LOGGER = logging.getLogger(__name__) + + +class Role(Model): + path = StringType(deserialize_from="Path") + role_name = StringType(deserialize_from="RoleName") + role_id = StringType(deserialize_from="RoleId") + arn = StringType(deserialize_from="Arn") + create_date = DateTimeType(deserialize_from="CreateDate") + assume_role_policy_document = StringType( + deserialize_from="AssumeRolePolicyDocument" + ) + description = StringType(deserialize_from="Description") + max_session_duration = IntType(deserialize_from="MaxSessionDuration") + permissions_boundary = StringType(deserialize_from="PermissionsBoundary") + tags = StringType(deserialize_from="Tags") + role_last_used = StringType(deserialize_from="RoleLastUsed") diff --git a/src/plugin/model/iam/user.py b/src/plugin/model/iam/user.py new file mode 100644 index 0000000..21aaee8 --- /dev/null +++ b/src/plugin/model/iam/user.py @@ -0,0 +1,16 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType + +_LOGGER = logging.getLogger(__name__) + + +class User(Model): + path = StringType(deserialize_from="Path") + user_name = StringType(deserialize_from="UserName") + user_id = StringType(deserialize_from="UserId") + arn = StringType(deserialize_from="Arn") + create_date = DateTimeType(deserialize_from="CreateDate") + password_last_used = DateTimeType(deserialize_from="PasswordLastUsed") + permissions_boundary = StringType(deserialize_from="PermissionsBoundary") + tags = StringType(deserialize_from="Tags") diff --git a/src/plugin/model/kinesis_data_stream/__init__.py b/src/plugin/model/kinesis_data_stream/__init__.py new file mode 100644 index 0000000..ca176e7 --- /dev/null +++ b/src/plugin/model/kinesis_data_stream/__init__.py @@ -0,0 +1 @@ +from .data_stream import DataStream diff --git a/src/plugin/model/kinesis_data_stream/data_stream.py b/src/plugin/model/kinesis_data_stream/data_stream.py new file mode 100644 index 0000000..4a0c617 --- /dev/null +++ b/src/plugin/model/kinesis_data_stream/data_stream.py @@ -0,0 +1,23 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class DataStream(Model): + stream_name = StringType(deserialize_from="StreamName") + stream_arn = StringType(deserialize_from="StreamARN") + stream_status = StringType( + deserialize_from="StreamStatus", + choices=("CREATING", "DELETING", "ACTIVE", "UPDATING"), + ) + retention_period_hours = IntType(deserialize_from="RetentionPeriodHours") + enhanced_monitoring = StringType(deserialize_from="EnhancedMonitoring") + encryption_type = StringType( + deserialize_from="EncryptionType", choices=("NONE", "KMS") + ) + key_id = StringType(deserialize_from="KeyId") + open_shard_count = IntType(deserialize_from="OpenShardCount") + consumer_count = IntType(deserialize_from="ConsumerCount") + tags = StringType(deserialize_from="Tags") diff --git a/src/plugin/model/kinesis_firehose/__init__.py b/src/plugin/model/kinesis_firehose/__init__.py new file mode 100644 index 0000000..fa7902d --- /dev/null +++ b/src/plugin/model/kinesis_firehose/__init__.py @@ -0,0 +1 @@ +from .delivery_stream import DeliveryStream diff --git a/src/plugin/model/kinesis_firehose/delivery_stream.py b/src/plugin/model/kinesis_firehose/delivery_stream.py new file mode 100644 index 0000000..3646cb0 --- /dev/null +++ b/src/plugin/model/kinesis_firehose/delivery_stream.py @@ -0,0 +1,38 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class DeliveryStream(Model): + delivery_stream_name = StringType(deserialize_from="DeliveryStreamName") + delivery_stream_arn = StringType(deserialize_from="DeliveryStreamARN") + delivery_stream_status = StringType( + deserialize_from="DeliveryStreamStatus", + choices=( + "CREATING", + "CREATING_FAILED", + "DELETING", + "DELETING_FAILED", + "ACTIVE", + "SUSPENDED", + ), + ) + delivery_stream_type = StringType( + deserialize_from="DeliveryStreamType", + choices=("DirectPut", "KinesisStreamAsSource"), + ) + version_id = StringType(deserialize_from="VersionId") + create_timestamp = DateTimeType(deserialize_from="CreateTimestamp") + last_update_timestamp = DateTimeType(deserialize_from="LastUpdateTimestamp") + source = StringType(deserialize_from="Source") + destinations = StringType(deserialize_from="Destinations") + has_more_destinations = BooleanType(deserialize_from="HasMoreDestinations") + tags = StringType(deserialize_from="Tags") + + def reference(self, region_code): + return { + "resource_id": self.delivery_stream_arn, + "external_link": f"https://console.aws.amazon.com/firehose/home?region={region_code}#/details/{self.delivery_stream_name}", + } diff --git a/src/plugin/model/kms/__init__.py b/src/plugin/model/kms/__init__.py new file mode 100644 index 0000000..67393b2 --- /dev/null +++ b/src/plugin/model/kms/__init__.py @@ -0,0 +1 @@ +from .key import Key diff --git a/src/plugin/model/kms/key.py b/src/plugin/model/kms/key.py new file mode 100644 index 0000000..d2203a0 --- /dev/null +++ b/src/plugin/model/kms/key.py @@ -0,0 +1,81 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class Key(Model): + aws_account_id = StringType(deserialize_from="AWSAccountId") + key_id = StringType(deserialize_from="KeyId") + arn = StringType(deserialize_from="Arn") + creation_date = DateTimeType(deserialize_from="CreationDate") + enabled = BooleanType(deserialize_from="Enabled") + description = StringType(deserialize_from="Description") + key_usage = StringType( + deserialize_from="KeyUsage", + choices=("SIGN_VERIFY", "ENCRYPT_DECRYPT", "GENERATE_VERIFY_MAC"), + ) + key_state = StringType( + deserialize_from="KeyState", + choices=( + "Creating", + "Enabled", + "Disabled", + "PendingDeletion", + "PendingImport", + "PendingReplicaDeletion", + "Unavailable", + "Updating", + ), + ) + deletion_date = DateTimeType(deserialize_from="DeletionDate") + valid_to = DateTimeType(deserialize_from="ValidTo") + origin = StringType( + deserialize_from="Origin", + choices=("AWS_KMS", "EXTERNAL", "AWS_CLOUDHSM", "EXTERNAL_KEY_STORE"), + ) + custom_key_store_id = StringType(deserialize_from="CustomKeyStoreId") + cloud_hsm_cluster_id = StringType(deserialize_from="CloudHsmClusterId") + expiration_model = StringType( + deserialize_from="ExpirationModel", + choices=("KEY_MATERIAL_EXPIRES", "KEY_MATERIAL_DOES_NOT_EXPIRE"), + ) + key_manager = StringType(deserialize_from="KeyManager", choices=("AWS", "CUSTOMER")) + customer_master_key_spec = StringType( + deserialize_from="CustomerMasterKeySpec", + choices=( + "RSA_2048", + "RSA_3072", + "RSA_4096", + "ECC_NIST_P256", + "ECC_NIST_P384", + "ECC_NIST_P521", + "ECC_SECG_P256K1", + "SYMMETRIC_DEFAULT", + ), + ) + key_spec = StringType( + deserialize_from="KeySpec", + choices=( + "RSA_2048", + "RSA_3072", + "RSA_4096", + "ECC_NIST_P256", + "ECC_NIST_P384", + "ECC_NIST_P521", + "ECC_SECG_P256K1", + "SYMMETRIC_DEFAULT", + ), + ) + encryption_algorithms = ListType( + StringType, deserialize_from="EncryptionAlgorithms" + ) + signing_algorithms = ListType(StringType, deserialize_from="SigningAlgorithms") + multi_region = BooleanType(deserialize_from="MultiRegion") + multi_region_configuration = StringType(deserialize_from="MultiRegionConfiguration") + pending_deletion_window_in_days = IntType( + deserialize_from="PendingDeletionWindowInDays" + ) + mac_algorithms = ListType(StringType, deserialize_from="MacAlgorithms") + xks_key_configuration = StringType(deserialize_from="XksKeyConfiguration") diff --git a/src/plugin/model/lambda_model/__init__.py b/src/plugin/model/lambda_model/__init__.py new file mode 100644 index 0000000..1efeab9 --- /dev/null +++ b/src/plugin/model/lambda_model/__init__.py @@ -0,0 +1,2 @@ +from .function import Function +from .layer import Layer diff --git a/src/plugin/model/lambda_model/function.py b/src/plugin/model/lambda_model/function.py new file mode 100644 index 0000000..445c471 --- /dev/null +++ b/src/plugin/model/lambda_model/function.py @@ -0,0 +1,104 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class Function(Model): + function_name = StringType(deserialize_from="FunctionName") + function_arn = StringType(deserialize_from="FunctionArn") + runtime = StringType(deserialize_from="Runtime") + role = StringType(deserialize_from="Role") + handler = StringType(deserialize_from="Handler") + code_size = IntType(deserialize_from="CodeSize") + description = StringType(deserialize_from="Description") + timeout = IntType(deserialize_from="Timeout") + memory_size = IntType(deserialize_from="MemorySize") + last_modified = DateTimeType(deserialize_from="LastModified") + code_sha256 = StringType(deserialize_from="CodeSha256") + version = StringType(deserialize_from="Version") + vpc_config = StringType(deserialize_from="VpcConfig") + dead_letter_config = StringType(deserialize_from="DeadLetterConfig") + environment = StringType(deserialize_from="Environment") + kms_key_arn = StringType(deserialize_from="KMSKeyArn") + tracing_config = StringType(deserialize_from="TracingConfig") + master_arn = StringType(deserialize_from="MasterArn") + revision_id = StringType(deserialize_from="RevisionId") + layers = StringType(deserialize_from="Layers") + state = StringType( + deserialize_from="State", choices=("Pending", "Active", "Inactive", "Failed") + ) + state_reason = StringType(deserialize_from="StateReason") + state_reason_code = StringType( + deserialize_from="StateReasonCode", + choices=( + "Idle", + "Creating", + "Restoring", + "EniLimitExceeded", + "InsufficientRolePermissions", + "InvalidConfiguration", + "InternalError", + "SubnetOutOfIPAddresses", + "InvalidSubnet", + "InvalidSecurityGroup", + "ImageDeleted", + "ImageAccessDenied", + "InvalidImage", + "KMSKeyAccessDenied", + "KMSKeyNotFound", + "InvalidStateKMSKey", + "DisabledKMSKey", + "EFSIOError", + "EFSMountConnectivityError", + "EFSMountFailure", + "EFSMountTimeout", + "InvalidRuntime", + "InvalidZipFileException", + "FunctionError", + ), + ) + last_update_status = StringType( + deserialize_from="LastUpdateStatus", + choices=("InProgress", "Successful", "Failed"), + ) + last_update_status_reason = StringType(deserialize_from="LastUpdateStatusReason") + last_update_status_reason_code = StringType( + deserialize_from="LastUpdateStatusReasonCode", + choices=( + "EniLimitExceeded", + "InsufficientRolePermissions", + "InvalidConfiguration", + "InternalError", + "SubnetOutOfIPAddresses", + "InvalidSubnet", + "InvalidSecurityGroup", + "ImageDeleted", + "ImageAccessDenied", + "InvalidImage", + "KMSKeyAccessDenied", + "KMSKeyNotFound", + "InvalidStateKMSKey", + "DisabledKMSKey", + "EFSIOError", + "EFSMountConnectivityError", + "EFSMountFailure", + "EFSMountTimeout", + "InvalidRuntime", + "InvalidZipFileException", + "FunctionError", + ), + ) + file_system_configs = StringType(deserialize_from="FileSystemConfigs") + package_type = StringType(deserialize_from="PackageType", choices=("Zip", "Image")) + image_config_response = StringType(deserialize_from="ImageConfigResponse") + signing_profile_version_arn = StringType( + deserialize_from="SigningProfileVersionArn" + ) + signing_job_arn = StringType(deserialize_from="SigningJobArn") + architectures = ListType(StringType, deserialize_from="Architectures") + ephemeral_storage = StringType(deserialize_from="EphemeralStorage") + snap_start = StringType(deserialize_from="SnapStart") + runtime_version_config = StringType(deserialize_from="RuntimeVersionConfig") + logging_config = StringType(deserialize_from="LoggingConfig") diff --git a/src/plugin/model/lambda_model/layer.py b/src/plugin/model/lambda_model/layer.py new file mode 100644 index 0000000..f381c8b --- /dev/null +++ b/src/plugin/model/lambda_model/layer.py @@ -0,0 +1,19 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class Layer(Model): + layer_name = StringType(deserialize_from="LayerName") + layer_arn = StringType(deserialize_from="LayerArn") + version = IntType(deserialize_from="Version") + description = StringType(deserialize_from="Description") + created_date = DateTimeType(deserialize_from="CreatedDate") + layer_version_arn = StringType(deserialize_from="LayerVersionArn") + compatible_runtimes = ListType(StringType, deserialize_from="CompatibleRuntimes") + license_info = StringType(deserialize_from="LicenseInfo") + compatible_architectures = ListType( + StringType, deserialize_from="CompatibleArchitectures" + ) diff --git a/src/plugin/model/lightsail/__init__.py b/src/plugin/model/lightsail/__init__.py new file mode 100644 index 0000000..3726376 --- /dev/null +++ b/src/plugin/model/lightsail/__init__.py @@ -0,0 +1,10 @@ +from .instance import Instance +from .container import Container +from .database import Database +from .domain import Domain +from .distribution import Distribution +from .disk import Disk +from .bucket import Bucket +from .static_ip import StaticIP +from .loadbalancer import LoadBalancer +from .snapshot import Snapshot diff --git a/src/plugin/model/lightsail/bucket.py b/src/plugin/model/lightsail/bucket.py new file mode 100644 index 0000000..24cd07d --- /dev/null +++ b/src/plugin/model/lightsail/bucket.py @@ -0,0 +1,35 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class Bucket(Model): + name = StringType(deserialize_from="name") + arn = StringType(deserialize_from="arn") + support_code = StringType(deserialize_from="supportCode") + created_at = DateTimeType(deserialize_from="createdAt") + location = StringType(deserialize_from="location") + resource_type = StringType(deserialize_from="resourceType") + tags = StringType(deserialize_from="Tags") + bundle_id = StringType(deserialize_from="bundleId") + object_versioning = StringType(deserialize_from="objectVersioning") + readable_anonymous_access = BooleanType(deserialize_from="readableAnonymousAccess") + access_rules = StringType(deserialize_from="accessRules") + access_log_config = StringType(deserialize_from="accessLogConfig") + transfer_acceleration = StringType(deserialize_from="transferAcceleration") + resources_receiving_access = StringType(deserialize_from="resourcesReceivingAccess") + state = StringType( + deserialize_from="state", + choices=( + "pending", + "available", + "warning", + "updating", + "deleting", + "deleted", + "error", + ), + ) + url = StringType(deserialize_from="url") diff --git a/src/plugin/model/lightsail/container.py b/src/plugin/model/lightsail/container.py new file mode 100644 index 0000000..1d75cc8 --- /dev/null +++ b/src/plugin/model/lightsail/container.py @@ -0,0 +1,37 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class Container(Model): + container_service_name = StringType(deserialize_from="containerServiceName") + arn = StringType(deserialize_from="arn") + created_at = DateTimeType(deserialize_from="createdAt") + location = StringType(deserialize_from="location") + resource_type = StringType(deserialize_from="resourceType") + tags = StringType(deserialize_from="Tags") + power = StringType(deserialize_from="power") + power_id = StringType(deserialize_from="powerId") + state = StringType( + deserialize_from="state", + choices=( + "PENDING", + "READY", + "RUNNING", + "UPDATING", + "DELETING", + "DISABLED", + "DEPLOYING", + ), + ) + scale = IntType(deserialize_from="scale") + current_deployment = StringType(deserialize_from="currentDeployment") + next_deployment = StringType(deserialize_from="nextDeployment") + is_disabled = BooleanType(deserialize_from="isDisabled") + principal_arn = StringType(deserialize_from="principalArn") + private_domain_name = StringType(deserialize_from="privateDomainName") + public_domain_names = StringType(deserialize_from="publicDomainNames") + url = StringType(deserialize_from="url") + private_registry_access = StringType(deserialize_from="privateRegistryAccess") diff --git a/src/plugin/model/lightsail/database.py b/src/plugin/model/lightsail/database.py new file mode 100644 index 0000000..035a545 --- /dev/null +++ b/src/plugin/model/lightsail/database.py @@ -0,0 +1,92 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class Database(Model): + relational_database_name = StringType(deserialize_from="relationalDatabaseName") + arn = StringType(deserialize_from="arn") + support_code = StringType(deserialize_from="supportCode") + created_at = DateTimeType(deserialize_from="createdAt") + location = StringType(deserialize_from="location") + resource_type = StringType(deserialize_from="resourceType") + tags = StringType(deserialize_from="Tags") + relational_database_blueprint_id = StringType( + deserialize_from="relationalDatabaseBlueprintId" + ) + relational_database_bundle_id = StringType( + deserialize_from="relationalDatabaseBundleId" + ) + master_database_name = StringType(deserialize_from="masterDatabaseName") + hardware = StringType(deserialize_from="hardware") + state = StringType( + deserialize_from="state", + choices=( + "available", + "backing-up", + "configuring-enhanced-monitoring", + "configuring-log-exports", + "configuring-read-replica", + "creating", + "deleting", + "failed", + "inaccessible-encryption-credentials", + "incompatible-credentials", + "incompatible-network", + "incompatible-option-group", + "incompatible-parameters", + "incompatible-restore", + "maintenance", + "modifying", + "rebooting", + "renaming", + "resetting-master-credentials", + "restore-error", + "starting", + "stopped", + "stopping", + "storage-full", + "storage-optimization", + "upgrading", + ), + ) + secondary_availability_zone = StringType( + deserialize_from="secondaryAvailabilityZone" + ) + backup_retention_enabled = BooleanType(deserialize_from="backupRetentionEnabled") + pending_modified_values = StringType(deserialize_from="pendingModifiedValues") + engine = StringType(deserialize_from="engine") + engine_version = StringType(deserialize_from="engineVersion") + latest_restorable_time = DateTimeType(deserialize_from="latestRestorableTime") + master_endpoint = StringType(deserialize_from="masterEndpoint") + pending_maintenance_actions = StringType( + deserialize_from="pendingMaintenanceActions" + ) + preferred_backup_window = StringType(deserialize_from="preferredBackupWindow") + preferred_maintenance_window = StringType( + deserialize_from="preferredMaintenanceWindow" + ) + publicly_accessible = BooleanType(deserialize_from="publiclyAccessible") + master_username = StringType(deserialize_from="masterUsername") + parameter_apply_status = StringType(deserialize_from="parameterApplyStatus") + backup_retention_period = IntType(deserialize_from="backupRetentionPeriod") + ca_certificate_identifier = StringType(deserialize_from="caCertificateIdentifier") + performance_insights_enabled = BooleanType( + deserialize_from="performanceInsightsEnabled" + ) + performance_insights_kms_key_id = StringType( + deserialize_from="performanceInsightsKmsKeyId" + ) + performance_insights_retention_period = IntType( + deserialize_from="performanceInsightsRetentionPeriod" + ) + enabled_cloudwatch_logs_exports = ListType( + StringType, deserialize_from="enabledCloudwatchLogsExports" + ) + processor_features = StringType(deserialize_from="processorFeatures") + deletion_protection = BooleanType(deserialize_from="deletionProtection") + associated_roles = StringType(deserialize_from="associatedRoles") + listener_endpoint = StringType(deserialize_from="listenerEndpoint") + high_availability_config = StringType(deserialize_from="highAvailabilityConfig") diff --git a/src/plugin/model/lightsail/disk.py b/src/plugin/model/lightsail/disk.py new file mode 100644 index 0000000..bff63b5 --- /dev/null +++ b/src/plugin/model/lightsail/disk.py @@ -0,0 +1,29 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class Disk(Model): + name = StringType(deserialize_from="name") + arn = StringType(deserialize_from="arn") + support_code = StringType(deserialize_from="supportCode") + created_at = DateTimeType(deserialize_from="createdAt") + location = StringType(deserialize_from="location") + resource_type = StringType(deserialize_from="resourceType") + tags = StringType(deserialize_from="Tags") + add_ons = StringType(deserialize_from="addOns") + size_in_gb = IntType(deserialize_from="sizeInGb") + is_system_disk = BooleanType(deserialize_from="isSystemDisk") + iops = IntType(deserialize_from="iops") + path = StringType(deserialize_from="path") + state = StringType( + deserialize_from="state", + choices=("pending", "error", "available", "in-use", "unknown"), + ) + attached_to = StringType(deserialize_from="attachedTo") + is_attached = BooleanType(deserialize_from="isAttached") + attachment_state = StringType(deserialize_from="attachmentState") + gb_in_use = IntType(deserialize_from="gbInUse") + auto_mount_status = StringType(deserialize_from="autoMountStatus") diff --git a/src/plugin/model/lightsail/distribution.py b/src/plugin/model/lightsail/distribution.py new file mode 100644 index 0000000..29b6511 --- /dev/null +++ b/src/plugin/model/lightsail/distribution.py @@ -0,0 +1,34 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class Distribution(Model): + name = StringType(deserialize_from="name") + arn = StringType(deserialize_from="arn") + support_code = StringType(deserialize_from="supportCode") + created_at = DateTimeType(deserialize_from="createdAt") + location = StringType(deserialize_from="location") + resource_type = StringType(deserialize_from="resourceType") + tags = StringType(deserialize_from="Tags") + alternative_domain_names = ListType( + StringType, deserialize_from="alternativeDomainNames" + ) + status = StringType( + deserialize_from="status", + choices=("Deployed", "Failed", "InProgress", "Origin"), + ) + is_enabled = BooleanType(deserialize_from="isEnabled") + domain_name = StringType(deserialize_from="domainName") + bundle_id = StringType(deserialize_from="bundleId") + certificate_name = StringType(deserialize_from="certificateName") + origin = StringType(deserialize_from="origin") + origin_public_dns = StringType(deserialize_from="originPublicDNS") + default_cache_behavior = StringType(deserialize_from="defaultCacheBehavior") + cache_behavior_settings = StringType(deserialize_from="cacheBehaviorSettings") + cache_behaviors = StringType(deserialize_from="cacheBehaviors") + able_to_update_bundle = BooleanType(deserialize_from="ableToUpdateBundle") + ip_address_type = StringType(deserialize_from="ipAddressType") + tags = StringType(deserialize_from="Tags") diff --git a/src/plugin/model/lightsail/domain.py b/src/plugin/model/lightsail/domain.py new file mode 100644 index 0000000..c55782d --- /dev/null +++ b/src/plugin/model/lightsail/domain.py @@ -0,0 +1,16 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class Domain(Model): + name = StringType(deserialize_from="name") + arn = StringType(deserialize_from="arn") + support_code = StringType(deserialize_from="supportCode") + created_at = DateTimeType(deserialize_from="createdAt") + location = StringType(deserialize_from="location") + resource_type = StringType(deserialize_from="resourceType") + tags = StringType(deserialize_from="Tags") + domain_entries = StringType(deserialize_from="domainEntries") diff --git a/src/plugin/model/lightsail/instance.py b/src/plugin/model/lightsail/instance.py new file mode 100644 index 0000000..5dbd7a3 --- /dev/null +++ b/src/plugin/model/lightsail/instance.py @@ -0,0 +1,43 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class Instance(Model): + name = StringType(deserialize_from="name") + arn = StringType(deserialize_from="arn") + support_code = StringType(deserialize_from="supportCode") + created_at = DateTimeType(deserialize_from="createdAt") + location = StringType(deserialize_from="location") + resource_type = StringType(deserialize_from="resourceType") + tags = StringType(deserialize_from="Tags") + blueprint_id = StringType(deserialize_from="blueprintId") + blueprint_name = StringType(deserialize_from="blueprintName") + bundle_id = StringType(deserialize_from="bundleId") + add_ons = StringType(deserialize_from="addOns") + is_static_ip = BooleanType(deserialize_from="isStaticIp") + private_ip_address = StringType(deserialize_from="privateIpAddress") + public_ip_address = StringType(deserialize_from="publicIpAddress") + ip_address_type = StringType(deserialize_from="ipAddressType") + ipv6_addresses = ListType(StringType, deserialize_from="ipv6Addresses") + key_pair_name = StringType(deserialize_from="keyPairName") + networking = StringType(deserialize_from="networking") + state = StringType( + deserialize_from="state", + choices=( + "pending", + "running", + "stopping", + "stopped", + "starting", + "rebooting", + "shutting-down", + "terminated", + ), + ) + username = StringType(deserialize_from="username") + ssh_key_name = StringType(deserialize_from="sshKeyName") + metadata_options = StringType(deserialize_from="metadataOptions") + hardware = StringType(deserialize_from="hardware") diff --git a/src/plugin/model/lightsail/loadbalancer.py b/src/plugin/model/lightsail/loadbalancer.py new file mode 100644 index 0000000..993533e --- /dev/null +++ b/src/plugin/model/lightsail/loadbalancer.py @@ -0,0 +1,30 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class LoadBalancer(Model): + name = StringType(deserialize_from="name") + arn = StringType(deserialize_from="arn") + support_code = StringType(deserialize_from="supportCode") + created_at = DateTimeType(deserialize_from="createdAt") + location = StringType(deserialize_from="location") + resource_type = StringType(deserialize_from="resourceType") + tags = StringType(deserialize_from="Tags") + dns_name = StringType(deserialize_from="dnsName") + state = StringType( + deserialize_from="state", + choices=("active", "provisioning", "active_impaired", "failed", "unknown"), + ) + protocol = StringType(deserialize_from="protocol", choices=("HTTP", "HTTPS")) + public_ports = ListType(IntType, deserialize_from="publicPorts") + health_check_path = StringType(deserialize_from="healthCheckPath") + instance_port = IntType(deserialize_from="instancePort") + instance_health_summary = StringType(deserialize_from="instanceHealthSummary") + tls_certificate_summaries = StringType(deserialize_from="tlsCertificateSummaries") + configuration_options = StringType(deserialize_from="configurationOptions") + ip_address_type = StringType(deserialize_from="ipAddressType") + https_redirection_enabled = BooleanType(deserialize_from="httpsRedirectionEnabled") + tls_policy_name = StringType(deserialize_from="tlsPolicyName") diff --git a/src/plugin/model/lightsail/snapshot.py b/src/plugin/model/lightsail/snapshot.py new file mode 100644 index 0000000..fab81cd --- /dev/null +++ b/src/plugin/model/lightsail/snapshot.py @@ -0,0 +1,25 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class Snapshot(Model): + name = StringType(deserialize_from="name") + arn = StringType(deserialize_from="arn") + support_code = StringType(deserialize_from="supportCode") + created_at = DateTimeType(deserialize_from="createdAt") + location = StringType(deserialize_from="location") + resource_type = StringType(deserialize_from="resourceType") + tags = StringType(deserialize_from="Tags") + state = StringType( + deserialize_from="state", choices=("pending", "completed", "error", "unknown") + ) + progress = StringType(deserialize_from="progress") + from_resource_name = StringType(deserialize_from="fromResourceName") + from_resource_arn = StringType(deserialize_from="fromResourceArn") + from_blueprint_id = StringType(deserialize_from="fromBlueprintId") + from_bundle_id = StringType(deserialize_from="fromBundleId") + is_from_auto_snapshot = BooleanType(deserialize_from="isFromAutoSnapshot") + size_in_gb = IntType(deserialize_from="sizeInGb") diff --git a/src/plugin/model/lightsail/static_ip.py b/src/plugin/model/lightsail/static_ip.py new file mode 100644 index 0000000..068becb --- /dev/null +++ b/src/plugin/model/lightsail/static_ip.py @@ -0,0 +1,18 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class StaticIP(Model): + name = StringType(deserialize_from="name") + arn = StringType(deserialize_from="arn") + support_code = StringType(deserialize_from="supportCode") + created_at = DateTimeType(deserialize_from="createdAt") + location = StringType(deserialize_from="location") + resource_type = StringType(deserialize_from="resourceType") + tags = StringType(deserialize_from="Tags") + ip_address = StringType(deserialize_from="ipAddress") + attached_to = StringType(deserialize_from="attachedTo") + is_attached = BooleanType(deserialize_from="isAttached") diff --git a/src/plugin/model/msk/__init__.py b/src/plugin/model/msk/__init__.py new file mode 100644 index 0000000..0e601bb --- /dev/null +++ b/src/plugin/model/msk/__init__.py @@ -0,0 +1,2 @@ +from .cluster import Cluster +from .cluster_configuration import ClusterConfiguration diff --git a/src/plugin/model/msk/cluster.py b/src/plugin/model/msk/cluster.py new file mode 100644 index 0000000..95fa073 --- /dev/null +++ b/src/plugin/model/msk/cluster.py @@ -0,0 +1,33 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class Cluster(Model): + cluster_arn = StringType(deserialize_from="ClusterArn") + cluster_name = StringType(deserialize_from="ClusterName") + creation_time = DateTimeType(deserialize_from="CreationTime") + current_version = StringType(deserialize_from="CurrentVersion") + state = StringType( + deserialize_from="State", + choices=( + "ACTIVE", + "CREATING", + "DELETING", + "FAILED", + "HEALING", + "MAINTENANCE", + "REBOOTING_BROKER", + "UPDATING", + ), + ) + state_info = StringType(deserialize_from="StateInfo") + tags = StringType(deserialize_from="Tags") + active_operation_arn = StringType(deserialize_from="ActiveOperationArn") + cluster_type = StringType( + deserialize_from="ClusterType", choices=("PROVISIONED", "SERVERLESS") + ) + provisioned = StringType(deserialize_from="Provisioned") + serverless = StringType(deserialize_from="Serverless") diff --git a/src/plugin/model/msk/cluster_configuration.py b/src/plugin/model/msk/cluster_configuration.py new file mode 100644 index 0000000..770a37a --- /dev/null +++ b/src/plugin/model/msk/cluster_configuration.py @@ -0,0 +1,17 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class ClusterConfiguration(Model): + arn = StringType(deserialize_from="Arn") + creation_time = DateTimeType(deserialize_from="CreationTime") + description = StringType(deserialize_from="Description") + kafka_versions = ListType(StringType, deserialize_from="KafkaVersions") + latest_revision = StringType(deserialize_from="LatestRevision") + name = StringType(deserialize_from="Name") + state = StringType( + deserialize_from="State", choices=("ACTIVE", "DELETING", "DELETE_FAILED") + ) diff --git a/src/plugin/model/rds/__init__.py b/src/plugin/model/rds/__init__.py new file mode 100644 index 0000000..138b84d --- /dev/null +++ b/src/plugin/model/rds/__init__.py @@ -0,0 +1,6 @@ +from .instance import Instance +from .database import Database +from .option_group import OptionGroup +from .parameter_group import ParameterGroup +from .snapshot import Snapshot +from .subnet_group import SubnetGroup diff --git a/src/plugin/model/rds/database.py b/src/plugin/model/rds/database.py new file mode 100644 index 0000000..249d608 --- /dev/null +++ b/src/plugin/model/rds/database.py @@ -0,0 +1,111 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class Database(Model): + db_cluster_identifier = StringType(deserialize_from="DBClusterIdentifier") + db_cluster_parameter_group = StringType(deserialize_from="DBClusterParameterGroup") + db_subnet_group = StringType(deserialize_from="DBSubnetGroup") + status = StringType(deserialize_from="Status") + percent_progress = StringType(deserialize_from="PercentProgress") + earliest_restorable_time = DateTimeType(deserialize_from="EarliestRestorableTime") + endpoint = StringType(deserialize_from="Endpoint") + reader_endpoint = StringType(deserialize_from="ReaderEndpoint") + custom_endpoints = ListType(StringType, deserialize_from="CustomEndpoints") + multi_az = BooleanType(deserialize_from="MultiAZ") + engine = StringType(deserialize_from="Engine") + engine_version = StringType(deserialize_from="EngineVersion") + latest_restorable_time = DateTimeType(deserialize_from="LatestRestorableTime") + port = IntType(deserialize_from="Port") + master_username = StringType(deserialize_from="MasterUsername") + db_cluster_option_group_memberships = StringType( + deserialize_from="DBClusterOptionGroupMemberships" + ) + preferred_backup_window = StringType(deserialize_from="PreferredBackupWindow") + preferred_maintenance_window = StringType( + deserialize_from="PreferredMaintenanceWindow" + ) + replication_source_identifier = StringType( + deserialize_from="ReplicationSourceIdentifier" + ) + read_replica_identifiers = ListType( + StringType, deserialize_from="ReadReplicaIdentifiers" + ) + db_cluster_members = StringType(deserialize_from="DBClusterMembers") + vpc_security_groups = StringType(deserialize_from="VpcSecurityGroups") + hosted_zone_id = StringType(deserialize_from="HostedZoneId") + storage_encrypted = BooleanType(deserialize_from="StorageEncrypted") + kms_key_id = StringType(deserialize_from="KmsKeyId") + db_cluster_resource_id = StringType(deserialize_from="DbClusterResourceId") + db_cluster_arn = StringType(deserialize_from="DBClusterArn") + associated_roles = StringType(deserialize_from="AssociatedRoles") + iam_database_authentication_enabled = BooleanType( + deserialize_from="IAMDatabaseAuthenticationEnabled" + ) + clone_group_id = StringType(deserialize_from="CloneGroupId") + cluster_create_time = DateTimeType(deserialize_from="ClusterCreateTime") + earliest_backtrack_time = DateTimeType(deserialize_from="EarliestBacktrackTime") + backtrack_window = IntType(deserialize_from="BacktrackWindow") + backtrack_consumed_change_records = IntType( + deserialize_from="BacktrackConsumedChangeRecords" + ) + enabled_cloudwatch_logs_exports = ListType( + StringType, deserialize_from="EnabledCloudwatchLogsExports" + ) + capacity = StringType(deserialize_from="Capacity") + engine_mode = StringType(deserialize_from="EngineMode") + scaling_configuration_info = StringType(deserialize_from="ScalingConfigurationInfo") + deletion_protection = BooleanType(deserialize_from="DeletionProtection") + http_endpoint_enabled = BooleanType(deserialize_from="HttpEndpointEnabled") + activity_stream_mode = StringType(deserialize_from="ActivityStreamMode") + activity_stream_status = StringType(deserialize_from="ActivityStreamStatus") + activity_stream_kms_key_id = StringType(deserialize_from="ActivityStreamKmsKeyId") + activity_stream_kinesis_stream_name = StringType( + deserialize_from="ActivityStreamKinesisStreamName" + ) + copy_tags_to_snapshot = BooleanType(deserialize_from="CopyTagsToSnapshot") + cross_account_clone = BooleanType(deserialize_from="CrossAccountClone") + domain_memberships = StringType(deserialize_from="DomainMemberships") + tag_list = StringType(deserialize_from="TagList") + global_write_forwarding_status = StringType( + deserialize_from="GlobalWriteForwardingStatus" + ) + global_write_forwarding_requested = BooleanType( + deserialize_from="GlobalWriteForwardingRequested" + ) + pending_modified_values = StringType(deserialize_from="PendingModifiedValues") + db_cluster_instance_class = StringType(deserialize_from="DBClusterInstanceClass") + storage_type = StringType(deserialize_from="StorageType") + iops = IntType(deserialize_from="Iops") + publicly_accessible = BooleanType(deserialize_from="PubliclyAccessible") + auto_minor_version_upgrade = BooleanType(deserialize_from="AutoMinorVersionUpgrade") + monitoring_interval = IntType(deserialize_from="MonitoringInterval") + monitoring_role_arn = StringType(deserialize_from="MonitoringRoleArn") + database_insights_mode = StringType(deserialize_from="DatabaseInsightsMode") + performance_insights_enabled = BooleanType( + deserialize_from="PerformanceInsightsEnabled" + ) + performance_insights_kms_key_id = StringType( + deserialize_from="PerformanceInsightsKmsKeyId" + ) + performance_insights_retention_period = IntType( + deserialize_from="PerformanceInsightsRetentionPeriod" + ) + serverless_v2_scaling_configuration = StringType( + deserialize_from="ServerlessV2ScalingConfiguration" + ) + network_type = StringType(deserialize_from="NetworkType") + db_system_id = StringType(deserialize_from="DBSystemId") + master_user_secret = StringType(deserialize_from="MasterUserSecret") + io_optimized_next_allowed_modification_time = DateTimeType( + deserialize_from="IOOptimizedNextAllowedModificationTime" + ) + local_write_forwarding_status = StringType( + deserialize_from="LocalWriteForwardingStatus" + ) + aws_backup_recovery_point_arn = StringType( + deserialize_from="AwsBackupRecoveryPointArn" + ) diff --git a/src/plugin/model/rds/instance.py b/src/plugin/model/rds/instance.py new file mode 100644 index 0000000..f927a3c --- /dev/null +++ b/src/plugin/model/rds/instance.py @@ -0,0 +1,156 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class Instance(Model): + db_instance_identifier = StringType(deserialize_from="DBInstanceIdentifier") + db_instance_class = StringType(deserialize_from="DBInstanceClass") + engine = StringType(deserialize_from="Engine") + engine_version = StringType(deserialize_from="EngineVersion") + db_instance_status = StringType( + deserialize_from="DBInstanceStatus", + choices=( + "available", + "backing-up", + "configuring-enhanced-monitoring", + "configuring-log-exports", + "configuring-read-replica", + "creating", + "deleting", + "failed", + "inaccessible-encryption-credentials", + "incompatible-credentials", + "incompatible-network", + "incompatible-option-group", + "incompatible-parameters", + "incompatible-restore", + "maintenance", + "modifying", + "rebooting", + "renaming", + "resetting-master-credentials", + "restore-error", + "starting", + "stopped", + "stopping", + "storage-full", + "storage-optimization", + "upgrading", + ), + ) + master_username = StringType(deserialize_from="MasterUsername") + db_name = StringType(deserialize_from="DBName") + endpoint = StringType(deserialize_from="Endpoint") + allocated_storage = IntType(deserialize_from="AllocatedStorage") + instance_create_time = DateTimeType(deserialize_from="InstanceCreateTime") + preferred_backup_window = StringType(deserialize_from="PreferredBackupWindow") + backup_retention_period = IntType(deserialize_from="BackupRetentionPeriod") + db_security_groups = StringType(deserialize_from="DBSecurityGroups") + vpc_security_groups = StringType(deserialize_from="VpcSecurityGroups") + db_parameter_groups = StringType(deserialize_from="DBParameterGroups") + availability_zone = StringType(deserialize_from="AvailabilityZone") + db_subnet_group = StringType(deserialize_from="DBSubnetGroup") + preferred_maintenance_window = StringType( + deserialize_from="PreferredMaintenanceWindow" + ) + pending_modified_values = StringType(deserialize_from="PendingModifiedValues") + latest_restorable_time = DateTimeType(deserialize_from="LatestRestorableTime") + multi_az = BooleanType(deserialize_from="MultiAZ") + engine_version = StringType(deserialize_from="EngineVersion") + auto_minor_version_upgrade = BooleanType(deserialize_from="AutoMinorVersionUpgrade") + read_replica_source_db_instance_identifier = StringType( + deserialize_from="ReadReplicaSourceDBInstanceIdentifier" + ) + read_replica_db_instance_identifiers = ListType( + StringType, deserialize_from="ReadReplicaDBInstanceIdentifiers" + ) + read_replica_db_cluster_identifiers = ListType( + StringType, deserialize_from="ReadReplicaDBClusterIdentifiers" + ) + replica_mode = StringType(deserialize_from="ReplicaMode") + iops = IntType(deserialize_from="Iops") + option_group_memberships = StringType(deserialize_from="OptionGroupMemberships") + character_set_name = StringType(deserialize_from="CharacterSetName") + nchar_character_set_name = StringType(deserialize_from="NcharCharacterSetName") + secondary_availability_zone = StringType( + deserialize_from="SecondaryAvailabilityZone" + ) + publicly_accessible = BooleanType(deserialize_from="PubliclyAccessible") + status_infos = StringType(deserialize_from="StatusInfos") + storage_type = StringType(deserialize_from="StorageType") + tde_credential_arn = StringType(deserialize_from="TdeCredentialArn") + db_instance_port = IntType(deserialize_from="DbInstancePort") + db_cluster_identifier = StringType(deserialize_from="DBClusterIdentifier") + storage_encrypted = BooleanType(deserialize_from="StorageEncrypted") + kms_key_id = StringType(deserialize_from="KmsKeyId") + dbi_resource_id = StringType(deserialize_from="DbiResourceId") + ca_certificate_identifier = StringType(deserialize_from="CACertificateIdentifier") + domain_memberships = StringType(deserialize_from="DomainMemberships") + copy_tags_to_snapshot = BooleanType(deserialize_from="CopyTagsToSnapshot") + monitoring_interval = IntType(deserialize_from="MonitoringInterval") + enhanced_monitoring_resource_arn = StringType( + deserialize_from="EnhancedMonitoringResourceArn" + ) + monitoring_role_arn = StringType(deserialize_from="MonitoringRoleArn") + promotion_tier = IntType(deserialize_from="PromotionTier") + db_instance_arn = StringType(deserialize_from="DBInstanceArn") + timezone = StringType(deserialize_from="Timezone") + iam_database_authentication_enabled = BooleanType( + deserialize_from="IAMDatabaseAuthenticationEnabled" + ) + performance_insights_enabled = BooleanType( + deserialize_from="PerformanceInsightsEnabled" + ) + performance_insights_kms_key_id = StringType( + deserialize_from="PerformanceInsightsKmsKeyId" + ) + performance_insights_retention_period = IntType( + deserialize_from="PerformanceInsightsRetentionPeriod" + ) + enabled_cloudwatch_logs_exports = ListType( + StringType, deserialize_from="EnabledCloudwatchLogsExports" + ) + processor_features = StringType(deserialize_from="ProcessorFeatures") + deletion_protection = BooleanType(deserialize_from="DeletionProtection") + associated_roles = StringType(deserialize_from="AssociatedRoles") + listener_endpoint = StringType(deserialize_from="ListenerEndpoint") + max_allocated_storage = IntType(deserialize_from="MaxAllocatedStorage") + tag_list = StringType(deserialize_from="TagList") + db_instance_automated_backups_replications = StringType( + deserialize_from="DBInstanceAutomatedBackupsReplications" + ) + customer_owned_ip_enabled = BooleanType(deserialize_from="CustomerOwnedIpEnabled") + aws_backup_recovery_point_arn = StringType( + deserialize_from="AwsBackupRecoveryPointArn" + ) + activity_stream_status = StringType(deserialize_from="ActivityStreamStatus") + activity_stream_kms_key_id = StringType(deserialize_from="ActivityStreamKmsKeyId") + activity_stream_kinesis_stream_name = StringType( + deserialize_from="ActivityStreamKinesisStreamName" + ) + activity_stream_mode = StringType(deserialize_from="ActivityStreamMode") + activity_stream_engine_native_audit_fields_included = BooleanType( + deserialize_from="ActivityStreamEngineNativeAuditFieldsIncluded" + ) + automation_mode = StringType(deserialize_from="AutomationMode") + resume_full_automation_mode_time = DateTimeType( + deserialize_from="ResumeFullAutomationModeTime" + ) + custom_iam_instance_profile = StringType( + deserialize_from="CustomIamInstanceProfile" + ) + backup_target = StringType(deserialize_from="BackupTarget") + network_type = StringType(deserialize_from="NetworkType") + activity_stream_policy_status = StringType( + deserialize_from="ActivityStreamPolicyStatus" + ) + storage_throughput = IntType(deserialize_from="StorageThroughput") + db_system_id = StringType(deserialize_from="DBSystemId") + master_user_secret = StringType(deserialize_from="MasterUserSecret") + certificate_details = StringType(deserialize_from="CertificateDetails") + read_replica_source_db_cluster_identifier = StringType( + deserialize_from="ReadReplicaSourceDBClusterIdentifier" + ) diff --git a/src/plugin/model/rds/option_group.py b/src/plugin/model/rds/option_group.py new file mode 100644 index 0000000..ad72877 --- /dev/null +++ b/src/plugin/model/rds/option_group.py @@ -0,0 +1,21 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class OptionGroup(Model): + option_group_name = StringType(deserialize_from="OptionGroupName") + option_group_description = StringType(deserialize_from="OptionGroupDescription") + engine_name = StringType(deserialize_from="EngineName") + major_engine_version = StringType(deserialize_from="MajorEngineVersion") + options = StringType(deserialize_from="Options") + allows_vpc_and_non_vpc_instance_memberships = BooleanType( + deserialize_from="AllowsVpcAndNonVpcInstanceMemberships" + ) + vpc_id = StringType(deserialize_from="VpcId") + option_group_arn = StringType(deserialize_from="OptionGroupArn") + source_option_group = StringType(deserialize_from="SourceOptionGroup") + source_account_id = StringType(deserialize_from="SourceAccountId") + copy_timestamp = DateTimeType(deserialize_from="CopyTimestamp") diff --git a/src/plugin/model/rds/parameter_group.py b/src/plugin/model/rds/parameter_group.py new file mode 100644 index 0000000..e3367a4 --- /dev/null +++ b/src/plugin/model/rds/parameter_group.py @@ -0,0 +1,12 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class ParameterGroup(Model): + db_parameter_group_name = StringType(deserialize_from="DBParameterGroupName") + db_parameter_group_family = StringType(deserialize_from="DBParameterGroupFamily") + description = StringType(deserialize_from="Description") + db_parameter_group_arn = StringType(deserialize_from="DBParameterGroupArn") diff --git a/src/plugin/model/rds/snapshot.py b/src/plugin/model/rds/snapshot.py new file mode 100644 index 0000000..2383e78 --- /dev/null +++ b/src/plugin/model/rds/snapshot.py @@ -0,0 +1,47 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class Snapshot(Model): + db_snapshot_identifier = StringType(deserialize_from="DBSnapshotIdentifier") + db_instance_identifier = StringType(deserialize_from="DBInstanceIdentifier") + snapshot_create_time = DateTimeType(deserialize_from="SnapshotCreateTime") + engine = StringType(deserialize_from="Engine") + allocated_storage = IntType(deserialize_from="AllocatedStorage") + status = StringType(deserialize_from="Status") + port = IntType(deserialize_from="Port") + availability_zone = StringType(deserialize_from="AvailabilityZone") + vpc_id = StringType(deserialize_from="VpcId") + instance_create_time = DateTimeType(deserialize_from="InstanceCreateTime") + master_username = StringType(deserialize_from="MasterUsername") + engine_version = StringType(deserialize_from="EngineVersion") + license_model = StringType(deserialize_from="LicenseModel") + snapshot_type = StringType(deserialize_from="SnapshotType") + iops = IntType(deserialize_from="Iops") + option_group_name = StringType(deserialize_from="OptionGroupName") + percent_progress = IntType(deserialize_from="PercentProgress") + source_region = StringType(deserialize_from="SourceRegion") + source_db_snapshot_identifier = StringType( + deserialize_from="SourceDBSnapshotIdentifier" + ) + storage_type = StringType(deserialize_from="StorageType") + tde_credential_arn = StringType(deserialize_from="TdeCredentialArn") + encrypted = BooleanType(deserialize_from="Encrypted") + kms_key_id = StringType(deserialize_from="KmsKeyId") + db_snapshot_arn = StringType(deserialize_from="DBSnapshotArn") + timezone = StringType(deserialize_from="Timezone") + iam_database_authentication_enabled = BooleanType( + deserialize_from="IAMDatabaseAuthenticationEnabled" + ) + processor_features = StringType(deserialize_from="ProcessorFeatures") + dbi_resource_id = StringType(deserialize_from="DbiResourceId") + tag_list = StringType(deserialize_from="TagList") + original_snapshot_create_time = DateTimeType( + deserialize_from="OriginalSnapshotCreateTime" + ) + snapshot_database_time = DateTimeType(deserialize_from="SnapshotDatabaseTime") + snapshot_target = StringType(deserialize_from="SnapshotTarget") + storage_throughput = IntType(deserialize_from="StorageThroughput") diff --git a/src/plugin/model/rds/subnet_group.py b/src/plugin/model/rds/subnet_group.py new file mode 100644 index 0000000..e537ba5 --- /dev/null +++ b/src/plugin/model/rds/subnet_group.py @@ -0,0 +1,19 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class SubnetGroup(Model): + db_subnet_group_name = StringType(deserialize_from="DBSubnetGroupName") + db_subnet_group_description = StringType( + deserialize_from="DBSubnetGroupDescription" + ) + vpc_id = StringType(deserialize_from="VpcId") + subnet_group_status = StringType(deserialize_from="SubnetGroupStatus") + subnets = StringType(deserialize_from="Subnets") + db_subnet_group_arn = StringType(deserialize_from="DBSubnetGroupArn") + supported_network_types = ListType( + StringType, deserialize_from="SupportedNetworkTypes" + ) diff --git a/src/plugin/model/redshift/__init__.py b/src/plugin/model/redshift/__init__.py new file mode 100644 index 0000000..758589f --- /dev/null +++ b/src/plugin/model/redshift/__init__.py @@ -0,0 +1 @@ +from .cluster import Cluster diff --git a/src/plugin/model/redshift/cluster.py b/src/plugin/model/redshift/cluster.py new file mode 100644 index 0000000..72e557c --- /dev/null +++ b/src/plugin/model/redshift/cluster.py @@ -0,0 +1,126 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class Cluster(Model): + cluster_identifier = StringType(deserialize_from="ClusterIdentifier") + node_type = StringType(deserialize_from="NodeType") + cluster_status = StringType( + deserialize_from="ClusterStatus", + choices=( + "available", + "available, prep-for-resize", + "available, resize-cleanup", + "cancelling-resize", + "creating", + "deleting", + "final-snapshot", + "hardware-failure", + "incompatible-hsm", + "incompatible-network", + "incompatible-parameters", + "incompatible-restore", + "modifying", + "paused", + "rebooting", + "renaming", + "resizing", + "rotating-keys", + "storage-full", + "updating-hsm", + ), + ) + cluster_availability_status = StringType( + deserialize_from="ClusterAvailabilityStatus" + ) + modify_status = StringType(deserialize_from="ModifyStatus") + master_username = StringType(deserialize_from="MasterUsername") + db_name = StringType(deserialize_from="DBName") + endpoint = StringType(deserialize_from="Endpoint") + cluster_create_time = DateTimeType(deserialize_from="ClusterCreateTime") + automated_snapshot_retention_period = IntType( + deserialize_from="AutomatedSnapshotRetentionPeriod" + ) + manual_snapshot_retention_period = IntType( + deserialize_from="ManualSnapshotRetentionPeriod" + ) + cluster_security_groups = StringType(deserialize_from="ClusterSecurityGroups") + vpc_security_groups = StringType(deserialize_from="VpcSecurityGroups") + cluster_parameter_groups = StringType(deserialize_from="ClusterParameterGroups") + cluster_subnet_group_name = StringType(deserialize_from="ClusterSubnetGroupName") + vpc_id = StringType(deserialize_from="VpcId") + availability_zone = StringType(deserialize_from="AvailabilityZone") + preferred_maintenance_window = StringType( + deserialize_from="PreferredMaintenanceWindow" + ) + pending_modified_values = StringType(deserialize_from="PendingModifiedValues") + cluster_version = StringType(deserialize_from="ClusterVersion") + allow_version_upgrade = BooleanType(deserialize_from="AllowVersionUpgrade") + number_of_nodes = IntType(deserialize_from="NumberOfNodes") + publicly_accessible = BooleanType(deserialize_from="PubliclyAccessible") + encrypted = BooleanType(deserialize_from="Encrypted") + restore_status = StringType(deserialize_from="RestoreStatus") + data_transfer_progress = StringType(deserialize_from="DataTransferProgress") + hsm_status = StringType(deserialize_from="HsmStatus") + cluster_snapshot_copy_status = StringType( + deserialize_from="ClusterSnapshotCopyStatus" + ) + cluster_public_key = StringType(deserialize_from="ClusterPublicKey") + cluster_nodes = StringType(deserialize_from="ClusterNodes") + elastic_ip_status = StringType(deserialize_from="ElasticIpStatus") + cluster_revision_number = StringType(deserialize_from="ClusterRevisionNumber") + tags = StringType(deserialize_from="Tags") + kms_key_id = StringType(deserialize_from="KmsKeyId") + enhanced_vpc_routing = BooleanType(deserialize_from="EnhancedVpcRouting") + iam_roles = StringType(deserialize_from="IamRoles") + pending_actions = ListType(StringType, deserialize_from="PendingActions") + maintenance_track_name = StringType(deserialize_from="MaintenanceTrackName") + elastic_resize_number_of_node_options = StringType( + deserialize_from="ElasticResizeNumberOfNodeOptions" + ) + deferred_maintenance_windows = StringType( + deserialize_from="DeferredMaintenanceWindows" + ) + snapshot_schedule_identifier = StringType( + deserialize_from="SnapshotScheduleIdentifier" + ) + snapshot_schedule_state = StringType(deserialize_from="SnapshotScheduleState") + expected_next_snapshot_schedule_time = DateTimeType( + deserialize_from="ExpectedNextSnapshotScheduleTime" + ) + expected_next_snapshot_schedule_time_status = StringType( + deserialize_from="ExpectedNextSnapshotScheduleTimeStatus" + ) + next_maintenance_window_start_time = DateTimeType( + deserialize_from="NextMaintenanceWindowStartTime" + ) + resize_info = StringType(deserialize_from="ResizeInfo") + availability_zone_relocation_status = StringType( + deserialize_from="AvailabilityZoneRelocationStatus" + ) + cluster_namespace_arn = StringType(deserialize_from="ClusterNamespaceArn") + total_storage_capacity_in_mega_bytes = IntType( + deserialize_from="TotalStorageCapacityInMegaBytes" + ) + aqua_configuration = StringType(deserialize_from="AquaConfiguration") + default_iam_role_arn = StringType(deserialize_from="DefaultIamRoleArn") + reserved_node_exchange_status = StringType( + deserialize_from="ReservedNodeExchangeStatus" + ) + custom_domain_name = StringType(deserialize_from="CustomDomainName") + custom_domain_certificate_arn = StringType( + deserialize_from="CustomDomainCertificateArn" + ) + custom_domain_certificate_expiry_date = DateTimeType( + deserialize_from="CustomDomainCertificateExpiryDate" + ) + master_password_secret_arn = StringType(deserialize_from="MasterPasswordSecretArn") + master_password_secret_kms_key_id = StringType( + deserialize_from="MasterPasswordSecretKmsKeyId" + ) + ip_address_type = StringType(deserialize_from="IpAddressType") + multi_az = StringType(deserialize_from="MultiAZ") + multi_az_secondary = StringType(deserialize_from="MultiAZSecondary") diff --git a/src/plugin/model/route53/__init__.py b/src/plugin/model/route53/__init__.py new file mode 100644 index 0000000..6153c2b --- /dev/null +++ b/src/plugin/model/route53/__init__.py @@ -0,0 +1 @@ +from .hosted_zone import HostedZone diff --git a/src/plugin/model/route53/hosted_zone.py b/src/plugin/model/route53/hosted_zone.py new file mode 100644 index 0000000..8f60432 --- /dev/null +++ b/src/plugin/model/route53/hosted_zone.py @@ -0,0 +1,14 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class HostedZone(Model): + id = StringType(deserialize_from="Id") + name = StringType(deserialize_from="Name") + caller_reference = StringType(deserialize_from="CallerReference") + config = StringType(deserialize_from="Config") + resource_record_set_count = IntType(deserialize_from="ResourceRecordSetCount") + linked_service = StringType(deserialize_from="LinkedService") diff --git a/src/plugin/model/s3/__init__.py b/src/plugin/model/s3/__init__.py new file mode 100644 index 0000000..3a16edc --- /dev/null +++ b/src/plugin/model/s3/__init__.py @@ -0,0 +1 @@ +from .bucket import Bucket diff --git a/src/plugin/model/s3/bucket.py b/src/plugin/model/s3/bucket.py new file mode 100644 index 0000000..22441cd --- /dev/null +++ b/src/plugin/model/s3/bucket.py @@ -0,0 +1,38 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class Bucket(Model): + name = StringType(deserialize_from="Name") + creation_date = DateTimeType(deserialize_from="CreationDate") + bucket_location_constraint = StringType(deserialize_from="BucketLocationConstraint") + versioning = StringType(deserialize_from="Versioning") + website = StringType(deserialize_from="Website") + logging = StringType(deserialize_from="Logging") + cors = StringType(deserialize_from="Cors") + lifecycle = StringType(deserialize_from="Lifecycle") + policy = StringType(deserialize_from="Policy") + policy_status = StringType(deserialize_from="PolicyStatus") + acl = StringType(deserialize_from="Acl") + server_side_encryption_configuration = StringType( + deserialize_from="ServerSideEncryptionConfiguration" + ) + request_payment = StringType(deserialize_from="RequestPayment") + notification = StringType(deserialize_from="Notification") + replication = StringType(deserialize_from="Replication") + tagging = StringType(deserialize_from="Tagging") + accelerate_configuration = StringType(deserialize_from="AccelerateConfiguration") + public_access_block_configuration = StringType( + deserialize_from="PublicAccessBlockConfiguration" + ) + object_lock_configuration = StringType(deserialize_from="ObjectLockConfiguration") + intelligent_tiering_configurations = StringType( + deserialize_from="IntelligentTieringConfigurations" + ) + inventory_configurations = StringType(deserialize_from="InventoryConfigurations") + analytics_configurations = StringType(deserialize_from="AnalyticsConfigurations") + metrics_configurations = StringType(deserialize_from="MetricsConfigurations") + ownership_controls = StringType(deserialize_from="OwnershipControls") diff --git a/src/plugin/model/secrets_manager/__init__.py b/src/plugin/model/secrets_manager/__init__.py new file mode 100644 index 0000000..6f31597 --- /dev/null +++ b/src/plugin/model/secrets_manager/__init__.py @@ -0,0 +1 @@ +from .secret import Secret diff --git a/src/plugin/model/secrets_manager/secret.py b/src/plugin/model/secrets_manager/secret.py new file mode 100644 index 0000000..2d1aac0 --- /dev/null +++ b/src/plugin/model/secrets_manager/secret.py @@ -0,0 +1,26 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class Secret(Model): + arn = StringType(deserialize_from="ARN") + name = StringType(deserialize_from="Name") + description = StringType(deserialize_from="Description") + kms_key_id = StringType(deserialize_from="KmsKeyId") + rotation_enabled = BooleanType(deserialize_from="RotationEnabled") + rotation_lambda_arn = StringType(deserialize_from="RotationLambdaARN") + rotation_rules = StringType(deserialize_from="RotationRules") + last_rotated_date = DateTimeType(deserialize_from="LastRotatedDate") + last_changed_date = DateTimeType(deserialize_from="LastChangedDate") + last_accessed_date = DateTimeType(deserialize_from="LastAccessedDate") + deleted_date = DateTimeType(deserialize_from="DeletedDate") + next_rotation_date = DateTimeType(deserialize_from="NextRotationDate") + tags = StringType(deserialize_from="Tags") + secret_versions_to_stages = StringType(deserialize_from="SecretVersionsToStages") + owning_service = StringType(deserialize_from="OwningService") + created_date = DateTimeType(deserialize_from="CreatedDate") + primary_region = StringType(deserialize_from="PrimaryRegion") + replication_status = StringType(deserialize_from="ReplicationStatus") diff --git a/src/plugin/model/sns/__init__.py b/src/plugin/model/sns/__init__.py new file mode 100644 index 0000000..0a22b07 --- /dev/null +++ b/src/plugin/model/sns/__init__.py @@ -0,0 +1 @@ +from .topic import Topic diff --git a/src/plugin/model/sns/topic.py b/src/plugin/model/sns/topic.py new file mode 100644 index 0000000..c1009f8 --- /dev/null +++ b/src/plugin/model/sns/topic.py @@ -0,0 +1,23 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class Topic(Model): + topic_arn = StringType(deserialize_from="TopicArn") + display_name = StringType(deserialize_from="DisplayName") + owner = StringType(deserialize_from="Owner") + policy = StringType(deserialize_from="Policy") + delivery_policy = StringType(deserialize_from="DeliveryPolicy") + effective_delivery_policy = StringType(deserialize_from="EffectiveDeliveryPolicy") + subscriptions_confirmed = IntType(deserialize_from="SubscriptionsConfirmed") + subscriptions_deleted = IntType(deserialize_from="SubscriptionsDeleted") + subscriptions_pending = IntType(deserialize_from="SubscriptionsPending") + kms_master_key_id = StringType(deserialize_from="KmsMasterKeyId") + fifo_topic = BooleanType(deserialize_from="FifoTopic") + content_based_deduplication = BooleanType( + deserialize_from="ContentBasedDeduplication" + ) + tags = StringType(deserialize_from="Tags") diff --git a/src/plugin/model/sqs/__init__.py b/src/plugin/model/sqs/__init__.py new file mode 100644 index 0000000..a74608e --- /dev/null +++ b/src/plugin/model/sqs/__init__.py @@ -0,0 +1 @@ +from .queue import Queue diff --git a/src/plugin/model/sqs/queue.py b/src/plugin/model/sqs/queue.py new file mode 100644 index 0000000..f8b1796 --- /dev/null +++ b/src/plugin/model/sqs/queue.py @@ -0,0 +1,42 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class Queue(Model): + queue_url = StringType(deserialize_from="QueueUrl") + approximate_number_of_messages = IntType( + deserialize_from="ApproximateNumberOfMessages" + ) + approximate_number_of_messages_not_visible = IntType( + deserialize_from="ApproximateNumberOfMessagesNotVisible" + ) + approximate_number_of_messages_delayed = IntType( + deserialize_from="ApproximateNumberOfMessagesDelayed" + ) + created_timestamp = DateTimeType(deserialize_from="CreatedTimestamp") + last_modified_timestamp = DateTimeType(deserialize_from="LastModifiedTimestamp") + visibility_timeout_seconds = IntType(deserialize_from="VisibilityTimeoutSeconds") + maximum_message_size = IntType(deserialize_from="MaximumMessageSize") + message_retention_period = IntType(deserialize_from="MessageRetentionPeriod") + delay_seconds = IntType(deserialize_from="DelaySeconds") + receive_message_wait_time_seconds = IntType( + deserialize_from="ReceiveMessageWaitTimeSeconds" + ) + policy = StringType(deserialize_from="Policy") + redrive_policy = StringType(deserialize_from="RedrivePolicy") + fifo_queue = BooleanType(deserialize_from="FifoQueue") + content_based_deduplication = BooleanType( + deserialize_from="ContentBasedDeduplication" + ) + kms_master_key_id = StringType(deserialize_from="KmsMasterKeyId") + kms_data_key_reuse_period_seconds = IntType( + deserialize_from="KmsDataKeyReusePeriodSeconds" + ) + deduplication_scope = StringType(deserialize_from="DeduplicationScope") + fifo_throughput_limit = StringType(deserialize_from="FifoThroughputLimit") + redrive_allow_policy = StringType(deserialize_from="RedriveAllowPolicy") + sqs_managed_sse_enabled = BooleanType(deserialize_from="SqsManagedSseEnabled") + tags = StringType(deserialize_from="Tags") diff --git a/src/plugin/model/vpc/__init__.py b/src/plugin/model/vpc/__init__.py new file mode 100644 index 0000000..db5ab08 --- /dev/null +++ b/src/plugin/model/vpc/__init__.py @@ -0,0 +1,13 @@ +from .vpc import VPC +from .subnet import Subnet +from .route_table import RouteTable +from .network_acl import NetworkACL +from .internet_gateway import InternetGateway +from .nat_gateway import NATGateway +from .endpoint import Endpoint +from .peering_connection import PeeringConnection +from .transit_gateway import TransitGateway +from .customer_gateway import CustomerGateway +from .vpn_gateway import VPNGateway +from .vpn_connection import VPNConnection +from .egress_only_internet_gateway import EgressOnlyInternetGateway diff --git a/src/plugin/model/vpc/customer_gateway.py b/src/plugin/model/vpc/customer_gateway.py new file mode 100644 index 0000000..9792022 --- /dev/null +++ b/src/plugin/model/vpc/customer_gateway.py @@ -0,0 +1,19 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class CustomerGateway(Model): + bgp_asn = StringType(deserialize_from="BgpAsn") + customer_gateway_id = StringType(deserialize_from="CustomerGatewayId") + ip_address = StringType(deserialize_from="IpAddress") + certificate_arn = StringType(deserialize_from="CertificateArn") + state = StringType( + deserialize_from="State", + choices=("pending", "available", "deleting", "deleted"), + ) + type = StringType(deserialize_from="Type") + device_name = StringType(deserialize_from="DeviceName") + tags = StringType(deserialize_from="Tags") diff --git a/src/plugin/model/vpc/egress_only_internet_gateway.py b/src/plugin/model/vpc/egress_only_internet_gateway.py new file mode 100644 index 0000000..c8b3c65 --- /dev/null +++ b/src/plugin/model/vpc/egress_only_internet_gateway.py @@ -0,0 +1,13 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class EgressOnlyInternetGateway(Model): + attachments = StringType(deserialize_from="Attachments") + egress_only_internet_gateway_id = StringType( + deserialize_from="EgressOnlyInternetGatewayId" + ) + tags = StringType(deserialize_from="Tags") diff --git a/src/plugin/model/vpc/endpoint.py b/src/plugin/model/vpc/endpoint.py new file mode 100644 index 0000000..bf8120a --- /dev/null +++ b/src/plugin/model/vpc/endpoint.py @@ -0,0 +1,42 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class Endpoint(Model): + vpc_endpoint_id = StringType(deserialize_from="VpcEndpointId") + vpc_endpoint_type = StringType( + deserialize_from="VpcEndpointType", + choices=("Interface", "Gateway", "GatewayLoadBalancer"), + ) + vpc_id = StringType(deserialize_from="VpcId") + service_name = StringType(deserialize_from="ServiceName") + state = StringType( + deserialize_from="State", + choices=( + "PendingAcceptance", + "Pending", + "Available", + "Deleting", + "Deleted", + "Rejected", + "Failed", + "Expired", + ), + ) + policy_document = StringType(deserialize_from="PolicyDocument") + route_table_ids = ListType(StringType, deserialize_from="RouteTableIds") + subnet_ids = ListType(StringType, deserialize_from="SubnetIds") + groups = StringType(deserialize_from="Groups") + ip_address_type = StringType(deserialize_from="IpAddressType") + dns_options = StringType(deserialize_from="DnsOptions") + private_dns_enabled = BooleanType(deserialize_from="PrivateDnsEnabled") + requester_managed = BooleanType(deserialize_from="RequesterManaged") + network_interface_ids = ListType(StringType, deserialize_from="NetworkInterfaceIds") + dns_entries = StringType(deserialize_from="DnsEntries") + creation_timestamp = DateTimeType(deserialize_from="CreationTimestamp") + tags = StringType(deserialize_from="Tags") + owner_id = StringType(deserialize_from="OwnerId") + last_error = StringType(deserialize_from="LastError") diff --git a/src/plugin/model/vpc/internet_gateway.py b/src/plugin/model/vpc/internet_gateway.py new file mode 100644 index 0000000..29826a2 --- /dev/null +++ b/src/plugin/model/vpc/internet_gateway.py @@ -0,0 +1,12 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class InternetGateway(Model): + attachments = StringType(deserialize_from="Attachments") + internet_gateway_id = StringType(deserialize_from="InternetGatewayId") + owner_id = StringType(deserialize_from="OwnerId") + tags = StringType(deserialize_from="Tags") diff --git a/src/plugin/model/vpc/nat_gateway.py b/src/plugin/model/vpc/nat_gateway.py new file mode 100644 index 0000000..db66dd2 --- /dev/null +++ b/src/plugin/model/vpc/nat_gateway.py @@ -0,0 +1,25 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class NATGateway(Model): + create_time = DateTimeType(deserialize_from="CreateTime") + delete_time = DateTimeType(deserialize_from="DeleteTime") + failure_code = StringType(deserialize_from="FailureCode") + failure_message = StringType(deserialize_from="FailureMessage") + nat_gateway_addresses = StringType(deserialize_from="NatGatewayAddresses") + nat_gateway_id = StringType(deserialize_from="NatGatewayId") + provisioned_bandwidth = StringType(deserialize_from="ProvisionedBandwidth") + state = StringType( + deserialize_from="State", + choices=("pending", "failed", "available", "deleting", "deleted"), + ) + subnet_id = StringType(deserialize_from="SubnetId") + vpc_id = StringType(deserialize_from="VpcId") + tags = StringType(deserialize_from="Tags") + connectivity_type = StringType( + deserialize_from="ConnectivityType", choices=("private", "public") + ) diff --git a/src/plugin/model/vpc/network_acl.py b/src/plugin/model/vpc/network_acl.py new file mode 100644 index 0000000..0453ca2 --- /dev/null +++ b/src/plugin/model/vpc/network_acl.py @@ -0,0 +1,15 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class NetworkACL(Model): + associations = StringType(deserialize_from="Associations") + entries = StringType(deserialize_from="Entries") + is_default = BooleanType(deserialize_from="IsDefault") + network_acl_id = StringType(deserialize_from="NetworkAclId") + tags = StringType(deserialize_from="Tags") + vpc_id = StringType(deserialize_from="VpcId") + owner_id = StringType(deserialize_from="OwnerId") diff --git a/src/plugin/model/vpc/peering_connection.py b/src/plugin/model/vpc/peering_connection.py new file mode 100644 index 0000000..43caa1f --- /dev/null +++ b/src/plugin/model/vpc/peering_connection.py @@ -0,0 +1,14 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class PeeringConnection(Model): + accepter_vpc_info = StringType(deserialize_from="AccepterVpcInfo") + expiration_time = DateTimeType(deserialize_from="ExpirationTime") + requester_vpc_info = StringType(deserialize_from="RequesterVpcInfo") + status = StringType(deserialize_from="Status") + tags = StringType(deserialize_from="Tags") + vpc_peering_connection_id = StringType(deserialize_from="VpcPeeringConnectionId") diff --git a/src/plugin/model/vpc/route_table.py b/src/plugin/model/vpc/route_table.py new file mode 100644 index 0000000..f2d142f --- /dev/null +++ b/src/plugin/model/vpc/route_table.py @@ -0,0 +1,15 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class RouteTable(Model): + associations = StringType(deserialize_from="Associations") + propagating_vgws = StringType(deserialize_from="PropagatingVgws") + route_table_id = StringType(deserialize_from="RouteTableId") + routes = StringType(deserialize_from="Routes") + tags = StringType(deserialize_from="Tags") + vpc_id = StringType(deserialize_from="VpcId") + owner_id = StringType(deserialize_from="OwnerId") diff --git a/src/plugin/model/vpc/subnet.py b/src/plugin/model/vpc/subnet.py new file mode 100644 index 0000000..c979913 --- /dev/null +++ b/src/plugin/model/vpc/subnet.py @@ -0,0 +1,37 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class Subnet(Model): + availability_zone = StringType(deserialize_from="AvailabilityZone") + availability_zone_id = StringType(deserialize_from="AvailabilityZoneId") + available_ip_address_count = IntType(deserialize_from="AvailableIpAddressCount") + cidr_block = StringType(deserialize_from="CidrBlock") + default_for_az = BooleanType(deserialize_from="DefaultForAz") + enable_lni_at_device_index = IntType(deserialize_from="EnableLniAtDeviceIndex") + map_public_ip_on_launch = BooleanType(deserialize_from="MapPublicIpOnLaunch") + map_customer_owned_ip_on_launch = BooleanType( + deserialize_from="MapCustomerOwnedIpOnLaunch" + ) + customer_owned_ipv4_pool = StringType(deserialize_from="CustomerOwnedIpv4Pool") + state = StringType(deserialize_from="State", choices=("pending", "available")) + subnet_id = StringType(deserialize_from="SubnetId") + vpc_id = StringType(deserialize_from="VpcId") + owner_id = StringType(deserialize_from="OwnerId") + assign_ipv6_address_on_creation = BooleanType( + deserialize_from="AssignIpv6AddressOnCreation" + ) + ipv6_cidr_block_association_set = StringType( + deserialize_from="Ipv6CidrBlockAssociationSet" + ) + tags = StringType(deserialize_from="Tags") + subnet_arn = StringType(deserialize_from="SubnetArn") + outpost_arn = StringType(deserialize_from="OutpostArn") + enable_dns64 = BooleanType(deserialize_from="EnableDns64") + ipv6_native = BooleanType(deserialize_from="Ipv6Native") + private_dns_name_options_on_launch = StringType( + deserialize_from="PrivateDnsNameOptionsOnLaunch" + ) diff --git a/src/plugin/model/vpc/transit_gateway.py b/src/plugin/model/vpc/transit_gateway.py new file mode 100644 index 0000000..41d79a6 --- /dev/null +++ b/src/plugin/model/vpc/transit_gateway.py @@ -0,0 +1,19 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class TransitGateway(Model): + transit_gateway_id = StringType(deserialize_from="TransitGatewayId") + transit_gateway_arn = StringType(deserialize_from="TransitGatewayArn") + state = StringType( + deserialize_from="State", + choices=("pending", "available", "modifying", "deleting", "deleted"), + ) + owner_id = StringType(deserialize_from="OwnerId") + description = StringType(deserialize_from="Description") + creation_time = DateTimeType(deserialize_from="CreationTime") + options = StringType(deserialize_from="Options") + tags = StringType(deserialize_from="Tags") diff --git a/src/plugin/model/vpc/vpc.py b/src/plugin/model/vpc/vpc.py new file mode 100644 index 0000000..bdc481c --- /dev/null +++ b/src/plugin/model/vpc/vpc.py @@ -0,0 +1,22 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class VPC(Model): + cidr_block = StringType(deserialize_from="CidrBlock") + dhcp_options_id = StringType(deserialize_from="DhcpOptionsId") + state = StringType(deserialize_from="State", choices=("pending", "available")) + vpc_id = StringType(deserialize_from="VpcId") + owner_id = StringType(deserialize_from="OwnerId") + instance_tenancy = StringType( + deserialize_from="InstanceTenancy", choices=("default", "dedicated", "host") + ) + ipv6_cidr_block_association_set = StringType( + deserialize_from="Ipv6CidrBlockAssociationSet" + ) + cidr_block_association_set = StringType(deserialize_from="CidrBlockAssociationSet") + is_default = BooleanType(deserialize_from="IsDefault") + tags = StringType(deserialize_from="Tags") diff --git a/src/plugin/model/vpc/vpn_connection.py b/src/plugin/model/vpc/vpn_connection.py new file mode 100644 index 0000000..679503f --- /dev/null +++ b/src/plugin/model/vpc/vpn_connection.py @@ -0,0 +1,30 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class VPNConnection(Model): + customer_gateway_configuration = StringType( + deserialize_from="CustomerGatewayConfiguration" + ) + customer_gateway_id = StringType(deserialize_from="CustomerGatewayId") + category = StringType(deserialize_from="Category") + state = StringType( + deserialize_from="State", + choices=("pending", "available", "deleting", "deleted"), + ) + type = StringType(deserialize_from="Type") + vpn_connection_id = StringType(deserialize_from="VpnConnectionId") + vpn_gateway_id = StringType(deserialize_from="VpnGatewayId") + transit_gateway_id = StringType(deserialize_from="TransitGatewayId") + core_network_arn = StringType(deserialize_from="CoreNetworkArn") + core_network_attachment_arn = StringType( + deserialize_from="CoreNetworkAttachmentArn" + ) + gateway_association_state = StringType(deserialize_from="GatewayAssociationState") + options = StringType(deserialize_from="Options") + routes = StringType(deserialize_from="Routes") + tags = StringType(deserialize_from="Tags") + vgw_telemetry = StringType(deserialize_from="VgwTelemetry") diff --git a/src/plugin/model/vpc/vpn_gateway.py b/src/plugin/model/vpc/vpn_gateway.py new file mode 100644 index 0000000..24d7265 --- /dev/null +++ b/src/plugin/model/vpc/vpn_gateway.py @@ -0,0 +1,18 @@ +import logging +from schematics import Model +from schematics.types import StringType, DateTimeType, ListType, BooleanType, IntType + +_LOGGER = logging.getLogger(__name__) + + +class VPNGateway(Model): + availability_zone = StringType(deserialize_from="AvailabilityZone") + state = StringType( + deserialize_from="State", + choices=("pending", "available", "deleting", "deleted"), + ) + type = StringType(deserialize_from="Type") + vpc_attachments = StringType(deserialize_from="VpcAttachments") + vpn_gateway_id = StringType(deserialize_from="VpnGatewayId") + amazon_side_asn = IntType(deserialize_from="AmazonSideAsn") + tags = StringType(deserialize_from="Tags")