@@ -160,6 +160,19 @@ func (c *EKS) EKSDeploymentParse(*kingpin.ParseContext) error {
160
160
return err
161
161
}
162
162
163
+ subnetIds , err := c .listdownSubnetIds (c .DeploymentVars ["CLUSTER_NAME" ])
164
+
165
+ if err != nil {
166
+ log .Fatalf ("Error in listing down subnets: %v" , err )
167
+ }
168
+
169
+ c .DeploymentVars = provider .MergeDeploymentVars (
170
+ c .DeploymentVars ,
171
+ map [string ]string {
172
+ "EKS_SUBNET_IDS" : strings .Join (subnetIds , c .DeploymentVars ["SEPARATOR" ]),
173
+ },
174
+ )
175
+
163
176
deploymentResource , err := provider .DeploymentsParse (c .DeploymentFiles , c .DeploymentVars )
164
177
if err != nil {
165
178
return fmt .Errorf ("Couldn't parse deployment files: %v" , err )
@@ -209,14 +222,32 @@ func (c *EKS) K8SDeploymentsParse(*kingpin.ParseContext) error {
209
222
return nil
210
223
}
211
224
212
- // StackCreate creates a new vpc and prints desired subnetIds.
213
- func (c * EKS ) StackCreate (* kingpin.ParseContext ) error {
214
- stackName := fmt .Sprintf ("%s-vpc" , c .DeploymentVars ["CLUSTER_NAME" ])
225
+ func (c * EKS ) listdownSubnetIds (clusterName string ) ([]string , error ) {
226
+ subnetIds , err := c .showSubnetIds (clusterName )
227
+
228
+ if err != nil {
229
+ return []string {}, err
230
+ }
231
+
232
+ if len (subnetIds ) == 0 {
233
+ subnetIds , err = c .createStack (clusterName )
234
+ if err != nil {
235
+ return []string {}, err
236
+ }
237
+ }
238
+
239
+ return subnetIds , err
240
+ }
241
+
242
+ // createStack creates a new vpc and prints desired subnetIds.
243
+ func (c * EKS ) createStack (clusterName string ) ([]string , error ) {
244
+ stackName := fmt .Sprintf ("%s-vpc" , clusterName )
215
245
req := & cloudFormation.CreateStackInput {
216
- StackName : aws .String (stackName ),
246
+ TemplateURL : aws .String ("https://amazon-eks.s3.us-west-2.amazonaws.com/cloudformation/2020-07-23/amazon-eks-vpc-sample.yaml" ),
247
+ StackName : aws .String (stackName ),
217
248
Tags : []* cloudFormation.Tag {
218
249
{
219
- Key : aws .String (fmt .Sprintf ("kubernetes.io/cluster/%s" , c . DeploymentVars [ "CLUSTER_NAME" ] )),
250
+ Key : aws .String (fmt .Sprintf ("kubernetes.io/cluster/%s" , clusterName )),
220
251
Value : aws .String ("shared" ),
221
252
},
222
253
},
@@ -226,33 +257,25 @@ func (c *EKS) StackCreate(*kingpin.ParseContext) error {
226
257
227
258
_ , err := c .clientCF .CreateStack (req )
228
259
if err != nil {
229
- log . Fatalf ("Couldn't create stack '%s' ,err: %s" , * req .StackName , err )
260
+ return nil , fmt . Errorf ("Couldn't create stack '%s' ,err: %s" , * req .StackName , err )
230
261
}
231
262
232
263
err = provider .RetryUntilTrue (
233
264
fmt .Sprintf ("creating stack:%v" , * req .StackName ),
234
265
provider .GlobalRetryCount ,
235
- func () (bool , error ) { return c .clusterRunning (* req .StackName ) },
266
+ func () (bool , error ) { return c .stackCreated (* req .StackName ) },
236
267
)
237
268
238
269
if err != nil {
239
- log . Fatalf ("creating cluster err:%v" , err )
270
+ return nil , fmt . Errorf ("creating stack err:%v" , err )
240
271
}
241
272
242
- subnetIds , err := c .showSubnetIds (* req .StackName )
243
-
244
- if err != nil {
245
- log .Fatalf ("error in displaying subnetIds, err:%v" , err )
246
- }
247
-
248
- fmt .Printf ("SubnetIds with defined separator is as follows: %s" , strings .Join (subnetIds , c .DeploymentVars ["SEPARATOR" ]))
249
-
250
- return nil
273
+ return c .showSubnetIds (clusterName )
251
274
}
252
275
253
- // StackDelete deletes vpc stack.
254
- func (c * EKS ) StackDelete ( * kingpin. ParseContext ) error {
255
- stackName := fmt .Sprintf ("%s-vpc" , c . DeploymentVars [ "CLUSTER_NAME" ] )
276
+ // deleteStack deletes vpc stack.
277
+ func (c * EKS ) deleteStack ( clusterName string ) error {
278
+ stackName := fmt .Sprintf ("%s-vpc" , clusterName )
256
279
req := & cloudFormation.DeleteStackInput {
257
280
StackName : aws .String (stackName ),
258
281
}
@@ -261,7 +284,7 @@ func (c *EKS) StackDelete(*kingpin.ParseContext) error {
261
284
262
285
_ , err := c .clientCF .DeleteStack (req )
263
286
if err != nil {
264
- log . Fatalf ("Couldn't delete stack '%s' ,err: %s" , * req .StackName , err )
287
+ return fmt . Errorf ("Couldn't delete stack '%s' ,err: %s" , * req .StackName , err )
265
288
}
266
289
267
290
err = provider .RetryUntilTrue (
@@ -271,7 +294,7 @@ func (c *EKS) StackDelete(*kingpin.ParseContext) error {
271
294
)
272
295
273
296
if err != nil {
274
- log . Fatalf ("deleting stack err:%v" , err )
297
+ return fmt . Errorf ("deleting stack err:%v" , err )
275
298
}
276
299
277
300
return nil
@@ -302,27 +325,34 @@ func (c *EKS) stackDeleted(name string) (bool, error) {
302
325
StackName : aws .String (name ),
303
326
}
304
327
stackRes , err := c .clientCF .DescribeStacks (req )
328
+
329
+ if err .(awserr.Error ).Code () == "ValidationError" {
330
+ return true , nil
331
+ }
332
+
305
333
if err != nil {
306
334
return false , fmt .Errorf ("Couldn't get stack status: %v" , err )
307
335
}
336
+
308
337
if * stackRes .Stacks [0 ].StackStatus == cloudFormation .StackStatusDeleteFailed {
309
338
return false , fmt .Errorf ("Stack delete failed - %s" , * stackRes .Stacks [0 ].StackStatus )
310
339
}
311
- if len (stackRes .Stacks ) == 0 {
312
- return true , nil
313
- }
340
+
314
341
log .Printf ("Stack '%s' status: %s" , name , * stackRes .Stacks [0 ].StackStatus )
315
342
return false , nil
316
343
}
317
344
318
- func (c * EKS ) showSubnetIds (name string ) ([]string , error ) {
345
+ func (c * EKS ) showSubnetIds (clusterName string ) ([]string , error ) {
346
+ stackName := fmt .Sprintf ("%s-vpc" , clusterName )
319
347
req := & cloudFormation.DescribeStacksInput {
320
- StackName : aws .String (name ),
348
+ StackName : aws .String (stackName ),
321
349
}
322
350
stackRes , err := c .clientCF .DescribeStacks (req )
323
351
324
- if err != nil {
325
- return []string {}, err
352
+ if awsErr , ok := err .(awserr.Error ); ok {
353
+ if awsErr .Code () != "ValidationError" {
354
+ return []string {}, awsErr
355
+ }
326
356
}
327
357
328
358
for _ , stack := range stackRes .Stacks {
@@ -457,6 +487,13 @@ func (c *EKS) ClusterDelete(*kingpin.ParseContext) error {
457
487
if err != nil {
458
488
return fmt .Errorf ("removing cluster err:%v" , err )
459
489
}
490
+
491
+ log .Printf ("Removing subnets related to cluster '%s'" , * req .Cluster .Name )
492
+ err = c .deleteStack (* req .Cluster .Name )
493
+
494
+ if err != nil {
495
+ log .Fatalf ("removing cluster's subnets err:%v" , err )
496
+ }
460
497
}
461
498
return nil
462
499
}
0 commit comments