Просмотр исходного кода

Fix creation of storage account issue and make types happy

FabioRosado 4 лет назад
Родитель
Сommit
56fe5f3cb3
1 измененных файлов с 67 добавлено и 67 удалено
  1. 67 67
      cloudbridge/providers/azure/azure_client.py

+ 67 - 67
cloudbridge/providers/azure/azure_client.py

@@ -2,26 +2,26 @@ import datetime
 import logging
 import logging
 from io import BytesIO
 from io import BytesIO
 
 
+import tenacity
+from cloudbridge.interfaces.exceptions import (DuplicateResourceException,
+                                               InvalidLabelException,
+                                               ProviderConnectionException,
+                                               WaitStateException)
+from msrestazure.azure_exceptions import CloudError
+
 from azure.common import AzureConflictHttpError
 from azure.common import AzureConflictHttpError
-from azure.identity import ClientSecretCredential
+from azure.core.exceptions import (ClientAuthenticationError,
+                                   HttpResponseError, ResourceExistsError,
+                                   ResourceNotFoundError)
 from azure.cosmosdb.table.tableservice import TableService
 from azure.cosmosdb.table.tableservice import TableService
+from azure.identity import ClientSecretCredential
 from azure.mgmt.compute import ComputeManagementClient
 from azure.mgmt.compute import ComputeManagementClient
 from azure.mgmt.devtestlabs.models import GalleryImageReference
 from azure.mgmt.devtestlabs.models import GalleryImageReference
 from azure.mgmt.network import NetworkManagementClient
 from azure.mgmt.network import NetworkManagementClient
 from azure.mgmt.resource import ResourceManagementClient
 from azure.mgmt.resource import ResourceManagementClient
 from azure.mgmt.resource.subscriptions import SubscriptionClient
 from azure.mgmt.resource.subscriptions import SubscriptionClient
 from azure.mgmt.storage import StorageManagementClient
 from azure.mgmt.storage import StorageManagementClient
-from azure.storage.blob import BlobSasPermissions
-from azure.storage.blob import BlobServiceClient
-
-from msrestazure.azure_exceptions import CloudError
-
-import tenacity
-
-from cloudbridge.interfaces.exceptions import DuplicateResourceException
-from cloudbridge.interfaces.exceptions import InvalidLabelException
-from cloudbridge.interfaces.exceptions import ProviderConnectionException
-from cloudbridge.interfaces.exceptions import WaitStateException
+from azure.storage.blob import BlobSasPermissions, BlobServiceClient
 
 
 from . import helpers as azure_helpers
 from . import helpers as azure_helpers
 
 
@@ -180,7 +180,7 @@ class AzureClient(object):
         log.debug("azure subscription : %s", self.subscription_id)
         log.debug("azure subscription : %s", self.subscription_id)
 
 
     @property
     @property
-    @tenacity.retry(stop=tenacity.stop_after_attempt(5), reraise=True)
+    @tenacity.retry(stop=tenacity.stop.stop_after_attempt(5), reraise=True)
     def access_key_result(self):
     def access_key_result(self):
         if not self._access_key_result:
         if not self._access_key_result:
             storage_account = self.storage_account
             storage_account = self.storage_account
@@ -294,12 +294,12 @@ class AzureClient(object):
 
 
     def create_storage_account(self, name, params):
     def create_storage_account(self, name, params):
         return self.storage_client.storage_accounts. \
         return self.storage_client.storage_accounts. \
-            create(self.resource_group, name.lower(), params).result()
+            begin_create(self.resource_group, name.lower(), params).result()
 
 
     # Create a storage account. To prevent a race condition, try
     # Create a storage account. To prevent a race condition, try
     # to get or create at least twice
     # to get or create at least twice
