Skip to content

Commit

Permalink
fix(security-group): Fix security group does not get deleted if the s…
Browse files Browse the repository at this point in the history
…tatus code is 409
  • Loading branch information
keerthi-gp committed Jan 29, 2025
1 parent d6375c4 commit b5af238
Showing 1 changed file with 58 additions and 0 deletions.
58 changes: 58 additions & 0 deletions ibm/service/vpc/resource_ibm_is_security_group.go
Original file line number Diff line number Diff line change
Expand Up @@ -503,6 +503,10 @@ func resourceIBMISSecurityGroupDelete(d *schema.ResourceData, meta interface{})
if err != nil {
return err
}
_, err := isWaitForSecurityGroupTargetDeleteRetry(sess, deleteSecurityGroupTargetBindingOptions, d.Timeout(schema.TimeoutDelete))
if err != nil {
return err
}
}
} else {
return fmt.Errorf("[ERROR] Error deleting security group target binding while deleting security group : %s\n%s", err, response)
Expand All @@ -528,6 +532,10 @@ func resourceIBMISSecurityGroupDelete(d *schema.ResourceData, meta interface{})
if err != nil {
return err
}
_, err := isWaitForSecurityGroupDeleteRetry(sess, deleteSecurityGroupOptions, d.Timeout(schema.TimeoutDelete))
if err != nil {
return err
}
}
} else {
return fmt.Errorf("[ERROR] Error Deleting Security Group : %s\n%s", err, response)
Expand Down Expand Up @@ -682,3 +690,53 @@ func isSgRefreshFunc(client *vpcv1.VpcV1, sgId string, groups []vpcv1.SecurityGr
return allrecs, "deleting", nil
}
}

func isWaitForSecurityGroupDeleteRetry(vpcClient *vpcv1.VpcV1, deleteSecurityGroupOptions *vpcv1.DeleteSecurityGroupOptions, timeout time.Duration) (interface{}, error) {
log.Printf("[DEBUG] Retrying security group (%s) delete", *deleteSecurityGroupOptions.ID)
stateConf := &resource.StateChangeConf{
Pending: []string{"security-group-in-use"},
Target: []string{"deleted", ""},
Refresh: func() (interface{}, string, error) {
log.Printf("[DEBUG] Retrying security group (%s) delete", *deleteSecurityGroupOptions.ID)
response, err := vpcClient.DeleteSecurityGroup(deleteSecurityGroupOptions)
if err != nil {
if response != nil && response.StatusCode == 409 {
return response, "security-group-in-use", nil
} else if response != nil && response.StatusCode == 404 {
return response, "deleted", nil
}
return response, "", fmt.Errorf("[ERROR] Error deleting security group: %s\n%s", err, response)
}
return response, "deleted", nil
},
Timeout: timeout,
Delay: 10 * time.Second,
MinTimeout: 10 * time.Second,
}
return stateConf.WaitForState()
}

func isWaitForSecurityGroupTargetDeleteRetry(vpcClient *vpcv1.VpcV1, deleteSecurityGroupTargetBindingOptions *vpcv1.DeleteSecurityGroupTargetBindingOptions, timeout time.Duration) (interface{}, error) {
log.Printf("[DEBUG] Retrying security group target (%s) delete", *deleteSecurityGroupTargetBindingOptions.ID)
stateConf := &resource.StateChangeConf{
Pending: []string{"security-group-target-in-use"},
Target: []string{"deleted", ""},
Refresh: func() (interface{}, string, error) {
log.Printf("[DEBUG] Retrying security group target(%s) delete", *deleteSecurityGroupTargetBindingOptions.ID)
response, err := vpcClient.DeleteSecurityGroupTargetBinding(deleteSecurityGroupTargetBindingOptions)
if err != nil {
if response != nil && response.StatusCode == 409 {
return response, "security-group-target-in-use", nil
} else if response != nil && response.StatusCode == 404 {
return response, "deleted", nil
}
return response, "", fmt.Errorf("[ERROR] Error deleting security group target: %s\n%s", err, response)
}
return response, "deleted", nil
},
Timeout: timeout,
Delay: 10 * time.Second,
MinTimeout: 10 * time.Second,
}
return stateConf.WaitForState()
}

0 comments on commit b5af238

Please sign in to comment.