@@ -160,6 +160,19 @@ func (c *EKS) EKSDeploymentParse(*kingpin.ParseContext) error {
160160 return err
161161 }
162162
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+
163176 deploymentResource , err := provider .DeploymentsParse (c .DeploymentFiles , c .DeploymentVars )
164177 if err != nil {
165178 log .Fatalf ("Couldn't parse deployment files: %v" , err )
@@ -208,14 +221,32 @@ func (c *EKS) K8SDeploymentsParse(*kingpin.ParseContext) error {
208221 return nil
209222}
210223
211- // StackCreate creates a new vpc and prints desired subnetIds.
212- func (c * EKS ) StackCreate (* kingpin.ParseContext ) error {
213- stackName := fmt .Sprintf ("%s-vpc" , c .DeploymentVars ["CLUSTER_NAME" ])
224+ func (c * EKS ) listdownSubnetIds (clusterName string ) ([]string , error ) {
225+ subnetIds , err := c .showSubnetIds (clusterName )
226+
227+ if err != nil {
228+ return []string {}, err
229+ }
230+
231+ if len (subnetIds ) == 0 {
232+ subnetIds , err = c .createStack (clusterName )
233+ if err != nil {
234+ return []string {}, err
235+ }
236+ }
237+
238+ return subnetIds , err
239+ }
240+
241+ // createStack creates a new vpc and prints desired subnetIds.
242+ func (c * EKS ) createStack (clusterName string ) ([]string , error ) {
243+ stackName := fmt .Sprintf ("%s-vpc" , clusterName )
214244 req := & cloudFormation.CreateStackInput {
215- StackName : aws .String (stackName ),
245+ TemplateURL : aws .String ("https://amazon-eks.s3.us-west-2.amazonaws.com/cloudformation/2020-07-23/amazon-eks-vpc-sample.yaml" ),
246+ StackName : aws .String (stackName ),
216247 Tags : []* cloudFormation.Tag {
217248 {
218- Key : aws .String (fmt .Sprintf ("kubernetes.io/cluster/%s" , c . DeploymentVars [ "CLUSTER_NAME" ] )),
249+ Key : aws .String (fmt .Sprintf ("kubernetes.io/cluster/%s" , clusterName )),
219250 Value : aws .String ("shared" ),
220251 },
221252 },
@@ -225,33 +256,25 @@ func (c *EKS) StackCreate(*kingpin.ParseContext) error {
225256
226257 _ , err := c .clientCF .CreateStack (req )
227258 if err != nil {
228- log . Fatalf ("Couldn't create stack '%s' ,err: %s" , * req .StackName , err )
259+ return nil , fmt . Errorf ("Couldn't create stack '%s' ,err: %s" , * req .StackName , err )
229260 }
230261
231262 err = provider .RetryUntilTrue (
232263 fmt .Sprintf ("creating stack:%v" , * req .StackName ),
233264 provider .GlobalRetryCount ,
234- func () (bool , error ) { return c .clusterRunning (* req .StackName ) },
265+ func () (bool , error ) { return c .stackCreated (* req .StackName ) },
235266 )
236267
237268 if err != nil {
238- log . Fatalf ("creating cluster err:%v" , err )
269+ return nil , fmt . Errorf ("creating stack err:%v" , err )
239270 }
240271
241- subnetIds , err := c .showSubnetIds (* req .StackName )
242-
243- if err != nil {
244- log .Fatalf ("error in displaying subnetIds, err:%v" , err )
245- }
246-
247- fmt .Printf ("SubnetIds with defined separator is as follows: %s" , strings .Join (subnetIds , c .DeploymentVars ["SEPARATOR" ]))
248-
249- return nil
272+ return c .showSubnetIds (clusterName )
250273}
251274
252- // StackDelete deletes vpc stack.
253- func (c * EKS ) StackDelete ( * kingpin. ParseContext ) error {
254- stackName := fmt .Sprintf ("%s-vpc" , c . DeploymentVars [ "CLUSTER_NAME" ] )
275+ // deleteStack deletes vpc stack.
276+ func (c * EKS ) deleteStack ( clusterName string ) error {
277+ stackName := fmt .Sprintf ("%s-vpc" , clusterName )
255278 req := & cloudFormation.DeleteStackInput {
256279 StackName : aws .String (stackName ),
257280 }
@@ -260,7 +283,7 @@ func (c *EKS) StackDelete(*kingpin.ParseContext) error {
260283
261284 _ , err := c .clientCF .DeleteStack (req )
262285 if err != nil {
263- log . Fatalf ("Couldn't delete stack '%s' ,err: %s" , * req .StackName , err )
286+ return fmt . Errorf ("Couldn't delete stack '%s' ,err: %s" , * req .StackName , err )
264287 }
265288
266289 err = provider .RetryUntilTrue (
@@ -270,7 +293,7 @@ func (c *EKS) StackDelete(*kingpin.ParseContext) error {
270293 )
271294
272295 if err != nil {
273- log . Fatalf ("deleting stack err:%v" , err )
296+ return fmt . Errorf ("deleting stack err:%v" , err )
274297 }
275298
276299 return nil
@@ -301,27 +324,34 @@ func (c *EKS) stackDeleted(name string) (bool, error) {
301324 StackName : aws .String (name ),
302325 }
303326 stackRes , err := c .clientCF .DescribeStacks (req )
327+
328+ if err .(awserr.Error ).Code () == "ValidationError" {
329+ return true , nil
330+ }
331+
304332 if err != nil {
305333 return false , fmt .Errorf ("Couldn't get stack status: %v" , err )
306334 }
335+
307336 if * stackRes .Stacks [0 ].StackStatus == cloudFormation .StackStatusDeleteFailed {
308337 return false , fmt .Errorf ("Stack delete failed - %s" , * stackRes .Stacks [0 ].StackStatus )
309338 }
310- if len (stackRes .Stacks ) == 0 {
311- return true , nil
312- }
339+
313340 log .Printf ("Stack '%s' status: %s" , name , * stackRes .Stacks [0 ].StackStatus )
314341 return false , nil
315342}
316343
317- func (c * EKS ) showSubnetIds (name string ) ([]string , error ) {
344+ func (c * EKS ) showSubnetIds (clusterName string ) ([]string , error ) {
345+ stackName := fmt .Sprintf ("%s-vpc" , clusterName )
318346 req := & cloudFormation.DescribeStacksInput {
319- StackName : aws .String (name ),
347+ StackName : aws .String (stackName ),
320348 }
321349 stackRes , err := c .clientCF .DescribeStacks (req )
322350
323- if err != nil {
324- return []string {}, err
351+ if awsErr , ok := err .(awserr.Error ); ok {
352+ if awsErr .Code () != "ValidationError" {
353+ return []string {}, awsErr
354+ }
325355 }
326356
327357 for _ , stack := range stackRes .Stacks {
@@ -458,6 +488,13 @@ func (c *EKS) ClusterDelete(*kingpin.ParseContext) error {
458488 if err != nil {
459489 log .Fatalf ("removing cluster err:%v" , err )
460490 }
491+
492+ log .Printf ("Removing subnets related to cluster '%s'" , * req .Cluster .Name )
493+ err = c .deleteStack (* req .Cluster .Name )
494+
495+ if err != nil {
496+ log .Fatalf ("removing cluster's subnets err:%v" , err )
497+ }
461498 }
462499 return nil
463500}
0 commit comments