Explorar el Código

Test resources cleanup

almahmoud hace 7 años
padre
commit
d7b6f6af65

+ 26 - 57
cloudbridge/cloud/providers/azure/azure_client.py

@@ -1,6 +1,5 @@
 import datetime
 import logging
-import time
 from io import BytesIO
 
 from azure.common.credentials import ServicePrincipalCredentials
@@ -18,6 +17,8 @@ from cloudbridge.cloud.interfaces.exceptions import WaitStateException
 
 from msrestazure.azure_exceptions import CloudError
 
+import tenacity
+
 from . import helpers as azure_helpers
 
 log = logging.getLogger(__name__)
@@ -168,33 +169,23 @@ class AzureClient(object):
         log.debug("azure subscription : %s", self.subscription_id)
 
     @property
+    @tenacity.retry(stop=tenacity.stop_after_attempt(5), reraise=True)
     def access_key_result(self):
         if not self._access_key_result:
             storage_account = self.storage_account
-            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 self.get_storage_account(storage_account).\
+            if self.get_storage_account(storage_account).\
                     provisioning_state.value != 'Succeeded':
                 log.debug(
-                    "Storage account %s is not in Succeeded state. "
-                    "Waiting another %s seconds to reach that state.",
-                    storage_account,
-                    int(end_time - time.time()))
-                time.sleep(interval)
-                if time.time() > end_time:
-                    raise WaitStateException(
-                        "Waited too long for storage account: {0} to "
-                        "become ready. It's still in state: {1}".format(
-                            storage_account,
-                            self.get_storage_account(storage_account).
-                            provisioning_state))
+                    "Storage account %s is not in Succeeded state yet. ",
+                    storage_account)
+                raise WaitStateException(
+                    "Waited too long for storage account: {0} to "
+                    "become ready.".format(
+                        storage_account,
+                        self.get_storage_account(storage_account).
+                        provisioning_state))
+
             self._access_key_result = self.storage_client.storage_accounts. \
                 list_keys(self.resource_group, storage_account)
         return self._access_key_result
@@ -582,6 +573,18 @@ class AzureClient(object):
 
         return subnet_info
 
+    def __if_subnet_in_use(e):
+        # return True if the CloudError exception is due to subnet being in use
+        if isinstance(e, CloudError):
+            error_message = e.message
+            if "Subnet" in error_message \
+                    and 'in use' in error_message:
+                return True
+        return False
+
+    @tenacity.retry(stop=tenacity.stop_after_attempt(5),
+                    retry=tenacity.retry_if_exception(__if_subnet_in_use),
+                    reraise=True)
     def delete_subnet(self, subnet_id):
         url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
                                              subnet_id)
@@ -598,41 +601,7 @@ class AzureClient(object):
             result_delete.wait()
         except CloudError as cloud_error:
             log.exception(cloud_error.message)
-            if "Subnet" not in cloud_error.message \
-                    or 'in use' not in cloud_error.message:
-                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))
+            raise cloud_error
 
     def create_floating_ip(self, public_ip_name, public_ip_parameters):
         return self.network_management_client.public_ip_addresses. \

+ 2 - 4
cloudbridge/cloud/providers/azure/provider.py

@@ -98,9 +98,7 @@ class AzureCloudProvider(BaseCloudProvider):
                 'azure_resource_group': self.resource_group,
                 'azure_storage_account': self.storage_account,
                 'azure_public_key_storage_table_name':
-                    self.public_key_storage_table_name,
-                'default_wait_timeout': self.config.default_wait_timeout,
-                'default_wait_interval': self.config.default_wait_interval
+                    self.public_key_storage_table_name
             }
 
             self._azure_client = AzureClient(provider_config)
@@ -123,7 +121,7 @@ class AzureCloudProvider(BaseCloudProvider):
         # to get or create at least twice
         self._get_or_create_storage_account()
 
-    @tenacity.retry(stop=tenacity.stop_after_attempt(2))
+    @tenacity.retry(stop=tenacity.stop_after_attempt(2), reraise=True)
     def _get_or_create_storage_account(self):
         try:
             return self._azure_client.get_storage_account(self.storage_account)

+ 14 - 14
cloudbridge/cloud/providers/azure/resources.py

@@ -88,8 +88,8 @@ class AzureVMFirewall(BaseVMFirewall):
                 get_vm_firewall(self.id)
             if not self._vm_firewall.tags:
                 self._vm_firewall.tags = {}
