Skip to content

Commit 5b8dc07

Browse files
1101-1aquamatthias
andauthored
[feat][fixlib] Extend base resources with additional common properties (#2278)
Co-authored-by: Matthias Veit <matthias_veit@yahoo.de>
1 parent 2cccb44 commit 5b8dc07

File tree

21 files changed

+183
-49
lines changed

21 files changed

+183
-49
lines changed

fixlib/fixlib/baseresources.py

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1089,6 +1089,16 @@ class BaseBucket(BaseResource):
10891089
_metadata: ClassVar[Dict[str, Any]] = {"icon": "bucket", "group": "storage"}
10901090
_categories: ClassVar[List[Category]] = [Category.storage]
10911091

1092+
encryption_enabled: Optional[bool] = None
1093+
versioning_enabled: Optional[bool] = None
1094+
1095+
1096+
@unique
1097+
class QueueType(Enum):
1098+
kind: ClassVar[str] = "queue_type"
1099+
STANDARD = "standard"
1100+
FIFO = "fifo"
1101+
10921102

10931103
@define(eq=False, slots=False)
10941104
class BaseQueue(BaseResource):
@@ -1097,6 +1107,9 @@ class BaseQueue(BaseResource):
10971107
_kind_description: ClassVar[str] = "A storage queue."
10981108
_metadata: ClassVar[Dict[str, Any]] = {"icon": "queue", "group": "storage"}
10991109
_categories: ClassVar[List[Category]] = [Category.storage]
1110+
queue_type: Optional[QueueType] = None
1111+
approximate_message_count: Optional[int] = None
1112+
message_retention_period: Optional[int] = None
11001113

11011114

11021115
@define(eq=False, slots=False)
@@ -1125,6 +1138,8 @@ class BaseServerlessFunction(BaseResource):
11251138
_metadata: ClassVar[Dict[str, Any]] = {"icon": "function", "group": "compute"}
11261139
_categories: ClassVar[List[Category]] = [Category.compute]
11271140

1141+
memory_size: Optional[int] = None
1142+
11281143

11291144
@define(eq=False, slots=False)
11301145
class BaseNetwork(BaseResource):
@@ -1134,6 +1149,8 @@ class BaseNetwork(BaseResource):
11341149
_metadata: ClassVar[Dict[str, Any]] = {"icon": "network", "group": "networking"}
11351150
_categories: ClassVar[List[Category]] = [Category.networking]
11361151

1152+
cidr_blocks: List[str] = field(factory=list)
1153+
11371154

11381155
@define(eq=False, slots=False)
11391156
class BaseNetworkQuota(BaseQuota):
@@ -1215,6 +1232,8 @@ class BaseSubnet(BaseResource):
12151232
_metadata: ClassVar[Dict[str, Any]] = {"icon": "subnet", "group": "networking"}
12161233
_categories: ClassVar[List[Category]] = [Category.networking]
12171234

1235+
cidr_block: Optional[str] = None
1236+
12181237

12191238
@define(eq=False, slots=False)
12201239
class BaseGateway(BaseResource):
@@ -1374,8 +1393,8 @@ class BaseAccessKey(BaseResource):
13741393
_kind_display: ClassVar[str] = "Access Key"
13751394
_kind_description: ClassVar[str] = "An access key."
13761395
_metadata: ClassVar[Dict[str, Any]] = {"icon": "key", "group": "access_control"}
1377-
access_key_status: str = ""
13781396
_categories: ClassVar[List[Category]] = [Category.access_control, Category.security]
1397+
access_key_status: Optional[str] = None
13791398

13801399

13811400
@define(eq=False, slots=False)
@@ -1404,10 +1423,10 @@ class BaseStack(BaseResource):
14041423
_kind_display: ClassVar[str] = "Stack"
14051424
_kind_description: ClassVar[str] = "A stack."
14061425
_metadata: ClassVar[Dict[str, Any]] = {"icon": "stack", "group": "management"}
1426+
_categories: ClassVar[List[Category]] = [Category.devops, Category.management]
14071427
stack_status: str = ""
14081428
stack_status_reason: str = ""
14091429
stack_parameters: Dict[str, str] = field(factory=dict)
1410-
_categories: ClassVar[List[Category]] = [Category.devops, Category.management]
14111430

14121431

14131432
@define(eq=False, slots=False)
@@ -1453,6 +1472,7 @@ class BaseDNSZone(BaseResource):
14531472
_kind_description: ClassVar[str] = "A DNS zone."
14541473
_metadata: ClassVar[Dict[str, Any]] = {"icon": "dns", "group": "networking"}
14551474
_categories: ClassVar[List[Category]] = [Category.dns, Category.networking]
1475+
private_zone: Optional[bool] = None
14561476

14571477

14581478
@define(eq=False, slots=False)
@@ -1574,6 +1594,19 @@ class BaseManagedKubernetesClusterProvider(BaseResource):
15741594
endpoint: Optional[str] = field(default=None, metadata={"description": "The kubernetes API endpoint"})
15751595

15761596

1597+
class AIJobStatus(Enum):
1598+
PENDING = "pending"
1599+
PREPARING = "preparing"
1600+
RUNNING = "running"
1601+
STOPPING = "stopping"
1602+
STOPPED = "stopped"
1603+
COMPLETED = "completed"
1604+
FAILED = "failed"
1605+
CANCELLED = "cancelled"
1606+
PAUSED = "paused"
1607+
UNKNOWN = "unknown"
1608+
1609+
15771610
@define(eq=False, slots=False)
15781611
class BaseAIResource(BaseResource):
15791612
kind: ClassVar[str] = "ai_resource"
@@ -1590,6 +1623,8 @@ class BaseAIJob(BaseAIResource):
15901623
_kind_description: ClassVar[str] = "An AI Job resource."
15911624
_metadata: ClassVar[Dict[str, Any]] = {"icon": "job", "group": "ai"}
15921625

1626+
ai_job_status: Optional[AIJobStatus] = field(default=None, metadata={"description": "Current status of the AI job"})
1627+
15931628

15941629
@define(eq=False, slots=False)
15951630
class BaseAIModel(BaseAIResource):

plugins/aws/fix_plugin_aws/resource/acm.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ class AwsAcmCertificate(AwsResource, BaseCertificate):
8080
"tags": S("Tags", default=[]) >> ToDict(),
8181
"name": S("DomainName"),
8282
"ctime": S("CreatedAt"),
83+
"mtime": S("RenewalSummary", "UpdatedAt"),
8384
"arn": S("CertificateArn"),
8485
"subject_alternative_names": S("SubjectAlternativeNames", default=[]),
8586
"domain_validation_options": S("DomainValidationOptions", default=[])

plugins/aws/fix_plugin_aws/resource/bedrock.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212
from fix_plugin_aws.resource.lambda_ import AwsLambdaFunction
1313
from fix_plugin_aws.resource.s3 import AwsS3Bucket
1414
from fix_plugin_aws.resource.rds import AwsRdsCluster, AwsRdsInstance
15-
from fixlib.baseresources import BaseAIJob, ModelReference, BaseAIModel
15+
from fixlib.baseresources import AIJobStatus, BaseAIJob, ModelReference, BaseAIModel
1616
from fixlib.graph import Graph
17-
from fixlib.json_bender import Bender, S, ForallBend, Bend, Sort
17+
from fixlib.json_bender import Bender, S, ForallBend, Bend, MapEnum, Sort
1818
from fixlib.types import Json
1919

2020
log = logging.getLogger("fix.plugins.aws")
@@ -82,6 +82,16 @@ def service_name(cls) -> str:
8282
return service_name
8383

8484

85+
AWS_BEDROCK_JOB_STATUS_MAPPING = {
86+
"InProgress": AIJobStatus.RUNNING,
87+
"Completed": AIJobStatus.COMPLETED,
88+
"Failed": AIJobStatus.FAILED,
89+
"Stopping": AIJobStatus.STOPPING,
90+
"Stopped": AIJobStatus.STOPPED,
91+
"Deleting": AIJobStatus.STOPPING,
92+
}
93+
94+
8595
@define(eq=False, slots=False)
8696
class AwsBedrockFoundationModel(BaseAIModel, AwsResource):
8797
kind: ClassVar[str] = "aws_bedrock_foundation_model"
@@ -553,7 +563,7 @@ class AwsBedrockModelCustomizationJob(BedrockTaggable, BaseAIJob, AwsResource):
553563
"output_model_arn": S("outputModelArn"),
554564
"client_request_token": S("clientRequestToken"),
555565
"role_arn": S("roleArn"),
556-
"status": S("status"),
566+
"status": S("status") >> MapEnum(AWS_BEDROCK_JOB_STATUS_MAPPING, AIJobStatus.UNKNOWN),
557567
"failure_message": S("failureMessage"),
558568
"creation_time": S("creationTime"),
559569
"last_modified_time": S("lastModifiedTime"),
@@ -575,7 +585,6 @@ class AwsBedrockModelCustomizationJob(BedrockTaggable, BaseAIJob, AwsResource):
575585
output_model_arn: Optional[str] = field(default=None, metadata={"description": "The Amazon Resource Name (ARN) of the output model."}) # fmt: skip
576586
client_request_token: Optional[str] = field(default=None, metadata={"description": "The token that you specified in the CreateCustomizationJob request."}) # fmt: skip
577587
role_arn: Optional[str] = field(default=None, metadata={"description": "The Amazon Resource Name (ARN) of the IAM role."}) # fmt: skip
578-
status: Optional[str] = field(default=None, metadata={"description": "The status of the job. A successful job transitions from in-progress to completed when the output model is ready to use. If the job failed, the failure message contains information about why the job failed."}) # fmt: skip
579588
failure_message: Optional[str] = field(default=None, metadata={"description": "Information about why the job failed."}) # fmt: skip
580589
creation_time: Optional[datetime] = field(default=None, metadata={"description": "Time that the resource was created."}) # fmt: skip
581590
last_modified_time: Optional[datetime] = field(default=None, metadata={"description": "Time that the resource was last modified."}) # fmt: skip
@@ -777,7 +786,7 @@ class AwsBedrockEvaluationJob(BedrockTaggable, BaseAIJob, AwsResource):
777786
"ctime": S("creationTime"),
778787
"mtime": S("lastModifiedTime"),
779788
"job_name": S("jobName"),
780-
"status": S("status"),
789+
"status": S("status") >> MapEnum(AWS_BEDROCK_JOB_STATUS_MAPPING, AIJobStatus.UNKNOWN),
781790
"job_arn": S("jobArn"),
782791
"job_description": S("jobDescription"),
783792
"role_arn": S("roleArn"),
@@ -791,7 +800,6 @@ class AwsBedrockEvaluationJob(BedrockTaggable, BaseAIJob, AwsResource):
791800
"failure_messages": S("failureMessages", default=[]),
792801
}
793802
job_name: Optional[str] = field(default=None, metadata={"description": "The name of the model evaluation job."}) # fmt: skip
794-
status: Optional[str] = field(default=None, metadata={"description": "The status of the model evaluation job."}) # fmt: skip
795803
job_arn: Optional[str] = field(default=None, metadata={"description": "The Amazon Resource Name (ARN) of the model evaluation job."}) # fmt: skip
796804
job_description: Optional[str] = field(default=None, metadata={"description": "The description of the model evaluation job."}) # fmt: skip
797805
role_arn: Optional[str] = field(default=None, metadata={"description": "The Amazon Resource Name (ARN) of the IAM service role used in the model evaluation job."}) # fmt: skip