-    @tenacity.retry(stop=tenacity.stop_after_attempt(2),
-                    retry=tenacity.retry_if_exception_type(CloudError),
+    @tenacity.retry(stop=tenacity.stop.stop_after_attempt(2),
+                    retry=tenacity.retry.retry_if_exception_type(HttpResponseError),
                     reraise=True)
                     reraise=True)
     def _get_or_create_storage_account(self):
     def _get_or_create_storage_account(self):
         if self._storage_account:
         if self._storage_account:
@@ -308,8 +308,9 @@ class AzureClient(object):
             try:
             try:
                 self._storage_account = \
                 self._storage_account = \
                     self.get_storage_account(self.storage_account)
                     self.get_storage_account(self.storage_account)
-            except CloudError as cloud_error:
-                if cloud_error.error.error == "ResourceNotFound":
+            except HttpResponseError as cloud_error:
+                
+                if isinstance(cloud_error, ResourceNotFoundError):
                     storage_account_params = {
                     storage_account_params = {
                         'sku': {
                         'sku': {
                             'name': 'Standard_LRS'
                             'name': 'Standard_LRS'
@@ -322,7 +323,7 @@ class AzureClient(object):
                             self.create_storage_account(self.storage_account,
                             self.create_storage_account(self.storage_account,
                                                         storage_account_params)
                                                         storage_account_params)
                     except CloudError as cloud_error2:  # pragma: no cover
                     except CloudError as cloud_error2:  # pragma: no cover
-                        if cloud_error2.error.error == "AuthorizationFailed":
+                        if isinstance(cloud_error2, ClientAuthenticationError):
                             mess = 'The following error was returned by ' \
                             mess = 'The following error was returned by ' \
                                    'Azure:\n%s\n\nThis is likely because the' \
                                    'Azure:\n%s\n\nThis is likely because the' \
                                    ' Role associated with the provided ' \
                                    ' Role associated with the provided ' \
@@ -338,8 +339,7 @@ class AzureClient(object):
                                    'access-control/overview\n' % cloud_error2
                                    'access-control/overview\n' % cloud_error2
                             raise ProviderConnectionException(mess)
                             raise ProviderConnectionException(mess)
 
 
-                        elif cloud_error2.error.error == \
-                                "StorageAccountAlreadyTaken":
+                        elif isinstance(cloud_error2, ResourceExistsError):
                             mess = 'The following error was ' \
                             mess = 'The following error was ' \
                                    'returned by Azure:\n%s\n\n' \
                                    'returned by Azure:\n%s\n\n' \
                                    'Note that Storage Account names must be ' \
                                    'Note that Storage Account names must be ' \
@@ -371,7 +371,7 @@ class AzureClient(object):
     def update_vm_firewall_tags(self, fw_id, tags):
     def update_vm_firewall_tags(self, fw_id, tags):
         url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
         url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
                                              fw_id)
                                              fw_id)
-        name = url_params.get(VM_FIREWALL_NAME)
+        name = url_params.get(VM_FIREWALL_NAME, "")
         return self.network_management_client.network_security_groups. \
         return self.network_management_client.network_security_groups. \
             begin_create_or_update(self.resource_group, name,
             begin_create_or_update(self.resource_group, name,
                                    {'tags': tags,
                                    {'tags': tags,
@@ -380,14 +380,14 @@ class AzureClient(object):
     def get_vm_firewall(self, fw_id):
     def get_vm_firewall(self, fw_id):
         url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
         url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
                                              fw_id)
                                              fw_id)
-        fw_name = url_params.get(VM_FIREWALL_NAME)
+        fw_name = url_params.get(VM_FIREWALL_NAME, "")
         return self.network_management_client.network_security_groups. \
         return self.network_management_client.network_security_groups. \
             get(self.resource_group, fw_name)
             get(self.resource_group, fw_name)
 
 
     def delete_vm_firewall(self, fw_id):
     def delete_vm_firewall(self, fw_id):
         url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
         url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
                                              fw_id)
                                              fw_id)
-        name = url_params.get(VM_FIREWALL_NAME)
+        name = url_params.get(VM_FIREWALL_NAME, "")
         self.network_management_client \
         self.network_management_client \
             .network_security_groups.begin_delete(self.resource_group, name).wait()
             .network_security_groups.begin_delete(self.resource_group, name).wait()
 
 
@@ -395,7 +395,7 @@ class AzureClient(object):
                                 rule_name, parameters):
                                 rule_name, parameters):
         url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
         url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
                                              fw_id)
                                              fw_id)