-        except (CloudError, ValueError) as cloudError:
-            log.exception(cloudError.message)
+        except (CloudError, ValueError) as cloud_error:
+            log.exception(cloud_error.message)
             # The security group no longer exists and cannot be refreshed.
 
     def to_json(self):
@@ -557,8 +557,8 @@ class AzureVolume(BaseVolume):
             self._volume = self._provider.azure_client. \
                 get_disk(self.id)
             self._update_state()
-        except (CloudError, ValueError) as cloudError:
-            log.exception(cloudError.message)
+        except (CloudError, ValueError) as cloud_error:
+            log.exception(cloud_error.message)
             # The volume no longer exists and cannot be refreshed.
             # set the state to unknown
             self._state = 'unknown'
@@ -649,8 +649,8 @@ class AzureSnapshot(BaseSnapshot):
             self._snapshot = self._provider.azure_client. \
                 get_snapshot(self.id)
             self._state = self._snapshot.provisioning_state
-        except (CloudError, ValueError) as cloudError:
-            log.exception(cloudError.message)
+        except (CloudError, ValueError) as cloud_error:
+            log.exception(cloud_error.message)
             # The snapshot no longer exists and cannot be refreshed.
             # set the state to unknown
             self._state = 'unknown'
@@ -806,8 +806,8 @@ class AzureMachineImage(BaseMachineImage):
             try:
                 self._image = self._provider.azure_client.get_image(self.id)
                 self._state = self._image.provisioning_state
-            except CloudError as cloudError:
-                log.exception(cloudError.message)
+            except CloudError as cloud_error:
+                log.exception(cloud_error.message)
                 # image no longer exists
                 self._state = "unknown"
 
@@ -902,8 +902,8 @@ class AzureNetwork(BaseNetwork):
             self._network = self._provider.azure_client.\
                 get_network(self.id)
             self._state = self._network.provisioning_state
-        except (CloudError, ValueError) as cloudError:
-            log.exception(cloudError.message)
+        except (CloudError, ValueError) as cloud_error:
+            log.exception(cloud_error.message)
             # The network no longer exists and cannot be refreshed.
             # set the state to unknown
             self._state = 'unknown'
@@ -1146,8 +1146,8 @@ class AzureSubnet(BaseSubnet):
             self._subnet = self._provider.azure_client. \
                 get_subnet(self.id)
             self._state = self._subnet.provisioning_state
-        except (CloudError, ValueError) as cloudError:
-            log.exception(cloudError.message)
+        except (CloudError, ValueError) as cloud_error:
+            log.exception(cloud_error.message)
             # The subnet no longer exists and cannot be refreshed.
             # set the state to unknown
             self._state = 'unknown'
@@ -1498,8 +1498,8 @@ class AzureInstance(BaseInstance):
             if not self._vm.tags:
                 self._vm.tags = {}
             self._update_state()
-        except (CloudError, ValueError) as cloudError:
-            log.exception(cloudError.message)
+        except (CloudError, ValueError) as cloud_error:
+            log.exception(cloud_error.message)
             # The volume no longer exists and cannot be refreshed.
             # set the state to unknown
             self._state = 'unknown'

+ 12 - 3
test/test_network_service.py

@@ -3,6 +3,7 @@ from test.helpers import ProviderTestBase
 from test.helpers import get_provider_test_data
 from test.helpers import standard_interface_tests as sit
 
+from cloudbridge.cloud.base.resources import BaseNetwork
 from cloudbridge.cloud.interfaces.resources import FloatingIP
 from cloudbridge.cloud.interfaces.resources import Network
 from cloudbridge.cloud.interfaces.resources import RouterState
@@ -194,6 +195,14 @@ class CloudNetworkServiceTestCase(ProviderTestBase):
 
     @helpers.skipIfNoService(['networking.networks'])
     def test_default_network(self):
-        subnet = self.provider.networking.subnets.get_or_create_default(
-            zone=get_provider_test_data(self.provider, 'placement'))
-        self.assertIsInstance(subnet, Subnet)
+        subnet = None
+        with helpers.cleanup_action(lambda: subnet.delete()):
+            subnet = self.provider.networking.subnets.get_or_create_default(
+                zone=get_provider_test_data(self.provider, 'placement'))
+            self.assertIsInstance(subnet, Subnet)
+        networks = self.provider.networking.networks.find(
+            name=BaseNetwork.CB_DEFAULT_NETWORK_NAME)
+
+        if networks:
+            network = networks[0]
+            network.delete()