22from typing import List
33
44from 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+ )
920from spaceone .inventory .libs .connector import SchematicAWSConnector
1021from spaceone .inventory .libs .schema .resource import ReferenceModel , CloudWatchModel
1122from spaceone .inventory .conf .cloud_service_conf import *
1526
1627
1728class 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