plugins/aws/fix_plugin_aws/resource/cognito.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ class AwsCognitoUser(AwsResource, BaseUser):
113113
"enabled": S("Enabled"),
114114
"user_status": S("UserStatus"),
115115
"mfa_options": S("MFAOptions", default=[]) >> ForallBend(AwsCognitoMFAOptionType.mapping),
116+
"username": S("Username"),
116117
}
117118
user_attributes: List[AwsCognitoAttributeType] = field(factory=list)
118119
enabled: Optional[bool] = field(default=None)

plugins/aws/fix_plugin_aws/resource/dynamodb.py

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,16 @@
88
from fix_plugin_aws.resource.kinesis import AwsKinesisStream
99
from fix_plugin_aws.resource.kms import AwsKmsKey
1010
from fix_plugin_aws.utils import ToDict
11-
from fixlib.baseresources import HasResourcePolicy, ModelReference, PolicySource, PolicySourceKind
11+
from fixlib.baseresources import (
12+
BaseDatabase,
13+
DatabaseInstanceStatus,
14+
HasResourcePolicy,
15+
ModelReference,
16+
PolicySource,
17+
PolicySourceKind,
18+
)
1219
from fixlib.graph import Graph
13-
from fixlib.json_bender import S, Bend, Bender, ForallBend, bend
20+
from fixlib.json_bender import S, Bend, Bender, ForallBend, bend, K, MapValue
1421
from fixlib.types import Json
1522
from fixlib.json import sort_json
1623