-        vm_firewall_name = url_params.get(VM_FIREWALL_NAME)
+        vm_firewall_name = url_params.get(VM_FIREWALL_NAME, "")
         return self.network_management_client.security_rules. \
         return self.network_management_client.security_rules. \
             begin_create_or_update(self.resource_group, vm_firewall_name,
             begin_create_or_update(self.resource_group, vm_firewall_name,
                                    rule_name, parameters).result()
                                    rule_name, parameters).result()
@@ -480,7 +480,7 @@ class AzureClient(object):
     def get_disk(self, disk_id):
     def get_disk(self, disk_id):
         url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
         url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
                                              disk_id)
                                              disk_id)
-        disk_name = url_params.get(VOLUME_NAME)
+        disk_name = url_params.get(VOLUME_NAME, "")
         return self.compute_client.disks.get(self.resource_group, disk_name)
         return self.compute_client.disks.get(self.resource_group, disk_name)
 
 
     def list_disks(self):
     def list_disks(self):
@@ -490,13 +490,13 @@ class AzureClient(object):
     def delete_disk(self, disk_id):
     def delete_disk(self, disk_id):
         url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
         url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
                                              disk_id)
                                              disk_id)
-        disk_name = url_params.get(VOLUME_NAME)
+        disk_name = url_params.get(VOLUME_NAME, "")
         self.compute_client.disks.begin_delete(self.resource_group, disk_name).wait()
         self.compute_client.disks.begin_delete(self.resource_group, disk_name).wait()
 
 
     def update_disk_tags(self, disk_id, tags):
     def update_disk_tags(self, disk_id, tags):
         url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
         url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
                                              disk_id)
                                              disk_id)
-        disk_name = url_params.get(VOLUME_NAME)
+        disk_name = url_params.get(VOLUME_NAME, "")
         return self.compute_client.disks.begin_update(
         return self.compute_client.disks.begin_update(
             self.resource_group,
             self.resource_group,
             disk_name,
             disk_name,
@@ -510,7 +510,7 @@ class AzureClient(object):
     def get_snapshot(self, snapshot_id):
     def get_snapshot(self, snapshot_id):
         url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
         url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
                                              snapshot_id)
                                              snapshot_id)
-        snapshot_name = url_params.get(SNAPSHOT_NAME)
+        snapshot_name = url_params.get(SNAPSHOT_NAME, "")
         return self.compute_client.snapshots.get(self.resource_group,
         return self.compute_client.snapshots.get(self.resource_group,
                                                  snapshot_name)
                                                  snapshot_name)
 
 
@@ -524,14 +524,14 @@ class AzureClient(object):
     def delete_snapshot(self, snapshot_id):
     def delete_snapshot(self, snapshot_id):
         url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
         url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
                                              snapshot_id)
                                              snapshot_id)
-        snapshot_name = url_params.get(SNAPSHOT_NAME)
+        snapshot_name = url_params.get(SNAPSHOT_NAME, "")
         self.compute_client.snapshots.begin_delete(self.resource_group,
         self.compute_client.snapshots.begin_delete(self.resource_group,
                                                    snapshot_name).wait()
                                                    snapshot_name).wait()
 
 
     def update_snapshot_tags(self, snapshot_id, tags):
     def update_snapshot_tags(self, snapshot_id, tags):
         url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
         url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
                                              snapshot_id)
                                              snapshot_id)
