Skip to content

Commit 690da3f

Browse files
authored
Merge pull request #169 from thwjddlek/master
add: add eks add-ons data
2 parents 3833024 + 1a5c579 commit 690da3f

File tree

4 files changed

+562
-261
lines changed

4 files changed

+562
-261
lines changed

src/.DS_Store

6 KB
Binary file not shown.

src/spaceone/inventory/connector/aws_eks_connector/connector.py

Lines changed: 180 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,21 @@
22
from typing import List
33

44
from spaceone.core.utils import *
5-
from spaceone.inventory.connector.aws_eks_connector.schema.data import Cluster, NodeGroup, Update
6-
from spaceone.inventory.connector.aws_eks_connector.schema.resource import ClusterResource, ClusterResponse, \
7-
NodeGroupResource, NodeGroupResponse
8-
from spaceone.inventory.connector.aws_eks_connector.schema.service_type import CLOUD_SERVICE_TYPES
5+
from spaceone.inventory.connector.aws_eks_connector.schema.data import (
6+
Cluster,
7+
NodeGroup,
8+
Update,
9+
AddOn,
10+
)
11+
from spaceone.inventory.connector.aws_eks_connector.schema.resource import (
12+
ClusterResource,
13+
ClusterResponse,
14+
NodeGroupResource,
15+
NodeGroupResponse,
16+
)
17+
from spaceone.inventory.connector.aws_eks_connector.schema.service_type import (
18+
CLOUD_SERVICE_TYPES,
19+
)
920
from spaceone.inventory.libs.connector import SchematicAWSConnector
1021
from spaceone.inventory.libs.schema.resource import ReferenceModel, CloudWatchModel
1122
from spaceone.inventory.conf.cloud_service_conf import *
@@ -15,9 +26,9 @@
1526

1627

1728
class EKSConnector(SchematicAWSConnector):
18-
service_name = 'eks'
19-
cloud_service_group = 'EKS'
20-
cloud_service_type = 'Cluster'
29+
service_name = "eks"
30+
cloud_service_group = "EKS"
31+
cloud_service_type = "Cluster"
2132
cloud_service_types = CLOUD_SERVICE_TYPES
2233

2334
def get_resources(self):
@@ -29,153 +40,203 @@ def get_resources(self):
2940
resources.extend(self.set_cloud_service_types())
3041

3142
collect_resource = {
32-
'request_method': self.request_data,
33-
'resource': ClusterResource,
34-
'response_schema': ClusterResponse
43+
"request_method": self.request_data,
44+
"resource": ClusterResource,
45+
"response_schema": ClusterResponse,
3546
}
3647

3748
for region_name in self.region_names:
3849
try:
3950
self.reset_region(region_name)
40-
resources.extend(self.collect_data_by_region(self.service_name, region_name, collect_resource))
51+
resources.extend(
52+
self.collect_data_by_region(
53+
self.service_name, region_name, collect_resource
54+
)
55+
)
4156

4257
# For Node Group
4358
for node_group_vo in self.node_groups:
44-
resources.append(NodeGroupResponse(
45-
{'resource': NodeGroupResource({
46-
'name': node_group_vo.nodegroup_name,
47-
'launched_at': self.datetime_to_iso8601(node_group_vo.created_at),
48-
'data': node_group_vo,
49-
'tags': node_group_vo.tags,
50-
'region_code': region_name,
51-
'reference': ReferenceModel(node_group_vo.reference(region_name))})}
52-
))
59+
resources.append(
60+
NodeGroupResponse(
61+
{
62+
"resource": NodeGroupResource(
63+
{
64+
"name": node_group_vo.nodegroup_name,
65+
"launched_at": self.datetime_to_iso8601(
66+
node_group_vo.created_at
67+
),
68+
"data": node_group_vo,
69+
"tags": node_group_vo.tags,
70+
"region_code": region_name,
71+
"reference": ReferenceModel(
72+
node_group_vo.reference(region_name)
73+
),
74+
}
75+
)
76+
}
77+
)
78+
)
5379