@@ -356,7 +363,7 @@ class AwsDynamoDbContinuousBackup:
356363

357364

358365
@define(eq=False, slots=False)
359-
class AwsDynamoDbTable(DynamoDbTaggable, AwsResource, HasResourcePolicy):
366+
class AwsDynamoDbTable(DynamoDbTaggable, BaseDatabase, AwsResource, HasResourcePolicy):
360367
kind: ClassVar[str] = "aws_dynamodb_table"
361368
_kind_display: ClassVar[str] = "AWS DynamoDB Table"
362369
_kind_description: ClassVar[str] = "AWS DynamoDB Table is a fully managed NoSQL database service that stores and retrieves data. It supports key-value and document data models, offering automatic scaling and low-latency performance. DynamoDB Tables handle data storage, indexing, and querying, providing consistent read and write throughput. They offer data encryption, backup, and recovery features for secure and reliable data management." # fmt: skip
@@ -396,6 +403,25 @@ class AwsDynamoDbTable(DynamoDbTaggable, AwsResource, HasResourcePolicy):
396403
"dynamodb_sse_description": S("SSEDescription") >> Bend(AwsDynamoDbSSEDescription.mapping),
397404
"dynamodb_archival_summary": S("ArchivalSummary") >> Bend(AwsDynamoDbArchivalSummary.mapping),
398405
"dynamodb_table_class_summary": S("TableClassSummary") >> Bend(AwsDynamoDbTableClassSummary.mapping),
406+
"db_type": K("dynamodb"),
407+
"db_status": S("TableStatus")
408+
>> MapValue(
409+
{
410+
"CREATING": DatabaseInstanceStatus.BUSY,
411+
"UPDATING": DatabaseInstanceStatus.BUSY,
412+
"DELETING": DatabaseInstanceStatus.BUSY,
413+
"ACTIVE": DatabaseInstanceStatus.AVAILABLE,
414+
"INACCESSIBLE_ENCRYPTION_CREDENTIALS": DatabaseInstanceStatus.FAILED,
415+
"ARCHIVING": DatabaseInstanceStatus.BUSY,
416+
"ARCHIVED": DatabaseInstanceStatus.STOPPED,
417+
},
418+
default=DatabaseInstanceStatus.UNKNOWN,
419+
),
420+
"volume_encrypted": S("SSEDescription", "Status")
421+
>> MapValue(
422+
{"ENABLING": True, "ENABLED": True, "DISABLING": False, "DISABLED": False, "UPDATING": None},
423+
default=None,
424+
),
399425
}
400426
arn: Optional[str] = field(default=None)
401427
dynamodb_attribute_definitions: List[AwsDynamoDbAttributeDefinition] = field(factory=list)

