Skip to content

Commit 251bcf1

Browse files
Merge pull request #163 from jinyoungmoonDEV/master
add: RDS의 SnapShot에 Instance 정보 이외의 Cluster 정보도 추가
2 parents 0897315 + 83a4337 commit 251bcf1

File tree

4 files changed

+69
-8
lines changed

4 files changed

+69
-8
lines changed

src/spaceone/inventory/connector/aws_rds_connector/connector.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,22 +204,69 @@ def snapshot_request_data(self, region_name) -> List[Snapshot]:
204204
self.cloud_service_type = 'Snapshot'
205205
cloudtrail_resource_type = 'AWS::RDS::DBSnapshot'
206206

207+
#Instance
207208
paginator = self.client.get_paginator('describe_db_snapshots')
208209
response_iterator = paginator.paginate(
209210
PaginationConfig={
210211
'MaxItems': 10000,
211212
'PageSize': 50,
212213
}
213214
)
215+
214216
for data in response_iterator:
215217
for raw in data.get('DBSnapshots', []):
216218
try:
217219
if raw.get('Engine') in DEFAULT_RDS_FILTER:
218220
raw.update({
221+
'db_type': 'instance',
222+
'DBIdentifier': raw['DBInstanceIdentifier'],
223+
'DBCreateTime': raw['InstanceCreateTime'],
224+
'DBResourceId': raw['DbiResourceId'],
219225
'region_name': region_name,
220226
'cloudtrail': self.set_cloudtrail(region_name, cloudtrail_resource_type,
221227
raw['DBSnapshotIdentifier'])
222228
})
229+
230+
snapshot_vo = Snapshot(raw, strict=False)
231+
yield {
232+
'data': snapshot_vo,
233+
'name': snapshot_vo.db_snapshot_identifier,
234+
'instance_type': snapshot_vo.engine,
235+
'account': self.account_id,
236+
'tags': self.list_tags_for_resource(snapshot_vo.db_snapshot_arn)
237+
}
238+
239+
except Exception as e:
240+
resource_id = raw.get('DBSnapshotArn', '')
241+
error_resource_response = self.generate_error(region_name, resource_id, e)
242+
yield {'data': error_resource_response}
243+
244+
#Cluster
245+
cluster_paginator = self.client.get_paginator('describe_db_cluster_snapshots')
246+
cluster_response_iterator = cluster_paginator.paginate(
247+
PaginationConfig={
248+
'MaxItems': 10000,
249+
'PageSize': 50,
250+
}
251+
)
252+
253+
for data in cluster_response_iterator:
254+
for raw in data.get('DBClusterSnapshots', []):
255+
try:
256+
if raw.get('Engine') in DEFAULT_RDS_FILTER:
257+
raw.update({
258+
'db_type': 'cluster',
259+
'DBSnapshotIdentifier': raw['DBClusterSnapshotIdentifier'],
260+
'DBIdentifier': raw['DBClusterIdentifier'],
261+
'DBCreateTime': raw['ClusterCreateTime'],
262+
'DBSnapshotArn': raw['DBClusterSnapshotArn'],
263+
'DBResourceId': raw['DbClusterResourceId'],
264+
'AvailabilityZone': self._get_availability_zones_to_str(raw['AvailabilityZones']),
265+
'region_name': region_name,
266+
'cloudtrail': self.set_cloudtrail(region_name, cloudtrail_resource_type,
267+
raw['DBClusterSnapshotIdentifier'])
268+
})
269+
223270
snapshot_vo = Snapshot(raw, strict=False)
224271
yield {
225272
'data': snapshot_vo,
@@ -357,3 +404,10 @@ def get_region(azs):
357404
return azs[0][:-1]
358405

359406
return None
407+
408+
@staticmethod
409+
def _get_availability_zones_to_str(azs):
410+
if azs:
411+
return ', '.join(azs)
412+
else:
413+
return ''

src/spaceone/inventory/connector/aws_rds_connector/schema/data.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -137,15 +137,16 @@ class Features(Model):
137137

138138
class Snapshot(AWSCloudService):
139139
db_snapshot_identifier = StringType(deserialize_from="DBSnapshotIdentifier")
140-
db_instance_identifier = StringType(deserialize_from="DBInstanceIdentifier")
140+
db_identifier = StringType(deserialize_from="DBIdentifier")
141+
db_type = StringType()
141142
snapshot_create_time = DateTimeType(deserialize_from="SnapshotCreateTime")
142143
engine = StringType(deserialize_from="Engine")
143144
allocated_storage = IntType(deserialize_from="AllocatedStorage")
144145
status = StringType(deserialize_from="Status")
145146
port = IntType(deserialize_from="Port")
146147
availability_zone = StringType(deserialize_from="AvailabilityZone")
147148
vpc_id = StringType(deserialize_from="VpcId")
148-
instance_create_time = DateTimeType(deserialize_from="InstanceCreateTime")
149+
db_create_time = DateTimeType(deserialize_from="DBCreateTime")
149150
master_username = StringType(deserialize_from="MasterUsername")
150151
engine_version = StringType(deserialize_from="EngineVersion")
151152
license_model = StringType(deserialize_from="LicenseModel")
@@ -163,7 +164,7 @@ class Snapshot(AWSCloudService):
163164
timezone = StringType(deserialize_from="Timezone")
164165
iam_database_authentication_enabled = BooleanType(deserialize_from="IAMDatabaseAuthenticationEnabled")
165166
processor_features = ListType(ModelType(Features), deserialize_from="ProcessorFeatures")
166-
dbi_resource_id = StringType(deserialize_from="DbiResourceId")
167+
db_resource_id = StringType(deserialize_from="DBResourceId")
167168

168169
def reference(self, region_code):
169170
return {

src/spaceone/inventory/connector/aws_rds_connector/schema/resource.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,10 @@
293293
'safe': ['available'],
294294
'warning': ['creating', 'pending']
295295
}),
296-
TextDyField.data_source('Cluster/Instance Name', 'data.db_instance_identifier'),
296+
EnumDyField.data_source('DB Type', 'data.db_type', default_badge={
297+
'indigo.500': ['instance'], 'coral.600': ['cluster']
298+
}),
299+
TextDyField.data_source('Cluster/Instance Name', 'data.db_identifier'),
297300
EnumDyField.data_source('Type', 'data.snapshot_type', default_outline_badge=['manual', 'automated']),
298301
EnumDyField.data_source('Storage Type', 'data.storage_type',
299302
default_outline_badge=['standard', 'io1', 'gp2', 'gp3', 'st1', 'sc1']),

