Skip to content

Commit 10aead5

Browse files
fix: add history metadata & fix bugs
1 parent 9b782ec commit 10aead5

File tree

5 files changed

+79
-45
lines changed

5 files changed

+79
-45
lines changed

src/spaceone/inventory/conf/cloud_service_conf.py

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -12,34 +12,34 @@
1212
DEFAULT_VULNERABLE_PORTS = "22,3306"
1313

1414
CLOUD_SERVICE_GROUP_MAP = {
15-
"IAM": "IAMConnectorManager",
16-
"DynamoDB": "DynamoDBConnectorManager",
17-
"Lambda": "LambdaConnectorManager",
18-
"CloudFront": "CloudFrontConnectorManager",
19-
"RDS": "RDSConnectorManager",
20-
"Route53": "Route53ConnectorManager",
21-
"S3": "S3ConnectorManager",
22-
"ElastiCache": "ElastiCacheConnectorManager",
23-
"APIGateway": "APIGatewayConnectorManager",
24-
"DirectConnect": "DirectConnectConnectorManager",
25-
"EFS": "EFSConnectorManager",
26-
"DocumentDB": "DocumentDBConnectorManager",
27-
"ECS": "ECSConnectorManager",
28-
"Redshift": "RedshiftConnectorManager",
29-
"EKS": "EKSConnectorManager",
30-
"SQS": "SQSConnectorManager",
31-
"KMS": "KMSConnectorManager",
32-
"ECR": "ECRConnectorManager",
33-
"CloudTrail": "CloudTrailConnectorManager",
34-
"SNS": "SNSConnectorManager",
35-
"SecretsManager": "SecretsManagerConnectorManager",
36-
"ELB": "ELBConnectorManager",
37-
"VPC": "VPCConnectorManager",
38-
"ACM": "ACMConnectorManager",
39-
"KinesisDataStream": "KinesisDataStreamConnectorManager",
40-
"MSK": "MSKConnectorManager",
41-
"KinesisFirehose": "KinesisFirehoseConnectorManager",
42-
"Lightsail": "LightsailConnectorManager",
15+
# "IAM": "IAMConnectorManager",
16+
# "DynamoDB": "DynamoDBConnectorManager",
17+
# "Lambda": "LambdaConnectorManager",
18+
# "CloudFront": "CloudFrontConnectorManager",
19+
# "RDS": "RDSConnectorManager",
20+
# "Route53": "Route53ConnectorManager",
21+
# "S3": "S3ConnectorManager",
22+
# "ElastiCache": "ElastiCacheConnectorManager",
23+
# "APIGateway": "APIGatewayConnectorManager",
24+
# "DirectConnect": "DirectConnectConnectorManager",
25+
# "EFS": "EFSConnectorManager",
26+
# "DocumentDB": "DocumentDBConnectorManager",
27+
# "ECS": "ECSConnectorManager",
28+
# "Redshift": "RedshiftConnectorManager",
29+
# "EKS": "EKSConnectorManager",
30+
# "SQS": "SQSConnectorManager",
31+
# "KMS": "KMSConnectorManager",
32+
# "ECR": "ECRConnectorManager",
33+
# "CloudTrail": "CloudTrailConnectorManager",
34+
# "SNS": "SNSConnectorManager",
35+
# "SecretsManager": "SecretsManagerConnectorManager",
36+
# "ELB": "ELBConnectorManager",
37+
# "VPC": "VPCConnectorManager",
38+
# "ACM": "ACMConnectorManager",
39+
# "KinesisDataStream": "KinesisDataStreamConnectorManager",
40+
# "MSK": "MSKConnectorManager",
41+
# "KinesisFirehose": "KinesisFirehoseConnectorManager",
42+
# "Lightsail": "LightsailConnectorManager",
4343
"CloudWatch": "CloudWatchConnectorManager",
4444
# Not used services
4545
# "EC2": "EC2ConnectorManager",

src/spaceone/inventory/connector/aws_cloud_watch_connector/connector.py

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,11 @@ def get_resources(self):
5959
)
6060
return resources
6161

62+
def get_alarms(self):
63+
response = self.client.describe_alarms()
64+
# Only MetricAlarms are returned temporarily, CompositeAlarms must be applied later.
65+
return response["MetricAlarms"]
66+
6267
def request_alarms_data(self, region_name):
6368
self.cloud_service_type = "Alarm"
6469
cloudwatch_resource_type = "AWS::CloudWatch::Alarm"
@@ -67,9 +72,9 @@ def request_alarms_data(self, region_name):
6772
raw_alarms = self.get_alarms()
6873

6974
for raw_alarm in raw_alarms:
70-
71-
self.set_alarm_conditions(raw_alarm)
75+
self._set_alarm_conditions(raw_alarm)
7276
self._set_alarm_actions(raw_alarm)
77+
self._set_alarm_history(raw_alarm)
7378

7479
alarms_vo = Alarms(raw_alarm, strict=False)
7580
self.alarms.append(alarms_vo)
@@ -86,12 +91,7 @@ def request_alarms_data(self, region_name):
8691
)
8792
yield {"data": error_resource_response}
8893