plugins/aws/fix_plugin_aws/resource/ec2.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
from fix_plugin_aws.resource.kms import AwsKmsKey
2424
from fix_plugin_aws.resource.s3 import AwsS3Bucket
2525
from fix_plugin_aws.utils import ToDict, TagsValue
26-
from fix_plugin_aws.aws_client import AwsClient
2726
from fixlib.baseresources import (
2827
BaseInstance,
2928
BaseKeyPair,
@@ -2155,6 +2154,7 @@ class AwsEc2Vpc(EC2Taggable, AwsResource, BaseNetwork):
21552154
"vpc_cidr_block_association_set": S("CidrBlockAssociationSet", default=[])
21562155
>> ForallBend(AwsEc2VpcCidrBlockAssociation.mapping),
21572156
"vpc_is_default": S("IsDefault"),
2157+
"cidr_blocks": S("CidrBlockAssociationSet", default=[]) >> ForallBend(S("CidrBlock")),
21582158
}
21592159
vpc_cidr_block: Optional[str] = field(default=None)
21602160
vpc_dhcp_options_id: Optional[str] = field(default=None)
@@ -2506,6 +2506,7 @@ class AwsEc2Subnet(EC2Taggable, AwsResource, BaseSubnet):
25062506
"subnet_ipv6_native": S("Ipv6Native"),
25072507
"subnet_private_dns_name_options_on_launch": S("PrivateDnsNameOptionsOnLaunch")
25082508
>> Bend(AwsEc2PrivateDnsNameOptionsOnLaunch.mapping),
2509+
"cidr_block": S("CidrBlock"),
25092510
}
25102511
subnet_availability_zone: Optional[str] = field(default=None)
25112512
subnet_availability_zone_id: Optional[str] = field(default=None)

