@@ -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