583
583
"GET_VRF_SWITCH" : "/rest/top-down/fabrics/{}/vrfs/switches?vrf-names={}&serial-numbers={}" ,
584
584
"GET_VRF_ID" : "/rest/managed-pool/fabrics/{}/partitions/ids" ,
585
585
"GET_VLAN" : "/rest/resource-manager/vlan/{}?vlanUsageType=TOP_DOWN_VRF_VLAN" ,
586
+ "GET_NET_VRF" : "/rest/resource-manager/fabrics/{}/networks?vrf-name={}"
586
587
},
587
588
12 : {
588
589
"GET_VRF" : "/appcenter/cisco/ndfc/api/v1/lan-fabric/rest/top-down/fabrics/{}/vrfs" ,
589
590
"GET_VRF_ATTACH" : "/appcenter/cisco/ndfc/api/v1/lan-fabric/rest/top-down/fabrics/{}/vrfs/attachments?vrf-names={}" ,
590
591
"GET_VRF_SWITCH" : "/appcenter/cisco/ndfc/api/v1/lan-fabric/rest/top-down/fabrics/{}/vrfs/switches?vrf-names={}&serial-numbers={}" ,
591
592
"GET_VRF_ID" : "/appcenter/cisco/ndfc/api/v1/lan-fabric/rest/top-down/fabrics/{}/vrfinfo" ,
592
593
"GET_VLAN" : "/appcenter/cisco/ndfc/api/v1/lan-fabric/rest/resource-manager/vlan/{}?vlanUsageType=TOP_DOWN_VRF_VLAN" ,
594
+ "GET_NET_VRF" : "/appcenter/cisco/ndfc/api/v1/lan-fabric/rest/top-down/fabrics/{}/networks?vrf-name={}" ,
593
595
},
594
596
}
595
597
@@ -3758,6 +3760,18 @@ def push_to_remote(self, is_rollback=False):
3758
3760
# attachment being deleted is re-used on a new vrf attachment being
3759
3761
# created. This is needed specially for state: overridden
3760
3762
3763
+ for vrf_name in self .diff_delete :
3764
+ path = self .paths ["GET_NET_VRF" ].format (self .fabric , vrf_name )
3765
+ resp = dcnm_send (self .module , "GET" , path )
3766
+ if resp .get ("DATA" ) is None :
3767
+ msg = f"Invalid Response from Controller. { resp } "
3768
+ self .module .fail_json (msg = msg )
3769
+ elif resp ["DATA" ] != []:
3770
+ msg = "VRF has associated network attachments. "
3771
+ msg += "Please remove the network attachments "
3772
+ msg += "before deleting the VRF. (maybe using dcnm_network module)"
3773
+ self .module .fail_json (msg = msg )
3774
+
3761
3775
self .push_diff_detach (is_rollback )
3762
3776
self .push_diff_undeploy (is_rollback )
3763
3777
@@ -3791,7 +3805,7 @@ def wait_for_vrf_del_ready(self, vrf_name="not_supplied"):
3791
3805
for vrf in self .diff_delete :
3792
3806
ok_to_delete = False
3793
3807
path = self .paths ["GET_VRF_ATTACH" ].format (self .fabric , vrf )
3794
-
3808
+ retry_count = 20
3795
3809
while not ok_to_delete :
3796
3810
resp = dcnm_send (self .module , "GET" , path )
3797
3811
ok_to_delete = True
@@ -3811,31 +3825,18 @@ def wait_for_vrf_del_ready(self, vrf_name="not_supplied"):
3811
3825
):
3812
3826
self .diff_delete .update ({vrf : "OUT-OF-SYNC" })
3813
3827
break
3814
- if (
3815
- attach ["lanAttachState" ] == "DEPLOYED"
3816
- and attach ["isLanAttached" ] is True
3817
- ):
3818
- vrf_name = attach .get ("vrfName" , "unknown" )
3819
- fabric_name = attach .get ("fabricName" , "unknown" )
3820
- switch_ip = attach .get ("ipAddress" , "unknown" )
3821
- switch_name = attach .get ("switchName" , "unknown" )
3822
- vlan_id = attach .get ("vlanId" , "unknown" )
3823
- msg = f"Network attachments associated with vrf { vrf_name } "
3824
- msg += "must be removed (e.g. using the dcnm_network module) "
3825
- msg += "prior to deleting the vrf. "
3826
- msg += f"Details: fabric_name: { fabric_name } , "
3827
- msg += f"vrf_name: { vrf_name } . "
3828
- msg += "Network attachments found on "
3829
- msg += f"switch_ip: { switch_ip } , "
3830
- msg += f"switch_name: { switch_name } , "
3831
- msg += f"vlan_id: { vlan_id } "
3832
- self .module .fail_json (msg = msg )
3833
3828
if attach ["lanAttachState" ] != "NA" :
3834
3829
time .sleep (self .WAIT_TIME_FOR_DELETE_LOOP )
3835
3830
self .diff_delete .update ({vrf : "DEPLOYED" })
3836
3831
ok_to_delete = False
3837
3832
break
3838
3833
self .diff_delete .update ({vrf : "NA" })
3834
+ if retry_count <= 0 :
3835
+ msg = "Timeout waiting for VRF to be ready for deletion. "
3836
+ msg += f"vrf: { vrf } , "
3837
+ msg += f"resp: { resp } "
3838
+ self .module .fail_json (msg = msg )
3839
+ retry_count -= 1
3839
3840
3840
3841
def attach_spec (self ):
3841
3842
"""
0 commit comments