2
0
almahmoud 7 жил өмнө
parent
commit
8500758b08

+ 48 - 7
cloudbridge/cloud/providers/azure/azure_client.py

@@ -16,6 +16,8 @@ from azure.storage.blob import BlockBlobService
 
 from cloudbridge.cloud.interfaces.exceptions import WaitStateException
 
+from msrestazure.azure_exceptions import CloudError
+
 from . import helpers as azure_helpers
 
 log = logging.getLogger(__name__)
@@ -585,13 +587,52 @@ class AzureClient(object):
                                              subnet_id)
         network_name = url_params.get(NETWORK_NAME)
         subnet_name = url_params.get(SUBNET_NAME)
-        result_delete = self.network_management_client \
-            .subnets.delete(
-                self.resource_group,
-                network_name,
-                subnet_name
-            )
-        result_delete.wait()
+
+        try:
+            result_delete = self.network_management_client \
+                .subnets.delete(
+                    self.resource_group,
+                    network_name,
+                    subnet_name
+                )
+            result_delete.wait()
+        except CloudError as cloud_error:
+            log.exception(cloud_error.message)
+            print(cloud_error.code)
+            if cloud_error.code != "InUseSubnetCannotBeDeleted":
+                raise cloud_error
+
+            else:
+                timeout = self._config.get("default_wait_timeout")
+                interval = self._config.get("default_wait_interval")
+
+                assert timeout >= 0
+                assert interval >= 0
+                assert timeout >= interval
+
+                end_time = time.time() + timeout
+
+                while time.time() < end_time:
+                    log.debug("Subnet %s is in use and cannot be deleted. "
+                              "Retrying every %s sec for another %s seconds.",
+                              subnet_id, interval, timeout)
+                    time.sleep(interval)
+                    try:
+                        result_delete = self.network_management_client \
+                            .subnets.delete(
+                                self.resource_group,
+                                network_name,
+                                subnet_name
+                            )
+                        result_delete.wait()
+                        break
+                    except CloudError as cloud_error:
+                        if cloud_error.code != "InUseSubnetCannotBeDeleted":
+                            raise cloud_error
+
+                raise WaitStateException(
+                    "Waited too long to delete subnet: {0}."
+                    "Subnet is still in use.".format(subnet_id))
 
     def create_floating_ip(self, public_ip_name, public_ip_parameters):
         return self.network_management_client.public_ip_addresses. \