Skip to content

Commit b5af238

Browse files
committed
fix(security-group): Fix security group does not get deleted if the status code is 409
1 parent d6375c4 commit b5af238

File tree

1 file changed

+58
-0
lines changed

1 file changed

+58
-0
lines changed

ibm/service/vpc/resource_ibm_is_security_group.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -503,6 +503,10 @@ func resourceIBMISSecurityGroupDelete(d *schema.ResourceData, meta interface{})
503503
if err != nil {
504504
return err
505505
}
506+
_, err := isWaitForSecurityGroupTargetDeleteRetry(sess, deleteSecurityGroupTargetBindingOptions, d.Timeout(schema.TimeoutDelete))
507+
if err != nil {
508+
return err
509+
}
506510
}
507511
} else {
508512
return fmt.Errorf("[ERROR] Error deleting security group target binding while deleting security group : %s\n%s", err, response)
@@ -528,6 +532,10 @@ func resourceIBMISSecurityGroupDelete(d *schema.ResourceData, meta interface{})
528532
if err != nil {
529533
return err
530534
}
535+
_, err := isWaitForSecurityGroupDeleteRetry(sess, deleteSecurityGroupOptions, d.Timeout(schema.TimeoutDelete))
536+
if err != nil {
537+
return err
538+
}
531539
}
532540
} else {
533541
return fmt.Errorf("[ERROR] Error Deleting Security Group : %s\n%s", err, response)
@@ -682,3 +690,53 @@ func isSgRefreshFunc(client *vpcv1.VpcV1, sgId string, groups []vpcv1.SecurityGr
682690
return allrecs, "deleting", nil
683691
}
684692
}
693+
694+
func isWaitForSecurityGroupDeleteRetry(vpcClient *vpcv1.VpcV1, deleteSecurityGroupOptions *vpcv1.DeleteSecurityGroupOptions, timeout time.Duration) (interface{}, error) {
695+
log.Printf("[DEBUG] Retrying security group (%s) delete", *deleteSecurityGroupOptions.ID)
696+
stateConf := &resource.StateChangeConf{
697+
Pending: []string{"security-group-in-use"},
698+
Target: []string{"deleted", ""},
699+
Refresh: func() (interface{}, string, error) {
700+
log.Printf("[DEBUG] Retrying security group (%s) delete", *deleteSecurityGroupOptions.ID)
701+
response, err := vpcClient.DeleteSecurityGroup(deleteSecurityGroupOptions)
702+
if err != nil {
703+
if response != nil && response.StatusCode == 409 {
704+
return response, "security-group-in-use", nil
705+
} else if response != nil && response.StatusCode == 404 {
706+
return response, "deleted", nil
707+
}
708+
return response, "", fmt.Errorf("[ERROR] Error deleting security group: %s\n%s", err, response)
709+
}
710+
return response, "deleted", nil
711+
},
712+
Timeout: timeout,
713+
Delay: 10 * time.Second,
714+
MinTimeout: 10 * time.Second,
715+
}
716+
return stateConf.WaitForState()
717+
}
718+
719+
func isWaitForSecurityGroupTargetDeleteRetry(vpcClient *vpcv1.VpcV1, deleteSecurityGroupTargetBindingOptions *vpcv1.DeleteSecurityGroupTargetBindingOptions, timeout time.Duration) (interface{}, error) {
720+
log.Printf("[DEBUG] Retrying security group target (%s) delete", *deleteSecurityGroupTargetBindingOptions.ID)
721+
stateConf := &resource.StateChangeConf{
722+
Pending: []string{"security-group-target-in-use"},
723+
Target: []string{"deleted", ""},
724+
Refresh: func() (interface{}, string, error) {
725+
log.Printf("[DEBUG] Retrying security group target(%s) delete", *deleteSecurityGroupTargetBindingOptions.ID)
726+
response, err := vpcClient.DeleteSecurityGroupTargetBinding(deleteSecurityGroupTargetBindingOptions)
727+
if err != nil {
728+
if response != nil && response.StatusCode == 409 {
729+
return response, "security-group-target-in-use", nil
730+
} else if response != nil && response.StatusCode == 404 {
731+
return response, "deleted", nil
732+
}
733+
return response, "", fmt.Errorf("[ERROR] Error deleting security group target: %s\n%s", err, response)
734+
}
735+
return response, "deleted", nil
736+
},
737+
Timeout: timeout,
738+
Delay: 10 * time.Second,
739+
MinTimeout: 10 * time.Second,
740+
}
741+
return stateConf.WaitForState()
742+
}

0 commit comments

Comments
 (0)