5480
self.node_groups = []
5581
except Exception as e:
56-
error_resource_response = self.generate_error(region_name, '', e)
82+
error_resource_response = self.generate_error(region_name, "", e)
5783
resources.append(error_resource_response)
5884

59-
_LOGGER.debug(f'[get_resources][account_id: {self.account_id}] FINISHED: EKS ({time.time() - start_time} sec)')
85+
_LOGGER.debug(
86+
f"[get_resources][account_id: {self.account_id}] FINISHED: EKS ({time.time() - start_time} sec)"
87+
)
6088
return resources
6189

6290
def request_data(self, region_name) -> List[Cluster]:
63-
self.cloud_service_type = 'Cluster'
64-
cloudtrail_resource_type = 'AWS::EKS::Cluster'
91+
self.cloud_service_type = "Cluster"
92+
cloudtrail_resource_type = "AWS::EKS::Cluster"
6593

66-
paginator = self.client.get_paginator('list_clusters')
94+
paginator = self.client.get_paginator("list_clusters")
6795
response_iterator = paginator.paginate(
6896
PaginationConfig={
69-
'MaxItems': 10000,
70-
'PageSize': 50,
97+
"MaxItems": 10000,
98+
"PageSize": 50,
7199
}
72100
)
73101

74102
errors = []
75103

76104
for data in response_iterator:
77-
for _cluster_name in data.get('clusters', []):
105+
for _cluster_name in data.get("clusters", []):
78106
try:
79107
raw = self.client.describe_cluster(name=_cluster_name)
80108

81-
if cluster := raw.get('cluster'):
82-
cluster.update({
83-
'updates': list(self.list_updates(_cluster_name)),
84-
'cloudwatch': self.eks_cluster_cloudwatch(cluster, region_name),
85-
'cloudtrail': self.set_cloudtrail(region_name, cloudtrail_resource_type, cluster['name'])
86-
})
87-
88-
node_groups, node_group_errors = self.list_node_groups(_cluster_name, cluster.get('arn'),
89-
region_name)
90-
91-
cluster.update({
92-
'node_groups': node_groups
93-
})
109+
if cluster := raw.get("cluster"):
110+
cluster.update(
111+
{
112+
"updates": list(self.list_updates(_cluster_name)),
113+
"add_ons": list(self.list_add_ons(_cluster_name)),
114+
"cloudwatch": self.eks_cluster_cloudwatch(
115+
cluster, region_name
116+
),
117+
"cloudtrail": self.set_cloudtrail(
118+
region_name,
119+
cloudtrail_resource_type,
120+
cluster["name"],
121+
),
122+
}
123+
)
124+
125+
node_groups, node_group_errors = self.list_node_groups(
126+
_cluster_name, cluster.get("arn"), region_name
127+
)
128+
129+
cluster.update({"node_groups": node_groups})
94130

95131
self.node_groups.extend(node_groups)
96132
errors.extend(node_group_errors)
97133

98134
cluster_vo = Cluster(cluster, strict=False)
99135

100136
yield {
101-
'data': cluster_vo,
102-
'name': cluster_vo.name,
103-
'launched_at': self.datetime_to_iso8601(cluster_vo.created_at),
104-
'account': self.account_id,
105-
'tags': cluster.get('tags',)
137+
"data": cluster_vo,
138+
"name": cluster_vo.name,
139+
"launched_at": self.datetime_to_iso8601(
140+
cluster_vo.created_at
141+
),
142+
"account": self.account_id,
143+
"tags": cluster.get(
144+
"tags",
145+
),
106146
}
107147

108148
except Exception as e:
109149
resource_id = _cluster_name
110150
errors.append(self.generate_error(region_name, resource_id, e))
111151

112152
for error in errors:
113-
yield {'data': error}
153+
yield {"data": error}
114154