-        snapshot_name = url_params.get(SNAPSHOT_NAME)
+        snapshot_name = url_params.get(SNAPSHOT_NAME, "")
         return self.compute_client.snapshots.begin_update(
         return self.compute_client.snapshots.begin_update(
             self.resource_group,
             self.resource_group,
             snapshot_name,
             snapshot_name,
@@ -552,7 +552,7 @@ class AzureClient(object):
         url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
         url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
                                              image_id)
                                              image_id)
         if not self.is_gallery_image(image_id):
         if not self.is_gallery_image(image_id):
-            name = url_params.get(IMAGE_NAME)
+            name = url_params.get(IMAGE_NAME, "")
             self.compute_client.images.begin_delete(self.resource_group, name).wait()
             self.compute_client.images.begin_delete(self.resource_group, name).wait()
 
 
     def list_images(self):
     def list_images(self):
@@ -572,7 +572,7 @@ class AzureClient(object):
                                          sku=url_params['sku'],
                                          sku=url_params['sku'],
                                          version=url_params['version'])
                                          version=url_params['version'])
         else:
         else:
-            name = url_params.get(IMAGE_NAME)
+            name = url_params.get(IMAGE_NAME, "")
             return self.compute_client.images.get(self.resource_group, name)
             return self.compute_client.images.get(self.resource_group, name)
 
 
     def update_image_tags(self, image_id, tags):
     def update_image_tags(self, image_id, tags):
@@ -581,7 +581,7 @@ class AzureClient(object):
         if self.is_gallery_image(image_id):
         if self.is_gallery_image(image_id):
             return True
             return True
         else:
         else:
-            name = url_params.get(IMAGE_NAME)
+            name = url_params.get(IMAGE_NAME, "")
             return self.compute_client.images. \
             return self.compute_client.images. \
                 begin_create_or_update(self.resource_group, name,
                 begin_create_or_update(self.resource_group, name,
                                        {
                                        {
@@ -600,7 +600,7 @@ class AzureClient(object):
     def get_network(self, network_id):
     def get_network(self, network_id):
         url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID,
         url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID,
                                              network_id)
                                              network_id)
-        network_name = url_params.get(NETWORK_NAME)
+        network_name = url_params.get(NETWORK_NAME, "")
         return self.network_management_client.virtual_networks.get(
         return self.network_management_client.virtual_networks.get(
             self.resource_group, network_name)
             self.resource_group, network_name)
 
 
@@ -610,13 +610,13 @@ class AzureClient(object):
 
 
     def delete_network(self, network_id):
     def delete_network(self, network_id):
         url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
         url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
-        network_name = url_params.get(NETWORK_NAME)
+        network_name = url_params.get(NETWORK_NAME, "")
         return self.network_management_client.virtual_networks. \
         return self.network_management_client.virtual_networks. \
             begin_delete(self.resource_group, network_name).wait()
             begin_delete(self.resource_group, network_name).wait()
 
 
     def update_network_tags(self, network_id, tags):
     def update_network_tags(self, network_id, tags):
         url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
         url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
-        network_name = url_params.get(NETWORK_NAME)
+        network_name = url_params.get(NETWORK_NAME, "")
         return self.network_management_client.virtual_networks. \
         return self.network_management_client.virtual_networks. \
             begin_create_or_update(self.resource_group, network_name, tags).result()
             begin_create_or_update(self.resource_group, network_name, tags).result()
 
 
@@ -629,21 +629,21 @@ class AzureClient(object):
 
 
     def list_subnets(self, network_id):
     def list_subnets(self, network_id):
         url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
         url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
-        network_name = url_params.get(NETWORK_NAME)
+        network_name = url_params.get(NETWORK_NAME, "")
         return self.network_management_client.subnets. \
         return self.network_management_client.subnets. \
             list(self.resource_group, network_name)
             list(self.resource_group, network_name)
 
 
     def get_subnet(self, subnet_id):
     def get_subnet(self, subnet_id):
         url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
         url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
                                              subnet_id)
                                              subnet_id)