plugins/aws/fix_plugin_aws/resource/iam.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -654,6 +654,7 @@ class AwsIamUser(AwsResource, BaseUser, BaseIamPrincipal):
654654
"arn": S("Arn"),
655655
"user_policies": S("UserPolicyList", default=[]) >> ForallBend(AwsIamPolicyDetail.mapping),
656656
"user_permissions_boundary": S("PermissionsBoundary") >> Bend(AwsIamAttachedPermissionsBoundary.mapping),
657+
"username": S("UserName"),
657658
}
658659
path: Optional[str] = field(default=None)
659660
user_policies: List[AwsIamPolicyDetail] = field(factory=list)

plugins/aws/fix_plugin_aws/resource/lambda_.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,7 @@ class AwsLambdaFunction(AwsResource, BaseServerlessFunction, HasResourcePolicy):
251251
"function_signing_job_arn": S("SigningJobArn"),
252252
"function_architectures": S("Architectures", default=[]),
253253
"function_ephemeral_storage": S("EphemeralStorage", "Size"),
254+
"memory_size": S("MemorySize"),
254255
}
255256
function_runtime: Optional[str] = field(default=None)
256257
function_role: Optional[str] = field(default=None)

plugins/aws/fix_plugin_aws/resource/route53.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,13 @@ class AwsRoute53Zone(AwsResource, BaseDNSZone):
8181
"name": S("Name"),
8282
"zone_caller_reference": S("CallerReference"),
8383
"zone_config": S("Config") >> Bend(AwsRoute53ZoneConfig.mapping),
84-
"zone_resource_record_set_count": S("ResourceRecordSetCount"),
8584
"zone_linked_service": S("LinkedService") >> Bend(AwsRoute53LinkedService.mapping),
85+
"private_zone": S("Config", "PrivateZone"),
86+
"zone_resource_record_set_count": S("ResourceRecordSetCount"),
8687
}
88+
zone_resource_record_set_count: Optional[int] = field(default=None, metadata=dict(ignore_history=True))
8789
zone_caller_reference: Optional[str] = field(default=None)
8890
zone_config: Optional[AwsRoute53ZoneConfig] = field(default=None)
89-
zone_resource_record_set_count: Optional[int] = field(default=None, metadata=dict(ignore_history=True))
9091
zone_linked_service: Optional[AwsRoute53LinkedService] = field(default=None)
9192
zone_logging_config: Optional[AwsRoute53LoggingConfig] = field(default=None)
9293

plugins/aws/fix_plugin_aws/resource/s3.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ def add_bucket_encryption(bck: AwsS3Bucket) -> None:
235235
mapped = bend(AwsS3ServerSideEncryptionRule.mapping, raw)
236236
if rule := parse_json(mapped, AwsS3ServerSideEncryptionRule, builder):
237237
bck.bucket_encryption_rules.append(rule)
238+
bck.encryption_enabled = len(bck.bucket_encryption_rules) > 0
238239

239240
def add_bucket_policy(bck: AwsS3Bucket) -> None:
240241
with builder.suppress(f"{service_name}.get-bucket-policy"):
@@ -267,9 +268,11 @@ def add_bucket_versioning(bck: AwsS3Bucket) -> None:
267268
):
268269
bck.bucket_versioning = raw_versioning.get("Status") == "Enabled"
269270
bck.bucket_mfa_delete = raw_versioning.get("MFADelete") == "Enabled"
271+
bck.versioning_enabled = bck.bucket_versioning
270272
else:
271273
bck.bucket_versioning = False
272274
bck.bucket_mfa_delete = False
275+
bck.versioning_enabled = False
273276

274277
def add_public_access(bck: AwsS3Bucket) -> None:
275278
with builder.suppress(f"{service_name}.get-public-access-block"):

0 commit comments

Comments
 (0)