@@ -7,6 +7,8 @@ import EKS, {
77 DescribeClusterRequest ,
88 DescribeClusterResponse ,
99 ListTagsForResourceResponse ,
10+ ListNodegroupsRequest ,
11+ ListNodegroupsResponse ,
1012} from 'aws-sdk/clients/eks'
1113import CloudGraph from '@cloudgraph/sdk'
1214import groupBy from 'lodash/groupBy'
@@ -23,8 +25,8 @@ const errorLog = new AwsErrorLog(serviceName)
2325const endpoint = initTestEndpoint ( serviceName )
2426const MAX_ITEMS = 100
2527
26- const listClustersForRegion = async ( {
27- eks,
28+ const listClustersForRegion = async ( {
29+ eks,
2830 resolveRegion,
2931} : {
3032 eks : EKS
@@ -123,9 +125,61 @@ const getResourceTags = async (eks: EKS, arn: string): Promise<TagMap> =>
123125 }
124126 } )
125127
128+ const listNodegroups = async ( {
129+ eks,
130+ clusterName,
131+ } : {
132+ eks : EKS
133+ clusterName : string
134+ } ) : Promise < string [ ] > =>
135+ new Promise < string [ ] > ( resolve => {
136+ const nodeGroupsList : string [ ] = [ ]
137+ let args : ListNodegroupsRequest = { clusterName }
138+ const listAllNodeGroups = ( token ?: string ) : void => {
139+ if ( token ) {
140+ args = { ...args , nextToken : token }
141+ }
142+
143+ try {
144+ eks . listNodegroups (
145+ args ,
146+ ( err : AWSError , data : ListNodegroupsResponse ) => {
147+ if ( err ) {
148+ errorLog . generateAwsErrorLog ( {
149+ functionName : 'eks:listNodegroups' ,
150+ err,
151+ } )
152+ }
153+
154+ /**
155+ * No node groups for this region
156+ */
157+ if ( isEmpty ( data ) ) {
158+ return resolve ( nodeGroupsList )
159+ }
160+
161+ const { nextToken, nodegroups } = data || { }
162+
163+ nodeGroupsList . push ( ...nodegroups )
164+
165+ if ( nextToken ) {
166+ listAllNodeGroups ( nextToken )
167+ }
168+
169+ resolve ( nodeGroupsList )
170+ }
171+ )
172+ } catch ( error ) {
173+ resolve ( [ ] )
174+ }
175+ }
176+ listAllNodeGroups ( )
177+ } )
178+
126179export interface RawAwsEksCluster extends Omit < Cluster , 'Tags' > {
127180 region : string
128181 Tags ?: TagMap
182+ NodeGroups ?: string [ ]
129183}
130184
131185export default async ( {
@@ -140,6 +194,7 @@ export default async ({
140194 const regionPromises = [ ]
141195 const clusterPromises = [ ]
142196 const tagsPromises = [ ]
197+ const nodeGroupsPromises = [ ]
143198
144199 // get all clusters for all regions
145200 regions . split ( ',' ) . map ( region => {
@@ -192,6 +247,22 @@ export default async ({
192247 } )
193248
194249 await Promise . all ( tagsPromises )
250+
251+ // get all node groups for each cluster
252+ eksData . map ( ( { name, region } , idx ) => {
253+ const eks = new EKS ( { ...config , region, endpoint } )
254+ const nodeGroupsPromise = new Promise < void > ( async resolveNodeGroups => {
255+ const nodeGroups : string [ ] = await listNodegroups ( {
256+ eks,
257+ clusterName : name ,
258+ } )
259+ eksData [ idx ] . NodeGroups = nodeGroups
260+ resolveNodeGroups ( )
261+ } )
262+ nodeGroupsPromises . push ( nodeGroupsPromise )
263+ } )
264+
265+ await Promise . all ( nodeGroupsPromises )
195266 errorLog . reset ( )
196267
197268 resolve ( groupBy ( eksData , 'region' ) )
0 commit comments