-        network_name = url_params.get(NETWORK_NAME)
-        subnet_name = url_params.get(SUBNET_NAME)
+        network_name = url_params.get(NETWORK_NAME, "")
+        subnet_name = url_params.get(SUBNET_NAME, "")
         return self.network_management_client.subnets. \
         return self.network_management_client.subnets. \
             get(self.resource_group, network_name, subnet_name)
             get(self.resource_group, network_name, subnet_name)
 
 
     def create_subnet(self, network_id, subnet_name, params):
     def create_subnet(self, network_id, subnet_name, params):
         url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
         url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
-        network_name = url_params.get(NETWORK_NAME)
+        network_name = url_params.get(NETWORK_NAME, "")
         result_create = self.network_management_client \
         result_create = self.network_management_client \
             .subnets.begin_create_or_update(
             .subnets.begin_create_or_update(
                 self.resource_group,
                 self.resource_group,
@@ -662,15 +662,15 @@ class AzureClient(object):
                 return True
                 return True
         return False
         return False
 
 
-    @tenacity.retry(stop=tenacity.stop_after_attempt(5),
-                    retry=tenacity.retry_if_exception(__if_subnet_in_use),
-                    wait=tenacity.wait_fixed(5),
+    @tenacity.retry(stop=tenacity.stop.stop_after_attempt(5),
+                    retry=tenacity.retry.retry_if_exception(__if_subnet_in_use),
+                    wait=tenacity.wait.wait_fixed(5),
                     reraise=True)
                     reraise=True)
     def delete_subnet(self, subnet_id):
     def delete_subnet(self, subnet_id):
         url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
         url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
                                              subnet_id)
                                              subnet_id)
-        network_name = url_params.get(NETWORK_NAME)
-        subnet_name = url_params.get(SUBNET_NAME)
+        network_name = url_params.get(NETWORK_NAME, "")
+        subnet_name = url_params.get(SUBNET_NAME, "")
 
 
         try:
         try:
             result_delete = self.network_management_client \
             result_delete = self.network_management_client \
@@ -692,14 +692,14 @@ class AzureClient(object):
     def get_floating_ip(self, public_ip_id):
     def get_floating_ip(self, public_ip_id):
         url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
         url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
                                              public_ip_id)
                                              public_ip_id)
-        public_ip_name = url_params.get(PUBLIC_IP_NAME)
+        public_ip_name = url_params.get(PUBLIC_IP_NAME, "")
         return self.network_management_client. \
         return self.network_management_client. \
             public_ip_addresses.get(self.resource_group, public_ip_name)
             public_ip_addresses.get(self.resource_group, public_ip_name)
 
 
     def delete_floating_ip(self, public_ip_id):
     def delete_floating_ip(self, public_ip_id):
         url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
         url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
                                              public_ip_id)
                                              public_ip_id)
-        public_ip_name = url_params.get(PUBLIC_IP_NAME)
+        public_ip_name = url_params.get(PUBLIC_IP_NAME, "")
         self.network_management_client. \
         self.network_management_client. \
             public_ip_addresses.begin_delete(self.resource_group,
             public_ip_addresses.begin_delete(self.resource_group,
                                              public_ip_name).wait()
                                              public_ip_name).wait()
@@ -707,7 +707,7 @@ class AzureClient(object):
     def update_fip_tags(self, fip_id, tags):
     def update_fip_tags(self, fip_id, tags):
         url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
         url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
                                              fip_id)
                                              fip_id)
-        fip_name = url_params.get(PUBLIC_IP_NAME)
+        fip_name = url_params.get(PUBLIC_IP_NAME, "")
         self.network_management_client.public_ip_addresses. \
         self.network_management_client.public_ip_addresses. \
             begin_create_or_update(self.resource_group, fip_name, tags).result()
             begin_create_or_update(self.resource_group, fip_name, tags).result()
 
 
@@ -723,21 +723,21 @@ class AzureClient(object):
     def restart_vm(self, vm_id):
     def restart_vm(self, vm_id):
         url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
         url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
                                              vm_id)
                                              vm_id)