src/spaceone/inventory/connector/aws_rds_connector/schema/service_type.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -315,12 +315,15 @@
315315
}
316316
cst_rds_snapshot._metadata = CloudServiceTypeMeta.set_meta(
317317
fields=[
318-
TextDyField.data_source('DB Instance', 'data.db_instance_identifier'),
318+
EnumDyField.data_source('DB Type', 'data.db_type', default_badge={
319+
'indigo.500': ['instance'], 'coral.600': ['cluster']
320+
}),
321+
TextDyField.data_source('DB Instance/Cluster', 'data.db_identifier'),
319322
EnumDyField.data_source('Status', 'data.status', default_state={
320323
'warning': ['creating', 'deleting'],
321324
'safe': ['available'],
322325
}),
323-
TextDyField.data_source('Type', 'data.snapshot_type'),
326+
TextDyField.data_source('Snapshot Type', 'data.snapshot_type'),
324327
TextDyField.data_source('Engine', 'data.engine'),
325328
TextDyField.data_source('AZ', 'data.availability_zone'),
326329
EnumDyField.data_source('Encryption', 'data.encrypted', default_badge={
@@ -348,7 +351,7 @@
348351
TextDyField.data_source('KMS ID', 'data.kms_key_id', options={
349352
'is_optional': True
350353
}),
351-
TextDyField.data_source('DBI Resource ID', 'data.dbi_resource_id', options={
354+
TextDyField.data_source('DB Resource ID', 'data.db_resource_id', options={
352355
'is_optional': True
353356
}),
354357
TextDyField.data_source('Option Group Name', 'data.option_group_name', options={
@@ -363,7 +366,7 @@
363366
],
364367
search=[
365368
SearchField.set(name='ARN', key='data.db_snapshot_arn'),
366-
SearchField.set(name='DB Instance Identifier', key='data.db_instance_identifier'),
369+
SearchField.set(name='DB Instance Identifier', key='data.db_identifier'),
367370
SearchField.set(name='Engine', key='data.engine'),
368371
SearchField.set(name='Allocated Storage', key='data.allocated_storage', data_type='integer'),
369372
SearchField.set(name='Status', key='data.status'),

0 commit comments

Comments
 (0)