115155
def list_node_groups(self, cluster_name, cluster_arn, region_name):
116-
self.cloud_service_type = 'NodeGroup'
117-
cloudtrail_resource_type = 'AWS::EKS::Nodegroup'
156+
self.cloud_service_type = "NodeGroup"
157+
cloudtrail_resource_type = "AWS::EKS::Nodegroup"
118158

119159
asgs = self.get_auto_scaling_groups()
120-
paginator = self.client.get_paginator('list_nodegroups')
160+
paginator = self.client.get_paginator("list_nodegroups")
121161
response_iterator = paginator.paginate(
122162
clusterName=cluster_name,
123163
PaginationConfig={
124-
'MaxItems': 10000,
125-
'PageSize': 50,
126-
}
164+
"MaxItems": 10000,
165+
"PageSize": 50,
166+
},
127167
)
128168

129169
node_groups = []
130170
errors = []
131171

132172
for data in response_iterator:
133-
for node_group in data.get('nodegroups', []):
173+
for node_group in data.get("nodegroups", []):
134174
try:
135-
node_group_response = self.client.describe_nodegroup(clusterName=cluster_name, nodegroupName=node_group)
136-
node_group = node_group_response.get('nodegroup', {})
137-
node_group.update({
138-
'cluster_arn': cluster_arn,
139-
'cloudtrail': self.set_cloudtrail(region_name, cloudtrail_resource_type,
140-
node_group['nodegroupName'])
141-
})
142-
asg_names = [asg.get("name", "") for asg in
143-
node_group.get("resources", "").get("autoScalingGroups", [])]
175+
node_group_response = self.client.describe_nodegroup(
176+
clusterName=cluster_name, nodegroupName=node_group
177+
)
178+
node_group = node_group_response.get("nodegroup", {})
179+
node_group.update(
180+
{
181+
"cluster_arn": cluster_arn,
182+
"cloudtrail": self.set_cloudtrail(
183+
region_name,
184+
cloudtrail_resource_type,
185+
node_group["nodegroupName"],
186+
),
187+
}
188+
)
189+
asg_names = [
190+
asg.get("name", "")
191+
for asg in node_group.get("resources", "").get(
192+
"autoScalingGroups", []
193+
)
194+
]
144195
if len(asg_names) > 0:
145-
node_group["resources"]["autoScalingGroups"] = self.get_matched_auto_scaling_groups(asgs, asg_names)
196+
node_group["resources"]["autoScalingGroups"] = (
197+
self.get_matched_auto_scaling_groups(asgs, asg_names)
198+
)
146199
node_groups.append(NodeGroup(node_group, strict=False))
147200

148201
except Exception as e:
149-
resource_id = node_group.get('nodegroupArn', '')
202+
resource_id = node_group.get("nodegroupArn", "")
150203
errors.append(self.generate_error(region_name, resource_id, e))
151204

152205
return node_groups, errors
153206

154207
def list_updates(self, cluster_name):
155-
paginator = self.client.get_paginator('list_updates')
208+
paginator = self.client.get_paginator("list_updates")
156209
response_iterator = paginator.paginate(
157210
name=cluster_name,
158211
PaginationConfig={
159-
'MaxItems': 10000,
160-
'PageSize': 50,
161-
}
212+
"MaxItems": 10000,
213+
"PageSize": 50,
214+
},
162215
)
163216

164217
for data in response_iterator:
165-
for update_id in data.get('updateIds', []):
166-
response = self.client.describe_update(name=cluster_name, updateId=update_id)
167-
yield Update(response.get('update', {}), strict=False)
218+
for update_id in data.get("updateIds", []):
219+
response = self.client.describe_update(
220+
name=cluster_name, updateId=update_id
221+
)
222+
yield Update(response.get("update", {}), strict=False)
168223