-        vm_name = url_params.get(VM_NAME)
+        vm_name = url_params.get(VM_NAME, "")
         return self.compute_client.virtual_machines.begin_restart(
         return self.compute_client.virtual_machines.begin_restart(
             self.resource_group, vm_name).wait()
             self.resource_group, vm_name).wait()
 
 
     def delete_vm(self, vm_id):
     def delete_vm(self, vm_id):
         url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
         url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
                                              vm_id)
                                              vm_id)
-        vm_name = url_params.get(VM_NAME)
+        vm_name = url_params.get(VM_NAME, "")
         return self.compute_client.virtual_machines.begin_delete(
         return self.compute_client.virtual_machines.begin_delete(
             self.resource_group, vm_name).wait()
             self.resource_group, vm_name).wait()
 
 
     def get_vm(self, vm_id):
     def get_vm(self, vm_id):
         url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
         url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
                                              vm_id)
                                              vm_id)
-        vm_name = url_params.get(VM_NAME)
+        vm_name = url_params.get(VM_NAME, "")
         return self.compute_client.virtual_machines.get(
         return self.compute_client.virtual_machines.get(
             self.resource_group,
             self.resource_group,
             vm_name,
             vm_name,
@@ -751,56 +751,56 @@ class AzureClient(object):
     def update_vm(self, vm_id, params):
     def update_vm(self, vm_id, params):
         url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
         url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
                                              vm_id)
                                              vm_id)
-        vm_name = url_params.get(VM_NAME)
+        vm_name = url_params.get(VM_NAME, "")
         return self.compute_client.virtual_machines. \
         return self.compute_client.virtual_machines. \
             begin_create_or_update(self.resource_group, vm_name, params).wait()
             begin_create_or_update(self.resource_group, vm_name, params).wait()
 
 
     def deallocate_vm(self, vm_id):
     def deallocate_vm(self, vm_id):
         url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
         url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
                                              vm_id)
                                              vm_id)
-        vm_name = url_params.get(VM_NAME)
+        vm_name = url_params.get(VM_NAME, "")
         self.compute_client. \
         self.compute_client. \
             virtual_machines.begin_deallocate(self.resource_group, vm_name).wait()
             virtual_machines.begin_deallocate(self.resource_group, vm_name).wait()
 
 
     def generalize_vm(self, vm_id):
     def generalize_vm(self, vm_id):
         url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
         url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
                                              vm_id)
                                              vm_id)
-        vm_name = url_params.get(VM_NAME)
+        vm_name = url_params.get(VM_NAME, "")
         self.compute_client.virtual_machines. \
         self.compute_client.virtual_machines. \
             generalize(self.resource_group, vm_name)
             generalize(self.resource_group, vm_name)
 
 
     def start_vm(self, vm_id):
     def start_vm(self, vm_id):
         url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
         url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
                                              vm_id)
                                              vm_id)
-        vm_name = url_params.get(VM_NAME)
+        vm_name = url_params.get(VM_NAME, "")
         self.compute_client.virtual_machines. \
         self.compute_client.virtual_machines. \
             begin_start(self.resource_group, vm_name).wait()
             begin_start(self.resource_group, vm_name).wait()
 
 
     def update_vm_tags(self, vm_id, tags):
     def update_vm_tags(self, vm_id, tags):
         url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
         url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
                                              vm_id)
                                              vm_id)
-        vm_name = url_params.get(VM_NAME)
+        vm_name = url_params.get(VM_NAME, "")
         self.compute_client.virtual_machines. \
         self.compute_client.virtual_machines. \
             begin_create_or_update(self.resource_group, vm_name, tags).result()
             begin_create_or_update(self.resource_group, vm_name, tags).result()
 
 
     def delete_nic(self, nic_id):
     def delete_nic(self, nic_id):
         nic_params = azure_helpers.\
         nic_params = azure_helpers.\
             parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
             parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