89-
def get_alarms(self):
90-
response = self.client.describe_alarms()
91-
# Only MetricAlarms are returned temporarily, CompositeAlarms must be applied later.
92-
return response["MetricAlarms"]
93-
94-
def set_alarm_conditions(self, raw_alarm):
94+
def _set_alarm_conditions(self, raw_alarm):
9595
metric_name = raw_alarm.get("MetricName", "?")
9696
period = raw_alarm["Period"]
9797
evaluation_periods = self._convert_int_type(raw_alarm.get("EvaluationPeriods", "?"))
@@ -134,6 +134,24 @@ def _set_alarm_actions(raw_alarm):
134134
else:
135135
raw_alarm["actions_enabled"] = "No Actions"
136136

137+
def get_alarm_history(self, alarm_name: str):
138+
response = self.client.describe_alarm_history(AlarmName=alarm_name)
139+
return response["AlarmHistoryItems"]
140+
141+
def _set_alarm_history(self, raw_alarm):
142+
alarm_histories = self.get_alarm_history(raw_alarm["AlarmName"])
143+
144+
raw_alarm["history"] = []
145+
history = raw_alarm["history"]
146+
147+
for alarm_history in alarm_histories:
148+
history.append(
149+
{
150+
"date": alarm_history["Timestamp"],
151+
"type": alarm_histories["HistoryItemType"],
152+
"description": alarm_histories["HistorySummary"]
153+
}
154+
)
137155

138156
@staticmethod
139157
def _convert_int_type(value):

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,21 @@ class Action(Model):
1717
config = StringType(deserialize_from="config")
1818

1919

20+
class History(Model):
21+
date = DateType(deserialize_from="date")
22+
type = StringType(deserialize_from="type")
23+
description = StringType(deserialize_from="description")
24+
25+
2026
class Alarms(AWSCloudService):
2127
alarm_arn = StringType(deserialize_from="AlarmArn")
2228
name = StringType(deserialize_from="AlarmName")
2329
state_value = StringType(choices=("OK","ALARM","INSUFFICIENT_DATA"), deserialize_from="StateValue")
2430
state_updated_timestamp = DateType(deserialize_from="StateUpdatedTimestamp")
2531
actions_enabled = StringType(deserialize_from="actions_enabled")
26-
actions = ListType(ModelType(Action, deserialize_from="action"), deserialize_from="actions")
2732
conditions = StringType(deserialize_from="conditions")
33+
actions = ListType(ModelType(Action, deserialize_from="action"), deserialize_from="actions")
34+
history = ListType(ModelType(History, deserialize_from="history"), deserialize_from="history")
2835

2936
def reference(self, region_code):
3037
return {

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from schematics.types import PolyModelType, StringType, ModelType
22

33
from spaceone.inventory.connector.aws_cloud_watch_connector.schema.data import Alarms
4-
from spaceone.inventory.libs.schema.dynamic_field import TextDyField
4+
from spaceone.inventory.libs.schema.dynamic_field import TextDyField, DateTimeDyField
55
from spaceone.inventory.libs.schema.dynamic_layout import TableDynamicLayout
66
from spaceone.inventory.libs.schema.resource import CloudServiceResponse, CloudServiceResource, CloudServiceMeta
77

@@ -15,7 +15,16 @@
1515
],
1616
)
1717

18-
cloud_watch_metadata = CloudServiceMeta.set_layouts(layouts=[cw_actions])
18+
cw_history = TableDynamicLayout.set_fields(
19+
"History",
20+
fields=[
21+
DateTimeDyField.data_source("Date", "data.history.date"),
22+
TextDyField.data_source("Type", "data.history.type"),
23+
TextDyField.data_source("Description", "data.history.description"),
24+
]
25+
)
26+
27+
cloud_watch_metadata = CloudServiceMeta.set_layouts(layouts=[cw_actions,cw_history])
1928

2029

2130
class CloudWatchResource(CloudServiceResource):

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from spaceone.inventory.conf.cloud_service_conf import ASSET_URL
2-
from spaceone.inventory.libs.schema.dynamic_field import TextDyField, ListDyField, SearchField
2+
from spaceone.inventory.libs.schema.dynamic_field import TextDyField, ListDyField, SearchField, DateTimeDyField
33
from spaceone.inventory.libs.schema.resource import CloudServiceTypeResponse, CloudServiceTypeResource, \
44
CloudServiceTypeMeta
55

@@ -20,16 +20,16 @@
2020

2121
cst_alarms._metadata = CloudServiceTypeMeta.set_meta(
2222
fields=[
23-
TextDyField.data_source("State", "data.state"),
24-
TextDyField.data_source("Last State Update", "data.last_state_update"),
23+
TextDyField.data_source("State", "data.state_value"),
24+
DateTimeDyField.data_source("Last State Update", "data.state_updated_timestamp"),
2525
TextDyField.data_source("Conditions", "data.conditions"),
26-
ListDyField.data_source("Actions", "data.actions"),
26+
ListDyField.data_source("Actions", "data.actions_enabled"),
2727
],
2828
search=[
2929
SearchField.set(name="Alarm ARN", key="data.alarm_arn"),
3030
SearchField.set(name="Alarm Name", key="data.alarm_name"),
31-
SearchField.set(name="State", key="data.state"),
32-
SearchField.set(name="Actions", key="data.actions"),
31+
SearchField.set(name="State", key="data.state_value"),
32+
SearchField.set(name="Actions", key="data.actions_enabled"),
3333
],
3434
)
3535

0 commit comments

Comments
 (0)