169224
def eks_cluster_cloudwatch(self, cluster, region_name):
170-
cloudwatch_kubernetes = self.set_cloudwatch('Kubernetes', 'CLUSTER_ID', cluster['name'], region_name)
171-
cloudwatch_container_insights = self.set_cloudwatch('ContainerInsights', 'ClusterName',
172-
cluster['name'], region_name)
225+
cloudwatch_kubernetes = self.set_cloudwatch(
226+
"Kubernetes", "CLUSTER_ID", cluster["name"], region_name
227+
)
228+
cloudwatch_container_insights = self.set_cloudwatch(
229+
"ContainerInsights", "ClusterName", cluster["name"], region_name
230+
)
173231

174-
cloudwatch_vo = CloudWatchModel({
175-
'region_name': region_name,
176-
'metrics_info': cloudwatch_kubernetes.metrics_info +
177-
cloudwatch_container_insights.metrics_info
178-
}, strict=False)
232+
cloudwatch_vo = CloudWatchModel(
233+
{
234+
"region_name": region_name,
235+
"metrics_info": cloudwatch_kubernetes.metrics_info
236+
+ cloudwatch_container_insights.metrics_info,
237+
},
238+
strict=False,
239+
)
179240

180241
return cloudwatch_vo
181242

@@ -184,27 +245,31 @@ def _convert_tag_format(tags):
184245
list_tags = []
185246

186247
for _key in tags:
187-
list_tags.append({'key': _key, 'value': tags[_key]})
248+
list_tags.append({"key": _key, "value": tags[_key]})
188249

189250
return list_tags
190251

191252
def get_auto_scaling_groups(self):
192-
auto_scaling_client = self.session.client('autoscaling', verify=BOTO3_HTTPS_VERIFIED)
193-
paginator = auto_scaling_client.get_paginator('describe_auto_scaling_groups')
253+
auto_scaling_client = self.session.client(
254+
"autoscaling", verify=BOTO3_HTTPS_VERIFIED
255+
)
256+
paginator = auto_scaling_client.get_paginator("describe_auto_scaling_groups")
194257
response_iterator = paginator.paginate(
195258
PaginationConfig={
196-
'MaxItems': 10000,
197-
'PageSize': 50,
259+
"MaxItems": 10000,
260+
"PageSize": 50,
198261
}
199262
)
200263

201264
asgs = []
202265
for data in response_iterator:
203-
for asg in data.get('AutoScalingGroups', []):
204-
asgs.append({
205-
"name": asg.get("AutoScalingGroupName", ""),
206-
"arn": asg.get("AutoScalingGroupARN", "")
207-
})
266+
for asg in data.get("AutoScalingGroups", []):
267+
asgs.append(
268+
{
269+
"name": asg.get("AutoScalingGroupName", ""),
270+
"arn": asg.get("AutoScalingGroupARN", ""),
271+
}
272+
)
208273
return asgs
209274

210275
@staticmethod
@@ -214,3 +279,28 @@ def get_matched_auto_scaling_groups(asgs, asg_names):
214279
if asg.get("name", "") in asg_names:
215280
matched_asgs.append(asg)
216281
return matched_asgs
282+
283+
def list_add_ons(self, cluster_name):
284+
paginator = self.client.get_paginator("list_addons")
285+
response_iterator = paginator.paginate(
286+
clusterName=cluster_name,
287+
PaginationConfig={
288+
"MaxItems": 10000,
289+
"PageSize": 50,
290+
},
291+
)
292+
293+
errors = []
294+
295+
for data in response_iterator:
296+
for addon_name in data.get("addons", []):
297+
try:
298+
add_on_response = self.client.describe_addon(
299+
clusterName=cluster_name,
300+
addonName=addon_name,
301+
)
302+
303+
yield AddOn(add_on_response.get("addon", {}), strict=False)
304+
305+
except Exception as e:
306+
errors.append(self.generate_error(cluster_name, addon_name, e))

0 commit comments

Comments
 (0)