-        nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+        nic_name = nic_params.get(NETWORK_INTERFACE_NAME, "")
         self.network_management_client. \
         self.network_management_client. \
             network_interfaces.begin_delete(self.resource_group, nic_name).wait()
             network_interfaces.begin_delete(self.resource_group, nic_name).wait()
 
 
     def get_nic(self, nic_id):
     def get_nic(self, nic_id):
         nic_params = azure_helpers.\
         nic_params = azure_helpers.\
             parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
             parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
-        nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+        nic_name = nic_params.get(NETWORK_INTERFACE_NAME, "")
         return self.network_management_client. \
         return self.network_management_client. \
             network_interfaces.get(self.resource_group, nic_name)
             network_interfaces.get(self.resource_group, nic_name)
 
 
     def update_nic(self, nic_id, params):
     def update_nic(self, nic_id, params):
         nic_params = azure_helpers.\
         nic_params = azure_helpers.\
             parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
             parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
-        nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+        nic_name = nic_params.get(NETWORK_INTERFACE_NAME, "")
         async_nic_creation = self.network_management_client. \
         async_nic_creation = self.network_management_client. \
             network_interfaces.begin_create_or_update(
             network_interfaces.begin_create_or_update(
                 self.resource_group,
                 self.resource_group,
@@ -849,8 +849,8 @@ class AzureClient(object):
     def attach_subnet_to_route_table(self, subnet_id, route_table_id):
     def attach_subnet_to_route_table(self, subnet_id, route_table_id):
         url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
         url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
                                              subnet_id)
                                              subnet_id)
-        network_name = url_params.get(NETWORK_NAME)
-        subnet_name = url_params.get(SUBNET_NAME)
+        network_name = url_params.get(NETWORK_NAME, "")
+        subnet_name = url_params.get(SUBNET_NAME, "")
 
 
         subnet_info = self.network_management_client.subnets.get(
         subnet_info = self.network_management_client.subnets.get(
             self.resource_group,
             self.resource_group,
@@ -867,7 +867,7 @@ class AzureClient(object):
                  self.resource_group,
                  self.resource_group,
                  network_name,
                  network_name,
                  subnet_name,
                  subnet_name,
-                 subnet_info)
+                 subnet_info) #type: ignore
             subnet_info = result_create.result()
             subnet_info = result_create.result()
 
 
         return subnet_info
         return subnet_info
@@ -875,8 +875,8 @@ class AzureClient(object):
     def detach_subnet_to_route_table(self, subnet_id, route_table_id):
     def detach_subnet_to_route_table(self, subnet_id, route_table_id):
         url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
         url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
                                              subnet_id)
                                              subnet_id)
-        network_name = url_params.get(NETWORK_NAME)
-        subnet_name = url_params.get(SUBNET_NAME)
+        network_name = url_params.get(NETWORK_NAME, "")
+        subnet_name = url_params.get(SUBNET_NAME, "")
 
 
         subnet_info = self.network_management_client.subnets.get(
         subnet_info = self.network_management_client.subnets.get(
             self.resource_group,
             self.resource_group,
@@ -892,7 +892,7 @@ class AzureClient(object):
                  self.resource_group,
                  self.resource_group,
                  network_name,
                  network_name,
                  subnet_name,
                  subnet_name,
-                 subnet_info)
+                 subnet_info) #type: ignore
             subnet_info = result_create.result()
             subnet_info = result_create.result()
 
 
         return subnet_info
         return subnet_info
@@ -904,7 +904,7 @@ class AzureClient(object):
     def get_route_table(self, router_id):
     def get_route_table(self, router_id):
         url_params = azure_helpers.parse_url(ROUTER_RESOURCE_ID,
         url_params = azure_helpers.parse_url(ROUTER_RESOURCE_ID,
                                              router_id)
                                              router_id)
-        router_name = url_params.get(ROUTER_NAME)
+        router_name = url_params.get(ROUTER_NAME, "")
         return self.network_management_client. \
         return self.network_management_client. \
             route_tables.get(self.resource_group, router_name)
             route_tables.get(self.resource_group, router_name)