瀏覽代碼

Line by line profiled tests + Results for Azure Client

almahmoud 7 年之前
父節點
當前提交
df0059fdc8

+ 97 - 0
cloudbridge/cloud/providers/azure/azure_client.py

@@ -157,6 +157,7 @@ class AzureClient(object):
     """
     Azure client is the wrapper on top of azure python sdk
     """
+    @profile
     def __init__(self, config):
         self._config = config
         self.subscription_id = str(config.get('azure_subscription_id'))
@@ -181,6 +182,7 @@ class AzureClient(object):
 
     @property
     @tenacity.retry(stop=tenacity.stop_after_attempt(5), reraise=True)
+    @profile
     def access_key_result(self):
         if not self._access_key_result:
             storage_account = self.storage_account
@@ -202,22 +204,27 @@ class AzureClient(object):
         return self._access_key_result
 
     @property
+    @profile
     def resource_group(self):
         return self._config.get('azure_resource_group')
 
     @property
+    @profile
     def storage_account(self):
         return self._config.get('azure_storage_account')
 
     @property
+    @profile
     def region_name(self):
         return self._config.get('azure_region_name')
 
     @property
+    @profile
     def public_key_storage_table_name(self):
         return self._config.get('azure_public_key_storage_table_name')
 
     @property
+    @profile
     def storage_client(self):
         if not self._storage_client:
             self._storage_client = \
@@ -226,12 +233,14 @@ class AzureClient(object):
         return self._storage_client
 
     @property
+    @profile
     def subscription_client(self):
         if not self._subscription_client:
             self._subscription_client = SubscriptionClient(self._credentials)
         return self._subscription_client
 
     @property
+    @profile
     def resource_client(self):
         if not self._resource_client:
             self._resource_client = \
@@ -240,6 +249,7 @@ class AzureClient(object):
         return self._resource_client
 
     @property
+    @profile
     def compute_client(self):
         if not self._compute_client:
             self._compute_client = \
@@ -248,6 +258,7 @@ class AzureClient(object):
         return self._compute_client
 
     @property
+    @profile
     def network_management_client(self):
         if not self._network_management_client:
             self._network_management_client = NetworkManagementClient(
@@ -255,6 +266,7 @@ class AzureClient(object):
         return self._network_management_client
 
     @property
+    @profile
     def blob_service(self):
         self._get_or_create_storage_account()
         if not self._block_blob_service:
@@ -270,6 +282,7 @@ class AzureClient(object):
         return self._block_blob_service
 
     @property
+    @profile
     def table_service(self):
         self._get_or_create_storage_account()
         if not self._table_service:
@@ -282,17 +295,21 @@ class AzureClient(object):
                 self.public_key_storage_table_name)
         return self._table_service
 
+    @profile
     def get_resource_group(self, name):
         return self.resource_client.resource_groups.get(name)
 
+    @profile
     def create_resource_group(self, name, parameters):
         return self.resource_client.resource_groups. \
             create_or_update(name, parameters)
 
+    @profile
     def get_storage_account(self, storage_account):
         return self.storage_client.storage_accounts. \
             get_properties(self.resource_group, storage_account)
 
+    @profile
     def create_storage_account(self, name, params):
         return self.storage_client.storage_accounts. \
             create(self.resource_group, name.lower(), params).result()
@@ -302,6 +319,7 @@ class AzureClient(object):
     @tenacity.retry(stop=tenacity.stop_after_attempt(2),
                     retry=tenacity.retry_if_exception_type(CloudError),
                     reraise=True)
+    @profile
     def _get_or_create_storage_account(self):
         if self._storage_account:
             return self._storage_account
@@ -356,19 +374,23 @@ class AzureClient(object):
                 else:
                     raise cloud_error
 
+    @profile
     def list_locations(self):
         return self.subscription_client.subscriptions. \
             list_locations(self.subscription_id)
 
+    @profile
     def list_vm_firewall(self):
         return self.network_management_client.network_security_groups. \
             list(self.resource_group)
 
+    @profile
     def create_vm_firewall(self, name, parameters):
         return self.network_management_client.network_security_groups. \
             create_or_update(self.resource_group, name,
                              parameters).result()
 
+    @profile
     def update_vm_firewall_tags(self, fw_id, tags):
         url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
                                              fw_id)
@@ -378,6 +400,7 @@ class AzureClient(object):
                              {'tags': tags,
                               'location': self.region_name}).result()
 
+    @profile
     def get_vm_firewall(self, fw_id):
         url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
                                              fw_id)
@@ -385,6 +408,7 @@ class AzureClient(object):
         return self.network_management_client.network_security_groups. \
             get(self.resource_group, fw_name)
 
+    @profile
     def delete_vm_firewall(self, fw_id):
         url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
                                              fw_id)
@@ -392,6 +416,7 @@ class AzureClient(object):
         self.network_management_client \
             .network_security_groups.delete(self.resource_group, name).wait()
 
+    @profile
     def create_vm_firewall_rule(self, fw_id,
                                 rule_name, parameters):
         url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
@@ -401,6 +426,7 @@ class AzureClient(object):
             create_or_update(self.resource_group, vm_firewall_name,
                              rule_name, parameters).result()
 
+    @profile
     def delete_vm_firewall_rule(self, fw_rule_id, vm_firewall):
         url_params = azure_helpers.parse_url(VM_FIREWALL_RULE_RESOURCE_ID,
                                              fw_rule_id)
@@ -408,12 +434,14 @@ class AzureClient(object):
         return self.network_management_client.security_rules. \
             delete(self.resource_group, vm_firewall, name).result()
 
+    @profile
     def list_containers(self, prefix=None, limit=None, marker=None):
         results = self.blob_service.list_containers(prefix=prefix,
                                                     num_results=limit,
                                                     marker=marker)
         return (results.items, results.next_marker)
 
+    @profile
     def create_container(self, container_name):
         try:
             self.blob_service.create_container(container_name,
@@ -429,29 +457,37 @@ class AzureClient(object):
 
         return self.blob_service.get_container_properties(container_name)
 
+    @profile
     def get_container(self, container_name):
         return self.blob_service.get_container_properties(container_name)
 
+    @profile
     def delete_container(self, container_name):
         self.blob_service.delete_container(container_name)
 
+    @profile
     def list_blobs(self, container_name, prefix=None):
         return self.blob_service.list_blobs(container_name, prefix=prefix)
 
+    @profile
     def get_blob(self, container_name, blob_name):
         return self.blob_service.get_blob_properties(container_name, blob_name)
 
+    @profile
     def create_blob_from_text(self, container_name, blob_name, text):
         self.blob_service.create_blob_from_text(container_name,
                                                 blob_name, text)
 
+    @profile
     def create_blob_from_file(self, container_name, blob_name, file_path):
         self.blob_service.create_blob_from_path(container_name,
                                                 blob_name, file_path)
 
+    @profile
     def delete_blob(self, container_name, blob_name):
         self.blob_service.delete_blob(container_name, blob_name)
 
+    @profile
     def get_blob_url(self, container_name, blob_name, expiry_time):
         expiry_date = datetime.datetime.utcnow() + datetime.timedelta(
             seconds=expiry_time)
@@ -461,12 +497,14 @@ class AzureClient(object):
         return self.blob_service.make_blob_url(container_name, blob_name,
                                                sas_token=sas)
 
+    @profile
     def get_blob_content(self, container_name, blob_name):
         out_stream = BytesIO()
         self.blob_service.get_blob_to_stream(container_name,
                                              blob_name, out_stream)
         return out_stream
 
+    @profile
     def create_empty_disk(self, disk_name, params):
         return self.compute_client.disks.create_or_update(
             self.resource_group,
@@ -474,6 +512,7 @@ class AzureClient(object):
             params
         ).result()
 
+    @profile
     def create_snapshot_disk(self, disk_name, params):
         return self.compute_client.disks.create_or_update(
             self.resource_group,
@@ -481,22 +520,26 @@ class AzureClient(object):
             params
         ).result()
 
+    @profile
     def get_disk(self, disk_id):
         url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
                                              disk_id)
         disk_name = url_params.get(VOLUME_NAME)
         return self.compute_client.disks.get(self.resource_group, disk_name)
 
+    @profile
     def list_disks(self):
         return self.compute_client.disks. \
             list_by_resource_group(self.resource_group)
 
+    @profile
     def delete_disk(self, disk_id):
         url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
                                              disk_id)
         disk_name = url_params.get(VOLUME_NAME)
         self.compute_client.disks.delete(self.resource_group, disk_name).wait()
 
+    @profile
     def update_disk_tags(self, disk_id, tags):
         url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
                                              disk_id)
@@ -508,10 +551,12 @@ class AzureClient(object):
             raw=True
         )
 
+    @profile
     def list_snapshots(self):
         return self.compute_client.snapshots. \
             list_by_resource_group(self.resource_group)
 
+    @profile
     def get_snapshot(self, snapshot_id):
         url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
                                              snapshot_id)
@@ -519,6 +564,7 @@ class AzureClient(object):
         return self.compute_client.snapshots.get(self.resource_group,
                                                  snapshot_name)
 
+    @profile
     def create_snapshot(self, snapshot_name, params):
         return self.compute_client.snapshots.create_or_update(
             self.resource_group,
@@ -526,6 +572,7 @@ class AzureClient(object):
             params
         ).result()
 
+    @profile
     def delete_snapshot(self, snapshot_id):
         url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
                                              snapshot_id)
@@ -533,6 +580,7 @@ class AzureClient(object):
         self.compute_client.snapshots.delete(self.resource_group,
                                              snapshot_name).wait()
 
+    @profile
     def update_snapshot_tags(self, snapshot_id, tags):
         url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
                                              snapshot_id)
@@ -544,17 +592,20 @@ class AzureClient(object):
             raw=True
         )
 
+    @profile
     def is_gallery_image(self, image_id):
         url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
                                              image_id)
         # If it is a gallery image, it will always have an offer
         return 'offer' in url_params
 
+    @profile
     def create_image(self, name, params):
         return self.compute_client.images. \
             create_or_update(self.resource_group, name,
                              params).result()
 
+    @profile
     def delete_image(self, image_id):
         url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
                                              image_id)
@@ -562,14 +613,17 @@ class AzureClient(object):
             name = url_params.get(IMAGE_NAME)
             self.compute_client.images.delete(self.resource_group, name).wait()
 
+    @profile
     def list_images(self):
         azure_images = list(self.compute_client.images.
                             list_by_resource_group(self.resource_group))
         return azure_images
 
+    @profile
     def list_gallery_refs(self):
         return gallery_image_references
 
+    @profile
     def get_image(self, image_id):
         url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
                                              image_id)
@@ -582,6 +636,7 @@ class AzureClient(object):
             name = url_params.get(IMAGE_NAME)
             return self.compute_client.images.get(self.resource_group, name)
 
+    @profile
     def update_image_tags(self, image_id, tags):
         url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
                                              image_id)
@@ -596,14 +651,17 @@ class AzureClient(object):
                                      'location': self.region_name
                                  }).result()
 
+    @profile
     def list_vm_types(self):
         return self.compute_client.virtual_machine_sizes. \
             list(self.region_name)
 
+    @profile
     def list_networks(self):
         return self.network_management_client.virtual_networks.list(
             self.resource_group)
 
+    @profile
     def get_network(self, network_id):
         url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID,
                                              network_id)
@@ -611,18 +669,21 @@ class AzureClient(object):
         return self.network_management_client.virtual_networks.get(
             self.resource_group, network_name)
 
+    @profile
     def create_network(self, name, params):
         return self.network_management_client.virtual_networks. \
             create_or_update(self.resource_group,
                              name,
                              parameters=params).result()
 
+    @profile
     def delete_network(self, network_id):
         url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
         network_name = url_params.get(NETWORK_NAME)
         return self.network_management_client.virtual_networks. \
             delete(self.resource_group, network_name).wait()
 
+    @profile
     def update_network_tags(self, network_id, tags):
         url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
         network_name = url_params.get(NETWORK_NAME)
@@ -630,6 +691,7 @@ class AzureClient(object):
             create_or_update(self.resource_group,
                              network_name, tags).result()
 
+    @profile
     def get_network_id_for_subnet(self, subnet_id):
         url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID, subnet_id)
         network_id = NETWORK_RESOURCE_ID[0]
@@ -637,12 +699,14 @@ class AzureClient(object):
             network_id = network_id.replace("{" + key + "}", val)
         return network_id
 
+    @profile
     def list_subnets(self, network_id):
         url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
         network_name = url_params.get(NETWORK_NAME)
         return self.network_management_client.subnets. \
             list(self.resource_group, network_name)
 
+    @profile
     def get_subnet(self, subnet_id):
         url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
                                              subnet_id)
@@ -651,6 +715,7 @@ class AzureClient(object):
         return self.network_management_client.subnets. \
             get(self.resource_group, network_name, subnet_name)
 
+    @profile
     def create_subnet(self, network_id, subnet_name, params):
         url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
         network_name = url_params.get(NETWORK_NAME)
@@ -665,6 +730,7 @@ class AzureClient(object):
 
         return subnet_info
 
+    @profile
     def __if_subnet_in_use(e):
         # return True if the CloudError exception is due to subnet being in use
         if isinstance(e, CloudError):
@@ -676,6 +742,7 @@ class AzureClient(object):
                     retry=tenacity.retry_if_exception(__if_subnet_in_use),
                     wait=tenacity.wait_fixed(5),
                     reraise=True)
+    @profile
     def delete_subnet(self, subnet_id):
         url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
                                              subnet_id)
@@ -694,12 +761,14 @@ class AzureClient(object):
             log.exception(cloud_error.message)
             raise cloud_error
 
+    @profile
     def create_floating_ip(self, public_ip_name, public_ip_parameters):
         return self.network_management_client.public_ip_addresses. \
             create_or_update(self.resource_group,
                              public_ip_name,
                              public_ip_parameters).result()
 
+    @profile
     def get_floating_ip(self, public_ip_id):
         url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
                                              public_ip_id)
@@ -707,6 +776,7 @@ class AzureClient(object):
         return self.network_management_client. \
             public_ip_addresses.get(self.resource_group, public_ip_name)
 
+    @profile
     def delete_floating_ip(self, public_ip_id):
         url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
                                              public_ip_id)
@@ -715,6 +785,7 @@ class AzureClient(object):
             public_ip_addresses.delete(self.resource_group,
                                        public_ip_name).wait()
 
+    @profile
     def update_fip_tags(self, fip_id, tags):
         url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
                                              fip_id)
@@ -723,15 +794,18 @@ class AzureClient(object):
             create_or_update(self.resource_group,
                              fip_name, tags).result()
 
+    @profile
     def list_floating_ips(self):
         return self.network_management_client.public_ip_addresses.list(
             self.resource_group)
 
+    @profile
     def list_vm(self):
         return self.compute_client.virtual_machines.list(
             self.resource_group
         )
 
+    @profile
     def restart_vm(self, vm_id):
         url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
                                              vm_id)
@@ -739,6 +813,7 @@ class AzureClient(object):
         return self.compute_client.virtual_machines.restart(
             self.resource_group, vm_name).wait()
 
+    @profile
     def delete_vm(self, vm_id):
         url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
                                              vm_id)
@@ -746,6 +821,7 @@ class AzureClient(object):
         return self.compute_client.virtual_machines.delete(
             self.resource_group, vm_name).wait()
 
+    @profile
     def get_vm(self, vm_id):
         url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
                                              vm_id)
@@ -756,11 +832,13 @@ class AzureClient(object):
             expand='instanceView'
         )
 
+    @profile
     def create_vm(self, vm_name, params):
         return self.compute_client.virtual_machines. \
             create_or_update(self.resource_group,
                              vm_name, params).result()
 
+    @profile
     def update_vm(self, vm_id, params):
         url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
                                              vm_id)
@@ -769,6 +847,7 @@ class AzureClient(object):
             create_or_update(self.resource_group,
                              vm_name, params, raw=True)
 
+    @profile
     def deallocate_vm(self, vm_id):
         url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
                                              vm_id)
@@ -777,6 +856,7 @@ class AzureClient(object):
             virtual_machines.deallocate(self.resource_group,
                                         vm_name).wait()
 
+    @profile
     def generalize_vm(self, vm_id):
         url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
                                              vm_id)
@@ -784,6 +864,7 @@ class AzureClient(object):
         self.compute_client.virtual_machines. \
             generalize(self.resource_group, vm_name)
 
+    @profile
     def start_vm(self, vm_id):
         url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
                                              vm_id)
@@ -792,6 +873,7 @@ class AzureClient(object):
             start(self.resource_group,
                   vm_name).wait()
 
+    @profile
     def update_vm_tags(self, vm_id, tags):
         url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
                                              vm_id)
@@ -800,6 +882,7 @@ class AzureClient(object):
             create_or_update(self.resource_group,
                              vm_name, tags).result()
 
+    @profile
     def delete_nic(self, nic_id):
         nic_params = azure_helpers.\
             parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
@@ -808,6 +891,7 @@ class AzureClient(object):
             network_interfaces.delete(self.resource_group,
                                       nic_name).wait()
 
+    @profile
     def get_nic(self, nic_id):
         nic_params = azure_helpers.\
             parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
@@ -815,6 +899,7 @@ class AzureClient(object):
         return self.network_management_client. \
             network_interfaces.get(self.resource_group, nic_name)
 
+    @profile
     def update_nic(self, nic_id, params):
         nic_params = azure_helpers.\
             parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
@@ -828,6 +913,7 @@ class AzureClient(object):
         nic_info = async_nic_creation.result()
         return nic_info
 
+    @profile
     def create_nic(self, nic_name, params):
         return self.network_management_client. \
             network_interfaces.create_or_update(
@@ -836,11 +922,13 @@ class AzureClient(object):
                 params
             ).result()
 
+    @profile
     def create_public_key(self, entity):
         return self.table_service. \
             insert_or_replace_entity(self.public_key_storage_table_name,
                                      entity)
 
+    @profile
     def get_public_key(self, name):
         entities = self.table_service. \
             query_entities(self.public_key_storage_table_name,
@@ -848,10 +936,12 @@ class AzureClient(object):
 
         return entities.items[0] if len(entities.items) > 0 else None
 
+    @profile
     def delete_public_key(self, entity):
         self.table_service.delete_entity(self.public_key_storage_table_name,
                                          entity.PartitionKey, entity.RowKey)
 
+    @profile
     def list_public_keys(self, partition_key, limit=None, marker=None):
         entities = self.table_service. \
             query_entities(self.public_key_storage_table_name,
@@ -859,11 +949,13 @@ class AzureClient(object):
                            marker=marker, num_results=limit)
         return (entities.items, entities.next_marker)
 
+    @profile
     def delete_route_table(self, route_table_name):
         self.network_management_client. \
             route_tables.delete(self.resource_group, route_table_name
                                 ).wait()
 
+    @profile
     def attach_subnet_to_route_table(self, subnet_id, route_table_id):
         url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
                                              subnet_id)
@@ -890,6 +982,7 @@ class AzureClient(object):
 
         return subnet_info
 
+    @profile
     def detach_subnet_to_route_table(self, subnet_id, route_table_id):
         url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
                                              subnet_id)
@@ -915,10 +1008,12 @@ class AzureClient(object):
 
         return subnet_info
 
+    @profile
     def list_route_tables(self):
         return self.network_management_client. \
             route_tables.list(self.resource_group)
 
+    @profile
     def get_route_table(self, router_id):
         url_params = azure_helpers.parse_url(ROUTER_RESOURCE_ID,
                                              router_id)
@@ -926,12 +1021,14 @@ class AzureClient(object):
         return self.network_management_client. \
             route_tables.get(self.resource_group, router_name)
 
+    @profile
     def create_route_table(self, route_table_name, params):
         return self.network_management_client. \
             route_tables.create_or_update(
              self.resource_group,
              route_table_name, params).result()
 
+    @profile
     def update_route_table_tags(self, route_table_name, tags):
         self.network_management_client.route_tables. \
             create_or_update(self.resource_group,

+ 0 - 0
test/__init__.py → cloudbridge/test/__init__.py


+ 0 - 0
test/fixtures/custom_amis.json → cloudbridge/test/fixtures/custom_amis.json


+ 0 - 0
test/fixtures/logo.jpg → cloudbridge/test/fixtures/logo.jpg


+ 0 - 0
test/helpers/__init__.py → cloudbridge/test/helpers/__init__.py


+ 1 - 1
test/helpers/standard_interface_tests.py → cloudbridge/test/helpers/standard_interface_tests.py

@@ -16,7 +16,7 @@ from cloudbridge.cloud.interfaces.resources import ObjectLifeCycleMixin
 from cloudbridge.cloud.interfaces.resources import ResultList
 from cloudbridge.cloud.providers.aws.services import AWSImageService
 
-import test.helpers as helpers
+import cloudbridge.test.helpers as helpers
 
 
 def check_repr(test, obj):

+ 3 - 3
test/test_block_store_service.py → cloudbridge/test/test_block_store_service.py

@@ -10,9 +10,9 @@ from cloudbridge.cloud.interfaces.resources import AttachmentInfo
 from cloudbridge.cloud.interfaces.resources import Snapshot
 from cloudbridge.cloud.interfaces.resources import Volume
 
-from test import helpers
-from test.helpers import ProviderTestBase
-from test.helpers import standard_interface_tests as sit
+from cloudbridge.test import helpers
+from cloudbridge.test.helpers import ProviderTestBase
+from cloudbridge.test.helpers import standard_interface_tests as sit
 
 
 class CloudBlockStoreServiceTestCase(ProviderTestBase):

+ 1 - 1
test/test_cloud_factory.py → cloudbridge/test/test_cloud_factory.py

@@ -8,7 +8,7 @@ from cloudbridge.cloud.interfaces.provider import CloudProvider
 from cloudbridge.cloud.providers.aws import AWSCloudProvider
 from cloudbridge.cloud.providers.aws.provider import MockAWSCloudProvider
 
-from test import helpers
+from cloudbridge.test import helpers
 
 
 class CloudFactoryTestCase(unittest.TestCase):

+ 1 - 1
test/test_cloud_helpers.py → cloudbridge/test/test_cloud_helpers.py

@@ -6,7 +6,7 @@ from cloudbridge.cloud.base.helpers import get_env
 from cloudbridge.cloud.base.resources import ClientPagedResultList
 from cloudbridge.cloud.base.resources import ServerPagedResultList
 
-from test.helpers import ProviderTestBase
+from cloudbridge.test.helpers import ProviderTestBase
 
 
 class DummyResult(object):

+ 3 - 3
test/test_compute_service.py → cloudbridge/test/test_compute_service.py

@@ -10,9 +10,9 @@ from cloudbridge.cloud.interfaces.resources import Instance
 from cloudbridge.cloud.interfaces.resources import SnapshotState
 from cloudbridge.cloud.interfaces.resources import VMType
 
-from test import helpers
-from test.helpers import ProviderTestBase
-from test.helpers import standard_interface_tests as sit
+from cloudbridge.test import helpers
+from cloudbridge.test.helpers import ProviderTestBase
+from cloudbridge.test.helpers import standard_interface_tests as sit
 
 
 class CloudComputeServiceTestCase(ProviderTestBase):

+ 3 - 3
test/test_image_service.py → cloudbridge/test/test_image_service.py

@@ -1,9 +1,9 @@
 from cloudbridge.cloud.interfaces import MachineImageState
 from cloudbridge.cloud.interfaces.resources import Instance, MachineImage
 
-from test import helpers
-from test.helpers import ProviderTestBase
-from test.helpers import standard_interface_tests as sit
+from cloudbridge.test import helpers
+from cloudbridge.test.helpers import ProviderTestBase
+from cloudbridge.test.helpers import standard_interface_tests as sit
 
 
 class CloudImageServiceTestCase(ProviderTestBase):

+ 1 - 1
test/test_interface.py → cloudbridge/test/test_interface.py

@@ -6,7 +6,7 @@ from cloudbridge.cloud.factory import CloudProviderFactory
 from cloudbridge.cloud.interfaces import TestMockHelperMixin
 from cloudbridge.cloud.interfaces.exceptions import ProviderConnectionException
 
-from test.helpers import ProviderTestBase
+from cloudbridge.test.helpers import ProviderTestBase
 
 
 class CloudInterfaceTestCase(ProviderTestBase):

+ 4 - 4
test/test_network_service.py → cloudbridge/test/test_network_service.py

@@ -5,10 +5,10 @@ from cloudbridge.cloud.interfaces.resources import RouterState
 from cloudbridge.cloud.interfaces.resources import Subnet
 from cloudbridge.cloud.interfaces.resources import SubnetState
 
-import test.helpers as helpers
-from test.helpers import ProviderTestBase
-from test.helpers import get_provider_test_data
-from test.helpers import standard_interface_tests as sit
+import cloudbridge.test.helpers as helpers
+from cloudbridge.test.helpers import ProviderTestBase
+from cloudbridge.test.helpers import get_provider_test_data
+from cloudbridge.test.helpers import standard_interface_tests as sit
 
 
 class CloudNetworkServiceTestCase(ProviderTestBase):

+ 2 - 2
test/test_object_life_cycle.py → cloudbridge/test/test_object_life_cycle.py

@@ -1,8 +1,8 @@
 from cloudbridge.cloud.interfaces import VolumeState
 from cloudbridge.cloud.interfaces.exceptions import WaitStateException
 
-from test import helpers
-from test.helpers import ProviderTestBase
+from cloudbridge.test import helpers
+from cloudbridge.test.helpers import ProviderTestBase
 
 
 class CloudObjectLifeCycleTestCase(ProviderTestBase):

+ 3 - 3
test/test_object_store_service.py → cloudbridge/test/test_object_store_service.py

@@ -12,9 +12,9 @@ from cloudbridge.cloud.interfaces.provider import TestMockHelperMixin
 from cloudbridge.cloud.interfaces.resources import Bucket
 from cloudbridge.cloud.interfaces.resources import BucketObject
 
-from test import helpers
-from test.helpers import ProviderTestBase
-from test.helpers import standard_interface_tests as sit
+from cloudbridge.test import helpers
+from cloudbridge.test.helpers import ProviderTestBase
+from cloudbridge.test.helpers import standard_interface_tests as sit
 
 
 class CloudObjectStoreServiceTestCase(ProviderTestBase):

+ 3 - 3
test/test_region_service.py → cloudbridge/test/test_region_service.py

@@ -2,9 +2,9 @@ import six
 
 from cloudbridge.cloud.interfaces import Region
 
-from test import helpers
-from test.helpers import ProviderTestBase
-from test.helpers import standard_interface_tests as sit
+from cloudbridge.test import helpers
+from cloudbridge.test.helpers import ProviderTestBase
+from cloudbridge.test.helpers import standard_interface_tests as sit
 
 
 class CloudRegionServiceTestCase(ProviderTestBase):

+ 3 - 3
test/test_security_service.py → cloudbridge/test/test_security_service.py

@@ -6,9 +6,9 @@ from cloudbridge.cloud.interfaces.resources import TrafficDirection
 from cloudbridge.cloud.interfaces.resources import VMFirewall
 from cloudbridge.cloud.interfaces.resources import VMFirewallRule
 
-from test import helpers
-from test.helpers import ProviderTestBase
-from test.helpers import standard_interface_tests as sit
+from cloudbridge.test import helpers
+from cloudbridge.test.helpers import ProviderTestBase
+from cloudbridge.test.helpers import standard_interface_tests as sit
 
 
 class CloudSecurityServiceTestCase(ProviderTestBase):

+ 4 - 4
test/test_vm_types_service.py → cloudbridge/test/test_vm_types_service.py

@@ -1,11 +1,11 @@
 import six
 
-from test import helpers
-from test.helpers import ProviderTestBase
-from test.helpers import standard_interface_tests as sit
+from cloudbridge.test import helpers
+from cloudbridge.test.helpers import ProviderTestBase
+from cloudbridge.test.helpers import standard_interface_tests as sit
 
 
-class CloudVMTypeServiceTestCase(ProviderTestBase):
+class CloudVMTypesServiceTestCase(ProviderTestBase):
 
     _multiprocess_can_split_ = True
 

+ 33 - 0
profiling-scripts/run-all.sh

@@ -0,0 +1,33 @@
+#!/bin/bash
+#
+###############
+# Pre-reqs:
+###############
+# Add @profile decorator in all cloudbridge methods to profile
+# `pip install .`
+#                in the modified cloudbridge directory (with tests as part of the library)
+# `pip install line-profiler`
+###############
+# Usage:
+###############
+# sh run-all.sh
+###############
+# Behavior:
+###############
+# Will run the line-by-line profiler (https://github.com/rkern/line_profiler) on each test,
+# and generate a result file containing the test results and the line-by-line runtime for
+# each profiled function
+
+export CB_TEST_PROVIDER=azure
+
+kernprof -l -v run_single.py block_store > ../results/block_store.res
+kernprof -l -v run_single.py cloud_factory > ../results/cloud_factory.res
+kernprof -l -v run_single.py cloud_helpers > ../results/cloud_helpers.res
+kernprof -l -v run_single.py compute > ../results/compute.res
+kernprof -l -v run_single.py image > ../results/image.res
+kernprof -l -v run_single.py network > ../results/network.res
+kernprof -l -v run_single.py object_life_cycle > ../results/object_life_cycle.res
+kernprof -l -v run_single.py object_store > ../results/object_store.res
+kernprof -l -v run_single.py region > ../results/region.res
+kernprof -l -v run_single.py security > ../results/security.res
+kernprof -l -v run_single.py vm_types > ../results/vm_types.res

+ 31 - 0
profiling-scripts/run_single.py

@@ -0,0 +1,31 @@
+import unittest
+from io import StringIO
+import argparse
+import importlib
+
+parser = argparse.ArgumentParser()
+parser.add_argument("suite", help="the name of the test suite from which a "
+                                  "class should be profiled",
+                    type=str)
+
+args = parser.parse_args()
+if not args.suite:
+    print("A test suite must be provided")
+else:
+    mod_name = "cloudbridge.test.test_{}_service".format(args.suite)
+    case_name = "Cloud{}ServiceTestCase".format("".join([x.capitalize() for
+                                                         x in
+                                                         args.suite.split('_')]))
+    case_name = case_name.replace("VmType", "VMType").replace("CloudCloud",
+                                                              "Cloud")
+    if "interface" in mod_name or "cycle" in mod_name or "cloud" in mod_name:
+        mod_name = mod_name.replace("_service", "")
+        case_name = case_name.replace("Service", "")
+    print("{}.{}\n\n".format(mod_name, case_name))
+    case = getattr(importlib.import_module(mod_name), case_name)
+
+    stream = StringIO()
+    runner = unittest.TextTestRunner(stream=stream)
+    result = runner.run(unittest.makeSuite(case))
+    stream.seek(0)
+    print('Test output\n', stream.read())

二進制
profiling-scripts/run_single.py.lprof


+ 1467 - 0
results/block_store.res

@@ -0,0 +1,1467 @@
+Test output
+ .....
+----------------------------------------------------------------------
+Ran 5 tests in 1397.596s
+
+OK
+
+Wrote profile results to run_tests.py.lprof
+Timer unit: 1e-06 s
+
+Total time: 1.4167 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: __init__ at line 160
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   160                                               @profile
+   161                                               def __init__(self, config):
+   162         5         17.0      3.4      0.0          self._config = config
+   163         5         14.0      2.8      0.0          self.subscription_id = str(config.get('azure_subscription_id'))
+   164         5          3.0      0.6      0.0          self._credentials = ServicePrincipalCredentials(
+   165         5          4.0      0.8      0.0              client_id=config.get('azure_client_id'),
+   166         5          4.0      0.8      0.0              secret=config.get('azure_secret'),
+   167         5    1416552.0 283310.4    100.0              tenant=config.get('azure_tenant')
+   168                                                   )
+   169                                           
+   170         5         16.0      3.2      0.0          self._access_token = config.get('azure_access_token')
+   171         5          6.0      1.2      0.0          self._resource_client = None
+   172         5          5.0      1.0      0.0          self._storage_client = None
+   173         5          4.0      0.8      0.0          self._network_management_client = None
+   174         5          6.0      1.2      0.0          self._subscription_client = None
+   175         5          6.0      1.2      0.0          self._compute_client = None
+   176         5          5.0      1.0      0.0          self._access_key_result = None
+   177         5          6.0      1.2      0.0          self._block_blob_service = None
+   178         5          4.0      0.8      0.0          self._table_service = None
+   179         5          5.0      1.0      0.0          self._storage_account = None
+   180                                           
+   181         5         41.0      8.2      0.0          log.debug("azure subscription : %s", self.subscription_id)
+
+Total time: 0.999881 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: access_key_result at line 183
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   183                                               @property
+   184                                               @tenacity.retry(stop=tenacity.stop_after_attempt(5), reraise=True)
+   185                                               @profile
+   186                                               def access_key_result(self):
+   187         2          2.0      1.0      0.0          if not self._access_key_result:
+   188         2          7.0      3.5      0.0              storage_account = self.storage_account
+   189                                           
+   190         2     497806.0 248903.0     49.8              if self.get_storage_account(storage_account).\
+   191         2          2.0      1.0      0.0                      provisioning_state.value != 'Succeeded':
+   192                                                           log.debug(
+   193                                                               "Storage account %s is not in Succeeded state yet. ",
+   194                                                               storage_account)
+   195                                                           raise WaitStateException(
+   196                                                               "Waited too long for storage account: {0} to "
+   197                                                               "become ready.".format(
+   198                                                                   storage_account,
+   199                                                                   self.get_storage_account(storage_account).
+   200                                                                   provisioning_state))
+   201                                           
+   202         2        463.0    231.5      0.0              self._access_key_result = self.storage_client.storage_accounts. \
+   203         2     501597.0 250798.5     50.2                  list_keys(self.resource_group, storage_account)
+   204         2          4.0      2.0      0.0          return self._access_key_result
+
+Total time: 0.00028 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: resource_group at line 206
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   206                                               @property
+   207                                               @profile
+   208                                               def resource_group(self):
+   209       158        280.0      1.8    100.0          return self._config.get('azure_resource_group')
+
+Total time: 7e-06 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: storage_account at line 211
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   211                                               @property
+   212                                               @profile
+   213                                               def storage_account(self):
+   214         6          7.0      1.2    100.0          return self._config.get('azure_storage_account')
+
+Total time: 9e-06 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: region_name at line 216
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   216                                               @property
+   217                                               @profile
+   218                                               def region_name(self):
+   219         3          9.0      3.0    100.0          return self._config.get('azure_region_name')
+
+Total time: 3.3e-05 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: public_key_storage_table_name at line 221
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   221                                               @property
+   222                                               @profile
+   223                                               def public_key_storage_table_name(self):
+   224        17         33.0      1.9    100.0          return self._config.get('azure_public_key_storage_table_name')
+
+Total time: 0.013736 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: storage_client at line 226
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   226                                               @property
+   227                                               @profile
+   228                                               def storage_client(self):
+   229         6          6.0      1.0      0.0          if not self._storage_client:
+   230                                                       self._storage_client = \
+   231         2          2.0      1.0      0.0                  StorageManagementClient(self._credentials,
+   232         2      13724.0   6862.0     99.9                                          self.subscription_id)
+   233         6          4.0      0.7      0.0          return self._storage_client
+
+Total time: 0.012467 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: subscription_client at line 235
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   235                                               @property
+   236                                               @profile
+   237                                               def subscription_client(self):
+   238         2          2.0      1.0      0.0          if not self._subscription_client:
+   239         2      12463.0   6231.5    100.0              self._subscription_client = SubscriptionClient(self._credentials)
+   240         2          2.0      1.0      0.0          return self._subscription_client
+
+Total time: 0.045807 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: resource_client at line 242
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   242                                               @property
+   243                                               @profile
+   244                                               def resource_client(self):
+   245         5          5.0      1.0      0.0          if not self._resource_client:
+   246                                                       self._resource_client = \
+   247         5          3.0      0.6      0.0                  ResourceManagementClient(self._credentials,
+   248         5      45789.0   9157.8    100.0                                           self.subscription_id)
+   249         5         10.0      2.0      0.0          return self._resource_client
+
+Total time: 0.034362 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: compute_client at line 251
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   251                                               @property
+   252                                               @profile
+   253                                               def compute_client(self):
+   254       136        319.0      2.3      0.9          if not self._compute_client:
+   255                                                       self._compute_client = \
+   256         5          9.0      1.8      0.0                  ComputeManagementClient(self._credentials,
+   257         5      33902.0   6780.4     98.7                                          self.subscription_id)
+   258       136        132.0      1.0      0.4          return self._compute_client
+
+Total time: 0.014786 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: network_management_client at line 260
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   260                                               @property
+   261                                               @profile
+   262                                               def network_management_client(self):
+   263        16         17.0      1.1      0.1          if not self._network_management_client:
+   264         2          5.0      2.5      0.0              self._network_management_client = NetworkManagementClient(
+   265         2      14756.0   7378.0     99.8                  self._credentials, self.subscription_id)
+   266        16          8.0      0.5      0.1          return self._network_management_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: blob_service at line 268
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   268                                               @property
+   269                                               @profile
+   270                                               def blob_service(self):
+   271                                                   self._get_or_create_storage_account()
+   272                                                   if not self._block_blob_service:
+   273                                                       if self._access_token:
+   274                                                           token_credential = TokenCredential(self._access_token)
+   275                                                           self._block_blob_service = BlockBlobService(
+   276                                                               account_name=self.storage_account,
+   277                                                               token_credential=token_credential)
+   278                                                       else:
+   279                                                           self._block_blob_service = BlockBlobService(
+   280                                                               account_name=self.storage_account,
+   281                                                               account_key=self.access_key_result.keys[0].value)
+   282                                                   return self._block_blob_service
+
+Total time: 2.45904 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: table_service at line 284
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   284                                               @property
+   285                                               @profile
+   286                                               def table_service(self):
+   287         8     620455.0  77556.9     25.2          self._get_or_create_storage_account()
+   288         8         15.0      1.9      0.0          if not self._table_service:
+   289         2          5.0      2.5      0.0              self._table_service = TableService(
+   290         2         16.0      8.0      0.0                  self.storage_account,
+   291         2    1000721.0 500360.5     40.7                  self.access_key_result.keys[0].value)
+   292         8         20.0      2.5      0.0          if not self._table_service. \
+   293         8     776819.0  97102.4     31.6                  exists(table_name=self.public_key_storage_table_name):
+   294         1          4.0      4.0      0.0              self._table_service.create_table(
+   295         1      60955.0  60955.0      2.5                  self.public_key_storage_table_name)
+   296         8         31.0      3.9      0.0          return self._table_service
+
+Total time: 1.0522 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_resource_group at line 298
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   298                                               @profile
+   299                                               def get_resource_group(self, name):
+   300         5    1052198.0 210439.6    100.0          return self.resource_client.resource_groups.get(name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_resource_group at line 302
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   302                                               @profile
+   303                                               def create_resource_group(self, name, parameters):
+   304                                                   return self.resource_client.resource_groups. \
+   305                                                       create_or_update(name, parameters)
+
+Total time: 1.11697 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_storage_account at line 307
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   307                                               @profile
+   308                                               def get_storage_account(self, storage_account):
+   309         4      67334.0  16833.5      6.0          return self.storage_client.storage_accounts. \
+   310         4    1049640.0 262410.0     94.0              get_properties(self.resource_group, storage_account)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_storage_account at line 312
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   312                                               @profile
+   313                                               def create_storage_account(self, name, params):
+   314                                                   return self.storage_client.storage_accounts. \
+   315                                                       create(self.resource_group, name.lower(), params).result()
+
+Total time: 0.619268 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: _get_or_create_storage_account at line 319
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   319                                               @tenacity.retry(stop=tenacity.stop_after_attempt(2),
+   320                                                               retry=tenacity.retry_if_exception_type(CloudError),
+   321                                                               reraise=True)
+   322                                               @profile
+   323                                               def _get_or_create_storage_account(self):
+   324         8         12.0      1.5      0.0          if self._storage_account:
+   325         6          5.0      0.8      0.0              return self._storage_account
+   326                                                   else:
+   327         2          2.0      1.0      0.0              try:
+   328                                                           self._storage_account = \
+   329         2     619249.0 309624.5    100.0                      self.get_storage_account(self.storage_account)
+   330                                                       except CloudError as cloud_error:
+   331                                                           if cloud_error.error.error == "ResourceNotFound":
+   332                                                               storage_account_params = {
+   333                                                                   'sku': {
+   334                                                                       'name': 'Standard_LRS'
+   335                                                                   },
+   336                                                                   'kind': 'storage',
+   337                                                                   'location': self.region_name,
+   338                                                               }
+   339                                                               try:
+   340                                                                   self._storage_account = \
+   341                                                                       self.create_storage_account(self.storage_account,
+   342                                                                                                   storage_account_params)
+   343                                                               except CloudError as cloud_error2:  # pragma: no cover
+   344                                                                   if cloud_error2.error.error == "AuthorizationFailed":
+   345                                                                       mess = 'The following error was returned by ' \
+   346                                                                              'Azure:\n%s\n\nThis is likely because the' \
+   347                                                                              ' Role associated with the provided ' \
+   348                                                                              'credentials does not allow for Storage ' \
+   349                                                                              'Account creation.\nA Storage Account is ' \
+   350                                                                              'necessary in order to perform the ' \
+   351                                                                              'desired operation. You must either ' \
+   352                                                                              'provide an existing Storage Account name' \
+   353                                                                              ' as part of the configuration, or ' \
+   354                                                                              'elevate the associated Role.\nFor more ' \
+   355                                                                              'information on roles, see: https://docs.' \
+   356                                                                              'microsoft.com/en-us/azure/role-based-' \
+   357                                                                              'access-control/overview\n' % cloud_error2
+   358                                                                       raise ProviderConnectionException(mess)
+   359                                           
+   360                                                                   elif cloud_error2.error.error == \
+   361                                                                           "StorageAccountAlreadyTaken":
+   362                                                                       mess = 'The following error was ' \
+   363                                                                              'returned by Azure:\n%s\n\n' \
+   364                                                                              'Note that Storage Account names must be ' \
+   365                                                                              'unique across Azure (not just in your ' \
+   366                                                                              'subscription).\nFor more information ' \
+   367                                                                              'see https://docs.microsoft.com/en-us/' \
+   368                                                                              'azure/azure-resource-manager/resource-' \
+   369                                                                              'manager-storage-account-name-errors\n' \
+   370                                                                              % cloud_error2
+   371                                                                       raise InvalidLabelException(mess)
+   372                                                                   else:
+   373                                                                       raise cloud_error2
+   374                                                           else:
+   375                                                               raise cloud_error
+
+Total time: 0.039382 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_locations at line 377
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   377                                               @profile
+   378                                               def list_locations(self):
+   379         2      39332.0  19666.0     99.9          return self.subscription_client.subscriptions. \
+   380         2         50.0     25.0      0.1              list_locations(self.subscription_id)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm_firewall at line 382
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   382                                               @profile
+   383                                               def list_vm_firewall(self):
+   384                                                   return self.network_management_client.network_security_groups. \
+   385                                                       list(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm_firewall at line 387
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   387                                               @profile
+   388                                               def create_vm_firewall(self, name, parameters):
+   389                                                   return self.network_management_client.network_security_groups. \
+   390                                                       create_or_update(self.resource_group, name,
+   391                                                                        parameters).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm_firewall_tags at line 393
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   393                                               @profile
+   394                                               def update_vm_firewall_tags(self, fw_id, tags):
+   395                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   396                                                                                        fw_id)
+   397                                                   name = url_params.get(VM_FIREWALL_NAME)
+   398                                                   return self.network_management_client.network_security_groups. \
+   399                                                       create_or_update(self.resource_group, name,
+   400                                                                        {'tags': tags,
+   401                                                                         'location': self.region_name}).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_vm_firewall at line 403
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   403                                               @profile
+   404                                               def get_vm_firewall(self, fw_id):
+   405                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   406                                                                                        fw_id)
+   407                                                   fw_name = url_params.get(VM_FIREWALL_NAME)
+   408                                                   return self.network_management_client.network_security_groups. \
+   409                                                       get(self.resource_group, fw_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm_firewall at line 411
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   411                                               @profile
+   412                                               def delete_vm_firewall(self, fw_id):
+   413                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   414                                                                                        fw_id)
+   415                                                   name = url_params.get(VM_FIREWALL_NAME)
+   416                                                   self.network_management_client \
+   417                                                       .network_security_groups.delete(self.resource_group, name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm_firewall_rule at line 419
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   419                                               @profile
+   420                                               def create_vm_firewall_rule(self, fw_id,
+   421                                                                           rule_name, parameters):
+   422                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   423                                                                                        fw_id)
+   424                                                   vm_firewall_name = url_params.get(VM_FIREWALL_NAME)
+   425                                                   return self.network_management_client.security_rules. \
+   426                                                       create_or_update(self.resource_group, vm_firewall_name,
+   427                                                                        rule_name, parameters).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm_firewall_rule at line 429
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   429                                               @profile
+   430                                               def delete_vm_firewall_rule(self, fw_rule_id, vm_firewall):
+   431                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RULE_RESOURCE_ID,
+   432                                                                                        fw_rule_id)
+   433                                                   name = url_params.get(VM_FIREWALL_RULE_NAME)
+   434                                                   return self.network_management_client.security_rules. \
+   435                                                       delete(self.resource_group, vm_firewall, name).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_containers at line 437
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   437                                               @profile
+   438                                               def list_containers(self, prefix=None, limit=None, marker=None):
+   439                                                   results = self.blob_service.list_containers(prefix=prefix,
+   440                                                                                               num_results=limit,
+   441                                                                                               marker=marker)
+   442                                                   return (results.items, results.next_marker)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_container at line 444
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   444                                               @profile
+   445                                               def create_container(self, container_name):
+   446                                                   try:
+   447                                                       self.blob_service.create_container(container_name,
+   448                                                                                          fail_on_exist=True)
+   449                                                   except AzureConflictHttpError as cloud_error:
+   450                                                       if cloud_error.error_code == "ContainerAlreadyExists":
+   451                                                           msg = "The given Bucket name '%s' already exists. Please " \
+   452                                                                 "use the `get` or `find` method to get a reference to " \
+   453                                                                 "an existing Bucket, or specify a new Bucket name to " \
+   454                                                                 "create.\nNote that in Azure, Buckets are contained " \
+   455                                                                 "in Storage Accounts." % container_name
+   456                                                           raise DuplicateResourceException(msg)
+   457                                           
+   458                                                   return self.blob_service.get_container_properties(container_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_container at line 460
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   460                                               @profile
+   461                                               def get_container(self, container_name):
+   462                                                   return self.blob_service.get_container_properties(container_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_container at line 464
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   464                                               @profile
+   465                                               def delete_container(self, container_name):
+   466                                                   self.blob_service.delete_container(container_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_blobs at line 468
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   468                                               @profile
+   469                                               def list_blobs(self, container_name, prefix=None):
+   470                                                   return self.blob_service.list_blobs(container_name, prefix=prefix)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob at line 472
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   472                                               @profile
+   473                                               def get_blob(self, container_name, blob_name):
+   474                                                   return self.blob_service.get_blob_properties(container_name, blob_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_blob_from_text at line 476
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   476                                               @profile
+   477                                               def create_blob_from_text(self, container_name, blob_name, text):
+   478                                                   self.blob_service.create_blob_from_text(container_name,
+   479                                                                                           blob_name, text)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_blob_from_file at line 481
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   481                                               @profile
+   482                                               def create_blob_from_file(self, container_name, blob_name, file_path):
+   483                                                   self.blob_service.create_blob_from_path(container_name,
+   484                                                                                           blob_name, file_path)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_blob at line 486
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   486                                               @profile
+   487                                               def delete_blob(self, container_name, blob_name):
+   488                                                   self.blob_service.delete_blob(container_name, blob_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob_url at line 490
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   490                                               @profile
+   491                                               def get_blob_url(self, container_name, blob_name, expiry_time):
+   492                                                   expiry_date = datetime.datetime.utcnow() + datetime.timedelta(
+   493                                                       seconds=expiry_time)
+   494                                                   sas = self.blob_service.generate_blob_shared_access_signature(
+   495                                                       container_name, blob_name, permission=BlobPermissions.READ,
+   496                                                       expiry=expiry_date)
+   497                                                   return self.blob_service.make_blob_url(container_name, blob_name,
+   498                                                                                          sas_token=sas)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob_content at line 500
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   500                                               @profile
+   501                                               def get_blob_content(self, container_name, blob_name):
+   502                                                   out_stream = BytesIO()
+   503                                                   self.blob_service.get_blob_to_stream(container_name,
+   504                                                                                        blob_name, out_stream)
+   505                                                   return out_stream
+
+Total time: 154.785 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_empty_disk at line 507
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   507                                               @profile
+   508                                               def create_empty_disk(self, disk_name, params):
+   509         5      22114.0   4422.8      0.0          return self.compute_client.disks.create_or_update(
+   510         5         42.0      8.4      0.0              self.resource_group,
+   511         5          4.0      0.8      0.0              disk_name,
+   512         5  154763184.0 30952636.8    100.0              params
+   513                                                   ).result()
+
+Total time: 61.8265 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_snapshot_disk at line 515
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   515                                               @profile
+   516                                               def create_snapshot_disk(self, disk_name, params):
+   517         2        937.0    468.5      0.0          return self.compute_client.disks.create_or_update(
+   518         2         16.0      8.0      0.0              self.resource_group,
+   519         2          0.0      0.0      0.0              disk_name,
+   520         2   61825555.0 30912777.5    100.0              params
+   521                                                   ).result()
+
+Total time: 13.0483 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_disk at line 523
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   523                                               @profile
+   524                                               def get_disk(self, disk_id):
+   525        54        331.0      6.1      0.0          url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   526        54       2974.0     55.1      0.0                                               disk_id)
+   527        54        192.0      3.6      0.0          disk_name = url_params.get(VOLUME_NAME)
+   528        54   13044845.0 241571.2    100.0          return self.compute_client.disks.get(self.resource_group, disk_name)
+
+Total time: 0.003016 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_disks at line 530
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   530                                               @profile
+   531                                               def list_disks(self):
+   532         6       2752.0    458.7     91.2          return self.compute_client.disks. \
+   533         6        264.0     44.0      8.8              list_by_resource_group(self.resource_group)
+
+Total time: 275.18 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_disk at line 535
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   535                                               @profile
+   536                                               def delete_disk(self, disk_id):
+   537         9         33.0      3.7      0.0          url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   538         9        272.0     30.2      0.0                                               disk_id)
+   539         9         11.0      1.2      0.0          disk_name = url_params.get(VOLUME_NAME)
+   540         9  275180033.0 30575559.2    100.0          self.compute_client.disks.delete(self.resource_group, disk_name).wait()
+
+Total time: 1.28909 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_disk_tags at line 542
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   542                                               @profile
+   543                                               def update_disk_tags(self, disk_id, tags):
+   544         4         13.0      3.2      0.0          url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   545         4        117.0     29.2      0.0                                               disk_id)
+   546         4          7.0      1.8      0.0          disk_name = url_params.get(VOLUME_NAME)
+   547         4       1914.0    478.5      0.1          return self.compute_client.disks.update(
+   548         4         30.0      7.5      0.0              self.resource_group,
+   549         4          1.0      0.2      0.0              disk_name,
+   550         4          3.0      0.8      0.0              {'tags': tags},
+   551         4    1287000.0 321750.0     99.8              raw=True
+   552                                                   )
+
+Total time: 0.006221 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_snapshots at line 554
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   554                                               @profile
+   555                                               def list_snapshots(self):
+   556        12       5710.0    475.8     91.8          return self.compute_client.snapshots. \
+   557        12        511.0     42.6      8.2              list_by_resource_group(self.resource_group)
+
+Total time: 2.48516 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_snapshot at line 559
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   559                                               @profile
+   560                                               def get_snapshot(self, snapshot_id):
+   561        12         53.0      4.4      0.0          url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   562        12        622.0     51.8      0.0                                               snapshot_id)
+   563        12         30.0      2.5      0.0          snapshot_name = url_params.get(SNAPSHOT_NAME)
+   564        12       7012.0    584.3      0.3          return self.compute_client.snapshots.get(self.resource_group,
+   565        12    2477439.0 206453.2     99.7                                                   snapshot_name)
+
+Total time: 93.2656 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_snapshot at line 567
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   567                                               @profile
+   568                                               def create_snapshot(self, snapshot_name, params):
+   569         3       1486.0    495.3      0.0          return self.compute_client.snapshots.create_or_update(
+   570         3         25.0      8.3      0.0              self.resource_group,
+   571         3          1.0      0.3      0.0              snapshot_name,
+   572         3   93264095.0 31088031.7    100.0              params
+   573                                                   ).result()
+
+Total time: 91.916 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_snapshot at line 575
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   575                                               @profile
+   576                                               def delete_snapshot(self, snapshot_id):
+   577         3         11.0      3.7      0.0          url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   578         3         99.0     33.0      0.0                                               snapshot_id)
+   579         3          6.0      2.0      0.0          snapshot_name = url_params.get(SNAPSHOT_NAME)
+   580         3       1506.0    502.0      0.0          self.compute_client.snapshots.delete(self.resource_group,
+   581         3   91914390.0 30638130.0    100.0                                               snapshot_name).wait()
+
+Total time: 3.81265 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_snapshot_tags at line 583
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   583                                               @profile
+   584                                               def update_snapshot_tags(self, snapshot_id, tags):
+   585         8         24.0      3.0      0.0          url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   586         8        242.0     30.2      0.0                                               snapshot_id)
+   587         8          9.0      1.1      0.0          snapshot_name = url_params.get(SNAPSHOT_NAME)
+   588         8       3725.0    465.6      0.1          return self.compute_client.snapshots.update(
+   589         8         66.0      8.2      0.0              self.resource_group,
+   590         8          5.0      0.6      0.0              snapshot_name,
+   591         8          7.0      0.9      0.0              {'tags': tags},
+   592         8    3808572.0 476071.5     99.9              raw=True
+   593                                                   )
+
+Total time: 5e-05 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: is_gallery_image at line 595
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   595                                               @profile
+   596                                               def is_gallery_image(self, image_id):
+   597         2          2.0      1.0      4.0          url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   598         2         46.0     23.0     92.0                                               image_id)
+   599                                                   # If it is a gallery image, it will always have an offer
+   600         2          2.0      1.0      4.0          return 'offer' in url_params
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_image at line 602
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   602                                               @profile
+   603                                               def create_image(self, name, params):
+   604                                                   return self.compute_client.images. \
+   605                                                       create_or_update(self.resource_group, name,
+   606                                                                        params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_image at line 608
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   608                                               @profile
+   609                                               def delete_image(self, image_id):
+   610                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   611                                                                                        image_id)
+   612                                                   if not self.is_gallery_image(image_id):
+   613                                                       name = url_params.get(IMAGE_NAME)
+   614                                                       self.compute_client.images.delete(self.resource_group, name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_images at line 616
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   616                                               @profile
+   617                                               def list_images(self):
+   618                                                   azure_images = list(self.compute_client.images.
+   619                                                                       list_by_resource_group(self.resource_group))
+   620                                                   return azure_images
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_gallery_refs at line 622
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   622                                               @profile
+   623                                               def list_gallery_refs(self):
+   624                                                   return gallery_image_references
+
+Total time: 0.000207 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_image at line 626
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   626                                               @profile
+   627                                               def get_image(self, image_id):
+   628         2          6.0      3.0      2.9          url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   629         2         70.0     35.0     33.8                                               image_id)
+   630         2         74.0     37.0     35.7          if self.is_gallery_image(image_id):
+   631         2          2.0      1.0      1.0              return GalleryImageReference(publisher=url_params['publisher'],
+   632         2          2.0      1.0      1.0                                           offer=url_params['offer'],
+   633         2          1.0      0.5      0.5                                           sku=url_params['sku'],
+   634         2         52.0     26.0     25.1                                           version=url_params['version'])
+   635                                                   else:
+   636                                                       name = url_params.get(IMAGE_NAME)
+   637                                                       return self.compute_client.images.get(self.resource_group, name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_image_tags at line 639
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   639                                               @profile
+   640                                               def update_image_tags(self, image_id, tags):
+   641                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   642                                                                                        image_id)
+   643                                                   if self.is_gallery_image(image_id):
+   644                                                       return True
+   645                                                   else:
+   646                                                       name = url_params.get(IMAGE_NAME)
+   647                                                       return self.compute_client.images. \
+   648                                                           create_or_update(self.resource_group, name,
+   649                                                                            {
+   650                                                                                'tags': tags,
+   651                                                                                'location': self.region_name
+   652                                                                            }).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm_types at line 654
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   654                                               @profile
+   655                                               def list_vm_types(self):
+   656                                                   return self.compute_client.virtual_machine_sizes. \
+   657                                                       list(self.region_name)
+
+Total time: 0.016803 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_networks at line 659
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   659                                               @profile
+   660                                               def list_networks(self):
+   661         2      16665.0   8332.5     99.2          return self.network_management_client.virtual_networks.list(
+   662         2        138.0     69.0      0.8              self.resource_group)
+
+Total time: 1.48537 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_network at line 664
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   664                                               @profile
+   665                                               def get_network(self, network_id):
+   666         6          6.0      1.0      0.0          url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID,
+   667         6        132.0     22.0      0.0                                               network_id)
+   668         6          8.0      1.3      0.0          network_name = url_params.get(NETWORK_NAME)
+   669         6       4650.0    775.0      0.3          return self.network_management_client.virtual_networks.get(
+   670         6    1480579.0 246763.2     99.7              self.resource_group, network_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_network at line 672
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   672                                               @profile
+   673                                               def create_network(self, name, params):
+   674                                                   return self.network_management_client.virtual_networks. \
+   675                                                       create_or_update(self.resource_group,
+   676                                                                        name,
+   677                                                                        parameters=params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_network at line 679
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   679                                               @profile
+   680                                               def delete_network(self, network_id):
+   681                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   682                                                   network_name = url_params.get(NETWORK_NAME)
+   683                                                   return self.network_management_client.virtual_networks. \
+   684                                                       delete(self.resource_group, network_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_network_tags at line 686
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   686                                               @profile
+   687                                               def update_network_tags(self, network_id, tags):
+   688                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   689                                                   network_name = url_params.get(NETWORK_NAME)
+   690                                                   return self.network_management_client.virtual_networks. \
+   691                                                       create_or_update(self.resource_group,
+   692                                                                        network_name, tags).result()
+
+Total time: 0.000282 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_network_id_for_subnet at line 694
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   694                                               @profile
+   695                                               def get_network_id_for_subnet(self, subnet_id):
+   696         6        193.0     32.2     68.4          url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID, subnet_id)
+   697         6          9.0      1.5      3.2          network_id = NETWORK_RESOURCE_ID[0]
+   698        30         27.0      0.9      9.6          for key, val in url_params.items():
+   699        24         48.0      2.0     17.0              network_id = network_id.replace("{" + key + "}", val)
+   700         6          5.0      0.8      1.8          return network_id
+
+Total time: 0.001802 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_subnets at line 702
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   702                                               @profile
+   703                                               def list_subnets(self, network_id):
+   704         2         78.0     39.0      4.3          url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   705         2          3.0      1.5      0.2          network_name = url_params.get(NETWORK_NAME)
+   706         2       1599.0    799.5     88.7          return self.network_management_client.subnets. \
+   707         2        122.0     61.0      6.8              list(self.resource_group, network_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_subnet at line 709
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   709                                               @profile
+   710                                               def get_subnet(self, subnet_id):
+   711                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   712                                                                                        subnet_id)
+   713                                                   network_name = url_params.get(NETWORK_NAME)
+   714                                                   subnet_name = url_params.get(SUBNET_NAME)
+   715                                                   return self.network_management_client.subnets. \
+   716                                                       get(self.resource_group, network_name, subnet_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_subnet at line 718
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   718                                               @profile
+   719                                               def create_subnet(self, network_id, subnet_name, params):
+   720                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   721                                                   network_name = url_params.get(NETWORK_NAME)
+   722                                                   result_create = self.network_management_client \
+   723                                                       .subnets.create_or_update(
+   724                                                           self.resource_group,
+   725                                                           network_name,
+   726                                                           subnet_name,
+   727                                                           params
+   728                                                       )
+   729                                                   subnet_info = result_create.result()
+   730                                           
+   731                                                   return subnet_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: __if_subnet_in_use at line 733
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   733                                               @profile
+   734                                               def __if_subnet_in_use(e):
+   735                                                   # return True if the CloudError exception is due to subnet being in use
+   736                                                   if isinstance(e, CloudError):
+   737                                                       if e.error.error == "InUseSubnetCannotBeDeleted":
+   738                                                           return True
+   739                                                   return False
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_subnet at line 741
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   741                                               @tenacity.retry(stop=tenacity.stop_after_attempt(5),
+   742                                                               retry=tenacity.retry_if_exception(__if_subnet_in_use),
+   743                                                               wait=tenacity.wait_fixed(5),
+   744                                                               reraise=True)
+   745                                               @profile
+   746                                               def delete_subnet(self, subnet_id):
+   747                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   748                                                                                        subnet_id)
+   749                                                   network_name = url_params.get(NETWORK_NAME)
+   750                                                   subnet_name = url_params.get(SUBNET_NAME)
+   751                                           
+   752                                                   try:
+   753                                                       result_delete = self.network_management_client \
+   754                                                           .subnets.delete(
+   755                                                               self.resource_group,
+   756                                                               network_name,
+   757                                                               subnet_name
+   758                                                           )
+   759                                                       result_delete.wait()
+   760                                                   except CloudError as cloud_error:
+   761                                                       log.exception(cloud_error.message)
+   762                                                       raise cloud_error
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_floating_ip at line 764
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   764                                               @profile
+   765                                               def create_floating_ip(self, public_ip_name, public_ip_parameters):
+   766                                                   return self.network_management_client.public_ip_addresses. \
+   767                                                       create_or_update(self.resource_group,
+   768                                                                        public_ip_name,
+   769                                                                        public_ip_parameters).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_floating_ip at line 771
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   771                                               @profile
+   772                                               def get_floating_ip(self, public_ip_id):
+   773                                                   url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   774                                                                                        public_ip_id)
+   775                                                   public_ip_name = url_params.get(PUBLIC_IP_NAME)
+   776                                                   return self.network_management_client. \
+   777                                                       public_ip_addresses.get(self.resource_group, public_ip_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_floating_ip at line 779
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   779                                               @profile
+   780                                               def delete_floating_ip(self, public_ip_id):
+   781                                                   url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   782                                                                                        public_ip_id)
+   783                                                   public_ip_name = url_params.get(PUBLIC_IP_NAME)
+   784                                                   self.network_management_client. \
+   785                                                       public_ip_addresses.delete(self.resource_group,
+   786                                                                                  public_ip_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_fip_tags at line 788
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   788                                               @profile
+   789                                               def update_fip_tags(self, fip_id, tags):
+   790                                                   url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   791                                                                                        fip_id)
+   792                                                   fip_name = url_params.get(PUBLIC_IP_NAME)
+   793                                                   self.network_management_client.public_ip_addresses. \
+   794                                                       create_or_update(self.resource_group,
+   795                                                                        fip_name, tags).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_floating_ips at line 797
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   797                                               @profile
+   798                                               def list_floating_ips(self):
+   799                                                   return self.network_management_client.public_ip_addresses.list(
+   800                                                       self.resource_group)
+
+Total time: 0.001097 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm at line 802
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   802                                               @profile
+   803                                               def list_vm(self):
+   804         2        968.0    484.0     88.2          return self.compute_client.virtual_machines.list(
+   805         2        129.0     64.5     11.8              self.resource_group
+   806                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: restart_vm at line 808
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   808                                               @profile
+   809                                               def restart_vm(self, vm_id):
+   810                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   811                                                                                        vm_id)
+   812                                                   vm_name = url_params.get(VM_NAME)
+   813                                                   return self.compute_client.virtual_machines.restart(
+   814                                                       self.resource_group, vm_name).wait()
+
+Total time: 81.5978 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm at line 816
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   816                                               @profile
+   817                                               def delete_vm(self, vm_id):
+   818         2          6.0      3.0      0.0          url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   819         2         56.0     28.0      0.0                                               vm_id)
+   820         2          3.0      1.5      0.0          vm_name = url_params.get(VM_NAME)
+   821         2        930.0    465.0      0.0          return self.compute_client.virtual_machines.delete(
+   822         2   81596835.0 40798417.5    100.0              self.resource_group, vm_name).wait()
+
+Total time: 1.73237 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_vm at line 824
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   824                                               @profile
+   825                                               def get_vm(self, vm_id):
+   826         6         29.0      4.8      0.0          url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   827         6        367.0     61.2      0.0                                               vm_id)
+   828         6         13.0      2.2      0.0          vm_name = url_params.get(VM_NAME)
+   829         6       3885.0    647.5      0.2          return self.compute_client.virtual_machines.get(
+   830         6         62.0     10.3      0.0              self.resource_group,
+   831         6          4.0      0.7      0.0              vm_name,
+   832         6    1728012.0 288002.0     99.7              expand='instanceView'
+   833                                                   )
+
+Total time: 252.683 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm at line 835
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   835                                               @profile
+   836                                               def create_vm(self, vm_name, params):
+   837         2      15216.0   7608.0      0.0          return self.compute_client.virtual_machines. \
+   838         2         16.0      8.0      0.0              create_or_update(self.resource_group,
+   839         2  252667585.0 126333792.5    100.0                               vm_name, params).result()
+
+Total time: 2.57777 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm at line 841
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   841                                               @profile
+   842                                               def update_vm(self, vm_id, params):
+   843         4         13.0      3.2      0.0          url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   844         4        103.0     25.8      0.0                                               vm_id)
+   845         4          6.0      1.5      0.0          vm_name = url_params.get(VM_NAME)
+   846         4       1852.0    463.0      0.1          return self.compute_client.virtual_machines. \
+   847         4         35.0      8.8      0.0              create_or_update(self.resource_group,
+   848         4    2575761.0 643940.2     99.9                               vm_name, params, raw=True)
+
+Total time: 215.106 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: deallocate_vm at line 850
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   850                                               @profile
+   851                                               def deallocate_vm(self, vm_id):
+   852         2          6.0      3.0      0.0          url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   853         2         59.0     29.5      0.0                                               vm_id)
+   854         2          2.0      1.0      0.0          vm_name = url_params.get(VM_NAME)
+   855         2       1006.0    503.0      0.0          self.compute_client. \
+   856         2         33.0     16.5      0.0              virtual_machines.deallocate(self.resource_group,
+   857         2  215104764.0 107552382.0    100.0                                          vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: generalize_vm at line 859
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   859                                               @profile
+   860                                               def generalize_vm(self, vm_id):
+   861                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   862                                                                                        vm_id)
+   863                                                   vm_name = url_params.get(VM_NAME)
+   864                                                   self.compute_client.virtual_machines. \
+   865                                                       generalize(self.resource_group, vm_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: start_vm at line 867
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   867                                               @profile
+   868                                               def start_vm(self, vm_id):
+   869                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   870                                                                                        vm_id)
+   871                                                   vm_name = url_params.get(VM_NAME)
+   872                                                   self.compute_client.virtual_machines. \
+   873                                                       start(self.resource_group,
+   874                                                             vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm_tags at line 876
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   876                                               @profile
+   877                                               def update_vm_tags(self, vm_id, tags):
+   878                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   879                                                                                        vm_id)
+   880                                                   vm_name = url_params.get(VM_NAME)
+   881                                                   self.compute_client.virtual_machines. \
+   882                                                       create_or_update(self.resource_group,
+   883                                                                        vm_name, tags).result()
+
+Total time: 21.1995 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_nic at line 885
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   885                                               @profile
+   886                                               def delete_nic(self, nic_id):
+   887         2          5.0      2.5      0.0          nic_params = azure_helpers.\
+   888         2         53.0     26.5      0.0              parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   889         2          3.0      1.5      0.0          nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   890         2       1409.0    704.5      0.0          self.network_management_client. \
+   891         2         16.0      8.0      0.0              network_interfaces.delete(self.resource_group,
+   892         2   21198019.0 10599009.5    100.0                                        nic_name).wait()
+
+Total time: 0.33701 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_nic at line 894
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   894                                               @profile
+   895                                               def get_nic(self, nic_id):
+   896         2          5.0      2.5      0.0          nic_params = azure_helpers.\
+   897         2         64.0     32.0      0.0              parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   898         2          3.0      1.5      0.0          nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   899         2       1771.0    885.5      0.5          return self.network_management_client. \
+   900         2     335167.0 167583.5     99.5              network_interfaces.get(self.resource_group, nic_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_nic at line 902
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   902                                               @profile
+   903                                               def update_nic(self, nic_id, params):
+   904                                                   nic_params = azure_helpers.\
+   905                                                       parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   906                                                   nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   907                                                   async_nic_creation = self.network_management_client. \
+   908                                                       network_interfaces.create_or_update(
+   909                                                           self.resource_group,
+   910                                                           nic_name,
+   911                                                           params
+   912                                                       )
+   913                                                   nic_info = async_nic_creation.result()
+   914                                                   return nic_info
+
+Total time: 62.265 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_nic at line 916
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   916                                               @profile
+   917                                               def create_nic(self, nic_name, params):
+   918         2       1463.0    731.5      0.0          return self.network_management_client. \
+   919                                                       network_interfaces.create_or_update(
+   920         2         16.0      8.0      0.0                  self.resource_group,
+   921         2          2.0      1.0      0.0                  nic_name,
+   922         2   62263484.0 31131742.0    100.0                  params
+   923                                                       ).result()
+
+Total time: 0.11157 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_public_key at line 925
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   925                                               @profile
+   926                                               def create_public_key(self, entity):
+   927         2      50381.0  25190.5     45.2          return self.table_service. \
+   928         2         24.0     12.0      0.0              insert_or_replace_entity(self.public_key_storage_table_name,
+   929         2      61165.0  30582.5     54.8                                       entity)
+
+Total time: 2.3086 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_public_key at line 931
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   931                                               @profile
+   932                                               def get_public_key(self, name):
+   933         4    2143534.0 535883.5     92.9          entities = self.table_service. \
+   934         4         43.0     10.8      0.0              query_entities(self.public_key_storage_table_name,
+   935         4     165008.0  41252.0      7.1                             "Name eq '{0}'".format(name), num_results=1)
+   936                                           
+   937         4         11.0      2.8      0.0          return entities.items[0] if len(entities.items) > 0 else None
+
+Total time: 0.398418 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_public_key at line 939
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   939                                               @profile
+   940                                               def delete_public_key(self, entity):
+   941         2     265317.0 132658.5     66.6          self.table_service.delete_entity(self.public_key_storage_table_name,
+   942         2     133101.0  66550.5     33.4                                           entity.PartitionKey, entity.RowKey)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_public_keys at line 944
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   944                                               @profile
+   945                                               def list_public_keys(self, partition_key, limit=None, marker=None):
+   946                                                   entities = self.table_service. \
+   947                                                       query_entities(self.public_key_storage_table_name,
+   948                                                                      "PartitionKey eq '{0}'".format(partition_key),
+   949                                                                      marker=marker, num_results=limit)
+   950                                                   return (entities.items, entities.next_marker)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_route_table at line 952
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   952                                               @profile
+   953                                               def delete_route_table(self, route_table_name):
+   954                                                   self.network_management_client. \
+   955                                                       route_tables.delete(self.resource_group, route_table_name
+   956                                                                           ).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: attach_subnet_to_route_table at line 958
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   958                                               @profile
+   959                                               def attach_subnet_to_route_table(self, subnet_id, route_table_id):
+   960                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   961                                                                                        subnet_id)
+   962                                                   network_name = url_params.get(NETWORK_NAME)
+   963                                                   subnet_name = url_params.get(SUBNET_NAME)
+   964                                           
+   965                                                   subnet_info = self.network_management_client.subnets.get(
+   966                                                       self.resource_group,
+   967                                                       network_name,
+   968                                                       subnet_name
+   969                                                   )
+   970                                                   if subnet_info:
+   971                                                       subnet_info.route_table = {
+   972                                                           'id': route_table_id
+   973                                                       }
+   974                                           
+   975                                                       result_create = self.network_management_client. \
+   976                                                           subnets.create_or_update(
+   977                                                            self.resource_group,
+   978                                                            network_name,
+   979                                                            subnet_name,
+   980                                                            subnet_info)
+   981                                                       subnet_info = result_create.result()
+   982                                           
+   983                                                   return subnet_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: detach_subnet_to_route_table at line 985
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   985                                               @profile
+   986                                               def detach_subnet_to_route_table(self, subnet_id, route_table_id):
+   987                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   988                                                                                        subnet_id)
+   989                                                   network_name = url_params.get(NETWORK_NAME)
+   990                                                   subnet_name = url_params.get(SUBNET_NAME)
+   991                                           
+   992                                                   subnet_info = self.network_management_client.subnets.get(
+   993                                                       self.resource_group,
+   994                                                       network_name,
+   995                                                       subnet_name
+   996                                                   )
+   997                                           
+   998                                                   if subnet_info and subnet_info.route_table.id == route_table_id:
+   999                                                       subnet_info.route_table = None
+  1000                                           
+  1001                                                       result_create = self.network_management_client. \
+  1002                                                           subnets.create_or_update(
+  1003                                                            self.resource_group,
+  1004                                                            network_name,
+  1005                                                            subnet_name,
+  1006                                                            subnet_info)
+  1007                                                       subnet_info = result_create.result()
+  1008                                           
+  1009                                                   return subnet_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_route_tables at line 1011
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1011                                               @profile
+  1012                                               def list_route_tables(self):
+  1013                                                   return self.network_management_client. \
+  1014                                                       route_tables.list(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_route_table at line 1016
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1016                                               @profile
+  1017                                               def get_route_table(self, router_id):
+  1018                                                   url_params = azure_helpers.parse_url(ROUTER_RESOURCE_ID,
+  1019                                                                                        router_id)
+  1020                                                   router_name = url_params.get(ROUTER_NAME)
+  1021                                                   return self.network_management_client. \
+  1022                                                       route_tables.get(self.resource_group, router_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_route_table at line 1024
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1024                                               @profile
+  1025                                               def create_route_table(self, route_table_name, params):
+  1026                                                   return self.network_management_client. \
+  1027                                                       route_tables.create_or_update(
+  1028                                                        self.resource_group,
+  1029                                                        route_table_name, params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_route_table_tags at line 1031
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1031                                               @profile
+  1032                                               def update_route_table_tags(self, route_table_name, tags):
+  1033                                                   self.network_management_client.route_tables. \
+  1034                                                       create_or_update(self.resource_group,
+  1035                                                                        route_table_name, tags).result()
+

+ 1470 - 0
results/cloud_factory.res

@@ -0,0 +1,1470 @@
+cloudbridge.test.test_cloud_factory.CloudFactoryTestCase
+
+
+Test output
+ .........
+----------------------------------------------------------------------
+Ran 9 tests in 2.038s
+
+OK
+
+Wrote profile results to run_single.py.lprof
+Timer unit: 1e-06 s
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: __init__ at line 160
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   160                                               @profile
+   161                                               def __init__(self, config):
+   162                                                   self._config = config
+   163                                                   self.subscription_id = str(config.get('azure_subscription_id'))
+   164                                                   self._credentials = ServicePrincipalCredentials(
+   165                                                       client_id=config.get('azure_client_id'),
+   166                                                       secret=config.get('azure_secret'),
+   167                                                       tenant=config.get('azure_tenant')
+   168                                                   )
+   169                                           
+   170                                                   self._access_token = config.get('azure_access_token')
+   171                                                   self._resource_client = None
+   172                                                   self._storage_client = None
+   173                                                   self._network_management_client = None
+   174                                                   self._subscription_client = None
+   175                                                   self._compute_client = None
+   176                                                   self._access_key_result = None
+   177                                                   self._block_blob_service = None
+   178                                                   self._table_service = None
+   179                                                   self._storage_account = None
+   180                                           
+   181                                                   log.debug("azure subscription : %s", self.subscription_id)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: access_key_result at line 183
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   183                                               @property
+   184                                               @tenacity.retry(stop=tenacity.stop_after_attempt(5), reraise=True)
+   185                                               @profile
+   186                                               def access_key_result(self):
+   187                                                   if not self._access_key_result:
+   188                                                       storage_account = self.storage_account
+   189                                           
+   190                                                       if self.get_storage_account(storage_account).\
+   191                                                               provisioning_state.value != 'Succeeded':
+   192                                                           log.debug(
+   193                                                               "Storage account %s is not in Succeeded state yet. ",
+   194                                                               storage_account)
+   195                                                           raise WaitStateException(
+   196                                                               "Waited too long for storage account: {0} to "
+   197                                                               "become ready.".format(
+   198                                                                   storage_account,
+   199                                                                   self.get_storage_account(storage_account).
+   200                                                                   provisioning_state))
+   201                                           
+   202                                                       self._access_key_result = self.storage_client.storage_accounts. \
+   203                                                           list_keys(self.resource_group, storage_account)
+   204                                                   return self._access_key_result
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: resource_group at line 206
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   206                                               @property
+   207                                               @profile
+   208                                               def resource_group(self):
+   209                                                   return self._config.get('azure_resource_group')
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: storage_account at line 211
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   211                                               @property
+   212                                               @profile
+   213                                               def storage_account(self):
+   214                                                   return self._config.get('azure_storage_account')
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: region_name at line 216
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   216                                               @property
+   217                                               @profile
+   218                                               def region_name(self):
+   219                                                   return self._config.get('azure_region_name')
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: public_key_storage_table_name at line 221
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   221                                               @property
+   222                                               @profile
+   223                                               def public_key_storage_table_name(self):
+   224                                                   return self._config.get('azure_public_key_storage_table_name')
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: storage_client at line 226
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   226                                               @property
+   227                                               @profile
+   228                                               def storage_client(self):
+   229                                                   if not self._storage_client:
+   230                                                       self._storage_client = \
+   231                                                           StorageManagementClient(self._credentials,
+   232                                                                                   self.subscription_id)
+   233                                                   return self._storage_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: subscription_client at line 235
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   235                                               @property
+   236                                               @profile
+   237                                               def subscription_client(self):
+   238                                                   if not self._subscription_client:
+   239                                                       self._subscription_client = SubscriptionClient(self._credentials)
+   240                                                   return self._subscription_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: resource_client at line 242
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   242                                               @property
+   243                                               @profile
+   244                                               def resource_client(self):
+   245                                                   if not self._resource_client:
+   246                                                       self._resource_client = \
+   247                                                           ResourceManagementClient(self._credentials,
+   248                                                                                    self.subscription_id)
+   249                                                   return self._resource_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: compute_client at line 251
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   251                                               @property
+   252                                               @profile
+   253                                               def compute_client(self):
+   254                                                   if not self._compute_client:
+   255                                                       self._compute_client = \
+   256                                                           ComputeManagementClient(self._credentials,
+   257                                                                                   self.subscription_id)
+   258                                                   return self._compute_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: network_management_client at line 260
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   260                                               @property
+   261                                               @profile
+   262                                               def network_management_client(self):
+   263                                                   if not self._network_management_client:
+   264                                                       self._network_management_client = NetworkManagementClient(
+   265                                                           self._credentials, self.subscription_id)
+   266                                                   return self._network_management_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: blob_service at line 268
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   268                                               @property
+   269                                               @profile
+   270                                               def blob_service(self):
+   271                                                   self._get_or_create_storage_account()
+   272                                                   if not self._block_blob_service:
+   273                                                       if self._access_token:
+   274                                                           token_credential = TokenCredential(self._access_token)
+   275                                                           self._block_blob_service = BlockBlobService(
+   276                                                               account_name=self.storage_account,
+   277                                                               token_credential=token_credential)
+   278                                                       else:
+   279                                                           self._block_blob_service = BlockBlobService(
+   280                                                               account_name=self.storage_account,
+   281                                                               account_key=self.access_key_result.keys[0].value)
+   282                                                   return self._block_blob_service
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: table_service at line 284
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   284                                               @property
+   285                                               @profile
+   286                                               def table_service(self):
+   287                                                   self._get_or_create_storage_account()
+   288                                                   if not self._table_service:
+   289                                                       self._table_service = TableService(
+   290                                                           self.storage_account,
+   291                                                           self.access_key_result.keys[0].value)
+   292                                                   if not self._table_service. \
+   293                                                           exists(table_name=self.public_key_storage_table_name):
+   294                                                       self._table_service.create_table(
+   295                                                           self.public_key_storage_table_name)
+   296                                                   return self._table_service
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_resource_group at line 298
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   298                                               @profile
+   299                                               def get_resource_group(self, name):
+   300                                                   return self.resource_client.resource_groups.get(name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_resource_group at line 302
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   302                                               @profile
+   303                                               def create_resource_group(self, name, parameters):
+   304                                                   return self.resource_client.resource_groups. \
+   305                                                       create_or_update(name, parameters)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_storage_account at line 307
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   307                                               @profile
+   308                                               def get_storage_account(self, storage_account):
+   309                                                   return self.storage_client.storage_accounts. \
+   310                                                       get_properties(self.resource_group, storage_account)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_storage_account at line 312
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   312                                               @profile
+   313                                               def create_storage_account(self, name, params):
+   314                                                   return self.storage_client.storage_accounts. \
+   315                                                       create(self.resource_group, name.lower(), params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: _get_or_create_storage_account at line 319
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   319                                               @tenacity.retry(stop=tenacity.stop_after_attempt(2),
+   320                                                               retry=tenacity.retry_if_exception_type(CloudError),
+   321                                                               reraise=True)
+   322                                               @profile
+   323                                               def _get_or_create_storage_account(self):
+   324                                                   if self._storage_account:
+   325                                                       return self._storage_account
+   326                                                   else:
+   327                                                       try:
+   328                                                           self._storage_account = \
+   329                                                               self.get_storage_account(self.storage_account)
+   330                                                       except CloudError as cloud_error:
+   331                                                           if cloud_error.error.error == "ResourceNotFound":
+   332                                                               storage_account_params = {
+   333                                                                   'sku': {
+   334                                                                       'name': 'Standard_LRS'
+   335                                                                   },
+   336                                                                   'kind': 'storage',
+   337                                                                   'location': self.region_name,
+   338                                                               }
+   339                                                               try:
+   340                                                                   self._storage_account = \
+   341                                                                       self.create_storage_account(self.storage_account,
+   342                                                                                                   storage_account_params)
+   343                                                               except CloudError as cloud_error2:  # pragma: no cover
+   344                                                                   if cloud_error2.error.error == "AuthorizationFailed":
+   345                                                                       mess = 'The following error was returned by ' \
+   346                                                                              'Azure:\n%s\n\nThis is likely because the' \
+   347                                                                              ' Role associated with the provided ' \
+   348                                                                              'credentials does not allow for Storage ' \
+   349                                                                              'Account creation.\nA Storage Account is ' \
+   350                                                                              'necessary in order to perform the ' \
+   351                                                                              'desired operation. You must either ' \
+   352                                                                              'provide an existing Storage Account name' \
+   353                                                                              ' as part of the configuration, or ' \
+   354                                                                              'elevate the associated Role.\nFor more ' \
+   355                                                                              'information on roles, see: https://docs.' \
+   356                                                                              'microsoft.com/en-us/azure/role-based-' \
+   357                                                                              'access-control/overview\n' % cloud_error2
+   358                                                                       raise ProviderConnectionException(mess)
+   359                                           
+   360                                                                   elif cloud_error2.error.error == \
+   361                                                                           "StorageAccountAlreadyTaken":
+   362                                                                       mess = 'The following error was ' \
+   363                                                                              'returned by Azure:\n%s\n\n' \
+   364                                                                              'Note that Storage Account names must be ' \
+   365                                                                              'unique across Azure (not just in your ' \
+   366                                                                              'subscription).\nFor more information ' \
+   367                                                                              'see https://docs.microsoft.com/en-us/' \
+   368                                                                              'azure/azure-resource-manager/resource-' \
+   369                                                                              'manager-storage-account-name-errors\n' \
+   370                                                                              % cloud_error2
+   371                                                                       raise InvalidLabelException(mess)
+   372                                                                   else:
+   373                                                                       raise cloud_error2
+   374                                                           else:
+   375                                                               raise cloud_error
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_locations at line 377
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   377                                               @profile
+   378                                               def list_locations(self):
+   379                                                   return self.subscription_client.subscriptions. \
+   380                                                       list_locations(self.subscription_id)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm_firewall at line 382
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   382                                               @profile
+   383                                               def list_vm_firewall(self):
+   384                                                   return self.network_management_client.network_security_groups. \
+   385                                                       list(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm_firewall at line 387
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   387                                               @profile
+   388                                               def create_vm_firewall(self, name, parameters):
+   389                                                   return self.network_management_client.network_security_groups. \
+   390                                                       create_or_update(self.resource_group, name,
+   391                                                                        parameters).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm_firewall_tags at line 393
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   393                                               @profile
+   394                                               def update_vm_firewall_tags(self, fw_id, tags):
+   395                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   396                                                                                        fw_id)
+   397                                                   name = url_params.get(VM_FIREWALL_NAME)
+   398                                                   return self.network_management_client.network_security_groups. \
+   399                                                       create_or_update(self.resource_group, name,
+   400                                                                        {'tags': tags,
+   401                                                                         'location': self.region_name}).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_vm_firewall at line 403
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   403                                               @profile
+   404                                               def get_vm_firewall(self, fw_id):
+   405                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   406                                                                                        fw_id)
+   407                                                   fw_name = url_params.get(VM_FIREWALL_NAME)
+   408                                                   return self.network_management_client.network_security_groups. \
+   409                                                       get(self.resource_group, fw_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm_firewall at line 411
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   411                                               @profile
+   412                                               def delete_vm_firewall(self, fw_id):
+   413                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   414                                                                                        fw_id)
+   415                                                   name = url_params.get(VM_FIREWALL_NAME)
+   416                                                   self.network_management_client \
+   417                                                       .network_security_groups.delete(self.resource_group, name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm_firewall_rule at line 419
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   419                                               @profile
+   420                                               def create_vm_firewall_rule(self, fw_id,
+   421                                                                           rule_name, parameters):
+   422                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   423                                                                                        fw_id)
+   424                                                   vm_firewall_name = url_params.get(VM_FIREWALL_NAME)
+   425                                                   return self.network_management_client.security_rules. \
+   426                                                       create_or_update(self.resource_group, vm_firewall_name,
+   427                                                                        rule_name, parameters).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm_firewall_rule at line 429
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   429                                               @profile
+   430                                               def delete_vm_firewall_rule(self, fw_rule_id, vm_firewall):
+   431                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RULE_RESOURCE_ID,
+   432                                                                                        fw_rule_id)
+   433                                                   name = url_params.get(VM_FIREWALL_RULE_NAME)
+   434                                                   return self.network_management_client.security_rules. \
+   435                                                       delete(self.resource_group, vm_firewall, name).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_containers at line 437
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   437                                               @profile
+   438                                               def list_containers(self, prefix=None, limit=None, marker=None):
+   439                                                   results = self.blob_service.list_containers(prefix=prefix,
+   440                                                                                               num_results=limit,
+   441                                                                                               marker=marker)
+   442                                                   return (results.items, results.next_marker)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_container at line 444
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   444                                               @profile
+   445                                               def create_container(self, container_name):
+   446                                                   try:
+   447                                                       self.blob_service.create_container(container_name,
+   448                                                                                          fail_on_exist=True)
+   449                                                   except AzureConflictHttpError as cloud_error:
+   450                                                       if cloud_error.error_code == "ContainerAlreadyExists":
+   451                                                           msg = "The given Bucket name '%s' already exists. Please " \
+   452                                                                 "use the `get` or `find` method to get a reference to " \
+   453                                                                 "an existing Bucket, or specify a new Bucket name to " \
+   454                                                                 "create.\nNote that in Azure, Buckets are contained " \
+   455                                                                 "in Storage Accounts." % container_name
+   456                                                           raise DuplicateResourceException(msg)
+   457                                           
+   458                                                   return self.blob_service.get_container_properties(container_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_container at line 460
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   460                                               @profile
+   461                                               def get_container(self, container_name):
+   462                                                   return self.blob_service.get_container_properties(container_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_container at line 464
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   464                                               @profile
+   465                                               def delete_container(self, container_name):
+   466                                                   self.blob_service.delete_container(container_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_blobs at line 468
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   468                                               @profile
+   469                                               def list_blobs(self, container_name, prefix=None):
+   470                                                   return self.blob_service.list_blobs(container_name, prefix=prefix)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob at line 472
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   472                                               @profile
+   473                                               def get_blob(self, container_name, blob_name):
+   474                                                   return self.blob_service.get_blob_properties(container_name, blob_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_blob_from_text at line 476
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   476                                               @profile
+   477                                               def create_blob_from_text(self, container_name, blob_name, text):
+   478                                                   self.blob_service.create_blob_from_text(container_name,
+   479                                                                                           blob_name, text)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_blob_from_file at line 481
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   481                                               @profile
+   482                                               def create_blob_from_file(self, container_name, blob_name, file_path):
+   483                                                   self.blob_service.create_blob_from_path(container_name,
+   484                                                                                           blob_name, file_path)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_blob at line 486
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   486                                               @profile
+   487                                               def delete_blob(self, container_name, blob_name):
+   488                                                   self.blob_service.delete_blob(container_name, blob_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob_url at line 490
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   490                                               @profile
+   491                                               def get_blob_url(self, container_name, blob_name, expiry_time):
+   492                                                   expiry_date = datetime.datetime.utcnow() + datetime.timedelta(
+   493                                                       seconds=expiry_time)
+   494                                                   sas = self.blob_service.generate_blob_shared_access_signature(
+   495                                                       container_name, blob_name, permission=BlobPermissions.READ,
+   496                                                       expiry=expiry_date)
+   497                                                   return self.blob_service.make_blob_url(container_name, blob_name,
+   498                                                                                          sas_token=sas)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob_content at line 500
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   500                                               @profile
+   501                                               def get_blob_content(self, container_name, blob_name):
+   502                                                   out_stream = BytesIO()
+   503                                                   self.blob_service.get_blob_to_stream(container_name,
+   504                                                                                        blob_name, out_stream)
+   505                                                   return out_stream
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_empty_disk at line 507
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   507                                               @profile
+   508                                               def create_empty_disk(self, disk_name, params):
+   509                                                   return self.compute_client.disks.create_or_update(
+   510                                                       self.resource_group,
+   511                                                       disk_name,
+   512                                                       params
+   513                                                   ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_snapshot_disk at line 515
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   515                                               @profile
+   516                                               def create_snapshot_disk(self, disk_name, params):
+   517                                                   return self.compute_client.disks.create_or_update(
+   518                                                       self.resource_group,
+   519                                                       disk_name,
+   520                                                       params
+   521                                                   ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_disk at line 523
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   523                                               @profile
+   524                                               def get_disk(self, disk_id):
+   525                                                   url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   526                                                                                        disk_id)
+   527                                                   disk_name = url_params.get(VOLUME_NAME)
+   528                                                   return self.compute_client.disks.get(self.resource_group, disk_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_disks at line 530
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   530                                               @profile
+   531                                               def list_disks(self):
+   532                                                   return self.compute_client.disks. \
+   533                                                       list_by_resource_group(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_disk at line 535
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   535                                               @profile
+   536                                               def delete_disk(self, disk_id):
+   537                                                   url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   538                                                                                        disk_id)
+   539                                                   disk_name = url_params.get(VOLUME_NAME)
+   540                                                   self.compute_client.disks.delete(self.resource_group, disk_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_disk_tags at line 542
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   542                                               @profile
+   543                                               def update_disk_tags(self, disk_id, tags):
+   544                                                   url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   545                                                                                        disk_id)
+   546                                                   disk_name = url_params.get(VOLUME_NAME)
+   547                                                   return self.compute_client.disks.update(
+   548                                                       self.resource_group,
+   549                                                       disk_name,
+   550                                                       {'tags': tags},
+   551                                                       raw=True
+   552                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_snapshots at line 554
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   554                                               @profile
+   555                                               def list_snapshots(self):
+   556                                                   return self.compute_client.snapshots. \
+   557                                                       list_by_resource_group(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_snapshot at line 559
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   559                                               @profile
+   560                                               def get_snapshot(self, snapshot_id):
+   561                                                   url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   562                                                                                        snapshot_id)
+   563                                                   snapshot_name = url_params.get(SNAPSHOT_NAME)
+   564                                                   return self.compute_client.snapshots.get(self.resource_group,
+   565                                                                                            snapshot_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_snapshot at line 567
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   567                                               @profile
+   568                                               def create_snapshot(self, snapshot_name, params):
+   569                                                   return self.compute_client.snapshots.create_or_update(
+   570                                                       self.resource_group,
+   571                                                       snapshot_name,
+   572                                                       params
+   573                                                   ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_snapshot at line 575
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   575                                               @profile
+   576                                               def delete_snapshot(self, snapshot_id):
+   577                                                   url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   578                                                                                        snapshot_id)
+   579                                                   snapshot_name = url_params.get(SNAPSHOT_NAME)
+   580                                                   self.compute_client.snapshots.delete(self.resource_group,
+   581                                                                                        snapshot_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_snapshot_tags at line 583
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   583                                               @profile
+   584                                               def update_snapshot_tags(self, snapshot_id, tags):
+   585                                                   url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   586                                                                                        snapshot_id)
+   587                                                   snapshot_name = url_params.get(SNAPSHOT_NAME)
+   588                                                   return self.compute_client.snapshots.update(
+   589                                                       self.resource_group,
+   590                                                       snapshot_name,
+   591                                                       {'tags': tags},
+   592                                                       raw=True
+   593                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: is_gallery_image at line 595
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   595                                               @profile
+   596                                               def is_gallery_image(self, image_id):
+   597                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   598                                                                                        image_id)
+   599                                                   # If it is a gallery image, it will always have an offer
+   600                                                   return 'offer' in url_params
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_image at line 602
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   602                                               @profile
+   603                                               def create_image(self, name, params):
+   604                                                   return self.compute_client.images. \
+   605                                                       create_or_update(self.resource_group, name,
+   606                                                                        params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_image at line 608
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   608                                               @profile
+   609                                               def delete_image(self, image_id):
+   610                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   611                                                                                        image_id)
+   612                                                   if not self.is_gallery_image(image_id):
+   613                                                       name = url_params.get(IMAGE_NAME)
+   614                                                       self.compute_client.images.delete(self.resource_group, name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_images at line 616
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   616                                               @profile
+   617                                               def list_images(self):
+   618                                                   azure_images = list(self.compute_client.images.
+   619                                                                       list_by_resource_group(self.resource_group))
+   620                                                   return azure_images
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_gallery_refs at line 622
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   622                                               @profile
+   623                                               def list_gallery_refs(self):
+   624                                                   return gallery_image_references
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_image at line 626
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   626                                               @profile
+   627                                               def get_image(self, image_id):
+   628                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   629                                                                                        image_id)
+   630                                                   if self.is_gallery_image(image_id):
+   631                                                       return GalleryImageReference(publisher=url_params['publisher'],
+   632                                                                                    offer=url_params['offer'],
+   633                                                                                    sku=url_params['sku'],
+   634                                                                                    version=url_params['version'])
+   635                                                   else:
+   636                                                       name = url_params.get(IMAGE_NAME)
+   637                                                       return self.compute_client.images.get(self.resource_group, name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_image_tags at line 639
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   639                                               @profile
+   640                                               def update_image_tags(self, image_id, tags):
+   641                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   642                                                                                        image_id)
+   643                                                   if self.is_gallery_image(image_id):
+   644                                                       return True
+   645                                                   else:
+   646                                                       name = url_params.get(IMAGE_NAME)
+   647                                                       return self.compute_client.images. \
+   648                                                           create_or_update(self.resource_group, name,
+   649                                                                            {
+   650                                                                                'tags': tags,
+   651                                                                                'location': self.region_name
+   652                                                                            }).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm_types at line 654
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   654                                               @profile
+   655                                               def list_vm_types(self):
+   656                                                   return self.compute_client.virtual_machine_sizes. \
+   657                                                       list(self.region_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_networks at line 659
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   659                                               @profile
+   660                                               def list_networks(self):
+   661                                                   return self.network_management_client.virtual_networks.list(
+   662                                                       self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_network at line 664
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   664                                               @profile
+   665                                               def get_network(self, network_id):
+   666                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID,
+   667                                                                                        network_id)
+   668                                                   network_name = url_params.get(NETWORK_NAME)
+   669                                                   return self.network_management_client.virtual_networks.get(
+   670                                                       self.resource_group, network_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_network at line 672
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   672                                               @profile
+   673                                               def create_network(self, name, params):
+   674                                                   return self.network_management_client.virtual_networks. \
+   675                                                       create_or_update(self.resource_group,
+   676                                                                        name,
+   677                                                                        parameters=params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_network at line 679
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   679                                               @profile
+   680                                               def delete_network(self, network_id):
+   681                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   682                                                   network_name = url_params.get(NETWORK_NAME)
+   683                                                   return self.network_management_client.virtual_networks. \
+   684                                                       delete(self.resource_group, network_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_network_tags at line 686
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   686                                               @profile
+   687                                               def update_network_tags(self, network_id, tags):
+   688                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   689                                                   network_name = url_params.get(NETWORK_NAME)
+   690                                                   return self.network_management_client.virtual_networks. \
+   691                                                       create_or_update(self.resource_group,
+   692                                                                        network_name, tags).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_network_id_for_subnet at line 694
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   694                                               @profile
+   695                                               def get_network_id_for_subnet(self, subnet_id):
+   696                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID, subnet_id)
+   697                                                   network_id = NETWORK_RESOURCE_ID[0]
+   698                                                   for key, val in url_params.items():
+   699                                                       network_id = network_id.replace("{" + key + "}", val)
+   700                                                   return network_id
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_subnets at line 702
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   702                                               @profile
+   703                                               def list_subnets(self, network_id):
+   704                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   705                                                   network_name = url_params.get(NETWORK_NAME)
+   706                                                   return self.network_management_client.subnets. \
+   707                                                       list(self.resource_group, network_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_subnet at line 709
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   709                                               @profile
+   710                                               def get_subnet(self, subnet_id):
+   711                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   712                                                                                        subnet_id)
+   713                                                   network_name = url_params.get(NETWORK_NAME)
+   714                                                   subnet_name = url_params.get(SUBNET_NAME)
+   715                                                   return self.network_management_client.subnets. \
+   716                                                       get(self.resource_group, network_name, subnet_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_subnet at line 718
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   718                                               @profile
+   719                                               def create_subnet(self, network_id, subnet_name, params):
+   720                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   721                                                   network_name = url_params.get(NETWORK_NAME)
+   722                                                   result_create = self.network_management_client \
+   723                                                       .subnets.create_or_update(
+   724                                                           self.resource_group,
+   725                                                           network_name,
+   726                                                           subnet_name,
+   727                                                           params
+   728                                                       )
+   729                                                   subnet_info = result_create.result()
+   730                                           
+   731                                                   return subnet_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: __if_subnet_in_use at line 733
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   733                                               @profile
+   734                                               def __if_subnet_in_use(e):
+   735                                                   # return True if the CloudError exception is due to subnet being in use
+   736                                                   if isinstance(e, CloudError):
+   737                                                       if e.error.error == "InUseSubnetCannotBeDeleted":
+   738                                                           return True
+   739                                                   return False
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_subnet at line 741
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   741                                               @tenacity.retry(stop=tenacity.stop_after_attempt(5),
+   742                                                               retry=tenacity.retry_if_exception(__if_subnet_in_use),
+   743                                                               wait=tenacity.wait_fixed(5),
+   744                                                               reraise=True)
+   745                                               @profile
+   746                                               def delete_subnet(self, subnet_id):
+   747                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   748                                                                                        subnet_id)
+   749                                                   network_name = url_params.get(NETWORK_NAME)
+   750                                                   subnet_name = url_params.get(SUBNET_NAME)
+   751                                           
+   752                                                   try:
+   753                                                       result_delete = self.network_management_client \
+   754                                                           .subnets.delete(
+   755                                                               self.resource_group,
+   756                                                               network_name,
+   757                                                               subnet_name
+   758                                                           )
+   759                                                       result_delete.wait()
+   760                                                   except CloudError as cloud_error:
+   761                                                       log.exception(cloud_error.message)
+   762                                                       raise cloud_error
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_floating_ip at line 764
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   764                                               @profile
+   765                                               def create_floating_ip(self, public_ip_name, public_ip_parameters):
+   766                                                   return self.network_management_client.public_ip_addresses. \
+   767                                                       create_or_update(self.resource_group,
+   768                                                                        public_ip_name,
+   769                                                                        public_ip_parameters).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_floating_ip at line 771
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   771                                               @profile
+   772                                               def get_floating_ip(self, public_ip_id):
+   773                                                   url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   774                                                                                        public_ip_id)
+   775                                                   public_ip_name = url_params.get(PUBLIC_IP_NAME)
+   776                                                   return self.network_management_client. \
+   777                                                       public_ip_addresses.get(self.resource_group, public_ip_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_floating_ip at line 779
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   779                                               @profile
+   780                                               def delete_floating_ip(self, public_ip_id):
+   781                                                   url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   782                                                                                        public_ip_id)
+   783                                                   public_ip_name = url_params.get(PUBLIC_IP_NAME)
+   784                                                   self.network_management_client. \
+   785                                                       public_ip_addresses.delete(self.resource_group,
+   786                                                                                  public_ip_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_fip_tags at line 788
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   788                                               @profile
+   789                                               def update_fip_tags(self, fip_id, tags):
+   790                                                   url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   791                                                                                        fip_id)
+   792                                                   fip_name = url_params.get(PUBLIC_IP_NAME)
+   793                                                   self.network_management_client.public_ip_addresses. \
+   794                                                       create_or_update(self.resource_group,
+   795                                                                        fip_name, tags).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_floating_ips at line 797
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   797                                               @profile
+   798                                               def list_floating_ips(self):
+   799                                                   return self.network_management_client.public_ip_addresses.list(
+   800                                                       self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm at line 802
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   802                                               @profile
+   803                                               def list_vm(self):
+   804                                                   return self.compute_client.virtual_machines.list(
+   805                                                       self.resource_group
+   806                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: restart_vm at line 808
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   808                                               @profile
+   809                                               def restart_vm(self, vm_id):
+   810                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   811                                                                                        vm_id)
+   812                                                   vm_name = url_params.get(VM_NAME)
+   813                                                   return self.compute_client.virtual_machines.restart(
+   814                                                       self.resource_group, vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm at line 816
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   816                                               @profile
+   817                                               def delete_vm(self, vm_id):
+   818                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   819                                                                                        vm_id)
+   820                                                   vm_name = url_params.get(VM_NAME)
+   821                                                   return self.compute_client.virtual_machines.delete(
+   822                                                       self.resource_group, vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_vm at line 824
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   824                                               @profile
+   825                                               def get_vm(self, vm_id):
+   826                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   827                                                                                        vm_id)
+   828                                                   vm_name = url_params.get(VM_NAME)
+   829                                                   return self.compute_client.virtual_machines.get(
+   830                                                       self.resource_group,
+   831                                                       vm_name,
+   832                                                       expand='instanceView'
+   833                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm at line 835
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   835                                               @profile
+   836                                               def create_vm(self, vm_name, params):
+   837                                                   return self.compute_client.virtual_machines. \
+   838                                                       create_or_update(self.resource_group,
+   839                                                                        vm_name, params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm at line 841
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   841                                               @profile
+   842                                               def update_vm(self, vm_id, params):
+   843                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   844                                                                                        vm_id)
+   845                                                   vm_name = url_params.get(VM_NAME)
+   846                                                   return self.compute_client.virtual_machines. \
+   847                                                       create_or_update(self.resource_group,
+   848                                                                        vm_name, params, raw=True)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: deallocate_vm at line 850
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   850                                               @profile
+   851                                               def deallocate_vm(self, vm_id):
+   852                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   853                                                                                        vm_id)
+   854                                                   vm_name = url_params.get(VM_NAME)
+   855                                                   self.compute_client. \
+   856                                                       virtual_machines.deallocate(self.resource_group,
+   857                                                                                   vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: generalize_vm at line 859
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   859                                               @profile
+   860                                               def generalize_vm(self, vm_id):
+   861                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   862                                                                                        vm_id)
+   863                                                   vm_name = url_params.get(VM_NAME)
+   864                                                   self.compute_client.virtual_machines. \
+   865                                                       generalize(self.resource_group, vm_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: start_vm at line 867
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   867                                               @profile
+   868                                               def start_vm(self, vm_id):
+   869                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   870                                                                                        vm_id)
+   871                                                   vm_name = url_params.get(VM_NAME)
+   872                                                   self.compute_client.virtual_machines. \
+   873                                                       start(self.resource_group,
+   874                                                             vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm_tags at line 876
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   876                                               @profile
+   877                                               def update_vm_tags(self, vm_id, tags):
+   878                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   879                                                                                        vm_id)
+   880                                                   vm_name = url_params.get(VM_NAME)
+   881                                                   self.compute_client.virtual_machines. \
+   882                                                       create_or_update(self.resource_group,
+   883                                                                        vm_name, tags).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_nic at line 885
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   885                                               @profile
+   886                                               def delete_nic(self, nic_id):
+   887                                                   nic_params = azure_helpers.\
+   888                                                       parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   889                                                   nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   890                                                   self.network_management_client. \
+   891                                                       network_interfaces.delete(self.resource_group,
+   892                                                                                 nic_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_nic at line 894
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   894                                               @profile
+   895                                               def get_nic(self, nic_id):
+   896                                                   nic_params = azure_helpers.\
+   897                                                       parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   898                                                   nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   899                                                   return self.network_management_client. \
+   900                                                       network_interfaces.get(self.resource_group, nic_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_nic at line 902
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   902                                               @profile
+   903                                               def update_nic(self, nic_id, params):
+   904                                                   nic_params = azure_helpers.\
+   905                                                       parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   906                                                   nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   907                                                   async_nic_creation = self.network_management_client. \
+   908                                                       network_interfaces.create_or_update(
+   909                                                           self.resource_group,
+   910                                                           nic_name,
+   911                                                           params
+   912                                                       )
+   913                                                   nic_info = async_nic_creation.result()
+   914                                                   return nic_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_nic at line 916
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   916                                               @profile
+   917                                               def create_nic(self, nic_name, params):
+   918                                                   return self.network_management_client. \
+   919                                                       network_interfaces.create_or_update(
+   920                                                           self.resource_group,
+   921                                                           nic_name,
+   922                                                           params
+   923                                                       ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_public_key at line 925
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   925                                               @profile
+   926                                               def create_public_key(self, entity):
+   927                                                   return self.table_service. \
+   928                                                       insert_or_replace_entity(self.public_key_storage_table_name,
+   929                                                                                entity)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_public_key at line 931
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   931                                               @profile
+   932                                               def get_public_key(self, name):
+   933                                                   entities = self.table_service. \
+   934                                                       query_entities(self.public_key_storage_table_name,
+   935                                                                      "Name eq '{0}'".format(name), num_results=1)
+   936                                           
+   937                                                   return entities.items[0] if len(entities.items) > 0 else None
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_public_key at line 939
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   939                                               @profile
+   940                                               def delete_public_key(self, entity):
+   941                                                   self.table_service.delete_entity(self.public_key_storage_table_name,
+   942                                                                                    entity.PartitionKey, entity.RowKey)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_public_keys at line 944
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   944                                               @profile
+   945                                               def list_public_keys(self, partition_key, limit=None, marker=None):
+   946                                                   entities = self.table_service. \
+   947                                                       query_entities(self.public_key_storage_table_name,
+   948                                                                      "PartitionKey eq '{0}'".format(partition_key),
+   949                                                                      marker=marker, num_results=limit)
+   950                                                   return (entities.items, entities.next_marker)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_route_table at line 952
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   952                                               @profile
+   953                                               def delete_route_table(self, route_table_name):
+   954                                                   self.network_management_client. \
+   955                                                       route_tables.delete(self.resource_group, route_table_name
+   956                                                                           ).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: attach_subnet_to_route_table at line 958
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   958                                               @profile
+   959                                               def attach_subnet_to_route_table(self, subnet_id, route_table_id):
+   960                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   961                                                                                        subnet_id)
+   962                                                   network_name = url_params.get(NETWORK_NAME)
+   963                                                   subnet_name = url_params.get(SUBNET_NAME)
+   964                                           
+   965                                                   subnet_info = self.network_management_client.subnets.get(
+   966                                                       self.resource_group,
+   967                                                       network_name,
+   968                                                       subnet_name
+   969                                                   )
+   970                                                   if subnet_info:
+   971                                                       subnet_info.route_table = {
+   972                                                           'id': route_table_id
+   973                                                       }
+   974                                           
+   975                                                       result_create = self.network_management_client. \
+   976                                                           subnets.create_or_update(
+   977                                                            self.resource_group,
+   978                                                            network_name,
+   979                                                            subnet_name,
+   980                                                            subnet_info)
+   981                                                       subnet_info = result_create.result()
+   982                                           
+   983                                                   return subnet_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: detach_subnet_to_route_table at line 985
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   985                                               @profile
+   986                                               def detach_subnet_to_route_table(self, subnet_id, route_table_id):
+   987                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   988                                                                                        subnet_id)
+   989                                                   network_name = url_params.get(NETWORK_NAME)
+   990                                                   subnet_name = url_params.get(SUBNET_NAME)
+   991                                           
+   992                                                   subnet_info = self.network_management_client.subnets.get(
+   993                                                       self.resource_group,
+   994                                                       network_name,
+   995                                                       subnet_name
+   996                                                   )
+   997                                           
+   998                                                   if subnet_info and subnet_info.route_table.id == route_table_id:
+   999                                                       subnet_info.route_table = None
+  1000                                           
+  1001                                                       result_create = self.network_management_client. \
+  1002                                                           subnets.create_or_update(
+  1003                                                            self.resource_group,
+  1004                                                            network_name,
+  1005                                                            subnet_name,
+  1006                                                            subnet_info)
+  1007                                                       subnet_info = result_create.result()
+  1008                                           
+  1009                                                   return subnet_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_route_tables at line 1011
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1011                                               @profile
+  1012                                               def list_route_tables(self):
+  1013                                                   return self.network_management_client. \
+  1014                                                       route_tables.list(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_route_table at line 1016
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1016                                               @profile
+  1017                                               def get_route_table(self, router_id):
+  1018                                                   url_params = azure_helpers.parse_url(ROUTER_RESOURCE_ID,
+  1019                                                                                        router_id)
+  1020                                                   router_name = url_params.get(ROUTER_NAME)
+  1021                                                   return self.network_management_client. \
+  1022                                                       route_tables.get(self.resource_group, router_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_route_table at line 1024
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1024                                               @profile
+  1025                                               def create_route_table(self, route_table_name, params):
+  1026                                                   return self.network_management_client. \
+  1027                                                       route_tables.create_or_update(
+  1028                                                        self.resource_group,
+  1029                                                        route_table_name, params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_route_table_tags at line 1031
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1031                                               @profile
+  1032                                               def update_route_table_tags(self, route_table_name, tags):
+  1033                                                   self.network_management_client.route_tables. \
+  1034                                                       create_or_update(self.resource_group,
+  1035                                                                        route_table_name, tags).result()
+

+ 1478 - 0
results/cloud_helpers.res

@@ -0,0 +1,1478 @@
+cloudbridge.test.test_cloud_helpers.CloudHelpersTestCase
+
+
+Test output
+ ..F
+======================================================================
+FAIL: test_type_validation (cloudbridge.test.test_cloud_helpers.CloudHelpersTestCase)
+----------------------------------------------------------------------
+Traceback (most recent call last):
+  File "/Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/test/test_cloud_helpers.py", line 92, in test_type_validation
+    self.assertIsInstance(env_value, six.string_types)
+AssertionError: None is not an instance of (<class 'str'>,)
+
+----------------------------------------------------------------------
+Ran 3 tests in 1.333s
+
+FAILED (failures=1)
+
+Wrote profile results to run_single.py.lprof
+Timer unit: 1e-06 s
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: __init__ at line 160
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   160                                               @profile
+   161                                               def __init__(self, config):
+   162                                                   self._config = config
+   163                                                   self.subscription_id = str(config.get('azure_subscription_id'))
+   164                                                   self._credentials = ServicePrincipalCredentials(
+   165                                                       client_id=config.get('azure_client_id'),
+   166                                                       secret=config.get('azure_secret'),
+   167                                                       tenant=config.get('azure_tenant')
+   168                                                   )
+   169                                           
+   170                                                   self._access_token = config.get('azure_access_token')
+   171                                                   self._resource_client = None
+   172                                                   self._storage_client = None
+   173                                                   self._network_management_client = None
+   174                                                   self._subscription_client = None
+   175                                                   self._compute_client = None
+   176                                                   self._access_key_result = None
+   177                                                   self._block_blob_service = None
+   178                                                   self._table_service = None
+   179                                                   self._storage_account = None
+   180                                           
+   181                                                   log.debug("azure subscription : %s", self.subscription_id)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: access_key_result at line 183
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   183                                               @property
+   184                                               @tenacity.retry(stop=tenacity.stop_after_attempt(5), reraise=True)
+   185                                               @profile
+   186                                               def access_key_result(self):
+   187                                                   if not self._access_key_result:
+   188                                                       storage_account = self.storage_account
+   189                                           
+   190                                                       if self.get_storage_account(storage_account).\
+   191                                                               provisioning_state.value != 'Succeeded':
+   192                                                           log.debug(
+   193                                                               "Storage account %s is not in Succeeded state yet. ",
+   194                                                               storage_account)
+   195                                                           raise WaitStateException(
+   196                                                               "Waited too long for storage account: {0} to "
+   197                                                               "become ready.".format(
+   198                                                                   storage_account,
+   199                                                                   self.get_storage_account(storage_account).
+   200                                                                   provisioning_state))
+   201                                           
+   202                                                       self._access_key_result = self.storage_client.storage_accounts. \
+   203                                                           list_keys(self.resource_group, storage_account)
+   204                                                   return self._access_key_result
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: resource_group at line 206
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   206                                               @property
+   207                                               @profile
+   208                                               def resource_group(self):
+   209                                                   return self._config.get('azure_resource_group')
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: storage_account at line 211
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   211                                               @property
+   212                                               @profile
+   213                                               def storage_account(self):
+   214                                                   return self._config.get('azure_storage_account')
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: region_name at line 216
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   216                                               @property
+   217                                               @profile
+   218                                               def region_name(self):
+   219                                                   return self._config.get('azure_region_name')
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: public_key_storage_table_name at line 221
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   221                                               @property
+   222                                               @profile
+   223                                               def public_key_storage_table_name(self):
+   224                                                   return self._config.get('azure_public_key_storage_table_name')
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: storage_client at line 226
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   226                                               @property
+   227                                               @profile
+   228                                               def storage_client(self):
+   229                                                   if not self._storage_client:
+   230                                                       self._storage_client = \
+   231                                                           StorageManagementClient(self._credentials,
+   232                                                                                   self.subscription_id)
+   233                                                   return self._storage_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: subscription_client at line 235
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   235                                               @property
+   236                                               @profile
+   237                                               def subscription_client(self):
+   238                                                   if not self._subscription_client:
+   239                                                       self._subscription_client = SubscriptionClient(self._credentials)
+   240                                                   return self._subscription_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: resource_client at line 242
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   242                                               @property
+   243                                               @profile
+   244                                               def resource_client(self):
+   245                                                   if not self._resource_client:
+   246                                                       self._resource_client = \
+   247                                                           ResourceManagementClient(self._credentials,
+   248                                                                                    self.subscription_id)
+   249                                                   return self._resource_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: compute_client at line 251
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   251                                               @property
+   252                                               @profile
+   253                                               def compute_client(self):
+   254                                                   if not self._compute_client:
+   255                                                       self._compute_client = \
+   256                                                           ComputeManagementClient(self._credentials,
+   257                                                                                   self.subscription_id)
+   258                                                   return self._compute_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: network_management_client at line 260
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   260                                               @property
+   261                                               @profile
+   262                                               def network_management_client(self):
+   263                                                   if not self._network_management_client:
+   264                                                       self._network_management_client = NetworkManagementClient(
+   265                                                           self._credentials, self.subscription_id)
+   266                                                   return self._network_management_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: blob_service at line 268
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   268                                               @property
+   269                                               @profile
+   270                                               def blob_service(self):
+   271                                                   self._get_or_create_storage_account()
+   272                                                   if not self._block_blob_service:
+   273                                                       if self._access_token:
+   274                                                           token_credential = TokenCredential(self._access_token)
+   275                                                           self._block_blob_service = BlockBlobService(
+   276                                                               account_name=self.storage_account,
+   277                                                               token_credential=token_credential)
+   278                                                       else:
+   279                                                           self._block_blob_service = BlockBlobService(
+   280                                                               account_name=self.storage_account,
+   281                                                               account_key=self.access_key_result.keys[0].value)
+   282                                                   return self._block_blob_service
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: table_service at line 284
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   284                                               @property
+   285                                               @profile
+   286                                               def table_service(self):
+   287                                                   self._get_or_create_storage_account()
+   288                                                   if not self._table_service:
+   289                                                       self._table_service = TableService(
+   290                                                           self.storage_account,
+   291                                                           self.access_key_result.keys[0].value)
+   292                                                   if not self._table_service. \
+   293                                                           exists(table_name=self.public_key_storage_table_name):
+   294                                                       self._table_service.create_table(
+   295                                                           self.public_key_storage_table_name)
+   296                                                   return self._table_service
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_resource_group at line 298
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   298                                               @profile
+   299                                               def get_resource_group(self, name):
+   300                                                   return self.resource_client.resource_groups.get(name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_resource_group at line 302
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   302                                               @profile
+   303                                               def create_resource_group(self, name, parameters):
+   304                                                   return self.resource_client.resource_groups. \
+   305                                                       create_or_update(name, parameters)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_storage_account at line 307
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   307                                               @profile
+   308                                               def get_storage_account(self, storage_account):
+   309                                                   return self.storage_client.storage_accounts. \
+   310                                                       get_properties(self.resource_group, storage_account)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_storage_account at line 312
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   312                                               @profile
+   313                                               def create_storage_account(self, name, params):
+   314                                                   return self.storage_client.storage_accounts. \
+   315                                                       create(self.resource_group, name.lower(), params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: _get_or_create_storage_account at line 319
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   319                                               @tenacity.retry(stop=tenacity.stop_after_attempt(2),
+   320                                                               retry=tenacity.retry_if_exception_type(CloudError),
+   321                                                               reraise=True)
+   322                                               @profile
+   323                                               def _get_or_create_storage_account(self):
+   324                                                   if self._storage_account:
+   325                                                       return self._storage_account
+   326                                                   else:
+   327                                                       try:
+   328                                                           self._storage_account = \
+   329                                                               self.get_storage_account(self.storage_account)
+   330                                                       except CloudError as cloud_error:
+   331                                                           if cloud_error.error.error == "ResourceNotFound":
+   332                                                               storage_account_params = {
+   333                                                                   'sku': {
+   334                                                                       'name': 'Standard_LRS'
+   335                                                                   },
+   336                                                                   'kind': 'storage',
+   337                                                                   'location': self.region_name,
+   338                                                               }
+   339                                                               try:
+   340                                                                   self._storage_account = \
+   341                                                                       self.create_storage_account(self.storage_account,
+   342                                                                                                   storage_account_params)
+   343                                                               except CloudError as cloud_error2:  # pragma: no cover
+   344                                                                   if cloud_error2.error.error == "AuthorizationFailed":
+   345                                                                       mess = 'The following error was returned by ' \
+   346                                                                              'Azure:\n%s\n\nThis is likely because the' \
+   347                                                                              ' Role associated with the provided ' \
+   348                                                                              'credentials does not allow for Storage ' \
+   349                                                                              'Account creation.\nA Storage Account is ' \
+   350                                                                              'necessary in order to perform the ' \
+   351                                                                              'desired operation. You must either ' \
+   352                                                                              'provide an existing Storage Account name' \
+   353                                                                              ' as part of the configuration, or ' \
+   354                                                                              'elevate the associated Role.\nFor more ' \
+   355                                                                              'information on roles, see: https://docs.' \
+   356                                                                              'microsoft.com/en-us/azure/role-based-' \
+   357                                                                              'access-control/overview\n' % cloud_error2
+   358                                                                       raise ProviderConnectionException(mess)
+   359                                           
+   360                                                                   elif cloud_error2.error.error == \
+   361                                                                           "StorageAccountAlreadyTaken":
+   362                                                                       mess = 'The following error was ' \
+   363                                                                              'returned by Azure:\n%s\n\n' \
+   364                                                                              'Note that Storage Account names must be ' \
+   365                                                                              'unique across Azure (not just in your ' \
+   366                                                                              'subscription).\nFor more information ' \
+   367                                                                              'see https://docs.microsoft.com/en-us/' \
+   368                                                                              'azure/azure-resource-manager/resource-' \
+   369                                                                              'manager-storage-account-name-errors\n' \
+   370                                                                              % cloud_error2
+   371                                                                       raise InvalidLabelException(mess)
+   372                                                                   else:
+   373                                                                       raise cloud_error2
+   374                                                           else:
+   375                                                               raise cloud_error
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_locations at line 377
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   377                                               @profile
+   378                                               def list_locations(self):
+   379                                                   return self.subscription_client.subscriptions. \
+   380                                                       list_locations(self.subscription_id)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm_firewall at line 382
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   382                                               @profile
+   383                                               def list_vm_firewall(self):
+   384                                                   return self.network_management_client.network_security_groups. \
+   385                                                       list(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm_firewall at line 387
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   387                                               @profile
+   388                                               def create_vm_firewall(self, name, parameters):
+   389                                                   return self.network_management_client.network_security_groups. \
+   390                                                       create_or_update(self.resource_group, name,
+   391                                                                        parameters).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm_firewall_tags at line 393
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   393                                               @profile
+   394                                               def update_vm_firewall_tags(self, fw_id, tags):
+   395                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   396                                                                                        fw_id)
+   397                                                   name = url_params.get(VM_FIREWALL_NAME)
+   398                                                   return self.network_management_client.network_security_groups. \
+   399                                                       create_or_update(self.resource_group, name,
+   400                                                                        {'tags': tags,
+   401                                                                         'location': self.region_name}).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_vm_firewall at line 403
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   403                                               @profile
+   404                                               def get_vm_firewall(self, fw_id):
+   405                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   406                                                                                        fw_id)
+   407                                                   fw_name = url_params.get(VM_FIREWALL_NAME)
+   408                                                   return self.network_management_client.network_security_groups. \
+   409                                                       get(self.resource_group, fw_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm_firewall at line 411
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   411                                               @profile
+   412                                               def delete_vm_firewall(self, fw_id):
+   413                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   414                                                                                        fw_id)
+   415                                                   name = url_params.get(VM_FIREWALL_NAME)
+   416                                                   self.network_management_client \
+   417                                                       .network_security_groups.delete(self.resource_group, name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm_firewall_rule at line 419
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   419                                               @profile
+   420                                               def create_vm_firewall_rule(self, fw_id,
+   421                                                                           rule_name, parameters):
+   422                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   423                                                                                        fw_id)
+   424                                                   vm_firewall_name = url_params.get(VM_FIREWALL_NAME)
+   425                                                   return self.network_management_client.security_rules. \
+   426                                                       create_or_update(self.resource_group, vm_firewall_name,
+   427                                                                        rule_name, parameters).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm_firewall_rule at line 429
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   429                                               @profile
+   430                                               def delete_vm_firewall_rule(self, fw_rule_id, vm_firewall):
+   431                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RULE_RESOURCE_ID,
+   432                                                                                        fw_rule_id)
+   433                                                   name = url_params.get(VM_FIREWALL_RULE_NAME)
+   434                                                   return self.network_management_client.security_rules. \
+   435                                                       delete(self.resource_group, vm_firewall, name).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_containers at line 437
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   437                                               @profile
+   438                                               def list_containers(self, prefix=None, limit=None, marker=None):
+   439                                                   results = self.blob_service.list_containers(prefix=prefix,
+   440                                                                                               num_results=limit,
+   441                                                                                               marker=marker)
+   442                                                   return (results.items, results.next_marker)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_container at line 444
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   444                                               @profile
+   445                                               def create_container(self, container_name):
+   446                                                   try:
+   447                                                       self.blob_service.create_container(container_name,
+   448                                                                                          fail_on_exist=True)
+   449                                                   except AzureConflictHttpError as cloud_error:
+   450                                                       if cloud_error.error_code == "ContainerAlreadyExists":
+   451                                                           msg = "The given Bucket name '%s' already exists. Please " \
+   452                                                                 "use the `get` or `find` method to get a reference to " \
+   453                                                                 "an existing Bucket, or specify a new Bucket name to " \
+   454                                                                 "create.\nNote that in Azure, Buckets are contained " \
+   455                                                                 "in Storage Accounts." % container_name
+   456                                                           raise DuplicateResourceException(msg)
+   457                                           
+   458                                                   return self.blob_service.get_container_properties(container_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_container at line 460
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   460                                               @profile
+   461                                               def get_container(self, container_name):
+   462                                                   return self.blob_service.get_container_properties(container_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_container at line 464
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   464                                               @profile
+   465                                               def delete_container(self, container_name):
+   466                                                   self.blob_service.delete_container(container_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_blobs at line 468
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   468                                               @profile
+   469                                               def list_blobs(self, container_name, prefix=None):
+   470                                                   return self.blob_service.list_blobs(container_name, prefix=prefix)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob at line 472
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   472                                               @profile
+   473                                               def get_blob(self, container_name, blob_name):
+   474                                                   return self.blob_service.get_blob_properties(container_name, blob_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_blob_from_text at line 476
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   476                                               @profile
+   477                                               def create_blob_from_text(self, container_name, blob_name, text):
+   478                                                   self.blob_service.create_blob_from_text(container_name,
+   479                                                                                           blob_name, text)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_blob_from_file at line 481
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   481                                               @profile
+   482                                               def create_blob_from_file(self, container_name, blob_name, file_path):
+   483                                                   self.blob_service.create_blob_from_path(container_name,
+   484                                                                                           blob_name, file_path)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_blob at line 486
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   486                                               @profile
+   487                                               def delete_blob(self, container_name, blob_name):
+   488                                                   self.blob_service.delete_blob(container_name, blob_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob_url at line 490
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   490                                               @profile
+   491                                               def get_blob_url(self, container_name, blob_name, expiry_time):
+   492                                                   expiry_date = datetime.datetime.utcnow() + datetime.timedelta(
+   493                                                       seconds=expiry_time)
+   494                                                   sas = self.blob_service.generate_blob_shared_access_signature(
+   495                                                       container_name, blob_name, permission=BlobPermissions.READ,
+   496                                                       expiry=expiry_date)
+   497                                                   return self.blob_service.make_blob_url(container_name, blob_name,
+   498                                                                                          sas_token=sas)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob_content at line 500
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   500                                               @profile
+   501                                               def get_blob_content(self, container_name, blob_name):
+   502                                                   out_stream = BytesIO()
+   503                                                   self.blob_service.get_blob_to_stream(container_name,
+   504                                                                                        blob_name, out_stream)
+   505                                                   return out_stream
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_empty_disk at line 507
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   507                                               @profile
+   508                                               def create_empty_disk(self, disk_name, params):
+   509                                                   return self.compute_client.disks.create_or_update(
+   510                                                       self.resource_group,
+   511                                                       disk_name,
+   512                                                       params
+   513                                                   ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_snapshot_disk at line 515
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   515                                               @profile
+   516                                               def create_snapshot_disk(self, disk_name, params):
+   517                                                   return self.compute_client.disks.create_or_update(
+   518                                                       self.resource_group,
+   519                                                       disk_name,
+   520                                                       params
+   521                                                   ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_disk at line 523
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   523                                               @profile
+   524                                               def get_disk(self, disk_id):
+   525                                                   url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   526                                                                                        disk_id)
+   527                                                   disk_name = url_params.get(VOLUME_NAME)
+   528                                                   return self.compute_client.disks.get(self.resource_group, disk_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_disks at line 530
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   530                                               @profile
+   531                                               def list_disks(self):
+   532                                                   return self.compute_client.disks. \
+   533                                                       list_by_resource_group(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_disk at line 535
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   535                                               @profile
+   536                                               def delete_disk(self, disk_id):
+   537                                                   url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   538                                                                                        disk_id)
+   539                                                   disk_name = url_params.get(VOLUME_NAME)
+   540                                                   self.compute_client.disks.delete(self.resource_group, disk_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_disk_tags at line 542
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   542                                               @profile
+   543                                               def update_disk_tags(self, disk_id, tags):
+   544                                                   url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   545                                                                                        disk_id)
+   546                                                   disk_name = url_params.get(VOLUME_NAME)
+   547                                                   return self.compute_client.disks.update(
+   548                                                       self.resource_group,
+   549                                                       disk_name,
+   550                                                       {'tags': tags},
+   551                                                       raw=True
+   552                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_snapshots at line 554
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   554                                               @profile
+   555                                               def list_snapshots(self):
+   556                                                   return self.compute_client.snapshots. \
+   557                                                       list_by_resource_group(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_snapshot at line 559
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   559                                               @profile
+   560                                               def get_snapshot(self, snapshot_id):
+   561                                                   url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   562                                                                                        snapshot_id)
+   563                                                   snapshot_name = url_params.get(SNAPSHOT_NAME)
+   564                                                   return self.compute_client.snapshots.get(self.resource_group,
+   565                                                                                            snapshot_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_snapshot at line 567
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   567                                               @profile
+   568                                               def create_snapshot(self, snapshot_name, params):
+   569                                                   return self.compute_client.snapshots.create_or_update(
+   570                                                       self.resource_group,
+   571                                                       snapshot_name,
+   572                                                       params
+   573                                                   ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_snapshot at line 575
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   575                                               @profile
+   576                                               def delete_snapshot(self, snapshot_id):
+   577                                                   url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   578                                                                                        snapshot_id)
+   579                                                   snapshot_name = url_params.get(SNAPSHOT_NAME)
+   580                                                   self.compute_client.snapshots.delete(self.resource_group,
+   581                                                                                        snapshot_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_snapshot_tags at line 583
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   583                                               @profile
+   584                                               def update_snapshot_tags(self, snapshot_id, tags):
+   585                                                   url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   586                                                                                        snapshot_id)
+   587                                                   snapshot_name = url_params.get(SNAPSHOT_NAME)
+   588                                                   return self.compute_client.snapshots.update(
+   589                                                       self.resource_group,
+   590                                                       snapshot_name,
+   591                                                       {'tags': tags},
+   592                                                       raw=True
+   593                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: is_gallery_image at line 595
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   595                                               @profile
+   596                                               def is_gallery_image(self, image_id):
+   597                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   598                                                                                        image_id)
+   599                                                   # If it is a gallery image, it will always have an offer
+   600                                                   return 'offer' in url_params
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_image at line 602
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   602                                               @profile
+   603                                               def create_image(self, name, params):
+   604                                                   return self.compute_client.images. \
+   605                                                       create_or_update(self.resource_group, name,
+   606                                                                        params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_image at line 608
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   608                                               @profile
+   609                                               def delete_image(self, image_id):
+   610                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   611                                                                                        image_id)
+   612                                                   if not self.is_gallery_image(image_id):
+   613                                                       name = url_params.get(IMAGE_NAME)
+   614                                                       self.compute_client.images.delete(self.resource_group, name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_images at line 616
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   616                                               @profile
+   617                                               def list_images(self):
+   618                                                   azure_images = list(self.compute_client.images.
+   619                                                                       list_by_resource_group(self.resource_group))
+   620                                                   return azure_images
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_gallery_refs at line 622
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   622                                               @profile
+   623                                               def list_gallery_refs(self):
+   624                                                   return gallery_image_references
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_image at line 626
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   626                                               @profile
+   627                                               def get_image(self, image_id):
+   628                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   629                                                                                        image_id)
+   630                                                   if self.is_gallery_image(image_id):
+   631                                                       return GalleryImageReference(publisher=url_params['publisher'],
+   632                                                                                    offer=url_params['offer'],
+   633                                                                                    sku=url_params['sku'],
+   634                                                                                    version=url_params['version'])
+   635                                                   else:
+   636                                                       name = url_params.get(IMAGE_NAME)
+   637                                                       return self.compute_client.images.get(self.resource_group, name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_image_tags at line 639
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   639                                               @profile
+   640                                               def update_image_tags(self, image_id, tags):
+   641                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   642                                                                                        image_id)
+   643                                                   if self.is_gallery_image(image_id):
+   644                                                       return True
+   645                                                   else:
+   646                                                       name = url_params.get(IMAGE_NAME)
+   647                                                       return self.compute_client.images. \
+   648                                                           create_or_update(self.resource_group, name,
+   649                                                                            {
+   650                                                                                'tags': tags,
+   651                                                                                'location': self.region_name
+   652                                                                            }).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm_types at line 654
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   654                                               @profile
+   655                                               def list_vm_types(self):
+   656                                                   return self.compute_client.virtual_machine_sizes. \
+   657                                                       list(self.region_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_networks at line 659
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   659                                               @profile
+   660                                               def list_networks(self):
+   661                                                   return self.network_management_client.virtual_networks.list(
+   662                                                       self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_network at line 664
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   664                                               @profile
+   665                                               def get_network(self, network_id):
+   666                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID,
+   667                                                                                        network_id)
+   668                                                   network_name = url_params.get(NETWORK_NAME)
+   669                                                   return self.network_management_client.virtual_networks.get(
+   670                                                       self.resource_group, network_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_network at line 672
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   672                                               @profile
+   673                                               def create_network(self, name, params):
+   674                                                   return self.network_management_client.virtual_networks. \
+   675                                                       create_or_update(self.resource_group,
+   676                                                                        name,
+   677                                                                        parameters=params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_network at line 679
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   679                                               @profile
+   680                                               def delete_network(self, network_id):
+   681                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   682                                                   network_name = url_params.get(NETWORK_NAME)
+   683                                                   return self.network_management_client.virtual_networks. \
+   684                                                       delete(self.resource_group, network_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_network_tags at line 686
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   686                                               @profile
+   687                                               def update_network_tags(self, network_id, tags):
+   688                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   689                                                   network_name = url_params.get(NETWORK_NAME)
+   690                                                   return self.network_management_client.virtual_networks. \
+   691                                                       create_or_update(self.resource_group,
+   692                                                                        network_name, tags).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_network_id_for_subnet at line 694
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   694                                               @profile
+   695                                               def get_network_id_for_subnet(self, subnet_id):
+   696                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID, subnet_id)
+   697                                                   network_id = NETWORK_RESOURCE_ID[0]
+   698                                                   for key, val in url_params.items():
+   699                                                       network_id = network_id.replace("{" + key + "}", val)
+   700                                                   return network_id
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_subnets at line 702
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   702                                               @profile
+   703                                               def list_subnets(self, network_id):
+   704                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   705                                                   network_name = url_params.get(NETWORK_NAME)
+   706                                                   return self.network_management_client.subnets. \
+   707                                                       list(self.resource_group, network_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_subnet at line 709
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   709                                               @profile
+   710                                               def get_subnet(self, subnet_id):
+   711                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   712                                                                                        subnet_id)
+   713                                                   network_name = url_params.get(NETWORK_NAME)
+   714                                                   subnet_name = url_params.get(SUBNET_NAME)
+   715                                                   return self.network_management_client.subnets. \
+   716                                                       get(self.resource_group, network_name, subnet_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_subnet at line 718
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   718                                               @profile
+   719                                               def create_subnet(self, network_id, subnet_name, params):
+   720                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   721                                                   network_name = url_params.get(NETWORK_NAME)
+   722                                                   result_create = self.network_management_client \
+   723                                                       .subnets.create_or_update(
+   724                                                           self.resource_group,
+   725                                                           network_name,
+   726                                                           subnet_name,
+   727                                                           params
+   728                                                       )
+   729                                                   subnet_info = result_create.result()
+   730                                           
+   731                                                   return subnet_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: __if_subnet_in_use at line 733
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   733                                               @profile
+   734                                               def __if_subnet_in_use(e):
+   735                                                   # return True if the CloudError exception is due to subnet being in use
+   736                                                   if isinstance(e, CloudError):
+   737                                                       if e.error.error == "InUseSubnetCannotBeDeleted":
+   738                                                           return True
+   739                                                   return False
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_subnet at line 741
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   741                                               @tenacity.retry(stop=tenacity.stop_after_attempt(5),
+   742                                                               retry=tenacity.retry_if_exception(__if_subnet_in_use),
+   743                                                               wait=tenacity.wait_fixed(5),
+   744                                                               reraise=True)
+   745                                               @profile
+   746                                               def delete_subnet(self, subnet_id):
+   747                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   748                                                                                        subnet_id)
+   749                                                   network_name = url_params.get(NETWORK_NAME)
+   750                                                   subnet_name = url_params.get(SUBNET_NAME)
+   751                                           
+   752                                                   try:
+   753                                                       result_delete = self.network_management_client \
+   754                                                           .subnets.delete(
+   755                                                               self.resource_group,
+   756                                                               network_name,
+   757                                                               subnet_name
+   758                                                           )
+   759                                                       result_delete.wait()
+   760                                                   except CloudError as cloud_error:
+   761                                                       log.exception(cloud_error.message)
+   762                                                       raise cloud_error
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_floating_ip at line 764
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   764                                               @profile
+   765                                               def create_floating_ip(self, public_ip_name, public_ip_parameters):
+   766                                                   return self.network_management_client.public_ip_addresses. \
+   767                                                       create_or_update(self.resource_group,
+   768                                                                        public_ip_name,
+   769                                                                        public_ip_parameters).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_floating_ip at line 771
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   771                                               @profile
+   772                                               def get_floating_ip(self, public_ip_id):
+   773                                                   url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   774                                                                                        public_ip_id)
+   775                                                   public_ip_name = url_params.get(PUBLIC_IP_NAME)
+   776                                                   return self.network_management_client. \
+   777                                                       public_ip_addresses.get(self.resource_group, public_ip_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_floating_ip at line 779
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   779                                               @profile
+   780                                               def delete_floating_ip(self, public_ip_id):
+   781                                                   url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   782                                                                                        public_ip_id)
+   783                                                   public_ip_name = url_params.get(PUBLIC_IP_NAME)
+   784                                                   self.network_management_client. \
+   785                                                       public_ip_addresses.delete(self.resource_group,
+   786                                                                                  public_ip_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_fip_tags at line 788
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   788                                               @profile
+   789                                               def update_fip_tags(self, fip_id, tags):
+   790                                                   url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   791                                                                                        fip_id)
+   792                                                   fip_name = url_params.get(PUBLIC_IP_NAME)
+   793                                                   self.network_management_client.public_ip_addresses. \
+   794                                                       create_or_update(self.resource_group,
+   795                                                                        fip_name, tags).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_floating_ips at line 797
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   797                                               @profile
+   798                                               def list_floating_ips(self):
+   799                                                   return self.network_management_client.public_ip_addresses.list(
+   800                                                       self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm at line 802
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   802                                               @profile
+   803                                               def list_vm(self):
+   804                                                   return self.compute_client.virtual_machines.list(
+   805                                                       self.resource_group
+   806                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: restart_vm at line 808
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   808                                               @profile
+   809                                               def restart_vm(self, vm_id):
+   810                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   811                                                                                        vm_id)
+   812                                                   vm_name = url_params.get(VM_NAME)
+   813                                                   return self.compute_client.virtual_machines.restart(
+   814                                                       self.resource_group, vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm at line 816
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   816                                               @profile
+   817                                               def delete_vm(self, vm_id):
+   818                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   819                                                                                        vm_id)
+   820                                                   vm_name = url_params.get(VM_NAME)
+   821                                                   return self.compute_client.virtual_machines.delete(
+   822                                                       self.resource_group, vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_vm at line 824
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   824                                               @profile
+   825                                               def get_vm(self, vm_id):
+   826                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   827                                                                                        vm_id)
+   828                                                   vm_name = url_params.get(VM_NAME)
+   829                                                   return self.compute_client.virtual_machines.get(
+   830                                                       self.resource_group,
+   831                                                       vm_name,
+   832                                                       expand='instanceView'
+   833                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm at line 835
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   835                                               @profile
+   836                                               def create_vm(self, vm_name, params):
+   837                                                   return self.compute_client.virtual_machines. \
+   838                                                       create_or_update(self.resource_group,
+   839                                                                        vm_name, params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm at line 841
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   841                                               @profile
+   842                                               def update_vm(self, vm_id, params):
+   843                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   844                                                                                        vm_id)
+   845                                                   vm_name = url_params.get(VM_NAME)
+   846                                                   return self.compute_client.virtual_machines. \
+   847                                                       create_or_update(self.resource_group,
+   848                                                                        vm_name, params, raw=True)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: deallocate_vm at line 850
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   850                                               @profile
+   851                                               def deallocate_vm(self, vm_id):
+   852                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   853                                                                                        vm_id)
+   854                                                   vm_name = url_params.get(VM_NAME)
+   855                                                   self.compute_client. \
+   856                                                       virtual_machines.deallocate(self.resource_group,
+   857                                                                                   vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: generalize_vm at line 859
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   859                                               @profile
+   860                                               def generalize_vm(self, vm_id):
+   861                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   862                                                                                        vm_id)
+   863                                                   vm_name = url_params.get(VM_NAME)
+   864                                                   self.compute_client.virtual_machines. \
+   865                                                       generalize(self.resource_group, vm_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: start_vm at line 867
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   867                                               @profile
+   868                                               def start_vm(self, vm_id):
+   869                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   870                                                                                        vm_id)
+   871                                                   vm_name = url_params.get(VM_NAME)
+   872                                                   self.compute_client.virtual_machines. \
+   873                                                       start(self.resource_group,
+   874                                                             vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm_tags at line 876
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   876                                               @profile
+   877                                               def update_vm_tags(self, vm_id, tags):
+   878                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   879                                                                                        vm_id)
+   880                                                   vm_name = url_params.get(VM_NAME)
+   881                                                   self.compute_client.virtual_machines. \
+   882                                                       create_or_update(self.resource_group,
+   883                                                                        vm_name, tags).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_nic at line 885
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   885                                               @profile
+   886                                               def delete_nic(self, nic_id):
+   887                                                   nic_params = azure_helpers.\
+   888                                                       parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   889                                                   nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   890                                                   self.network_management_client. \
+   891                                                       network_interfaces.delete(self.resource_group,
+   892                                                                                 nic_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_nic at line 894
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   894                                               @profile
+   895                                               def get_nic(self, nic_id):
+   896                                                   nic_params = azure_helpers.\
+   897                                                       parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   898                                                   nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   899                                                   return self.network_management_client. \
+   900                                                       network_interfaces.get(self.resource_group, nic_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_nic at line 902
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   902                                               @profile
+   903                                               def update_nic(self, nic_id, params):
+   904                                                   nic_params = azure_helpers.\
+   905                                                       parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   906                                                   nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   907                                                   async_nic_creation = self.network_management_client. \
+   908                                                       network_interfaces.create_or_update(
+   909                                                           self.resource_group,
+   910                                                           nic_name,
+   911                                                           params
+   912                                                       )
+   913                                                   nic_info = async_nic_creation.result()
+   914                                                   return nic_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_nic at line 916
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   916                                               @profile
+   917                                               def create_nic(self, nic_name, params):
+   918                                                   return self.network_management_client. \
+   919                                                       network_interfaces.create_or_update(
+   920                                                           self.resource_group,
+   921                                                           nic_name,
+   922                                                           params
+   923                                                       ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_public_key at line 925
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   925                                               @profile
+   926                                               def create_public_key(self, entity):
+   927                                                   return self.table_service. \
+   928                                                       insert_or_replace_entity(self.public_key_storage_table_name,
+   929                                                                                entity)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_public_key at line 931
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   931                                               @profile
+   932                                               def get_public_key(self, name):
+   933                                                   entities = self.table_service. \
+   934                                                       query_entities(self.public_key_storage_table_name,
+   935                                                                      "Name eq '{0}'".format(name), num_results=1)
+   936                                           
+   937                                                   return entities.items[0] if len(entities.items) > 0 else None
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_public_key at line 939
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   939                                               @profile
+   940                                               def delete_public_key(self, entity):
+   941                                                   self.table_service.delete_entity(self.public_key_storage_table_name,
+   942                                                                                    entity.PartitionKey, entity.RowKey)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_public_keys at line 944
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   944                                               @profile
+   945                                               def list_public_keys(self, partition_key, limit=None, marker=None):
+   946                                                   entities = self.table_service. \
+   947                                                       query_entities(self.public_key_storage_table_name,
+   948                                                                      "PartitionKey eq '{0}'".format(partition_key),
+   949                                                                      marker=marker, num_results=limit)
+   950                                                   return (entities.items, entities.next_marker)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_route_table at line 952
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   952                                               @profile
+   953                                               def delete_route_table(self, route_table_name):
+   954                                                   self.network_management_client. \
+   955                                                       route_tables.delete(self.resource_group, route_table_name
+   956                                                                           ).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: attach_subnet_to_route_table at line 958
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   958                                               @profile
+   959                                               def attach_subnet_to_route_table(self, subnet_id, route_table_id):
+   960                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   961                                                                                        subnet_id)
+   962                                                   network_name = url_params.get(NETWORK_NAME)
+   963                                                   subnet_name = url_params.get(SUBNET_NAME)
+   964                                           
+   965                                                   subnet_info = self.network_management_client.subnets.get(
+   966                                                       self.resource_group,
+   967                                                       network_name,
+   968                                                       subnet_name
+   969                                                   )
+   970                                                   if subnet_info:
+   971                                                       subnet_info.route_table = {
+   972                                                           'id': route_table_id
+   973                                                       }
+   974                                           
+   975                                                       result_create = self.network_management_client. \
+   976                                                           subnets.create_or_update(
+   977                                                            self.resource_group,
+   978                                                            network_name,
+   979                                                            subnet_name,
+   980                                                            subnet_info)
+   981                                                       subnet_info = result_create.result()
+   982                                           
+   983                                                   return subnet_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: detach_subnet_to_route_table at line 985
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   985                                               @profile
+   986                                               def detach_subnet_to_route_table(self, subnet_id, route_table_id):
+   987                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   988                                                                                        subnet_id)
+   989                                                   network_name = url_params.get(NETWORK_NAME)
+   990                                                   subnet_name = url_params.get(SUBNET_NAME)
+   991                                           
+   992                                                   subnet_info = self.network_management_client.subnets.get(
+   993                                                       self.resource_group,
+   994                                                       network_name,
+   995                                                       subnet_name
+   996                                                   )
+   997                                           
+   998                                                   if subnet_info and subnet_info.route_table.id == route_table_id:
+   999                                                       subnet_info.route_table = None
+  1000                                           
+  1001                                                       result_create = self.network_management_client. \
+  1002                                                           subnets.create_or_update(
+  1003                                                            self.resource_group,
+  1004                                                            network_name,
+  1005                                                            subnet_name,
+  1006                                                            subnet_info)
+  1007                                                       subnet_info = result_create.result()
+  1008                                           
+  1009                                                   return subnet_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_route_tables at line 1011
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1011                                               @profile
+  1012                                               def list_route_tables(self):
+  1013                                                   return self.network_management_client. \
+  1014                                                       route_tables.list(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_route_table at line 1016
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1016                                               @profile
+  1017                                               def get_route_table(self, router_id):
+  1018                                                   url_params = azure_helpers.parse_url(ROUTER_RESOURCE_ID,
+  1019                                                                                        router_id)
+  1020                                                   router_name = url_params.get(ROUTER_NAME)
+  1021                                                   return self.network_management_client. \
+  1022                                                       route_tables.get(self.resource_group, router_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_route_table at line 1024
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1024                                               @profile
+  1025                                               def create_route_table(self, route_table_name, params):
+  1026                                                   return self.network_management_client. \
+  1027                                                       route_tables.create_or_update(
+  1028                                                        self.resource_group,
+  1029                                                        route_table_name, params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/profilenv/lib/python3.6/site-packages/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_route_table_tags at line 1031
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1031                                               @profile
+  1032                                               def update_route_table_tags(self, route_table_name, tags):
+  1033                                                   self.network_management_client.route_tables. \
+  1034                                                       create_or_update(self.resource_group,
+  1035                                                                        route_table_name, tags).result()
+

+ 1467 - 0
results/compute.res

@@ -0,0 +1,1467 @@
+Test output
+ .....
+----------------------------------------------------------------------
+Ran 5 tests in 2106.786s
+
+OK
+
+Wrote profile results to run_tests.py.lprof
+Timer unit: 1e-06 s
+
+Total time: 1.62089 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: __init__ at line 160
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   160                                               @profile
+   161                                               def __init__(self, config):
+   162         5         41.0      8.2      0.0          self._config = config
+   163         5         14.0      2.8      0.0          self.subscription_id = str(config.get('azure_subscription_id'))
+   164         5          3.0      0.6      0.0          self._credentials = ServicePrincipalCredentials(
+   165         5          5.0      1.0      0.0              client_id=config.get('azure_client_id'),
+   166         5          5.0      1.0      0.0              secret=config.get('azure_secret'),
+   167         5    1620737.0 324147.4    100.0              tenant=config.get('azure_tenant')
+   168                                                   )
+   169                                           
+   170         5         13.0      2.6      0.0          self._access_token = config.get('azure_access_token')
+   171         5          5.0      1.0      0.0          self._resource_client = None
+   172         5          4.0      0.8      0.0          self._storage_client = None
+   173         5          5.0      1.0      0.0          self._network_management_client = None
+   174         5          5.0      1.0      0.0          self._subscription_client = None
+   175         5          3.0      0.6      0.0          self._compute_client = None
+   176         5          4.0      0.8      0.0          self._access_key_result = None
+   177         5          5.0      1.0      0.0          self._block_blob_service = None
+   178         5          6.0      1.2      0.0          self._table_service = None
+   179         5          3.0      0.6      0.0          self._storage_account = None
+   180                                           
+   181         5         35.0      7.0      0.0          log.debug("azure subscription : %s", self.subscription_id)
+
+Total time: 1.959 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: access_key_result at line 183
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   183                                               @property
+   184                                               @tenacity.retry(stop=tenacity.stop_after_attempt(5), reraise=True)
+   185                                               @profile
+   186                                               def access_key_result(self):
+   187         4          6.0      1.5      0.0          if not self._access_key_result:
+   188         4         22.0      5.5      0.0              storage_account = self.storage_account
+   189                                           
+   190         4    1087621.0 271905.2     55.5              if self.get_storage_account(storage_account).\
+   191         4          6.0      1.5      0.0                      provisioning_state.value != 'Succeeded':
+   192                                                           log.debug(
+   193                                                               "Storage account %s is not in Succeeded state yet. ",
+   194                                                               storage_account)
+   195                                                           raise WaitStateException(
+   196                                                               "Waited too long for storage account: {0} to "
+   197                                                               "become ready.".format(
+   198                                                                   storage_account,
+   199                                                                   self.get_storage_account(storage_account).
+   200                                                                   provisioning_state))
+   201                                           
+   202         4        915.0    228.8      0.0              self._access_key_result = self.storage_client.storage_accounts. \
+   203         4     870421.0 217605.2     44.4                  list_keys(self.resource_group, storage_account)
+   204         4         10.0      2.5      0.0          return self._access_key_result
+
+Total time: 0.000332 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: resource_group at line 206
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   206                                               @property
+   207                                               @profile
+   208                                               def resource_group(self):
+   209       185        332.0      1.8    100.0          return self._config.get('azure_resource_group')
+
+Total time: 1.6e-05 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: storage_account at line 211
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   211                                               @property
+   212                                               @profile
+   213                                               def storage_account(self):
+   214        12         16.0      1.3    100.0          return self._config.get('azure_storage_account')
+
+Total time: 2e-05 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: region_name at line 216
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   216                                               @property
+   217                                               @profile
+   218                                               def region_name(self):
+   219        10         20.0      2.0    100.0          return self._config.get('azure_region_name')
+
+Total time: 5.5e-05 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: public_key_storage_table_name at line 221
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   221                                               @property
+   222                                               @profile
+   223                                               def public_key_storage_table_name(self):
+   224        32         55.0      1.7    100.0          return self._config.get('azure_public_key_storage_table_name')
+
+Total time: 0.028107 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: storage_client at line 226
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   226                                               @property
+   227                                               @profile
+   228                                               def storage_client(self):
+   229        12         15.0      1.2      0.1          if not self._storage_client:
+   230                                                       self._storage_client = \
+   231         4          7.0      1.8      0.0                  StorageManagementClient(self._credentials,
+   232         4      28078.0   7019.5     99.9                                          self.subscription_id)
+   233        12          7.0      0.6      0.0          return self._storage_client
+
+Total time: 0.027975 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: subscription_client at line 235
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   235                                               @property
+   236                                               @profile
+   237                                               def subscription_client(self):
+   238         5          7.0      1.4      0.0          if not self._subscription_client:
+   239         4      27961.0   6990.2     99.9              self._subscription_client = SubscriptionClient(self._credentials)
+   240         5          7.0      1.4      0.0          return self._subscription_client
+
+Total time: 0.053718 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: resource_client at line 242
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   242                                               @property
+   243                                               @profile
+   244                                               def resource_client(self):
+   245         5          5.0      1.0      0.0          if not self._resource_client:
+   246                                                       self._resource_client = \
+   247         5          2.0      0.4      0.0                  ResourceManagementClient(self._credentials,
+   248         5      53700.0  10740.0    100.0                                           self.subscription_id)
+   249         5         11.0      2.2      0.0          return self._resource_client
+
+Total time: 0.0351 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: compute_client at line 251
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   251                                               @property
+   252                                               @profile
+   253                                               def compute_client(self):
+   254        64         84.0      1.3      0.2          if not self._compute_client:
+   255                                                       self._compute_client = \
+   256         5          8.0      1.6      0.0                  ComputeManagementClient(self._credentials,
+   257         5      34967.0   6993.4     99.6                                          self.subscription_id)
+   258        64         41.0      0.6      0.1          return self._compute_client
+
+Total time: 0.027097 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: network_management_client at line 260
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   260                                               @property
+   261                                               @profile
+   262                                               def network_management_client(self):
+   263       115        122.0      1.1      0.5          if not self._network_management_client:
+   264         4          4.0      1.0      0.0              self._network_management_client = NetworkManagementClient(
+   265         4      26895.0   6723.8     99.3                  self._credentials, self.subscription_id)
+   266       115         76.0      0.7      0.3          return self._network_management_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: blob_service at line 268
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   268                                               @property
+   269                                               @profile
+   270                                               def blob_service(self):
+   271                                                   self._get_or_create_storage_account()
+   272                                                   if not self._block_blob_service:
+   273                                                       if self._access_token:
+   274                                                           token_credential = TokenCredential(self._access_token)
+   275                                                           self._block_blob_service = BlockBlobService(
+   276                                                               account_name=self.storage_account,
+   277                                                               token_credential=token_credential)
+   278                                                       else:
+   279                                                           self._block_blob_service = BlockBlobService(
+   280                                                               account_name=self.storage_account,
+   281                                                               account_key=self.access_key_result.keys[0].value)
+   282                                                   return self._block_blob_service
+
+Total time: 4.47112 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: table_service at line 284
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   284                                               @property
+   285                                               @profile
+   286                                               def table_service(self):
+   287        16    1016653.0  63540.8     22.7          self._get_or_create_storage_account()
+   288        16         22.0      1.4      0.0          if not self._table_service:
+   289         4          5.0      1.2      0.0              self._table_service = TableService(
+   290         4         38.0      9.5      0.0                  self.storage_account,
+   291         4    1960453.0 490113.2     43.8                  self.access_key_result.keys[0].value)
+   292        16         17.0      1.1      0.0          if not self._table_service. \
+   293        16    1493881.0  93367.6     33.4                  exists(table_name=self.public_key_storage_table_name):
+   294                                                       self._table_service.create_table(
+   295                                                           self.public_key_storage_table_name)
+   296        16         54.0      3.4      0.0          return self._table_service
+
+Total time: 1.11388 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_resource_group at line 298
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   298                                               @profile
+   299                                               def get_resource_group(self, name):
+   300         5    1113880.0 222776.0    100.0          return self.resource_client.resource_groups.get(name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_resource_group at line 302
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   302                                               @profile
+   303                                               def create_resource_group(self, name, parameters):
+   304                                                   return self.resource_client.resource_groups. \
+   305                                                       create_or_update(name, parameters)
+
+Total time: 2.10199 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_storage_account at line 307
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   307                                               @profile
+   308                                               def get_storage_account(self, storage_account):
+   309         8     108683.0  13585.4      5.2          return self.storage_client.storage_accounts. \
+   310         8    1993304.0 249163.0     94.8              get_properties(self.resource_group, storage_account)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_storage_account at line 312
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   312                                               @profile
+   313                                               def create_storage_account(self, name, params):
+   314                                                   return self.storage_client.storage_accounts. \
+   315                                                       create(self.resource_group, name.lower(), params).result()
+
+Total time: 1.01459 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: _get_or_create_storage_account at line 319
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   319                                               @tenacity.retry(stop=tenacity.stop_after_attempt(2),
+   320                                                               retry=tenacity.retry_if_exception_type(CloudError),
+   321                                                               reraise=True)
+   322                                               @profile
+   323                                               def _get_or_create_storage_account(self):
+   324        16         23.0      1.4      0.0          if self._storage_account:
+   325        12         11.0      0.9      0.0              return self._storage_account
+   326                                                   else:
+   327         4          3.0      0.8      0.0              try:
+   328                                                           self._storage_account = \
+   329         4    1014556.0 253639.0    100.0                      self.get_storage_account(self.storage_account)
+   330                                                       except CloudError as cloud_error:
+   331                                                           if cloud_error.error.error == "ResourceNotFound":
+   332                                                               storage_account_params = {
+   333                                                                   'sku': {
+   334                                                                       'name': 'Standard_LRS'
+   335                                                                   },
+   336                                                                   'kind': 'storage',
+   337                                                                   'location': self.region_name,
+   338                                                               }
+   339                                                               try:
+   340                                                                   self._storage_account = \
+   341                                                                       self.create_storage_account(self.storage_account,
+   342                                                                                                   storage_account_params)
+   343                                                               except CloudError as cloud_error2:  # pragma: no cover
+   344                                                                   if cloud_error2.error.error == "AuthorizationFailed":
+   345                                                                       mess = 'The following error was returned by ' \
+   346                                                                              'Azure:\n%s\n\nThis is likely because the' \
+   347                                                                              ' Role associated with the provided ' \
+   348                                                                              'credentials does not allow for Storage ' \
+   349                                                                              'Account creation.\nA Storage Account is ' \
+   350                                                                              'necessary in order to perform the ' \
+   351                                                                              'desired operation. You must either ' \
+   352                                                                              'provide an existing Storage Account name' \
+   353                                                                              ' as part of the configuration, or ' \
+   354                                                                              'elevate the associated Role.\nFor more ' \
+   355                                                                              'information on roles, see: https://docs.' \
+   356                                                                              'microsoft.com/en-us/azure/role-based-' \
+   357                                                                              'access-control/overview\n' % cloud_error2
+   358                                                                       raise ProviderConnectionException(mess)
+   359                                           
+   360                                                                   elif cloud_error2.error.error == \
+   361                                                                           "StorageAccountAlreadyTaken":
+   362                                                                       mess = 'The following error was ' \
+   363                                                                              'returned by Azure:\n%s\n\n' \
+   364                                                                              'Note that Storage Account names must be ' \
+   365                                                                              'unique across Azure (not just in your ' \
+   366                                                                              'subscription).\nFor more information ' \
+   367                                                                              'see https://docs.microsoft.com/en-us/' \
+   368                                                                              'azure/azure-resource-manager/resource-' \
+   369                                                                              'manager-storage-account-name-errors\n' \
+   370                                                                              % cloud_error2
+   371                                                                       raise InvalidLabelException(mess)
+   372                                                                   else:
+   373                                                                       raise cloud_error2
+   374                                                           else:
+   375                                                               raise cloud_error
+
+Total time: 0.052927 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_locations at line 377
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   377                                               @profile
+   378                                               def list_locations(self):
+   379         5      52784.0  10556.8     99.7          return self.subscription_client.subscriptions. \
+   380         5        143.0     28.6      0.3              list_locations(self.subscription_id)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm_firewall at line 382
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   382                                               @profile
+   383                                               def list_vm_firewall(self):
+   384                                                   return self.network_management_client.network_security_groups. \
+   385                                                       list(self.resource_group)
+
+Total time: 22.4962 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm_firewall at line 387
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   387                                               @profile
+   388                                               def create_vm_firewall(self, name, parameters):
+   389         2       1602.0    801.0      0.0          return self.network_management_client.network_security_groups. \
+   390         2         23.0     11.5      0.0              create_or_update(self.resource_group, name,
+   391         2   22494593.0 11247296.5    100.0                               parameters).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm_firewall_tags at line 393
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   393                                               @profile
+   394                                               def update_vm_firewall_tags(self, fw_id, tags):
+   395                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   396                                                                                        fw_id)
+   397                                                   name = url_params.get(VM_FIREWALL_NAME)
+   398                                                   return self.network_management_client.network_security_groups. \
+   399                                                       create_or_update(self.resource_group, name,
+   400                                                                        {'tags': tags,
+   401                                                                         'location': self.region_name}).result()
+
+Total time: 0.776911 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_vm_firewall at line 403
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   403                                               @profile
+   404                                               def get_vm_firewall(self, fw_id):
+   405         4          8.0      2.0      0.0          url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   406         4        100.0     25.0      0.0                                               fw_id)
+   407         4          5.0      1.2      0.0          fw_name = url_params.get(VM_FIREWALL_NAME)
+   408         4       2975.0    743.8      0.4          return self.network_management_client.network_security_groups. \
+   409         4     773823.0 193455.8     99.6              get(self.resource_group, fw_name)
+
+Total time: 21.5193 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm_firewall at line 411
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   411                                               @profile
+   412                                               def delete_vm_firewall(self, fw_id):
+   413         2          8.0      4.0      0.0          url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   414         2         72.0     36.0      0.0                                               fw_id)
+   415         2          2.0      1.0      0.0          name = url_params.get(VM_FIREWALL_NAME)
+   416         2       2120.0   1060.0      0.0          self.network_management_client \
+   417         2   21517148.0 10758574.0    100.0              .network_security_groups.delete(self.resource_group, name).wait()
+
+Total time: 154.991 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm_firewall_rule at line 419
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   419                                               @profile
+   420                                               def create_vm_firewall_rule(self, fw_id,
+   421                                                                           rule_name, parameters):
+   422        14         35.0      2.5      0.0          url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   423        14        396.0     28.3      0.0                                               fw_id)
+   424        14         22.0      1.6      0.0          vm_firewall_name = url_params.get(VM_FIREWALL_NAME)
+   425        14      10489.0    749.2      0.0          return self.network_management_client.security_rules. \
+   426        14        128.0      9.1      0.0              create_or_update(self.resource_group, vm_firewall_name,
+   427        14  154979521.0 11069965.8    100.0                               rule_name, parameters).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm_firewall_rule at line 429
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   429                                               @profile
+   430                                               def delete_vm_firewall_rule(self, fw_rule_id, vm_firewall):
+   431                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RULE_RESOURCE_ID,
+   432                                                                                        fw_rule_id)
+   433                                                   name = url_params.get(VM_FIREWALL_RULE_NAME)
+   434                                                   return self.network_management_client.security_rules. \
+   435                                                       delete(self.resource_group, vm_firewall, name).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_containers at line 437
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   437                                               @profile
+   438                                               def list_containers(self, prefix=None, limit=None, marker=None):
+   439                                                   results = self.blob_service.list_containers(prefix=prefix,
+   440                                                                                               num_results=limit,
+   441                                                                                               marker=marker)
+   442                                                   return (results.items, results.next_marker)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_container at line 444
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   444                                               @profile
+   445                                               def create_container(self, container_name):
+   446                                                   try:
+   447                                                       self.blob_service.create_container(container_name,
+   448                                                                                          fail_on_exist=True)
+   449                                                   except AzureConflictHttpError as cloud_error:
+   450                                                       if cloud_error.error_code == "ContainerAlreadyExists":
+   451                                                           msg = "The given Bucket name '%s' already exists. Please " \
+   452                                                                 "use the `get` or `find` method to get a reference to " \
+   453                                                                 "an existing Bucket, or specify a new Bucket name to " \
+   454                                                                 "create.\nNote that in Azure, Buckets are contained " \
+   455                                                                 "in Storage Accounts." % container_name
+   456                                                           raise DuplicateResourceException(msg)
+   457                                           
+   458                                                   return self.blob_service.get_container_properties(container_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_container at line 460
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   460                                               @profile
+   461                                               def get_container(self, container_name):
+   462                                                   return self.blob_service.get_container_properties(container_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_container at line 464
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   464                                               @profile
+   465                                               def delete_container(self, container_name):
+   466                                                   self.blob_service.delete_container(container_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_blobs at line 468
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   468                                               @profile
+   469                                               def list_blobs(self, container_name, prefix=None):
+   470                                                   return self.blob_service.list_blobs(container_name, prefix=prefix)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob at line 472
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   472                                               @profile
+   473                                               def get_blob(self, container_name, blob_name):
+   474                                                   return self.blob_service.get_blob_properties(container_name, blob_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_blob_from_text at line 476
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   476                                               @profile
+   477                                               def create_blob_from_text(self, container_name, blob_name, text):
+   478                                                   self.blob_service.create_blob_from_text(container_name,
+   479                                                                                           blob_name, text)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_blob_from_file at line 481
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   481                                               @profile
+   482                                               def create_blob_from_file(self, container_name, blob_name, file_path):
+   483                                                   self.blob_service.create_blob_from_path(container_name,
+   484                                                                                           blob_name, file_path)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_blob at line 486
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   486                                               @profile
+   487                                               def delete_blob(self, container_name, blob_name):
+   488                                                   self.blob_service.delete_blob(container_name, blob_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob_url at line 490
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   490                                               @profile
+   491                                               def get_blob_url(self, container_name, blob_name, expiry_time):
+   492                                                   expiry_date = datetime.datetime.utcnow() + datetime.timedelta(
+   493                                                       seconds=expiry_time)
+   494                                                   sas = self.blob_service.generate_blob_shared_access_signature(
+   495                                                       container_name, blob_name, permission=BlobPermissions.READ,
+   496                                                       expiry=expiry_date)
+   497                                                   return self.blob_service.make_blob_url(container_name, blob_name,
+   498                                                                                          sas_token=sas)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob_content at line 500
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   500                                               @profile
+   501                                               def get_blob_content(self, container_name, blob_name):
+   502                                                   out_stream = BytesIO()
+   503                                                   self.blob_service.get_blob_to_stream(container_name,
+   504                                                                                        blob_name, out_stream)
+   505                                                   return out_stream
+
+Total time: 30.9193 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_empty_disk at line 507
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   507                                               @profile
+   508                                               def create_empty_disk(self, disk_name, params):
+   509         1       7639.0   7639.0      0.0          return self.compute_client.disks.create_or_update(
+   510         1         18.0     18.0      0.0              self.resource_group,
+   511         1          0.0      0.0      0.0              disk_name,
+   512         1   30911676.0 30911676.0    100.0              params
+   513                                                   ).result()
+
+Total time: 30.8045 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_snapshot_disk at line 515
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   515                                               @profile
+   516                                               def create_snapshot_disk(self, disk_name, params):
+   517         1        405.0    405.0      0.0          return self.compute_client.disks.create_or_update(
+   518         1          7.0      7.0      0.0              self.resource_group,
+   519         1          0.0      0.0      0.0              disk_name,
+   520         1   30804040.0 30804040.0    100.0              params
+   521                                                   ).result()
+
+Total time: 0.415075 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_disk at line 523
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   523                                               @profile
+   524                                               def get_disk(self, disk_id):
+   525         2         12.0      6.0      0.0          url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   526         2         65.0     32.5      0.0                                               disk_id)
+   527         2          2.0      1.0      0.0          disk_name = url_params.get(VOLUME_NAME)
+   528         2     414996.0 207498.0    100.0          return self.compute_client.disks.get(self.resource_group, disk_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_disks at line 530
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   530                                               @profile
+   531                                               def list_disks(self):
+   532                                                   return self.compute_client.disks. \
+   533                                                       list_by_resource_group(self.resource_group)
+
+Total time: 214.353 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_disk at line 535
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   535                                               @profile
+   536                                               def delete_disk(self, disk_id):
+   537         8         25.0      3.1      0.0          url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   538         8        257.0     32.1      0.0                                               disk_id)
+   539         8         12.0      1.5      0.0          disk_name = url_params.get(VOLUME_NAME)
+   540         8  214352959.0 26794119.9    100.0          self.compute_client.disks.delete(self.resource_group, disk_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_disk_tags at line 542
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   542                                               @profile
+   543                                               def update_disk_tags(self, disk_id, tags):
+   544                                                   url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   545                                                                                        disk_id)
+   546                                                   disk_name = url_params.get(VOLUME_NAME)
+   547                                                   return self.compute_client.disks.update(
+   548                                                       self.resource_group,
+   549                                                       disk_name,
+   550                                                       {'tags': tags},
+   551                                                       raw=True
+   552                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_snapshots at line 554
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   554                                               @profile
+   555                                               def list_snapshots(self):
+   556                                                   return self.compute_client.snapshots. \
+   557                                                       list_by_resource_group(self.resource_group)
+
+Total time: 0.191226 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_snapshot at line 559
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   559                                               @profile
+   560                                               def get_snapshot(self, snapshot_id):
+   561         1          5.0      5.0      0.0          url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   562         1         48.0     48.0      0.0                                               snapshot_id)
+   563         1          2.0      2.0      0.0          snapshot_name = url_params.get(SNAPSHOT_NAME)
+   564         1        594.0    594.0      0.3          return self.compute_client.snapshots.get(self.resource_group,
+   565         1     190577.0 190577.0     99.7                                                   snapshot_name)
+
+Total time: 31.0976 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_snapshot at line 567
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   567                                               @profile
+   568                                               def create_snapshot(self, snapshot_name, params):
+   569         1        451.0    451.0      0.0          return self.compute_client.snapshots.create_or_update(
+   570         1          9.0      9.0      0.0              self.resource_group,
+   571         1          1.0      1.0      0.0              snapshot_name,
+   572         1   31097107.0 31097107.0    100.0              params
+   573                                                   ).result()
+
+Total time: 30.6236 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_snapshot at line 575
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   575                                               @profile
+   576                                               def delete_snapshot(self, snapshot_id):
+   577         1          4.0      4.0      0.0          url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   578         1         29.0     29.0      0.0                                               snapshot_id)
+   579         1          1.0      1.0      0.0          snapshot_name = url_params.get(SNAPSHOT_NAME)
+   580         1        457.0    457.0      0.0          self.compute_client.snapshots.delete(self.resource_group,
+   581         1   30623148.0 30623148.0    100.0                                               snapshot_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_snapshot_tags at line 583
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   583                                               @profile
+   584                                               def update_snapshot_tags(self, snapshot_id, tags):
+   585                                                   url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   586                                                                                        snapshot_id)
+   587                                                   snapshot_name = url_params.get(SNAPSHOT_NAME)
+   588                                                   return self.compute_client.snapshots.update(
+   589                                                       self.resource_group,
+   590                                                       snapshot_name,
+   591                                                       {'tags': tags},
+   592                                                       raw=True
+   593                                                   )
+
+Total time: 0.000136 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: is_gallery_image at line 595
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   595                                               @profile
+   596                                               def is_gallery_image(self, image_id):
+   597         6          5.0      0.8      3.7          url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   598         6        125.0     20.8     91.9                                               image_id)
+   599                                                   # If it is a gallery image, it will always have an offer
+   600         6          6.0      1.0      4.4          return 'offer' in url_params
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_image at line 602
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   602                                               @profile
+   603                                               def create_image(self, name, params):
+   604                                                   return self.compute_client.images. \
+   605                                                       create_or_update(self.resource_group, name,
+   606                                                                        params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_image at line 608
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   608                                               @profile
+   609                                               def delete_image(self, image_id):
+   610                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   611                                                                                        image_id)
+   612                                                   if not self.is_gallery_image(image_id):
+   613                                                       name = url_params.get(IMAGE_NAME)
+   614                                                       self.compute_client.images.delete(self.resource_group, name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_images at line 616
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   616                                               @profile
+   617                                               def list_images(self):
+   618                                                   azure_images = list(self.compute_client.images.
+   619                                                                       list_by_resource_group(self.resource_group))
+   620                                                   return azure_images
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_gallery_refs at line 622
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   622                                               @profile
+   623                                               def list_gallery_refs(self):
+   624                                                   return gallery_image_references
+
+Total time: 0.000521 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_image at line 626
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   626                                               @profile
+   627                                               def get_image(self, image_id):
+   628         6         19.0      3.2      3.6          url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   629         6        182.0     30.3     34.9                                               image_id)
+   630         6        186.0     31.0     35.7          if self.is_gallery_image(image_id):
+   631         6          7.0      1.2      1.3              return GalleryImageReference(publisher=url_params['publisher'],
+   632         6          4.0      0.7      0.8                                           offer=url_params['offer'],
+   633         6          4.0      0.7      0.8                                           sku=url_params['sku'],
+   634         6        119.0     19.8     22.8                                           version=url_params['version'])
+   635                                                   else:
+   636                                                       name = url_params.get(IMAGE_NAME)
+   637                                                       return self.compute_client.images.get(self.resource_group, name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_image_tags at line 639
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   639                                               @profile
+   640                                               def update_image_tags(self, image_id, tags):
+   641                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   642                                                                                        image_id)
+   643                                                   if self.is_gallery_image(image_id):
+   644                                                       return True
+   645                                                   else:
+   646                                                       name = url_params.get(IMAGE_NAME)
+   647                                                       return self.compute_client.images. \
+   648                                                           create_or_update(self.resource_group, name,
+   649                                                                            {
+   650                                                                                'tags': tags,
+   651                                                                                'location': self.region_name
+   652                                                                            }).result()
+
+Total time: 0.009859 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm_types at line 654
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   654                                               @profile
+   655                                               def list_vm_types(self):
+   656         6       9568.0   1594.7     97.0          return self.compute_client.virtual_machine_sizes. \
+   657         6        291.0     48.5      3.0              list(self.region_name)
+
+Total time: 0.022426 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_networks at line 659
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   659                                               @profile
+   660                                               def list_networks(self):
+   661         3      22266.0   7422.0     99.3          return self.network_management_client.virtual_networks.list(
+   662         3        160.0     53.3      0.7              self.resource_group)
+
+Total time: 3.19146 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_network at line 664
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   664                                               @profile
+   665                                               def get_network(self, network_id):
+   666        13         13.0      1.0      0.0          url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID,
+   667        13        260.0     20.0      0.0                                               network_id)
+   668        13         13.0      1.0      0.0          network_name = url_params.get(NETWORK_NAME)
+   669        13      10048.0    772.9      0.3          return self.network_management_client.virtual_networks.get(
+   670        13    3181122.0 244701.7     99.7              self.resource_group, network_name)
+
+Total time: 14.5405 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_network at line 672
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   672                                               @profile
+   673                                               def create_network(self, name, params):
+   674         1       7644.0   7644.0      0.1          return self.network_management_client.virtual_networks. \
+   675         1          8.0      8.0      0.0              create_or_update(self.resource_group,
+   676         1          1.0      1.0      0.0                               name,
+   677         1   14532810.0 14532810.0     99.9                               parameters=params).result()
+
+Total time: 10.9976 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_network at line 679
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   679                                               @profile
+   680                                               def delete_network(self, network_id):
+   681         1         32.0     32.0      0.0          url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   682         1          2.0      2.0      0.0          network_name = url_params.get(NETWORK_NAME)
+   683         1        832.0    832.0      0.0          return self.network_management_client.virtual_networks. \
+   684         1   10996719.0 10996719.0    100.0              delete(self.resource_group, network_name).wait()
+
+Total time: 31.0639 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_network_tags at line 686
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   686                                               @profile
+   687                                               def update_network_tags(self, network_id, tags):
+   688         1         24.0     24.0      0.0          url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   689         1          1.0      1.0      0.0          network_name = url_params.get(NETWORK_NAME)
+   690         1        683.0    683.0      0.0          return self.network_management_client.virtual_networks. \
+   691         1          7.0      7.0      0.0              create_or_update(self.resource_group,
+   692         1   31063174.0 31063174.0    100.0                               network_name, tags).result()
+
+Total time: 0.000513 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_network_id_for_subnet at line 694
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   694                                               @profile
+   695                                               def get_network_id_for_subnet(self, subnet_id):
+   696        12        353.0     29.4     68.8          url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID, subnet_id)
+   697        12         18.0      1.5      3.5          network_id = NETWORK_RESOURCE_ID[0]
+   698        60         42.0      0.7      8.2          for key, val in url_params.items():
+   699        48         94.0      2.0     18.3              network_id = network_id.replace("{" + key + "}", val)
+   700        12          6.0      0.5      1.2          return network_id
+
+Total time: 0.003358 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_subnets at line 702
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   702                                               @profile
+   703                                               def list_subnets(self, network_id):
+   704         4        118.0     29.5      3.5          url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   705         4          7.0      1.8      0.2          network_name = url_params.get(NETWORK_NAME)
+   706         4       3012.0    753.0     89.7          return self.network_management_client.subnets. \
+   707         4        221.0     55.2      6.6              list(self.resource_group, network_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_subnet at line 709
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   709                                               @profile
+   710                                               def get_subnet(self, subnet_id):
+   711                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   712                                                                                        subnet_id)
+   713                                                   network_name = url_params.get(NETWORK_NAME)
+   714                                                   subnet_name = url_params.get(SUBNET_NAME)
+   715                                                   return self.network_management_client.subnets. \
+   716                                                       get(self.resource_group, network_name, subnet_name)
+
+Total time: 4.12285 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_subnet at line 718
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   718                                               @profile
+   719                                               def create_subnet(self, network_id, subnet_name, params):
+   720         1         26.0     26.0      0.0          url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   721         1          1.0      1.0      0.0          network_name = url_params.get(NETWORK_NAME)
+   722         1        723.0    723.0      0.0          result_create = self.network_management_client \
+   723                                                       .subnets.create_or_update(
+   724         1          8.0      8.0      0.0                  self.resource_group,
+   725         1          0.0      0.0      0.0                  network_name,
+   726         1          1.0      1.0      0.0                  subnet_name,
+   727         1     572230.0 572230.0     13.9                  params
+   728                                                       )
+   729         1    3549857.0 3549857.0     86.1          subnet_info = result_create.result()
+   730                                           
+   731         1          2.0      2.0      0.0          return subnet_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: __if_subnet_in_use at line 733
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   733                                               @profile
+   734                                               def __if_subnet_in_use(e):
+   735                                                   # return True if the CloudError exception is due to subnet being in use
+   736                                                   if isinstance(e, CloudError):
+   737                                                       if e.error.error == "InUseSubnetCannotBeDeleted":
+   738                                                           return True
+   739                                                   return False
+
+Total time: 10.6682 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_subnet at line 741
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   741                                               @tenacity.retry(stop=tenacity.stop_after_attempt(5),
+   742                                                               retry=tenacity.retry_if_exception(__if_subnet_in_use),
+   743                                                               wait=tenacity.wait_fixed(5),
+   744                                                               reraise=True)
+   745                                               @profile
+   746                                               def delete_subnet(self, subnet_id):
+   747         1          3.0      3.0      0.0          url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   748         1         32.0     32.0      0.0                                               subnet_id)
+   749         1          1.0      1.0      0.0          network_name = url_params.get(NETWORK_NAME)
+   750         1          1.0      1.0      0.0          subnet_name = url_params.get(SUBNET_NAME)
+   751                                           
+   752         1          1.0      1.0      0.0          try:
+   753         1        805.0    805.0      0.0              result_delete = self.network_management_client \
+   754                                                           .subnets.delete(
+   755         1          9.0      9.0      0.0                      self.resource_group,
+   756         1          1.0      1.0      0.0                      network_name,
+   757         1     434450.0 434450.0      4.1                      subnet_name
+   758                                                           )
+   759         1   10232911.0 10232911.0     95.9              result_delete.wait()
+   760                                                   except CloudError as cloud_error:
+   761                                                       log.exception(cloud_error.message)
+   762                                                       raise cloud_error
+
+Total time: 4.22866 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_floating_ip at line 764
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   764                                               @profile
+   765                                               def create_floating_ip(self, public_ip_name, public_ip_parameters):
+   766         1        803.0    803.0      0.0          return self.network_management_client.public_ip_addresses. \
+   767         1          8.0      8.0      0.0              create_or_update(self.resource_group,
+   768         1          1.0      1.0      0.0                               public_ip_name,
+   769         1    4227847.0 4227847.0    100.0                               public_ip_parameters).result()
+
+Total time: 0.204927 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_floating_ip at line 771
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   771                                               @profile
+   772                                               def get_floating_ip(self, public_ip_id):
+   773         1          2.0      2.0      0.0          url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   774         1         24.0     24.0      0.0                                               public_ip_id)
+   775         1          2.0      2.0      0.0          public_ip_name = url_params.get(PUBLIC_IP_NAME)
+   776         1        711.0    711.0      0.3          return self.network_management_client. \
+   777         1     204188.0 204188.0     99.6              public_ip_addresses.get(self.resource_group, public_ip_name)
+
+Total time: 10.7583 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_floating_ip at line 779
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   779                                               @profile
+   780                                               def delete_floating_ip(self, public_ip_id):
+   781         1          2.0      2.0      0.0          url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   782         1         24.0     24.0      0.0                                               public_ip_id)
+   783         1          1.0      1.0      0.0          public_ip_name = url_params.get(PUBLIC_IP_NAME)
+   784         1        709.0    709.0      0.0          self.network_management_client. \
+   785         1         10.0     10.0      0.0              public_ip_addresses.delete(self.resource_group,
+   786         1   10757580.0 10757580.0    100.0                                         public_ip_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_fip_tags at line 788
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   788                                               @profile
+   789                                               def update_fip_tags(self, fip_id, tags):
+   790                                                   url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   791                                                                                        fip_id)
+   792                                                   fip_name = url_params.get(PUBLIC_IP_NAME)
+   793                                                   self.network_management_client.public_ip_addresses. \
+   794                                                       create_or_update(self.resource_group,
+   795                                                                        fip_name, tags).result()
+
+Total time: 0.000868 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_floating_ips at line 797
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   797                                               @profile
+   798                                               def list_floating_ips(self):
+   799         1        798.0    798.0     91.9          return self.network_management_client.public_ip_addresses.list(
+   800         1         70.0     70.0      8.1              self.resource_group)
+
+Total time: 0.00234 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm at line 802
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   802                                               @profile
+   803                                               def list_vm(self):
+   804         5       2132.0    426.4     91.1          return self.compute_client.virtual_machines.list(
+   805         5        208.0     41.6      8.9              self.resource_group
+   806                                                   )
+
+Total time: 30.4549 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: restart_vm at line 808
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   808                                               @profile
+   809                                               def restart_vm(self, vm_id):
+   810         1          2.0      2.0      0.0          url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   811         1         23.0     23.0      0.0                                               vm_id)
+   812         1          1.0      1.0      0.0          vm_name = url_params.get(VM_NAME)
+   813         1        412.0    412.0      0.0          return self.compute_client.virtual_machines.restart(
+   814         1   30454435.0 30454435.0    100.0              self.resource_group, vm_name).wait()
+
+Total time: 133.21 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm at line 816
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   816                                               @profile
+   817                                               def delete_vm(self, vm_id):
+   818         4         10.0      2.5      0.0          url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   819         4        216.0     54.0      0.0                                               vm_id)
+   820         4          8.0      2.0      0.0          vm_name = url_params.get(VM_NAME)
+   821         4       2221.0    555.2      0.0          return self.compute_client.virtual_machines.delete(
+   822         4  133207787.0 33301946.8    100.0              self.resource_group, vm_name).wait()
+
+Total time: 74.9466 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_vm at line 824
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   824                                               @profile
+   825                                               def get_vm(self, vm_id):
+   826        22         79.0      3.6      0.0          url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   827        22        799.0     36.3      0.0                                               vm_id)
+   828        22         41.0      1.9      0.0          vm_name = url_params.get(VM_NAME)
+   829        22      12404.0    563.8      0.0          return self.compute_client.virtual_machines.get(
+   830        22        226.0     10.3      0.0              self.resource_group,
+   831        22         15.0      0.7      0.0              vm_name,
+   832        22   74933044.0 3406047.5    100.0              expand='instanceView'
+   833                                                   )
+
+Total time: 515.531 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm at line 835
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   835                                               @profile
+   836                                               def create_vm(self, vm_name, params):
+   837         4      23151.0   5787.8      0.0          return self.compute_client.virtual_machines. \
+   838         4         39.0      9.8      0.0              create_or_update(self.resource_group,
+   839         4  515507537.0 128876884.2    100.0                               vm_name, params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm at line 841
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   841                                               @profile
+   842                                               def update_vm(self, vm_id, params):
+   843                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   844                                                                                        vm_id)
+   845                                                   vm_name = url_params.get(VM_NAME)
+   846                                                   return self.compute_client.virtual_machines. \
+   847                                                       create_or_update(self.resource_group,
+   848                                                                        vm_name, params, raw=True)
+
+Total time: 284.987 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: deallocate_vm at line 850
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   850                                               @profile
+   851                                               def deallocate_vm(self, vm_id):
+   852         4         12.0      3.0      0.0          url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   853         4        117.0     29.2      0.0                                               vm_id)
+   854         4          7.0      1.8      0.0          vm_name = url_params.get(VM_NAME)
+   855         4       1979.0    494.8      0.0          self.compute_client. \
+   856         4         37.0      9.2      0.0              virtual_machines.deallocate(self.resource_group,
+   857         4  284985322.0 71246330.5    100.0                                          vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: generalize_vm at line 859
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   859                                               @profile
+   860                                               def generalize_vm(self, vm_id):
+   861                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   862                                                                                        vm_id)
+   863                                                   vm_name = url_params.get(VM_NAME)
+   864                                                   self.compute_client.virtual_machines. \
+   865                                                       generalize(self.resource_group, vm_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: start_vm at line 867
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   867                                               @profile
+   868                                               def start_vm(self, vm_id):
+   869                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   870                                                                                        vm_id)
+   871                                                   vm_name = url_params.get(VM_NAME)
+   872                                                   self.compute_client.virtual_machines. \
+   873                                                       start(self.resource_group,
+   874                                                             vm_name).wait()
+
+Total time: 93.3852 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm_tags at line 876
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   876                                               @profile
+   877                                               def update_vm_tags(self, vm_id, tags):
+   878         3          8.0      2.7      0.0          url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   879         3         77.0     25.7      0.0                                               vm_id)
+   880         3          4.0      1.3      0.0          vm_name = url_params.get(VM_NAME)
+   881         3       1314.0    438.0      0.0          self.compute_client.virtual_machines. \
+   882         3         30.0     10.0      0.0              create_or_update(self.resource_group,
+   883         3   93383730.0 31127910.0    100.0                               vm_name, tags).result()
+
+Total time: 42.7808 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_nic at line 885
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   885                                               @profile
+   886                                               def delete_nic(self, nic_id):
+   887         4          8.0      2.0      0.0          nic_params = azure_helpers.\
+   888         4         97.0     24.2      0.0              parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   889         4          5.0      1.2      0.0          nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   890         4       2754.0    688.5      0.0          self.network_management_client. \
+   891         4         30.0      7.5      0.0              network_interfaces.delete(self.resource_group,
+   892         4   42777872.0 10694468.0    100.0                                        nic_name).wait()
+
+Total time: 11.4969 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_nic at line 894
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   894                                               @profile
+   895                                               def get_nic(self, nic_id):
+   896        44        103.0      2.3      0.0          nic_params = azure_helpers.\
+   897        44       1130.0     25.7      0.0              parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   898        44         54.0      1.2      0.0          nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   899        44      32228.0    732.5      0.3          return self.network_management_client. \
+   900        44   11463350.0 260530.7     99.7              network_interfaces.get(self.resource_group, nic_name)
+
+Total time: 115.781 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_nic at line 902
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   902                                               @profile
+   903                                               def update_nic(self, nic_id, params):
+   904         4          8.0      2.0      0.0          nic_params = azure_helpers.\
+   905         4        100.0     25.0      0.0              parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   906         4          5.0      1.2      0.0          nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   907         4       3058.0    764.5      0.0          async_nic_creation = self.network_management_client. \
+   908                                                       network_interfaces.create_or_update(
+   909         4         39.0      9.8      0.0                  self.resource_group,
+   910         4          2.0      0.5      0.0                  nic_name,
+   911         4    1249938.0 312484.5      1.1                  params
+   912                                                       )
+   913         4  114528003.0 28632000.8     98.9          nic_info = async_nic_creation.result()
+   914         4          8.0      2.0      0.0          return nic_info
+
+Total time: 125.141 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_nic at line 916
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   916                                               @profile
+   917                                               def create_nic(self, nic_name, params):
+   918         4       3231.0    807.8      0.0          return self.network_management_client. \
+   919                                                       network_interfaces.create_or_update(
+   920         4         44.0     11.0      0.0                  self.resource_group,
+   921         4          3.0      0.8      0.0                  nic_name,
+   922         4  125137817.0 31284454.2    100.0                  params
+   923                                                       ).result()
+
+Total time: 0.227538 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_public_key at line 925
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   925                                               @profile
+   926                                               def create_public_key(self, entity):
+   927         4     114154.0  28538.5     50.2          return self.table_service. \
+   928         4         38.0      9.5      0.0              insert_or_replace_entity(self.public_key_storage_table_name,
+   929         4     113346.0  28336.5     49.8                                       entity)
+
+Total time: 4.19258 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_public_key at line 931
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   931                                               @profile
+   932                                               def get_public_key(self, name):
+   933         8    3836017.0 479502.1     91.5          entities = self.table_service. \
+   934         8         75.0      9.4      0.0              query_entities(self.public_key_storage_table_name,
+   935         8     356459.0  44557.4      8.5                             "Name eq '{0}'".format(name), num_results=1)
+   936                                           
+   937         8         30.0      3.8      0.0          return entities.items[0] if len(entities.items) > 0 else None
+
+Total time: 0.65627 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_public_key at line 939
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   939                                               @profile
+   940                                               def delete_public_key(self, entity):
+   941         4     521314.0 130328.5     79.4          self.table_service.delete_entity(self.public_key_storage_table_name,
+   942         4     134956.0  33739.0     20.6                                           entity.PartitionKey, entity.RowKey)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_public_keys at line 944
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   944                                               @profile
+   945                                               def list_public_keys(self, partition_key, limit=None, marker=None):
+   946                                                   entities = self.table_service. \
+   947                                                       query_entities(self.public_key_storage_table_name,
+   948                                                                      "PartitionKey eq '{0}'".format(partition_key),
+   949                                                                      marker=marker, num_results=limit)
+   950                                                   return (entities.items, entities.next_marker)
+
+Total time: 10.539 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_route_table at line 952
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   952                                               @profile
+   953                                               def delete_route_table(self, route_table_name):
+   954         1        893.0    893.0      0.0          self.network_management_client. \
+   955         1   10538154.0 10538154.0    100.0              route_tables.delete(self.resource_group, route_table_name
+   956                                                                           ).wait()
+
+Total time: 3.92367 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: attach_subnet_to_route_table at line 958
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   958                                               @profile
+   959                                               def attach_subnet_to_route_table(self, subnet_id, route_table_id):
+   960         1          3.0      3.0      0.0          url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   961         1         34.0     34.0      0.0                                               subnet_id)
+   962         1          2.0      2.0      0.0          network_name = url_params.get(NETWORK_NAME)
+   963         1          1.0      1.0      0.0          subnet_name = url_params.get(SUBNET_NAME)
+   964                                           
+   965         1        821.0    821.0      0.0          subnet_info = self.network_management_client.subnets.get(
+   966         1          9.0      9.0      0.0              self.resource_group,
+   967         1          1.0      1.0      0.0              network_name,
+   968         1     165580.0 165580.0      4.2              subnet_name
+   969                                                   )
+   970         1          2.0      2.0      0.0          if subnet_info:
+   971                                                       subnet_info.route_table = {
+   972         1          1.0      1.0      0.0                  'id': route_table_id
+   973                                                       }
+   974                                           
+   975         1        722.0    722.0      0.0              result_create = self.network_management_client. \
+   976                                                           subnets.create_or_update(
+   977         1          9.0      9.0      0.0                   self.resource_group,
+   978         1          1.0      1.0      0.0                   network_name,
+   979         1          0.0      0.0      0.0                   subnet_name,
+   980         1     419970.0 419970.0     10.7                   subnet_info)
+   981         1    3336510.0 3336510.0     85.0              subnet_info = result_create.result()
+   982                                           
+   983         1          2.0      2.0      0.0          return subnet_info
+
+Total time: 4.23668 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: detach_subnet_to_route_table at line 985
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   985                                               @profile
+   986                                               def detach_subnet_to_route_table(self, subnet_id, route_table_id):
+   987         1          2.0      2.0      0.0          url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   988         1         29.0     29.0      0.0                                               subnet_id)
+   989         1          1.0      1.0      0.0          network_name = url_params.get(NETWORK_NAME)
+   990         1          1.0      1.0      0.0          subnet_name = url_params.get(SUBNET_NAME)
+   991                                           
+   992         1        726.0    726.0      0.0          subnet_info = self.network_management_client.subnets.get(
+   993         1          8.0      8.0      0.0              self.resource_group,
+   994         1          1.0      1.0      0.0              network_name,
+   995         1     263253.0 263253.0      6.2              subnet_name
+   996                                                   )
+   997                                           
+   998         1          3.0      3.0      0.0          if subnet_info and subnet_info.route_table.id == route_table_id:
+   999         1          2.0      2.0      0.0              subnet_info.route_table = None
+  1000                                           
+  1001         1        723.0    723.0      0.0              result_create = self.network_management_client. \
+  1002                                                           subnets.create_or_update(
+  1003         1          8.0      8.0      0.0                   self.resource_group,
+  1004         1          1.0      1.0      0.0                   network_name,
+  1005         1          0.0      0.0      0.0                   subnet_name,
+  1006         1     546801.0 546801.0     12.9                   subnet_info)
+  1007         1    3425118.0 3425118.0     80.8              subnet_info = result_create.result()
+  1008                                           
+  1009         1          2.0      2.0      0.0          return subnet_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_route_tables at line 1011
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1011                                               @profile
+  1012                                               def list_route_tables(self):
+  1013                                                   return self.network_management_client. \
+  1014                                                       route_tables.list(self.resource_group)
+
+Total time: 0.376859 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_route_table at line 1016
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1016                                               @profile
+  1017                                               def get_route_table(self, router_id):
+  1018         2          4.0      2.0      0.0          url_params = azure_helpers.parse_url(ROUTER_RESOURCE_ID,
+  1019         2         44.0     22.0      0.0                                               router_id)
+  1020         2          2.0      1.0      0.0          router_name = url_params.get(ROUTER_NAME)
+  1021         2       1586.0    793.0      0.4          return self.network_management_client. \
+  1022         2     375223.0 187611.5     99.6              route_tables.get(self.resource_group, router_name)
+
+Total time: 10.9849 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_route_table at line 1024
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1024                                               @profile
+  1025                                               def create_route_table(self, route_table_name, params):
+  1026         1        727.0    727.0      0.0          return self.network_management_client. \
+  1027                                                       route_tables.create_or_update(
+  1028         1          9.0      9.0      0.0               self.resource_group,
+  1029         1   10984139.0 10984139.0    100.0               route_table_name, params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_route_table_tags at line 1031
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1031                                               @profile
+  1032                                               def update_route_table_tags(self, route_table_name, tags):
+  1033                                                   self.network_management_client.route_tables. \
+  1034                                                       create_or_update(self.resource_group,
+  1035                                                                        route_table_name, tags).result()
+

+ 1467 - 0
results/image.res

@@ -0,0 +1,1467 @@
+Test output
+ .
+----------------------------------------------------------------------
+Ran 1 test in 752.430s
+
+OK
+
+Wrote profile results to run_tests.py.lprof
+Timer unit: 1e-06 s
+
+Total time: 0.368103 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: __init__ at line 160
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   160                                               @profile
+   161                                               def __init__(self, config):
+   162         1          4.0      4.0      0.0          self._config = config
+   163         1          2.0      2.0      0.0          self.subscription_id = str(config.get('azure_subscription_id'))
+   164         1          1.0      1.0      0.0          self._credentials = ServicePrincipalCredentials(
+   165         1          0.0      0.0      0.0              client_id=config.get('azure_client_id'),
+   166         1          1.0      1.0      0.0              secret=config.get('azure_secret'),
+   167         1     368075.0 368075.0    100.0              tenant=config.get('azure_tenant')
+   168                                                   )
+   169                                           
+   170         1          3.0      3.0      0.0          self._access_token = config.get('azure_access_token')
+   171         1          1.0      1.0      0.0          self._resource_client = None
+   172         1          1.0      1.0      0.0          self._storage_client = None
+   173         1          1.0      1.0      0.0          self._network_management_client = None
+   174         1          0.0      0.0      0.0          self._subscription_client = None
+   175         1          1.0      1.0      0.0          self._compute_client = None
+   176         1          1.0      1.0      0.0          self._access_key_result = None
+   177         1          2.0      2.0      0.0          self._block_blob_service = None
+   178         1          1.0      1.0      0.0          self._table_service = None
+   179         1          1.0      1.0      0.0          self._storage_account = None
+   180                                           
+   181         1          8.0      8.0      0.0          log.debug("azure subscription : %s", self.subscription_id)
+
+Total time: 0.659054 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: access_key_result at line 183
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   183                                               @property
+   184                                               @tenacity.retry(stop=tenacity.stop_after_attempt(5), reraise=True)
+   185                                               @profile
+   186                                               def access_key_result(self):
+   187         1          1.0      1.0      0.0          if not self._access_key_result:
+   188         1          3.0      3.0      0.0              storage_account = self.storage_account
+   189                                           
+   190         1     395498.0 395498.0     60.0              if self.get_storage_account(storage_account).\
+   191         1          1.0      1.0      0.0                      provisioning_state.value != 'Succeeded':
+   192                                                           log.debug(
+   193                                                               "Storage account %s is not in Succeeded state yet. ",
+   194                                                               storage_account)
+   195                                                           raise WaitStateException(
+   196                                                               "Waited too long for storage account: {0} to "
+   197                                                               "become ready.".format(
+   198                                                                   storage_account,
+   199                                                                   self.get_storage_account(storage_account).
+   200                                                                   provisioning_state))
+   201                                           
+   202         1        213.0    213.0      0.0              self._access_key_result = self.storage_client.storage_accounts. \
+   203         1     263336.0 263336.0     40.0                  list_keys(self.resource_group, storage_account)
+   204         1          2.0      2.0      0.0          return self._access_key_result
+
+Total time: 9e-05 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: resource_group at line 206
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   206                                               @property
+   207                                               @profile
+   208                                               def resource_group(self):
+   209        50         90.0      1.8    100.0          return self._config.get('azure_resource_group')
+
+Total time: 4e-06 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: storage_account at line 211
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   211                                               @property
+   212                                               @profile
+   213                                               def storage_account(self):
+   214         3          4.0      1.3    100.0          return self._config.get('azure_storage_account')
+
+Total time: 2e-06 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: region_name at line 216
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   216                                               @property
+   217                                               @profile
+   218                                               def region_name(self):
+   219         3          2.0      0.7    100.0          return self._config.get('azure_region_name')
+
+Total time: 2.4e-05 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: public_key_storage_table_name at line 221
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   221                                               @property
+   222                                               @profile
+   223                                               def public_key_storage_table_name(self):
+   224        16         24.0      1.5    100.0          return self._config.get('azure_public_key_storage_table_name')
+
+Total time: 0.007101 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: storage_client at line 226
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   226                                               @property
+   227                                               @profile
+   228                                               def storage_client(self):
+   229         3          4.0      1.3      0.1          if not self._storage_client:
+   230                                                       self._storage_client = \
+   231         1          5.0      5.0      0.1                  StorageManagementClient(self._credentials,
+   232         1       7090.0   7090.0     99.8                                          self.subscription_id)
+   233         3          2.0      0.7      0.0          return self._storage_client
+
+Total time: 0.006426 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: subscription_client at line 235
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   235                                               @property
+   236                                               @profile
+   237                                               def subscription_client(self):
+   238         2          2.0      1.0      0.0          if not self._subscription_client:
+   239         1       6422.0   6422.0     99.9              self._subscription_client = SubscriptionClient(self._credentials)
+   240         2          2.0      1.0      0.0          return self._subscription_client
+
+Total time: 0.023096 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: resource_client at line 242
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   242                                               @property
+   243                                               @profile
+   244                                               def resource_client(self):
+   245         1          1.0      1.0      0.0          if not self._resource_client:
+   246                                                       self._resource_client = \
+   247         1          1.0      1.0      0.0                  ResourceManagementClient(self._credentials,
+   248         1      23089.0  23089.0    100.0                                           self.subscription_id)
+   249         1          5.0      5.0      0.0          return self._resource_client
+
+Total time: 0.006134 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: compute_client at line 251
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   251                                               @property
+   252                                               @profile
+   253                                               def compute_client(self):
+   254        31         56.0      1.8      0.9          if not self._compute_client:
+   255                                                       self._compute_client = \
+   256         1          1.0      1.0      0.0                  ComputeManagementClient(self._credentials,
+   257         1       6055.0   6055.0     98.7                                          self.subscription_id)
+   258        31         22.0      0.7      0.4          return self._compute_client
+
+Total time: 0.007027 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: network_management_client at line 260
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   260                                               @property
+   261                                               @profile
+   262                                               def network_management_client(self):
+   263        16         48.0      3.0      0.7          if not self._network_management_client:
+   264         1          3.0      3.0      0.0              self._network_management_client = NetworkManagementClient(
+   265         1       6966.0   6966.0     99.1                  self._credentials, self.subscription_id)
+   266        16         10.0      0.6      0.1          return self._network_management_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: blob_service at line 268
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   268                                               @property
+   269                                               @profile
+   270                                               def blob_service(self):
+   271                                                   self._get_or_create_storage_account()
+   272                                                   if not self._block_blob_service:
+   273                                                       if self._access_token:
+   274                                                           token_credential = TokenCredential(self._access_token)
+   275                                                           self._block_blob_service = BlockBlobService(
+   276                                                               account_name=self.storage_account,
+   277                                                               token_credential=token_credential)
+   278                                                       else:
+   279                                                           self._block_blob_service = BlockBlobService(
+   280                                                               account_name=self.storage_account,
+   281                                                               account_key=self.access_key_result.keys[0].value)
+   282                                                   return self._block_blob_service
+
+Total time: 1.61274 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: table_service at line 284
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   284                                               @property
+   285                                               @profile
+   286                                               def table_service(self):
+   287         8     349069.0  43633.6     21.6          self._get_or_create_storage_account()
+   288         8         11.0      1.4      0.0          if not self._table_service:
+   289         1          1.0      1.0      0.0              self._table_service = TableService(
+   290         1          7.0      7.0      0.0                  self.storage_account,
+   291         1     659474.0 659474.0     40.9                  self.access_key_result.keys[0].value)
+   292         8         13.0      1.6      0.0          if not self._table_service. \
+   293         8     604136.0  75517.0     37.5                  exists(table_name=self.public_key_storage_table_name):
+   294                                                       self._table_service.create_table(
+   295                                                           self.public_key_storage_table_name)
+   296         8         28.0      3.5      0.0          return self._table_service
+
+Total time: 0.380743 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_resource_group at line 298
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   298                                               @profile
+   299                                               def get_resource_group(self, name):
+   300         1     380743.0 380743.0    100.0          return self.resource_client.resource_groups.get(name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_resource_group at line 302
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   302                                               @profile
+   303                                               def create_resource_group(self, name, parameters):
+   304                                                   return self.resource_client.resource_groups. \
+   305                                                       create_or_update(name, parameters)
+
+Total time: 0.743545 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_storage_account at line 307
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   307                                               @profile
+   308                                               def get_storage_account(self, storage_account):
+   309         2      86657.0  43328.5     11.7          return self.storage_client.storage_accounts. \
+   310         2     656888.0 328444.0     88.3              get_properties(self.resource_group, storage_account)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_storage_account at line 312
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   312                                               @profile
+   313                                               def create_storage_account(self, name, params):
+   314                                                   return self.storage_client.storage_accounts. \
+   315                                                       create(self.resource_group, name.lower(), params).result()
+
+Total time: 0.34811 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: _get_or_create_storage_account at line 319
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   319                                               @tenacity.retry(stop=tenacity.stop_after_attempt(2),
+   320                                                               retry=tenacity.retry_if_exception_type(CloudError),
+   321                                                               reraise=True)
+   322                                               @profile
+   323                                               def _get_or_create_storage_account(self):
+   324         8         15.0      1.9      0.0          if self._storage_account:
+   325         7          7.0      1.0      0.0              return self._storage_account
+   326                                                   else:
+   327         1          0.0      0.0      0.0              try:
+   328                                                           self._storage_account = \
+   329         1     348088.0 348088.0    100.0                      self.get_storage_account(self.storage_account)
+   330                                                       except CloudError as cloud_error:
+   331                                                           if cloud_error.error.error == "ResourceNotFound":
+   332                                                               storage_account_params = {
+   333                                                                   'sku': {
+   334                                                                       'name': 'Standard_LRS'
+   335                                                                   },
+   336                                                                   'kind': 'storage',
+   337                                                                   'location': self.region_name,
+   338                                                               }
+   339                                                               try:
+   340                                                                   self._storage_account = \
+   341                                                                       self.create_storage_account(self.storage_account,
+   342                                                                                                   storage_account_params)
+   343                                                               except CloudError as cloud_error2:  # pragma: no cover
+   344                                                                   if cloud_error2.error.error == "AuthorizationFailed":
+   345                                                                       mess = 'The following error was returned by ' \
+   346                                                                              'Azure:\n%s\n\nThis is likely because the' \
+   347                                                                              ' Role associated with the provided ' \
+   348                                                                              'credentials does not allow for Storage ' \
+   349                                                                              'Account creation.\nA Storage Account is ' \
+   350                                                                              'necessary in order to perform the ' \
+   351                                                                              'desired operation. You must either ' \
+   352                                                                              'provide an existing Storage Account name' \
+   353                                                                              ' as part of the configuration, or ' \
+   354                                                                              'elevate the associated Role.\nFor more ' \
+   355                                                                              'information on roles, see: https://docs.' \
+   356                                                                              'microsoft.com/en-us/azure/role-based-' \
+   357                                                                              'access-control/overview\n' % cloud_error2
+   358                                                                       raise ProviderConnectionException(mess)
+   359                                           
+   360                                                                   elif cloud_error2.error.error == \
+   361                                                                           "StorageAccountAlreadyTaken":
+   362                                                                       mess = 'The following error was ' \
+   363                                                                              'returned by Azure:\n%s\n\n' \
+   364                                                                              'Note that Storage Account names must be ' \
+   365                                                                              'unique across Azure (not just in your ' \
+   366                                                                              'subscription).\nFor more information ' \
+   367                                                                              'see https://docs.microsoft.com/en-us/' \
+   368                                                                              'azure/azure-resource-manager/resource-' \
+   369                                                                              'manager-storage-account-name-errors\n' \
+   370                                                                              % cloud_error2
+   371                                                                       raise InvalidLabelException(mess)
+   372                                                                   else:
+   373                                                                       raise cloud_error2
+   374                                                           else:
+   375                                                               raise cloud_error
+
+Total time: 0.032704 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_locations at line 377
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   377                                               @profile
+   378                                               def list_locations(self):
+   379         2      32639.0  16319.5     99.8          return self.subscription_client.subscriptions. \
+   380         2         65.0     32.5      0.2              list_locations(self.subscription_id)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm_firewall at line 382
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   382                                               @profile
+   383                                               def list_vm_firewall(self):
+   384                                                   return self.network_management_client.network_security_groups. \
+   385                                                       list(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm_firewall at line 387
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   387                                               @profile
+   388                                               def create_vm_firewall(self, name, parameters):
+   389                                                   return self.network_management_client.network_security_groups. \
+   390                                                       create_or_update(self.resource_group, name,
+   391                                                                        parameters).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm_firewall_tags at line 393
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   393                                               @profile
+   394                                               def update_vm_firewall_tags(self, fw_id, tags):
+   395                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   396                                                                                        fw_id)
+   397                                                   name = url_params.get(VM_FIREWALL_NAME)
+   398                                                   return self.network_management_client.network_security_groups. \
+   399                                                       create_or_update(self.resource_group, name,
+   400                                                                        {'tags': tags,
+   401                                                                         'location': self.region_name}).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_vm_firewall at line 403
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   403                                               @profile
+   404                                               def get_vm_firewall(self, fw_id):
+   405                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   406                                                                                        fw_id)
+   407                                                   fw_name = url_params.get(VM_FIREWALL_NAME)
+   408                                                   return self.network_management_client.network_security_groups. \
+   409                                                       get(self.resource_group, fw_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm_firewall at line 411
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   411                                               @profile
+   412                                               def delete_vm_firewall(self, fw_id):
+   413                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   414                                                                                        fw_id)
+   415                                                   name = url_params.get(VM_FIREWALL_NAME)
+   416                                                   self.network_management_client \
+   417                                                       .network_security_groups.delete(self.resource_group, name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm_firewall_rule at line 419
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   419                                               @profile
+   420                                               def create_vm_firewall_rule(self, fw_id,
+   421                                                                           rule_name, parameters):
+   422                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   423                                                                                        fw_id)
+   424                                                   vm_firewall_name = url_params.get(VM_FIREWALL_NAME)
+   425                                                   return self.network_management_client.security_rules. \
+   426                                                       create_or_update(self.resource_group, vm_firewall_name,
+   427                                                                        rule_name, parameters).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm_firewall_rule at line 429
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   429                                               @profile
+   430                                               def delete_vm_firewall_rule(self, fw_rule_id, vm_firewall):
+   431                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RULE_RESOURCE_ID,
+   432                                                                                        fw_rule_id)
+   433                                                   name = url_params.get(VM_FIREWALL_RULE_NAME)
+   434                                                   return self.network_management_client.security_rules. \
+   435                                                       delete(self.resource_group, vm_firewall, name).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_containers at line 437
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   437                                               @profile
+   438                                               def list_containers(self, prefix=None, limit=None, marker=None):
+   439                                                   results = self.blob_service.list_containers(prefix=prefix,
+   440                                                                                               num_results=limit,
+   441                                                                                               marker=marker)
+   442                                                   return (results.items, results.next_marker)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_container at line 444
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   444                                               @profile
+   445                                               def create_container(self, container_name):
+   446                                                   try:
+   447                                                       self.blob_service.create_container(container_name,
+   448                                                                                          fail_on_exist=True)
+   449                                                   except AzureConflictHttpError as cloud_error:
+   450                                                       if cloud_error.error_code == "ContainerAlreadyExists":
+   451                                                           msg = "The given Bucket name '%s' already exists. Please " \
+   452                                                                 "use the `get` or `find` method to get a reference to " \
+   453                                                                 "an existing Bucket, or specify a new Bucket name to " \
+   454                                                                 "create.\nNote that in Azure, Buckets are contained " \
+   455                                                                 "in Storage Accounts." % container_name
+   456                                                           raise DuplicateResourceException(msg)
+   457                                           
+   458                                                   return self.blob_service.get_container_properties(container_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_container at line 460
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   460                                               @profile
+   461                                               def get_container(self, container_name):
+   462                                                   return self.blob_service.get_container_properties(container_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_container at line 464
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   464                                               @profile
+   465                                               def delete_container(self, container_name):
+   466                                                   self.blob_service.delete_container(container_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_blobs at line 468
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   468                                               @profile
+   469                                               def list_blobs(self, container_name, prefix=None):
+   470                                                   return self.blob_service.list_blobs(container_name, prefix=prefix)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob at line 472
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   472                                               @profile
+   473                                               def get_blob(self, container_name, blob_name):
+   474                                                   return self.blob_service.get_blob_properties(container_name, blob_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_blob_from_text at line 476
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   476                                               @profile
+   477                                               def create_blob_from_text(self, container_name, blob_name, text):
+   478                                                   self.blob_service.create_blob_from_text(container_name,
+   479                                                                                           blob_name, text)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_blob_from_file at line 481
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   481                                               @profile
+   482                                               def create_blob_from_file(self, container_name, blob_name, file_path):
+   483                                                   self.blob_service.create_blob_from_path(container_name,
+   484                                                                                           blob_name, file_path)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_blob at line 486
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   486                                               @profile
+   487                                               def delete_blob(self, container_name, blob_name):
+   488                                                   self.blob_service.delete_blob(container_name, blob_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob_url at line 490
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   490                                               @profile
+   491                                               def get_blob_url(self, container_name, blob_name, expiry_time):
+   492                                                   expiry_date = datetime.datetime.utcnow() + datetime.timedelta(
+   493                                                       seconds=expiry_time)
+   494                                                   sas = self.blob_service.generate_blob_shared_access_signature(
+   495                                                       container_name, blob_name, permission=BlobPermissions.READ,
+   496                                                       expiry=expiry_date)
+   497                                                   return self.blob_service.make_blob_url(container_name, blob_name,
+   498                                                                                          sas_token=sas)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob_content at line 500
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   500                                               @profile
+   501                                               def get_blob_content(self, container_name, blob_name):
+   502                                                   out_stream = BytesIO()
+   503                                                   self.blob_service.get_blob_to_stream(container_name,
+   504                                                                                        blob_name, out_stream)
+   505                                                   return out_stream
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_empty_disk at line 507
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   507                                               @profile
+   508                                               def create_empty_disk(self, disk_name, params):
+   509                                                   return self.compute_client.disks.create_or_update(
+   510                                                       self.resource_group,
+   511                                                       disk_name,
+   512                                                       params
+   513                                                   ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_snapshot_disk at line 515
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   515                                               @profile
+   516                                               def create_snapshot_disk(self, disk_name, params):
+   517                                                   return self.compute_client.disks.create_or_update(
+   518                                                       self.resource_group,
+   519                                                       disk_name,
+   520                                                       params
+   521                                                   ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_disk at line 523
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   523                                               @profile
+   524                                               def get_disk(self, disk_id):
+   525                                                   url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   526                                                                                        disk_id)
+   527                                                   disk_name = url_params.get(VOLUME_NAME)
+   528                                                   return self.compute_client.disks.get(self.resource_group, disk_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_disks at line 530
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   530                                               @profile
+   531                                               def list_disks(self):
+   532                                                   return self.compute_client.disks. \
+   533                                                       list_by_resource_group(self.resource_group)
+
+Total time: 61.3306 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_disk at line 535
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   535                                               @profile
+   536                                               def delete_disk(self, disk_id):
+   537         2          6.0      3.0      0.0          url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   538         2         61.0     30.5      0.0                                               disk_id)
+   539         2          3.0      1.5      0.0          disk_name = url_params.get(VOLUME_NAME)
+   540         2   61330574.0 30665287.0    100.0          self.compute_client.disks.delete(self.resource_group, disk_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_disk_tags at line 542
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   542                                               @profile
+   543                                               def update_disk_tags(self, disk_id, tags):
+   544                                                   url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   545                                                                                        disk_id)
+   546                                                   disk_name = url_params.get(VOLUME_NAME)
+   547                                                   return self.compute_client.disks.update(
+   548                                                       self.resource_group,
+   549                                                       disk_name,
+   550                                                       {'tags': tags},
+   551                                                       raw=True
+   552                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_snapshots at line 554
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   554                                               @profile
+   555                                               def list_snapshots(self):
+   556                                                   return self.compute_client.snapshots. \
+   557                                                       list_by_resource_group(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_snapshot at line 559
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   559                                               @profile
+   560                                               def get_snapshot(self, snapshot_id):
+   561                                                   url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   562                                                                                        snapshot_id)
+   563                                                   snapshot_name = url_params.get(SNAPSHOT_NAME)
+   564                                                   return self.compute_client.snapshots.get(self.resource_group,
+   565                                                                                            snapshot_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_snapshot at line 567
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   567                                               @profile
+   568                                               def create_snapshot(self, snapshot_name, params):
+   569                                                   return self.compute_client.snapshots.create_or_update(
+   570                                                       self.resource_group,
+   571                                                       snapshot_name,
+   572                                                       params
+   573                                                   ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_snapshot at line 575
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   575                                               @profile
+   576                                               def delete_snapshot(self, snapshot_id):
+   577                                                   url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   578                                                                                        snapshot_id)
+   579                                                   snapshot_name = url_params.get(SNAPSHOT_NAME)
+   580                                                   self.compute_client.snapshots.delete(self.resource_group,
+   581                                                                                        snapshot_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_snapshot_tags at line 583
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   583                                               @profile
+   584                                               def update_snapshot_tags(self, snapshot_id, tags):
+   585                                                   url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   586                                                                                        snapshot_id)
+   587                                                   snapshot_name = url_params.get(SNAPSHOT_NAME)
+   588                                                   return self.compute_client.snapshots.update(
+   589                                                       self.resource_group,
+   590                                                       snapshot_name,
+   591                                                       {'tags': tags},
+   592                                                       raw=True
+   593                                                   )
+
+Total time: 0.00022 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: is_gallery_image at line 595
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   595                                               @profile
+   596                                               def is_gallery_image(self, image_id):
+   597        11         10.0      0.9      4.5          url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   598        11        203.0     18.5     92.3                                               image_id)
+   599                                                   # If it is a gallery image, it will always have an offer
+   600        11          7.0      0.6      3.2          return 'offer' in url_params
+
+Total time: 31.1668 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_image at line 602
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   602                                               @profile
+   603                                               def create_image(self, name, params):
+   604         1        512.0    512.0      0.0          return self.compute_client.images. \
+   605         1          9.0      9.0      0.0              create_or_update(self.resource_group, name,
+   606         1   31166320.0 31166320.0    100.0                               params).result()
+
+Total time: 30.729 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_image at line 608
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   608                                               @profile
+   609                                               def delete_image(self, image_id):
+   610         1          3.0      3.0      0.0          url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   611         1         28.0     28.0      0.0                                               image_id)
+   612         1         28.0     28.0      0.0          if not self.is_gallery_image(image_id):
+   613         1          1.0      1.0      0.0              name = url_params.get(IMAGE_NAME)
+   614         1   30728980.0 30728980.0    100.0              self.compute_client.images.delete(self.resource_group, name).wait()
+
+Total time: 1.06767 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_images at line 616
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   616                                               @profile
+   617                                               def list_images(self):
+   618         6       2521.0    420.2      0.2          azure_images = list(self.compute_client.images.
+   619         6    1065136.0 177522.7     99.8                              list_by_resource_group(self.resource_group))
+   620         6         11.0      1.8      0.0          return azure_images
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_gallery_refs at line 622
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   622                                               @profile
+   623                                               def list_gallery_refs(self):
+   624                                                   return gallery_image_references
+
+Total time: 1.5034 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_image at line 626
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   626                                               @profile
+   627                                               def get_image(self, image_id):
+   628         7         22.0      3.1      0.0          url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   629         7        220.0     31.4      0.0                                               image_id)
+   630         7        212.0     30.3      0.0          if self.is_gallery_image(image_id):
+   631         1          5.0      5.0      0.0              return GalleryImageReference(publisher=url_params['publisher'],
+   632         1          1.0      1.0      0.0                                           offer=url_params['offer'],
+   633         1          0.0      0.0      0.0                                           sku=url_params['sku'],
+   634         1         38.0     38.0      0.0                                           version=url_params['version'])
+   635                                                   else:
+   636         6          7.0      1.2      0.0              name = url_params.get(IMAGE_NAME)
+   637         6    1502896.0 250482.7    100.0              return self.compute_client.images.get(self.resource_group, name)
+
+Total time: 92.9118 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_image_tags at line 639
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   639                                               @profile
+   640                                               def update_image_tags(self, image_id, tags):
+   641         3          7.0      2.3      0.0          url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   642         3         80.0     26.7      0.0                                               image_id)
+   643         3         83.0     27.7      0.0          if self.is_gallery_image(image_id):
+   644                                                       return True
+   645                                                   else:
+   646         3          3.0      1.0      0.0              name = url_params.get(IMAGE_NAME)
+   647         3       1395.0    465.0      0.0              return self.compute_client.images. \
+   648         3         23.0      7.7      0.0                  create_or_update(self.resource_group, name,
+   649                                                                            {
+   650         3          2.0      0.7      0.0                                       'tags': tags,
+   651         3   92910234.0 30970078.0    100.0                                       'location': self.region_name
+   652                                                                            }).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm_types at line 654
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   654                                               @profile
+   655                                               def list_vm_types(self):
+   656                                                   return self.compute_client.virtual_machine_sizes. \
+   657                                                       list(self.region_name)
+
+Total time: 0.008362 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_networks at line 659
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   659                                               @profile
+   660                                               def list_networks(self):
+   661         1       8273.0   8273.0     98.9          return self.network_management_client.virtual_networks.list(
+   662         1         89.0     89.0      1.1              self.resource_group)
+
+Total time: 0.988359 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_network at line 664
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   664                                               @profile
+   665                                               def get_network(self, network_id):
+   666         4          5.0      1.2      0.0          url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID,
+   667         4         85.0     21.2      0.0                                               network_id)
+   668         4          4.0      1.0      0.0          network_name = url_params.get(NETWORK_NAME)
+   669         4       2917.0    729.2      0.3          return self.network_management_client.virtual_networks.get(
+   670         4     985348.0 246337.0     99.7              self.resource_group, network_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_network at line 672
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   672                                               @profile
+   673                                               def create_network(self, name, params):
+   674                                                   return self.network_management_client.virtual_networks. \
+   675                                                       create_or_update(self.resource_group,
+   676                                                                        name,
+   677                                                                        parameters=params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_network at line 679
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   679                                               @profile
+   680                                               def delete_network(self, network_id):
+   681                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   682                                                   network_name = url_params.get(NETWORK_NAME)
+   683                                                   return self.network_management_client.virtual_networks. \
+   684                                                       delete(self.resource_group, network_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_network_tags at line 686
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   686                                               @profile
+   687                                               def update_network_tags(self, network_id, tags):
+   688                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   689                                                   network_name = url_params.get(NETWORK_NAME)
+   690                                                   return self.network_management_client.virtual_networks. \
+   691                                                       create_or_update(self.resource_group,
+   692                                                                        network_name, tags).result()
+
+Total time: 0.000219 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_network_id_for_subnet at line 694
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   694                                               @profile
+   695                                               def get_network_id_for_subnet(self, subnet_id):
+   696         4        122.0     30.5     55.7          url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID, subnet_id)
+   697         4          6.0      1.5      2.7          network_id = NETWORK_RESOURCE_ID[0]
+   698        20         15.0      0.8      6.8          for key, val in url_params.items():
+   699        16         74.0      4.6     33.8              network_id = network_id.replace("{" + key + "}", val)
+   700         4          2.0      0.5      0.9          return network_id
+
+Total time: 0.000922 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_subnets at line 702
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   702                                               @profile
+   703                                               def list_subnets(self, network_id):
+   704         1         54.0     54.0      5.9          url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   705         1          2.0      2.0      0.2          network_name = url_params.get(NETWORK_NAME)
+   706         1        800.0    800.0     86.8          return self.network_management_client.subnets. \
+   707         1         66.0     66.0      7.2              list(self.resource_group, network_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_subnet at line 709
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   709                                               @profile
+   710                                               def get_subnet(self, subnet_id):
+   711                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   712                                                                                        subnet_id)
+   713                                                   network_name = url_params.get(NETWORK_NAME)
+   714                                                   subnet_name = url_params.get(SUBNET_NAME)
+   715                                                   return self.network_management_client.subnets. \
+   716                                                       get(self.resource_group, network_name, subnet_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_subnet at line 718
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   718                                               @profile
+   719                                               def create_subnet(self, network_id, subnet_name, params):
+   720                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   721                                                   network_name = url_params.get(NETWORK_NAME)
+   722                                                   result_create = self.network_management_client \
+   723                                                       .subnets.create_or_update(
+   724                                                           self.resource_group,
+   725                                                           network_name,
+   726                                                           subnet_name,
+   727                                                           params
+   728                                                       )
+   729                                                   subnet_info = result_create.result()
+   730                                           
+   731                                                   return subnet_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: __if_subnet_in_use at line 733
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   733                                               @profile
+   734                                               def __if_subnet_in_use(e):
+   735                                                   # return True if the CloudError exception is due to subnet being in use
+   736                                                   if isinstance(e, CloudError):
+   737                                                       if e.error.error == "InUseSubnetCannotBeDeleted":
+   738                                                           return True
+   739                                                   return False
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_subnet at line 741
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   741                                               @tenacity.retry(stop=tenacity.stop_after_attempt(5),
+   742                                                               retry=tenacity.retry_if_exception(__if_subnet_in_use),
+   743                                                               wait=tenacity.wait_fixed(5),
+   744                                                               reraise=True)
+   745                                               @profile
+   746                                               def delete_subnet(self, subnet_id):
+   747                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   748                                                                                        subnet_id)
+   749                                                   network_name = url_params.get(NETWORK_NAME)
+   750                                                   subnet_name = url_params.get(SUBNET_NAME)
+   751                                           
+   752                                                   try:
+   753                                                       result_delete = self.network_management_client \
+   754                                                           .subnets.delete(
+   755                                                               self.resource_group,
+   756                                                               network_name,
+   757                                                               subnet_name
+   758                                                           )
+   759                                                       result_delete.wait()
+   760                                                   except CloudError as cloud_error:
+   761                                                       log.exception(cloud_error.message)
+   762                                                       raise cloud_error
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_floating_ip at line 764
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   764                                               @profile
+   765                                               def create_floating_ip(self, public_ip_name, public_ip_parameters):
+   766                                                   return self.network_management_client.public_ip_addresses. \
+   767                                                       create_or_update(self.resource_group,
+   768                                                                        public_ip_name,
+   769                                                                        public_ip_parameters).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_floating_ip at line 771
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   771                                               @profile
+   772                                               def get_floating_ip(self, public_ip_id):
+   773                                                   url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   774                                                                                        public_ip_id)
+   775                                                   public_ip_name = url_params.get(PUBLIC_IP_NAME)
+   776                                                   return self.network_management_client. \
+   777                                                       public_ip_addresses.get(self.resource_group, public_ip_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_floating_ip at line 779
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   779                                               @profile
+   780                                               def delete_floating_ip(self, public_ip_id):
+   781                                                   url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   782                                                                                        public_ip_id)
+   783                                                   public_ip_name = url_params.get(PUBLIC_IP_NAME)
+   784                                                   self.network_management_client. \
+   785                                                       public_ip_addresses.delete(self.resource_group,
+   786                                                                                  public_ip_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_fip_tags at line 788
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   788                                               @profile
+   789                                               def update_fip_tags(self, fip_id, tags):
+   790                                                   url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   791                                                                                        fip_id)
+   792                                                   fip_name = url_params.get(PUBLIC_IP_NAME)
+   793                                                   self.network_management_client.public_ip_addresses. \
+   794                                                       create_or_update(self.resource_group,
+   795                                                                        fip_name, tags).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_floating_ips at line 797
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   797                                               @profile
+   798                                               def list_floating_ips(self):
+   799                                                   return self.network_management_client.public_ip_addresses.list(
+   800                                                       self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm at line 802
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   802                                               @profile
+   803                                               def list_vm(self):
+   804                                                   return self.compute_client.virtual_machines.list(
+   805                                                       self.resource_group
+   806                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: restart_vm at line 808
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   808                                               @profile
+   809                                               def restart_vm(self, vm_id):
+   810                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   811                                                                                        vm_id)
+   812                                                   vm_name = url_params.get(VM_NAME)
+   813                                                   return self.compute_client.virtual_machines.restart(
+   814                                                       self.resource_group, vm_name).wait()
+
+Total time: 81.5368 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm at line 816
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   816                                               @profile
+   817                                               def delete_vm(self, vm_id):
+   818         2          6.0      3.0      0.0          url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   819         2         57.0     28.5      0.0                                               vm_id)
+   820         2          2.0      1.0      0.0          vm_name = url_params.get(VM_NAME)
+   821         2        929.0    464.5      0.0          return self.compute_client.virtual_machines.delete(
+   822         2   81535764.0 40767882.0    100.0              self.resource_group, vm_name).wait()
+
+Total time: 0.891989 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_vm at line 824
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   824                                               @profile
+   825                                               def get_vm(self, vm_id):
+   826         4         22.0      5.5      0.0          url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   827         4        201.0     50.2      0.0                                               vm_id)
+   828         4          8.0      2.0      0.0          vm_name = url_params.get(VM_NAME)
+   829         4       2873.0    718.2      0.3          return self.compute_client.virtual_machines.get(
+   830         4         47.0     11.8      0.0              self.resource_group,
+   831         4          5.0      1.2      0.0              vm_name,
+   832         4     888833.0 222208.2     99.6              expand='instanceView'
+   833                                                   )
+
+Total time: 220.739 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm at line 835
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   835                                               @profile
+   836                                               def create_vm(self, vm_name, params):
+   837         2       7168.0   3584.0      0.0          return self.compute_client.virtual_machines. \
+   838         2         16.0      8.0      0.0              create_or_update(self.resource_group,
+   839         2  220731539.0 110365769.5    100.0                               vm_name, params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm at line 841
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   841                                               @profile
+   842                                               def update_vm(self, vm_id, params):
+   843                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   844                                                                                        vm_id)
+   845                                                   vm_name = url_params.get(VM_NAME)
+   846                                                   return self.compute_client.virtual_machines. \
+   847                                                       create_or_update(self.resource_group,
+   848                                                                        vm_name, params, raw=True)
+
+Total time: 135.517 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: deallocate_vm at line 850
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   850                                               @profile
+   851                                               def deallocate_vm(self, vm_id):
+   852         3          7.0      2.3      0.0          url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   853         3         73.0     24.3      0.0                                               vm_id)
+   854         3          4.0      1.3      0.0          vm_name = url_params.get(VM_NAME)
+   855         3       1297.0    432.3      0.0          self.compute_client. \
+   856         3         21.0      7.0      0.0              virtual_machines.deallocate(self.resource_group,
+   857         3  135515592.0 45171864.0    100.0                                          vm_name).wait()
+
+Total time: 0.282532 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: generalize_vm at line 859
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   859                                               @profile
+   860                                               def generalize_vm(self, vm_id):
+   861         1          3.0      3.0      0.0          url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   862         1         32.0     32.0      0.0                                               vm_id)
+   863         1          2.0      2.0      0.0          vm_name = url_params.get(VM_NAME)
+   864         1        511.0    511.0      0.2          self.compute_client.virtual_machines. \
+   865         1     281984.0 281984.0     99.8              generalize(self.resource_group, vm_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: start_vm at line 867
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   867                                               @profile
+   868                                               def start_vm(self, vm_id):
+   869                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   870                                                                                        vm_id)
+   871                                                   vm_name = url_params.get(VM_NAME)
+   872                                                   self.compute_client.virtual_machines. \
+   873                                                       start(self.resource_group,
+   874                                                             vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm_tags at line 876
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   876                                               @profile
+   877                                               def update_vm_tags(self, vm_id, tags):
+   878                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   879                                                                                        vm_id)
+   880                                                   vm_name = url_params.get(VM_NAME)
+   881                                                   self.compute_client.virtual_machines. \
+   882                                                       create_or_update(self.resource_group,
+   883                                                                        vm_name, tags).result()
+
+Total time: 21.3373 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_nic at line 885
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   885                                               @profile
+   886                                               def delete_nic(self, nic_id):
+   887         2          6.0      3.0      0.0          nic_params = azure_helpers.\
+   888         2         50.0     25.0      0.0              parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   889         2          2.0      1.0      0.0          nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   890         2       1434.0    717.0      0.0          self.network_management_client. \
+   891         2         16.0      8.0      0.0              network_interfaces.delete(self.resource_group,
+   892         2   21335790.0 10667895.0    100.0                                        nic_name).wait()
+
+Total time: 1.76043 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_nic at line 894
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   894                                               @profile
+   895                                               def get_nic(self, nic_id):
+   896         6         14.0      2.3      0.0          nic_params = azure_helpers.\
+   897         6        178.0     29.7      0.0              parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   898         6          9.0      1.5      0.0          nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   899         6       4471.0    745.2      0.3          return self.network_management_client. \
+   900         6    1755758.0 292626.3     99.7              network_interfaces.get(self.resource_group, nic_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_nic at line 902
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   902                                               @profile
+   903                                               def update_nic(self, nic_id, params):
+   904                                                   nic_params = azure_helpers.\
+   905                                                       parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   906                                                   nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   907                                                   async_nic_creation = self.network_management_client. \
+   908                                                       network_interfaces.create_or_update(
+   909                                                           self.resource_group,
+   910                                                           nic_name,
+   911                                                           params
+   912                                                       )
+   913                                                   nic_info = async_nic_creation.result()
+   914                                                   return nic_info
+
+Total time: 61.8844 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_nic at line 916
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   916                                               @profile
+   917                                               def create_nic(self, nic_name, params):
+   918         2       1446.0    723.0      0.0          return self.network_management_client. \
+   919                                                       network_interfaces.create_or_update(
+   920         2         41.0     20.5      0.0                  self.resource_group,
+   921         2          2.0      1.0      0.0                  nic_name,
+   922         2   61882952.0 30941476.0    100.0                  params
+   923                                                       ).result()
+
+Total time: 0.151782 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_public_key at line 925
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   925                                               @profile
+   926                                               def create_public_key(self, entity):
+   927         2      89356.0  44678.0     58.9          return self.table_service. \
+   928         2         14.0      7.0      0.0              insert_or_replace_entity(self.public_key_storage_table_name,
+   929         2      62412.0  31206.0     41.1                                       entity)
+
+Total time: 1.5317 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_public_key at line 931
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   931                                               @profile
+   932                                               def get_public_key(self, name):
+   933         4    1342278.0 335569.5     87.6          entities = self.table_service. \
+   934         4         38.0      9.5      0.0              query_entities(self.public_key_storage_table_name,
+   935         4     189375.0  47343.8     12.4                             "Name eq '{0}'".format(name), num_results=1)
+   936                                           
+   937         4         14.0      3.5      0.0          return entities.items[0] if len(entities.items) > 0 else None
+
+Total time: 0.253359 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_public_key at line 939
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   939                                               @profile
+   940                                               def delete_public_key(self, entity):
+   941         2     181261.0  90630.5     71.5          self.table_service.delete_entity(self.public_key_storage_table_name,
+   942         2      72098.0  36049.0     28.5                                           entity.PartitionKey, entity.RowKey)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_public_keys at line 944
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   944                                               @profile
+   945                                               def list_public_keys(self, partition_key, limit=None, marker=None):
+   946                                                   entities = self.table_service. \
+   947                                                       query_entities(self.public_key_storage_table_name,
+   948                                                                      "PartitionKey eq '{0}'".format(partition_key),
+   949                                                                      marker=marker, num_results=limit)
+   950                                                   return (entities.items, entities.next_marker)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_route_table at line 952
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   952                                               @profile
+   953                                               def delete_route_table(self, route_table_name):
+   954                                                   self.network_management_client. \
+   955                                                       route_tables.delete(self.resource_group, route_table_name
+   956                                                                           ).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: attach_subnet_to_route_table at line 958
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   958                                               @profile
+   959                                               def attach_subnet_to_route_table(self, subnet_id, route_table_id):
+   960                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   961                                                                                        subnet_id)
+   962                                                   network_name = url_params.get(NETWORK_NAME)
+   963                                                   subnet_name = url_params.get(SUBNET_NAME)
+   964                                           
+   965                                                   subnet_info = self.network_management_client.subnets.get(
+   966                                                       self.resource_group,
+   967                                                       network_name,
+   968                                                       subnet_name
+   969                                                   )
+   970                                                   if subnet_info:
+   971                                                       subnet_info.route_table = {
+   972                                                           'id': route_table_id
+   973                                                       }
+   974                                           
+   975                                                       result_create = self.network_management_client. \
+   976                                                           subnets.create_or_update(
+   977                                                            self.resource_group,
+   978                                                            network_name,
+   979                                                            subnet_name,
+   980                                                            subnet_info)
+   981                                                       subnet_info = result_create.result()
+   982                                           
+   983                                                   return subnet_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: detach_subnet_to_route_table at line 985
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   985                                               @profile
+   986                                               def detach_subnet_to_route_table(self, subnet_id, route_table_id):
+   987                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   988                                                                                        subnet_id)
+   989                                                   network_name = url_params.get(NETWORK_NAME)
+   990                                                   subnet_name = url_params.get(SUBNET_NAME)
+   991                                           
+   992                                                   subnet_info = self.network_management_client.subnets.get(
+   993                                                       self.resource_group,
+   994                                                       network_name,
+   995                                                       subnet_name
+   996                                                   )
+   997                                           
+   998                                                   if subnet_info and subnet_info.route_table.id == route_table_id:
+   999                                                       subnet_info.route_table = None
+  1000                                           
+  1001                                                       result_create = self.network_management_client. \
+  1002                                                           subnets.create_or_update(
+  1003                                                            self.resource_group,
+  1004                                                            network_name,
+  1005                                                            subnet_name,
+  1006                                                            subnet_info)
+  1007                                                       subnet_info = result_create.result()
+  1008                                           
+  1009                                                   return subnet_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_route_tables at line 1011
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1011                                               @profile
+  1012                                               def list_route_tables(self):
+  1013                                                   return self.network_management_client. \
+  1014                                                       route_tables.list(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_route_table at line 1016
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1016                                               @profile
+  1017                                               def get_route_table(self, router_id):
+  1018                                                   url_params = azure_helpers.parse_url(ROUTER_RESOURCE_ID,
+  1019                                                                                        router_id)
+  1020                                                   router_name = url_params.get(ROUTER_NAME)
+  1021                                                   return self.network_management_client. \
+  1022                                                       route_tables.get(self.resource_group, router_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_route_table at line 1024
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1024                                               @profile
+  1025                                               def create_route_table(self, route_table_name, params):
+  1026                                                   return self.network_management_client. \
+  1027                                                       route_tables.create_or_update(
+  1028                                                        self.resource_group,
+  1029                                                        route_table_name, params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_route_table_tags at line 1031
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1031                                               @profile
+  1032                                               def update_route_table_tags(self, route_table_name, tags):
+  1033                                                   self.network_management_client.route_tables. \
+  1034                                                       create_or_update(self.resource_group,
+  1035                                                                        route_table_name, tags).result()
+

+ 1470 - 0
results/interface.res

@@ -0,0 +1,1470 @@
+cloudbridge.test.test_interface.CloudInterfaceTestCase
+
+
+Test output
+ ......
+----------------------------------------------------------------------
+Ran 6 tests in 3.860s
+
+OK
+
+Wrote profile results to run_tests.py.lprof
+Timer unit: 1e-06 s
+
+Total time: 0.6384 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: __init__ at line 160
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   160                                               @profile
+   161                                               def __init__(self, config):
+   162         2          7.0      3.5      0.0          self._config = config
+   163         2          5.0      2.5      0.0          self.subscription_id = str(config.get('azure_subscription_id'))
+   164         2          1.0      0.5      0.0          self._credentials = ServicePrincipalCredentials(
+   165         2          1.0      0.5      0.0              client_id=config.get('azure_client_id'),
+   166         2          2.0      1.0      0.0              secret=config.get('azure_secret'),
+   167         2     638344.0 319172.0    100.0              tenant=config.get('azure_tenant')
+   168                                                   )
+   169                                           
+   170         2          6.0      3.0      0.0          self._access_token = config.get('azure_access_token')
+   171         2          2.0      1.0      0.0          self._resource_client = None
+   172         2          2.0      1.0      0.0          self._storage_client = None
+   173         2          2.0      1.0      0.0          self._network_management_client = None
+   174         2          2.0      1.0      0.0          self._subscription_client = None
+   175         2          2.0      1.0      0.0          self._compute_client = None
+   176         2          2.0      1.0      0.0          self._access_key_result = None
+   177         2          3.0      1.5      0.0          self._block_blob_service = None
+   178         2          1.0      0.5      0.0          self._table_service = None
+   179         2          1.0      0.5      0.0          self._storage_account = None
+   180                                           
+   181         2         17.0      8.5      0.0          log.debug("azure subscription : %s", self.subscription_id)
+
+Total time: 0.373592 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: access_key_result at line 183
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   183                                               @property
+   184                                               @tenacity.retry(stop=tenacity.stop_after_attempt(5), reraise=True)
+   185                                               @profile
+   186                                               def access_key_result(self):
+   187         1          1.0      1.0      0.0          if not self._access_key_result:
+   188         1          3.0      3.0      0.0              storage_account = self.storage_account
+   189                                           
+   190         1     153188.0 153188.0     41.0              if self.get_storage_account(storage_account).\
+   191         1          2.0      2.0      0.0                      provisioning_state.value != 'Succeeded':
+   192                                                           log.debug(
+   193                                                               "Storage account %s is not in Succeeded state yet. ",
+   194                                                               storage_account)
+   195                                                           raise WaitStateException(
+   196                                                               "Waited too long for storage account: {0} to "
+   197                                                               "become ready.".format(
+   198                                                                   storage_account,
+   199                                                                   self.get_storage_account(storage_account).
+   200                                                                   provisioning_state))
+   201                                           
+   202         1        212.0    212.0      0.1              self._access_key_result = self.storage_client.storage_accounts. \
+   203         1     220184.0 220184.0     58.9                  list_keys(self.resource_group, storage_account)
+   204         1          2.0      2.0      0.0          return self._access_key_result
+
+Total time: 4e-06 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: resource_group at line 206
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   206                                               @property
+   207                                               @profile
+   208                                               def resource_group(self):
+   209         3          4.0      1.3    100.0          return self._config.get('azure_resource_group')
+
+Total time: 4e-06 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: storage_account at line 211
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   211                                               @property
+   212                                               @profile
+   213                                               def storage_account(self):
+   214         3          4.0      1.3    100.0          return self._config.get('azure_storage_account')
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: region_name at line 216
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   216                                               @property
+   217                                               @profile
+   218                                               def region_name(self):
+   219                                                   return self._config.get('azure_region_name')
+
+Total time: 3e-06 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: public_key_storage_table_name at line 221
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   221                                               @property
+   222                                               @profile
+   223                                               def public_key_storage_table_name(self):
+   224         2          3.0      1.5    100.0          return self._config.get('azure_public_key_storage_table_name')
+
+Total time: 0.006364 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: storage_client at line 226
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   226                                               @property
+   227                                               @profile
+   228                                               def storage_client(self):
+   229         3          5.0      1.7      0.1          if not self._storage_client:
+   230                                                       self._storage_client = \
+   231         1          1.0      1.0      0.0                  StorageManagementClient(self._credentials,
+   232         1       6354.0   6354.0     99.8                                          self.subscription_id)
+   233         3          4.0      1.3      0.1          return self._storage_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: subscription_client at line 235
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   235                                               @property
+   236                                               @profile
+   237                                               def subscription_client(self):
+   238                                                   if not self._subscription_client:
+   239                                                       self._subscription_client = SubscriptionClient(self._credentials)
+   240                                                   return self._subscription_client
+
+Total time: 0.025636 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: resource_client at line 242
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   242                                               @property
+   243                                               @profile
+   244                                               def resource_client(self):
+   245         3          8.0      2.7      0.0          if not self._resource_client:
+   246                                                       self._resource_client = \
+   247         2          2.0      1.0      0.0                  ResourceManagementClient(self._credentials,
+   248         2      25619.0  12809.5     99.9                                           self.subscription_id)
+   249         3          7.0      2.3      0.0          return self._resource_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: compute_client at line 251
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   251                                               @property
+   252                                               @profile
+   253                                               def compute_client(self):
+   254                                                   if not self._compute_client:
+   255                                                       self._compute_client = \
+   256                                                           ComputeManagementClient(self._credentials,
+   257                                                                                   self.subscription_id)
+   258                                                   return self._compute_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: network_management_client at line 260
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   260                                               @property
+   261                                               @profile
+   262                                               def network_management_client(self):
+   263                                                   if not self._network_management_client:
+   264                                                       self._network_management_client = NetworkManagementClient(
+   265                                                           self._credentials, self.subscription_id)
+   266                                                   return self._network_management_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: blob_service at line 268
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   268                                               @property
+   269                                               @profile
+   270                                               def blob_service(self):
+   271                                                   self._get_or_create_storage_account()
+   272                                                   if not self._block_blob_service:
+   273                                                       if self._access_token:
+   274                                                           token_credential = TokenCredential(self._access_token)
+   275                                                           self._block_blob_service = BlockBlobService(
+   276                                                               account_name=self.storage_account,
+   277                                                               token_credential=token_credential)
+   278                                                       else:
+   279                                                           self._block_blob_service = BlockBlobService(
+   280                                                               account_name=self.storage_account,
+   281                                                               account_key=self.access_key_result.keys[0].value)
+   282                                                   return self._block_blob_service
+
+Total time: 1.07638 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: table_service at line 284
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   284                                               @property
+   285                                               @profile
+   286                                               def table_service(self):
+   287         1     538972.0 538972.0     50.1          self._get_or_create_storage_account()
+   288         1          1.0      1.0      0.0          if not self._table_service:
+   289         1          4.0      4.0      0.0              self._table_service = TableService(
+   290         1          7.0      7.0      0.0                  self.storage_account,
+   291         1     374051.0 374051.0     34.8                  self.access_key_result.keys[0].value)
+   292         1          1.0      1.0      0.0          if not self._table_service. \
+   293         1     163345.0 163345.0     15.2                  exists(table_name=self.public_key_storage_table_name):
+   294                                                       self._table_service.create_table(
+   295                                                           self.public_key_storage_table_name)
+   296         1          2.0      2.0      0.0          return self._table_service
+
+Total time: 0.706347 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_resource_group at line 298
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   298                                               @profile
+   299                                               def get_resource_group(self, name):
+   300         3     706347.0 235449.0    100.0          return self.resource_client.resource_groups.get(name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_resource_group at line 302
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   302                                               @profile
+   303                                               def create_resource_group(self, name, parameters):
+   304                                                   return self.resource_client.resource_groups. \
+   305                                                       create_or_update(name, parameters)
+
+Total time: 0.691958 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_storage_account at line 307
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   307                                               @profile
+   308                                               def get_storage_account(self, storage_account):
+   309         2     261869.0 130934.5     37.8          return self.storage_client.storage_accounts. \
+   310         2     430089.0 215044.5     62.2              get_properties(self.resource_group, storage_account)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_storage_account at line 312
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   312                                               @profile
+   313                                               def create_storage_account(self, name, params):
+   314                                                   return self.storage_client.storage_accounts. \
+   315                                                       create(self.resource_group, name.lower(), params).result()
+
+Total time: 0.538814 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: _get_or_create_storage_account at line 319
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   319                                               @tenacity.retry(stop=tenacity.stop_after_attempt(2),
+   320                                                               retry=tenacity.retry_if_exception_type(CloudError),
+   321                                                               reraise=True)
+   322                                               @profile
+   323                                               def _get_or_create_storage_account(self):
+   324         1          1.0      1.0      0.0          if self._storage_account:
+   325                                                       return self._storage_account
+   326                                                   else:
+   327         1          1.0      1.0      0.0              try:
+   328                                                           self._storage_account = \
+   329         1     538812.0 538812.0    100.0                      self.get_storage_account(self.storage_account)
+   330                                                       except CloudError as cloud_error:
+   331                                                           if cloud_error.error.error == "ResourceNotFound":
+   332                                                               storage_account_params = {
+   333                                                                   'sku': {
+   334                                                                       'name': 'Standard_LRS'
+   335                                                                   },
+   336                                                                   'kind': 'storage',
+   337                                                                   'location': self.region_name,
+   338                                                               }
+   339                                                               try:
+   340                                                                   self._storage_account = \
+   341                                                                       self.create_storage_account(self.storage_account,
+   342                                                                                                   storage_account_params)
+   343                                                               except CloudError as cloud_error2:  # pragma: no cover
+   344                                                                   if cloud_error2.error.error == "AuthorizationFailed":
+   345                                                                       mess = 'The following error was returned by ' \
+   346                                                                              'Azure:\n%s\n\nThis is likely because the' \
+   347                                                                              ' Role associated with the provided ' \
+   348                                                                              'credentials does not allow for Storage ' \
+   349                                                                              'Account creation.\nA Storage Account is ' \
+   350                                                                              'necessary in order to perform the ' \
+   351                                                                              'desired operation. You must either ' \
+   352                                                                              'provide an existing Storage Account name' \
+   353                                                                              ' as part of the configuration, or ' \
+   354                                                                              'elevate the associated Role.\nFor more ' \
+   355                                                                              'information on roles, see: https://docs.' \
+   356                                                                              'microsoft.com/en-us/azure/role-based-' \
+   357                                                                              'access-control/overview\n' % cloud_error2
+   358                                                                       raise ProviderConnectionException(mess)
+   359                                           
+   360                                                                   elif cloud_error2.error.error == \
+   361                                                                           "StorageAccountAlreadyTaken":
+   362                                                                       mess = 'The following error was ' \
+   363                                                                              'returned by Azure:\n%s\n\n' \
+   364                                                                              'Note that Storage Account names must be ' \
+   365                                                                              'unique across Azure (not just in your ' \
+   366                                                                              'subscription).\nFor more information ' \
+   367                                                                              'see https://docs.microsoft.com/en-us/' \
+   368                                                                              'azure/azure-resource-manager/resource-' \
+   369                                                                              'manager-storage-account-name-errors\n' \
+   370                                                                              % cloud_error2
+   371                                                                       raise InvalidLabelException(mess)
+   372                                                                   else:
+   373                                                                       raise cloud_error2
+   374                                                           else:
+   375                                                               raise cloud_error
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_locations at line 377
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   377                                               @profile
+   378                                               def list_locations(self):
+   379                                                   return self.subscription_client.subscriptions. \
+   380                                                       list_locations(self.subscription_id)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm_firewall at line 382
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   382                                               @profile
+   383                                               def list_vm_firewall(self):
+   384                                                   return self.network_management_client.network_security_groups. \
+   385                                                       list(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm_firewall at line 387
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   387                                               @profile
+   388                                               def create_vm_firewall(self, name, parameters):
+   389                                                   return self.network_management_client.network_security_groups. \
+   390                                                       create_or_update(self.resource_group, name,
+   391                                                                        parameters).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm_firewall_tags at line 393
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   393                                               @profile
+   394                                               def update_vm_firewall_tags(self, fw_id, tags):
+   395                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   396                                                                                        fw_id)
+   397                                                   name = url_params.get(VM_FIREWALL_NAME)
+   398                                                   return self.network_management_client.network_security_groups. \
+   399                                                       create_or_update(self.resource_group, name,
+   400                                                                        {'tags': tags,
+   401                                                                         'location': self.region_name}).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_vm_firewall at line 403
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   403                                               @profile
+   404                                               def get_vm_firewall(self, fw_id):
+   405                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   406                                                                                        fw_id)
+   407                                                   fw_name = url_params.get(VM_FIREWALL_NAME)
+   408                                                   return self.network_management_client.network_security_groups. \
+   409                                                       get(self.resource_group, fw_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm_firewall at line 411
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   411                                               @profile
+   412                                               def delete_vm_firewall(self, fw_id):
+   413                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   414                                                                                        fw_id)
+   415                                                   name = url_params.get(VM_FIREWALL_NAME)
+   416                                                   self.network_management_client \
+   417                                                       .network_security_groups.delete(self.resource_group, name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm_firewall_rule at line 419
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   419                                               @profile
+   420                                               def create_vm_firewall_rule(self, fw_id,
+   421                                                                           rule_name, parameters):
+   422                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   423                                                                                        fw_id)
+   424                                                   vm_firewall_name = url_params.get(VM_FIREWALL_NAME)
+   425                                                   return self.network_management_client.security_rules. \
+   426                                                       create_or_update(self.resource_group, vm_firewall_name,
+   427                                                                        rule_name, parameters).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm_firewall_rule at line 429
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   429                                               @profile
+   430                                               def delete_vm_firewall_rule(self, fw_rule_id, vm_firewall):
+   431                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RULE_RESOURCE_ID,
+   432                                                                                        fw_rule_id)
+   433                                                   name = url_params.get(VM_FIREWALL_RULE_NAME)
+   434                                                   return self.network_management_client.security_rules. \
+   435                                                       delete(self.resource_group, vm_firewall, name).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_containers at line 437
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   437                                               @profile
+   438                                               def list_containers(self, prefix=None, limit=None, marker=None):
+   439                                                   results = self.blob_service.list_containers(prefix=prefix,
+   440                                                                                               num_results=limit,
+   441                                                                                               marker=marker)
+   442                                                   return (results.items, results.next_marker)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_container at line 444
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   444                                               @profile
+   445                                               def create_container(self, container_name):
+   446                                                   try:
+   447                                                       self.blob_service.create_container(container_name,
+   448                                                                                          fail_on_exist=True)
+   449                                                   except AzureConflictHttpError as cloud_error:
+   450                                                       if cloud_error.error_code == "ContainerAlreadyExists":
+   451                                                           msg = "The given Bucket name '%s' already exists. Please " \
+   452                                                                 "use the `get` or `find` method to get a reference to " \
+   453                                                                 "an existing Bucket, or specify a new Bucket name to " \
+   454                                                                 "create.\nNote that in Azure, Buckets are contained " \
+   455                                                                 "in Storage Accounts." % container_name
+   456                                                           raise DuplicateResourceException(msg)
+   457                                           
+   458                                                   return self.blob_service.get_container_properties(container_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_container at line 460
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   460                                               @profile
+   461                                               def get_container(self, container_name):
+   462                                                   return self.blob_service.get_container_properties(container_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_container at line 464
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   464                                               @profile
+   465                                               def delete_container(self, container_name):
+   466                                                   self.blob_service.delete_container(container_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_blobs at line 468
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   468                                               @profile
+   469                                               def list_blobs(self, container_name, prefix=None):
+   470                                                   return self.blob_service.list_blobs(container_name, prefix=prefix)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob at line 472
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   472                                               @profile
+   473                                               def get_blob(self, container_name, blob_name):
+   474                                                   return self.blob_service.get_blob_properties(container_name, blob_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_blob_from_text at line 476
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   476                                               @profile
+   477                                               def create_blob_from_text(self, container_name, blob_name, text):
+   478                                                   self.blob_service.create_blob_from_text(container_name,
+   479                                                                                           blob_name, text)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_blob_from_file at line 481
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   481                                               @profile
+   482                                               def create_blob_from_file(self, container_name, blob_name, file_path):
+   483                                                   self.blob_service.create_blob_from_path(container_name,
+   484                                                                                           blob_name, file_path)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_blob at line 486
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   486                                               @profile
+   487                                               def delete_blob(self, container_name, blob_name):
+   488                                                   self.blob_service.delete_blob(container_name, blob_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob_url at line 490
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   490                                               @profile
+   491                                               def get_blob_url(self, container_name, blob_name, expiry_time):
+   492                                                   expiry_date = datetime.datetime.utcnow() + datetime.timedelta(
+   493                                                       seconds=expiry_time)
+   494                                                   sas = self.blob_service.generate_blob_shared_access_signature(
+   495                                                       container_name, blob_name, permission=BlobPermissions.READ,
+   496                                                       expiry=expiry_date)
+   497                                                   return self.blob_service.make_blob_url(container_name, blob_name,
+   498                                                                                          sas_token=sas)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob_content at line 500
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   500                                               @profile
+   501                                               def get_blob_content(self, container_name, blob_name):
+   502                                                   out_stream = BytesIO()
+   503                                                   self.blob_service.get_blob_to_stream(container_name,
+   504                                                                                        blob_name, out_stream)
+   505                                                   return out_stream
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_empty_disk at line 507
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   507                                               @profile
+   508                                               def create_empty_disk(self, disk_name, params):
+   509                                                   return self.compute_client.disks.create_or_update(
+   510                                                       self.resource_group,
+   511                                                       disk_name,
+   512                                                       params
+   513                                                   ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_snapshot_disk at line 515
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   515                                               @profile
+   516                                               def create_snapshot_disk(self, disk_name, params):
+   517                                                   return self.compute_client.disks.create_or_update(
+   518                                                       self.resource_group,
+   519                                                       disk_name,
+   520                                                       params
+   521                                                   ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_disk at line 523
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   523                                               @profile
+   524                                               def get_disk(self, disk_id):
+   525                                                   url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   526                                                                                        disk_id)
+   527                                                   disk_name = url_params.get(VOLUME_NAME)
+   528                                                   return self.compute_client.disks.get(self.resource_group, disk_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_disks at line 530
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   530                                               @profile
+   531                                               def list_disks(self):
+   532                                                   return self.compute_client.disks. \
+   533                                                       list_by_resource_group(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_disk at line 535
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   535                                               @profile
+   536                                               def delete_disk(self, disk_id):
+   537                                                   url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   538                                                                                        disk_id)
+   539                                                   disk_name = url_params.get(VOLUME_NAME)
+   540                                                   self.compute_client.disks.delete(self.resource_group, disk_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_disk_tags at line 542
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   542                                               @profile
+   543                                               def update_disk_tags(self, disk_id, tags):
+   544                                                   url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   545                                                                                        disk_id)
+   546                                                   disk_name = url_params.get(VOLUME_NAME)
+   547                                                   return self.compute_client.disks.update(
+   548                                                       self.resource_group,
+   549                                                       disk_name,
+   550                                                       {'tags': tags},
+   551                                                       raw=True
+   552                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_snapshots at line 554
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   554                                               @profile
+   555                                               def list_snapshots(self):
+   556                                                   return self.compute_client.snapshots. \
+   557                                                       list_by_resource_group(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_snapshot at line 559
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   559                                               @profile
+   560                                               def get_snapshot(self, snapshot_id):
+   561                                                   url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   562                                                                                        snapshot_id)
+   563                                                   snapshot_name = url_params.get(SNAPSHOT_NAME)
+   564                                                   return self.compute_client.snapshots.get(self.resource_group,
+   565                                                                                            snapshot_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_snapshot at line 567
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   567                                               @profile
+   568                                               def create_snapshot(self, snapshot_name, params):
+   569                                                   return self.compute_client.snapshots.create_or_update(
+   570                                                       self.resource_group,
+   571                                                       snapshot_name,
+   572                                                       params
+   573                                                   ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_snapshot at line 575
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   575                                               @profile
+   576                                               def delete_snapshot(self, snapshot_id):
+   577                                                   url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   578                                                                                        snapshot_id)
+   579                                                   snapshot_name = url_params.get(SNAPSHOT_NAME)
+   580                                                   self.compute_client.snapshots.delete(self.resource_group,
+   581                                                                                        snapshot_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_snapshot_tags at line 583
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   583                                               @profile
+   584                                               def update_snapshot_tags(self, snapshot_id, tags):
+   585                                                   url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   586                                                                                        snapshot_id)
+   587                                                   snapshot_name = url_params.get(SNAPSHOT_NAME)
+   588                                                   return self.compute_client.snapshots.update(
+   589                                                       self.resource_group,
+   590                                                       snapshot_name,
+   591                                                       {'tags': tags},
+   592                                                       raw=True
+   593                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: is_gallery_image at line 595
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   595                                               @profile
+   596                                               def is_gallery_image(self, image_id):
+   597                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   598                                                                                        image_id)
+   599                                                   # If it is a gallery image, it will always have an offer
+   600                                                   return 'offer' in url_params
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_image at line 602
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   602                                               @profile
+   603                                               def create_image(self, name, params):
+   604                                                   return self.compute_client.images. \
+   605                                                       create_or_update(self.resource_group, name,
+   606                                                                        params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_image at line 608
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   608                                               @profile
+   609                                               def delete_image(self, image_id):
+   610                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   611                                                                                        image_id)
+   612                                                   if not self.is_gallery_image(image_id):
+   613                                                       name = url_params.get(IMAGE_NAME)
+   614                                                       self.compute_client.images.delete(self.resource_group, name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_images at line 616
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   616                                               @profile
+   617                                               def list_images(self):
+   618                                                   azure_images = list(self.compute_client.images.
+   619                                                                       list_by_resource_group(self.resource_group))
+   620                                                   return azure_images
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_gallery_refs at line 622
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   622                                               @profile
+   623                                               def list_gallery_refs(self):
+   624                                                   return gallery_image_references
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_image at line 626
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   626                                               @profile
+   627                                               def get_image(self, image_id):
+   628                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   629                                                                                        image_id)
+   630                                                   if self.is_gallery_image(image_id):
+   631                                                       return GalleryImageReference(publisher=url_params['publisher'],
+   632                                                                                    offer=url_params['offer'],
+   633                                                                                    sku=url_params['sku'],
+   634                                                                                    version=url_params['version'])
+   635                                                   else:
+   636                                                       name = url_params.get(IMAGE_NAME)
+   637                                                       return self.compute_client.images.get(self.resource_group, name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_image_tags at line 639
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   639                                               @profile
+   640                                               def update_image_tags(self, image_id, tags):
+   641                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   642                                                                                        image_id)
+   643                                                   if self.is_gallery_image(image_id):
+   644                                                       return True
+   645                                                   else:
+   646                                                       name = url_params.get(IMAGE_NAME)
+   647                                                       return self.compute_client.images. \
+   648                                                           create_or_update(self.resource_group, name,
+   649                                                                            {
+   650                                                                                'tags': tags,
+   651                                                                                'location': self.region_name
+   652                                                                            }).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm_types at line 654
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   654                                               @profile
+   655                                               def list_vm_types(self):
+   656                                                   return self.compute_client.virtual_machine_sizes. \
+   657                                                       list(self.region_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_networks at line 659
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   659                                               @profile
+   660                                               def list_networks(self):
+   661                                                   return self.network_management_client.virtual_networks.list(
+   662                                                       self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_network at line 664
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   664                                               @profile
+   665                                               def get_network(self, network_id):
+   666                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID,
+   667                                                                                        network_id)
+   668                                                   network_name = url_params.get(NETWORK_NAME)
+   669                                                   return self.network_management_client.virtual_networks.get(
+   670                                                       self.resource_group, network_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_network at line 672
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   672                                               @profile
+   673                                               def create_network(self, name, params):
+   674                                                   return self.network_management_client.virtual_networks. \
+   675                                                       create_or_update(self.resource_group,
+   676                                                                        name,
+   677                                                                        parameters=params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_network at line 679
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   679                                               @profile
+   680                                               def delete_network(self, network_id):
+   681                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   682                                                   network_name = url_params.get(NETWORK_NAME)
+   683                                                   return self.network_management_client.virtual_networks. \
+   684                                                       delete(self.resource_group, network_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_network_tags at line 686
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   686                                               @profile
+   687                                               def update_network_tags(self, network_id, tags):
+   688                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   689                                                   network_name = url_params.get(NETWORK_NAME)
+   690                                                   return self.network_management_client.virtual_networks. \
+   691                                                       create_or_update(self.resource_group,
+   692                                                                        network_name, tags).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_network_id_for_subnet at line 694
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   694                                               @profile
+   695                                               def get_network_id_for_subnet(self, subnet_id):
+   696                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID, subnet_id)
+   697                                                   network_id = NETWORK_RESOURCE_ID[0]
+   698                                                   for key, val in url_params.items():
+   699                                                       network_id = network_id.replace("{" + key + "}", val)
+   700                                                   return network_id
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_subnets at line 702
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   702                                               @profile
+   703                                               def list_subnets(self, network_id):
+   704                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   705                                                   network_name = url_params.get(NETWORK_NAME)
+   706                                                   return self.network_management_client.subnets. \
+   707                                                       list(self.resource_group, network_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_subnet at line 709
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   709                                               @profile
+   710                                               def get_subnet(self, subnet_id):
+   711                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   712                                                                                        subnet_id)
+   713                                                   network_name = url_params.get(NETWORK_NAME)
+   714                                                   subnet_name = url_params.get(SUBNET_NAME)
+   715                                                   return self.network_management_client.subnets. \
+   716                                                       get(self.resource_group, network_name, subnet_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_subnet at line 718
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   718                                               @profile
+   719                                               def create_subnet(self, network_id, subnet_name, params):
+   720                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   721                                                   network_name = url_params.get(NETWORK_NAME)
+   722                                                   result_create = self.network_management_client \
+   723                                                       .subnets.create_or_update(
+   724                                                           self.resource_group,
+   725                                                           network_name,
+   726                                                           subnet_name,
+   727                                                           params
+   728                                                       )
+   729                                                   subnet_info = result_create.result()
+   730                                           
+   731                                                   return subnet_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: __if_subnet_in_use at line 733
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   733                                               @profile
+   734                                               def __if_subnet_in_use(e):
+   735                                                   # return True if the CloudError exception is due to subnet being in use
+   736                                                   if isinstance(e, CloudError):
+   737                                                       if e.error.error == "InUseSubnetCannotBeDeleted":
+   738                                                           return True
+   739                                                   return False
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_subnet at line 741
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   741                                               @tenacity.retry(stop=tenacity.stop_after_attempt(5),
+   742                                                               retry=tenacity.retry_if_exception(__if_subnet_in_use),
+   743                                                               wait=tenacity.wait_fixed(5),
+   744                                                               reraise=True)
+   745                                               @profile
+   746                                               def delete_subnet(self, subnet_id):
+   747                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   748                                                                                        subnet_id)
+   749                                                   network_name = url_params.get(NETWORK_NAME)
+   750                                                   subnet_name = url_params.get(SUBNET_NAME)
+   751                                           
+   752                                                   try:
+   753                                                       result_delete = self.network_management_client \
+   754                                                           .subnets.delete(
+   755                                                               self.resource_group,
+   756                                                               network_name,
+   757                                                               subnet_name
+   758                                                           )
+   759                                                       result_delete.wait()
+   760                                                   except CloudError as cloud_error:
+   761                                                       log.exception(cloud_error.message)
+   762                                                       raise cloud_error
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_floating_ip at line 764
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   764                                               @profile
+   765                                               def create_floating_ip(self, public_ip_name, public_ip_parameters):
+   766                                                   return self.network_management_client.public_ip_addresses. \
+   767                                                       create_or_update(self.resource_group,
+   768                                                                        public_ip_name,
+   769                                                                        public_ip_parameters).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_floating_ip at line 771
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   771                                               @profile
+   772                                               def get_floating_ip(self, public_ip_id):
+   773                                                   url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   774                                                                                        public_ip_id)
+   775                                                   public_ip_name = url_params.get(PUBLIC_IP_NAME)
+   776                                                   return self.network_management_client. \
+   777                                                       public_ip_addresses.get(self.resource_group, public_ip_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_floating_ip at line 779
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   779                                               @profile
+   780                                               def delete_floating_ip(self, public_ip_id):
+   781                                                   url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   782                                                                                        public_ip_id)
+   783                                                   public_ip_name = url_params.get(PUBLIC_IP_NAME)
+   784                                                   self.network_management_client. \
+   785                                                       public_ip_addresses.delete(self.resource_group,
+   786                                                                                  public_ip_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_fip_tags at line 788
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   788                                               @profile
+   789                                               def update_fip_tags(self, fip_id, tags):
+   790                                                   url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   791                                                                                        fip_id)
+   792                                                   fip_name = url_params.get(PUBLIC_IP_NAME)
+   793                                                   self.network_management_client.public_ip_addresses. \
+   794                                                       create_or_update(self.resource_group,
+   795                                                                        fip_name, tags).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_floating_ips at line 797
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   797                                               @profile
+   798                                               def list_floating_ips(self):
+   799                                                   return self.network_management_client.public_ip_addresses.list(
+   800                                                       self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm at line 802
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   802                                               @profile
+   803                                               def list_vm(self):
+   804                                                   return self.compute_client.virtual_machines.list(
+   805                                                       self.resource_group
+   806                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: restart_vm at line 808
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   808                                               @profile
+   809                                               def restart_vm(self, vm_id):
+   810                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   811                                                                                        vm_id)
+   812                                                   vm_name = url_params.get(VM_NAME)
+   813                                                   return self.compute_client.virtual_machines.restart(
+   814                                                       self.resource_group, vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm at line 816
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   816                                               @profile
+   817                                               def delete_vm(self, vm_id):
+   818                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   819                                                                                        vm_id)
+   820                                                   vm_name = url_params.get(VM_NAME)
+   821                                                   return self.compute_client.virtual_machines.delete(
+   822                                                       self.resource_group, vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_vm at line 824
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   824                                               @profile
+   825                                               def get_vm(self, vm_id):
+   826                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   827                                                                                        vm_id)
+   828                                                   vm_name = url_params.get(VM_NAME)
+   829                                                   return self.compute_client.virtual_machines.get(
+   830                                                       self.resource_group,
+   831                                                       vm_name,
+   832                                                       expand='instanceView'
+   833                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm at line 835
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   835                                               @profile
+   836                                               def create_vm(self, vm_name, params):
+   837                                                   return self.compute_client.virtual_machines. \
+   838                                                       create_or_update(self.resource_group,
+   839                                                                        vm_name, params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm at line 841
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   841                                               @profile
+   842                                               def update_vm(self, vm_id, params):
+   843                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   844                                                                                        vm_id)
+   845                                                   vm_name = url_params.get(VM_NAME)
+   846                                                   return self.compute_client.virtual_machines. \
+   847                                                       create_or_update(self.resource_group,
+   848                                                                        vm_name, params, raw=True)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: deallocate_vm at line 850
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   850                                               @profile
+   851                                               def deallocate_vm(self, vm_id):
+   852                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   853                                                                                        vm_id)
+   854                                                   vm_name = url_params.get(VM_NAME)
+   855                                                   self.compute_client. \
+   856                                                       virtual_machines.deallocate(self.resource_group,
+   857                                                                                   vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: generalize_vm at line 859
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   859                                               @profile
+   860                                               def generalize_vm(self, vm_id):
+   861                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   862                                                                                        vm_id)
+   863                                                   vm_name = url_params.get(VM_NAME)
+   864                                                   self.compute_client.virtual_machines. \
+   865                                                       generalize(self.resource_group, vm_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: start_vm at line 867
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   867                                               @profile
+   868                                               def start_vm(self, vm_id):
+   869                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   870                                                                                        vm_id)
+   871                                                   vm_name = url_params.get(VM_NAME)
+   872                                                   self.compute_client.virtual_machines. \
+   873                                                       start(self.resource_group,
+   874                                                             vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm_tags at line 876
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   876                                               @profile
+   877                                               def update_vm_tags(self, vm_id, tags):
+   878                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   879                                                                                        vm_id)
+   880                                                   vm_name = url_params.get(VM_NAME)
+   881                                                   self.compute_client.virtual_machines. \
+   882                                                       create_or_update(self.resource_group,
+   883                                                                        vm_name, tags).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_nic at line 885
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   885                                               @profile
+   886                                               def delete_nic(self, nic_id):
+   887                                                   nic_params = azure_helpers.\
+   888                                                       parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   889                                                   nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   890                                                   self.network_management_client. \
+   891                                                       network_interfaces.delete(self.resource_group,
+   892                                                                                 nic_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_nic at line 894
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   894                                               @profile
+   895                                               def get_nic(self, nic_id):
+   896                                                   nic_params = azure_helpers.\
+   897                                                       parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   898                                                   nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   899                                                   return self.network_management_client. \
+   900                                                       network_interfaces.get(self.resource_group, nic_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_nic at line 902
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   902                                               @profile
+   903                                               def update_nic(self, nic_id, params):
+   904                                                   nic_params = azure_helpers.\
+   905                                                       parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   906                                                   nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   907                                                   async_nic_creation = self.network_management_client. \
+   908                                                       network_interfaces.create_or_update(
+   909                                                           self.resource_group,
+   910                                                           nic_name,
+   911                                                           params
+   912                                                       )
+   913                                                   nic_info = async_nic_creation.result()
+   914                                                   return nic_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_nic at line 916
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   916                                               @profile
+   917                                               def create_nic(self, nic_name, params):
+   918                                                   return self.network_management_client. \
+   919                                                       network_interfaces.create_or_update(
+   920                                                           self.resource_group,
+   921                                                           nic_name,
+   922                                                           params
+   923                                                       ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_public_key at line 925
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   925                                               @profile
+   926                                               def create_public_key(self, entity):
+   927                                                   return self.table_service. \
+   928                                                       insert_or_replace_entity(self.public_key_storage_table_name,
+   929                                                                                entity)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_public_key at line 931
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   931                                               @profile
+   932                                               def get_public_key(self, name):
+   933                                                   entities = self.table_service. \
+   934                                                       query_entities(self.public_key_storage_table_name,
+   935                                                                      "Name eq '{0}'".format(name), num_results=1)
+   936                                           
+   937                                                   return entities.items[0] if len(entities.items) > 0 else None
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_public_key at line 939
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   939                                               @profile
+   940                                               def delete_public_key(self, entity):
+   941                                                   self.table_service.delete_entity(self.public_key_storage_table_name,
+   942                                                                                    entity.PartitionKey, entity.RowKey)
+
+Total time: 1.13503 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_public_keys at line 944
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   944                                               @profile
+   945                                               def list_public_keys(self, partition_key, limit=None, marker=None):
+   946         1    1076407.0 1076407.0     94.8          entities = self.table_service. \
+   947         1          8.0      8.0      0.0              query_entities(self.public_key_storage_table_name,
+   948         1          2.0      2.0      0.0                             "PartitionKey eq '{0}'".format(partition_key),
+   949         1      58613.0  58613.0      5.2                             marker=marker, num_results=limit)
+   950         1          2.0      2.0      0.0          return (entities.items, entities.next_marker)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_route_table at line 952
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   952                                               @profile
+   953                                               def delete_route_table(self, route_table_name):
+   954                                                   self.network_management_client. \
+   955                                                       route_tables.delete(self.resource_group, route_table_name
+   956                                                                           ).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: attach_subnet_to_route_table at line 958
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   958                                               @profile
+   959                                               def attach_subnet_to_route_table(self, subnet_id, route_table_id):
+   960                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   961                                                                                        subnet_id)
+   962                                                   network_name = url_params.get(NETWORK_NAME)
+   963                                                   subnet_name = url_params.get(SUBNET_NAME)
+   964                                           
+   965                                                   subnet_info = self.network_management_client.subnets.get(
+   966                                                       self.resource_group,
+   967                                                       network_name,
+   968                                                       subnet_name
+   969                                                   )
+   970                                                   if subnet_info:
+   971                                                       subnet_info.route_table = {
+   972                                                           'id': route_table_id
+   973                                                       }
+   974                                           
+   975                                                       result_create = self.network_management_client. \
+   976                                                           subnets.create_or_update(
+   977                                                            self.resource_group,
+   978                                                            network_name,
+   979                                                            subnet_name,
+   980                                                            subnet_info)
+   981                                                       subnet_info = result_create.result()
+   982                                           
+   983                                                   return subnet_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: detach_subnet_to_route_table at line 985
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   985                                               @profile
+   986                                               def detach_subnet_to_route_table(self, subnet_id, route_table_id):
+   987                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   988                                                                                        subnet_id)
+   989                                                   network_name = url_params.get(NETWORK_NAME)
+   990                                                   subnet_name = url_params.get(SUBNET_NAME)
+   991                                           
+   992                                                   subnet_info = self.network_management_client.subnets.get(
+   993                                                       self.resource_group,
+   994                                                       network_name,
+   995                                                       subnet_name
+   996                                                   )
+   997                                           
+   998                                                   if subnet_info and subnet_info.route_table.id == route_table_id:
+   999                                                       subnet_info.route_table = None
+  1000                                           
+  1001                                                       result_create = self.network_management_client. \
+  1002                                                           subnets.create_or_update(
+  1003                                                            self.resource_group,
+  1004                                                            network_name,
+  1005                                                            subnet_name,
+  1006                                                            subnet_info)
+  1007                                                       subnet_info = result_create.result()
+  1008                                           
+  1009                                                   return subnet_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_route_tables at line 1011
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1011                                               @profile
+  1012                                               def list_route_tables(self):
+  1013                                                   return self.network_management_client. \
+  1014                                                       route_tables.list(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_route_table at line 1016
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1016                                               @profile
+  1017                                               def get_route_table(self, router_id):
+  1018                                                   url_params = azure_helpers.parse_url(ROUTER_RESOURCE_ID,
+  1019                                                                                        router_id)
+  1020                                                   router_name = url_params.get(ROUTER_NAME)
+  1021                                                   return self.network_management_client. \
+  1022                                                       route_tables.get(self.resource_group, router_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_route_table at line 1024
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1024                                               @profile
+  1025                                               def create_route_table(self, route_table_name, params):
+  1026                                                   return self.network_management_client. \
+  1027                                                       route_tables.create_or_update(
+  1028                                                        self.resource_group,
+  1029                                                        route_table_name, params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_route_table_tags at line 1031
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1031                                               @profile
+  1032                                               def update_route_table_tags(self, route_table_name, tags):
+  1033                                                   self.network_management_client.route_tables. \
+  1034                                                       create_or_update(self.resource_group,
+  1035                                                                        route_table_name, tags).result()
+

+ 1467 - 0
results/network.res

@@ -0,0 +1,1467 @@
+Test output
+ .......
+----------------------------------------------------------------------
+Ran 7 tests in 608.600s
+
+OK
+
+Wrote profile results to run_tests.py.lprof
+Timer unit: 1e-06 s
+
+Total time: 2.10756 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: __init__ at line 160
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   160                                               @profile
+   161                                               def __init__(self, config):
+   162         7         22.0      3.1      0.0          self._config = config
+   163         7         15.0      2.1      0.0          self.subscription_id = str(config.get('azure_subscription_id'))
+   164         7          6.0      0.9      0.0          self._credentials = ServicePrincipalCredentials(
+   165         7          6.0      0.9      0.0              client_id=config.get('azure_client_id'),
+   166         7          4.0      0.6      0.0              secret=config.get('azure_secret'),
+   167         7    2107374.0 301053.4    100.0              tenant=config.get('azure_tenant')
+   168                                                   )
+   169                                           
+   170         7         23.0      3.3      0.0          self._access_token = config.get('azure_access_token')
+   171         7          6.0      0.9      0.0          self._resource_client = None
+   172         7          4.0      0.6      0.0          self._storage_client = None
+   173         7          6.0      0.9      0.0          self._network_management_client = None
+   174         7          9.0      1.3      0.0          self._subscription_client = None
+   175         7          4.0      0.6      0.0          self._compute_client = None
+   176         7          7.0      1.0      0.0          self._access_key_result = None
+   177         7          4.0      0.6      0.0          self._block_blob_service = None
+   178         7          6.0      0.9      0.0          self._table_service = None
+   179         7          8.0      1.1      0.0          self._storage_account = None
+   180                                           
+   181         7         58.0      8.3      0.0          log.debug("azure subscription : %s", self.subscription_id)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: access_key_result at line 183
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   183                                               @property
+   184                                               @tenacity.retry(stop=tenacity.stop_after_attempt(5), reraise=True)
+   185                                               @profile
+   186                                               def access_key_result(self):
+   187                                                   if not self._access_key_result:
+   188                                                       storage_account = self.storage_account
+   189                                           
+   190                                                       if self.get_storage_account(storage_account).\
+   191                                                               provisioning_state.value != 'Succeeded':
+   192                                                           log.debug(
+   193                                                               "Storage account %s is not in Succeeded state yet. ",
+   194                                                               storage_account)
+   195                                                           raise WaitStateException(
+   196                                                               "Waited too long for storage account: {0} to "
+   197                                                               "become ready.".format(
+   198                                                                   storage_account,
+   199                                                                   self.get_storage_account(storage_account).
+   200                                                                   provisioning_state))
+   201                                           
+   202                                                       self._access_key_result = self.storage_client.storage_accounts. \
+   203                                                           list_keys(self.resource_group, storage_account)
+   204                                                   return self._access_key_result
+
+Total time: 0.0002 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: resource_group at line 206
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   206                                               @property
+   207                                               @profile
+   208                                               def resource_group(self):
+   209       146        200.0      1.4    100.0          return self._config.get('azure_resource_group')
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: storage_account at line 211
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   211                                               @property
+   212                                               @profile
+   213                                               def storage_account(self):
+   214                                                   return self._config.get('azure_storage_account')
+
+Total time: 1.3e-05 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: region_name at line 216
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   216                                               @property
+   217                                               @profile
+   218                                               def region_name(self):
+   219         5         13.0      2.6    100.0          return self._config.get('azure_region_name')
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: public_key_storage_table_name at line 221
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   221                                               @property
+   222                                               @profile
+   223                                               def public_key_storage_table_name(self):
+   224                                                   return self._config.get('azure_public_key_storage_table_name')
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: storage_client at line 226
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   226                                               @property
+   227                                               @profile
+   228                                               def storage_client(self):
+   229                                                   if not self._storage_client:
+   230                                                       self._storage_client = \
+   231                                                           StorageManagementClient(self._credentials,
+   232                                                                                   self.subscription_id)
+   233                                                   return self._storage_client
+
+Total time: 0.007613 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: subscription_client at line 235
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   235                                               @property
+   236                                               @profile
+   237                                               def subscription_client(self):
+   238         1          1.0      1.0      0.0          if not self._subscription_client:
+   239         1       7610.0   7610.0    100.0              self._subscription_client = SubscriptionClient(self._credentials)
+   240         1          2.0      2.0      0.0          return self._subscription_client
+
+Total time: 0.060981 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: resource_client at line 242
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   242                                               @property
+   243                                               @profile
+   244                                               def resource_client(self):
+   245         7          5.0      0.7      0.0          if not self._resource_client:
+   246                                                       self._resource_client = \
+   247         7          6.0      0.9      0.0                  ResourceManagementClient(self._credentials,
+   248         7      60956.0   8708.0    100.0                                           self.subscription_id)
+   249         7         14.0      2.0      0.0          return self._resource_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: compute_client at line 251
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   251                                               @property
+   252                                               @profile
+   253                                               def compute_client(self):
+   254                                                   if not self._compute_client:
+   255                                                       self._compute_client = \
+   256                                                           ComputeManagementClient(self._credentials,
+   257                                                                                   self.subscription_id)
+   258                                                   return self._compute_client
+
+Total time: 0.050602 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: network_management_client at line 260
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   260                                               @property
+   261                                               @profile
+   262                                               def network_management_client(self):
+   263       146        170.0      1.2      0.3          if not self._network_management_client:
+   264         7         10.0      1.4      0.0              self._network_management_client = NetworkManagementClient(
+   265         7      50322.0   7188.9     99.4                  self._credentials, self.subscription_id)
+   266       146        100.0      0.7      0.2          return self._network_management_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: blob_service at line 268
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   268                                               @property
+   269                                               @profile
+   270                                               def blob_service(self):
+   271                                                   self._get_or_create_storage_account()
+   272                                                   if not self._block_blob_service:
+   273                                                       if self._access_token:
+   274                                                           token_credential = TokenCredential(self._access_token)
+   275                                                           self._block_blob_service = BlockBlobService(
+   276                                                               account_name=self.storage_account,
+   277                                                               token_credential=token_credential)
+   278                                                       else:
+   279                                                           self._block_blob_service = BlockBlobService(
+   280                                                               account_name=self.storage_account,
+   281                                                               account_key=self.access_key_result.keys[0].value)
+   282                                                   return self._block_blob_service
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: table_service at line 284
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   284                                               @property
+   285                                               @profile
+   286                                               def table_service(self):
+   287                                                   self._get_or_create_storage_account()
+   288                                                   if not self._table_service:
+   289                                                       self._table_service = TableService(
+   290                                                           self.storage_account,
+   291                                                           self.access_key_result.keys[0].value)
+   292                                                   if not self._table_service. \
+   293                                                           exists(table_name=self.public_key_storage_table_name):
+   294                                                       self._table_service.create_table(
+   295                                                           self.public_key_storage_table_name)
+   296                                                   return self._table_service
+
+Total time: 1.59586 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_resource_group at line 298
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   298                                               @profile
+   299                                               def get_resource_group(self, name):
+   300         7    1595863.0 227980.4    100.0          return self.resource_client.resource_groups.get(name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_resource_group at line 302
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   302                                               @profile
+   303                                               def create_resource_group(self, name, parameters):
+   304                                                   return self.resource_client.resource_groups. \
+   305                                                       create_or_update(name, parameters)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_storage_account at line 307
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   307                                               @profile
+   308                                               def get_storage_account(self, storage_account):
+   309                                                   return self.storage_client.storage_accounts. \
+   310                                                       get_properties(self.resource_group, storage_account)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_storage_account at line 312
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   312                                               @profile
+   313                                               def create_storage_account(self, name, params):
+   314                                                   return self.storage_client.storage_accounts. \
+   315                                                       create(self.resource_group, name.lower(), params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: _get_or_create_storage_account at line 319
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   319                                               @tenacity.retry(stop=tenacity.stop_after_attempt(2),
+   320                                                               retry=tenacity.retry_if_exception_type(CloudError),
+   321                                                               reraise=True)
+   322                                               @profile
+   323                                               def _get_or_create_storage_account(self):
+   324                                                   if self._storage_account:
+   325                                                       return self._storage_account
+   326                                                   else:
+   327                                                       try:
+   328                                                           self._storage_account = \
+   329                                                               self.get_storage_account(self.storage_account)
+   330                                                       except CloudError as cloud_error:
+   331                                                           if cloud_error.error.error == "ResourceNotFound":
+   332                                                               storage_account_params = {
+   333                                                                   'sku': {
+   334                                                                       'name': 'Standard_LRS'
+   335                                                                   },
+   336                                                                   'kind': 'storage',
+   337                                                                   'location': self.region_name,
+   338                                                               }
+   339                                                               try:
+   340                                                                   self._storage_account = \
+   341                                                                       self.create_storage_account(self.storage_account,
+   342                                                                                                   storage_account_params)
+   343                                                               except CloudError as cloud_error2:  # pragma: no cover
+   344                                                                   if cloud_error2.error.error == "AuthorizationFailed":
+   345                                                                       mess = 'The following error was returned by ' \
+   346                                                                              'Azure:\n%s\n\nThis is likely because the' \
+   347                                                                              ' Role associated with the provided ' \
+   348                                                                              'credentials does not allow for Storage ' \
+   349                                                                              'Account creation.\nA Storage Account is ' \
+   350                                                                              'necessary in order to perform the ' \
+   351                                                                              'desired operation. You must either ' \
+   352                                                                              'provide an existing Storage Account name' \
+   353                                                                              ' as part of the configuration, or ' \
+   354                                                                              'elevate the associated Role.\nFor more ' \
+   355                                                                              'information on roles, see: https://docs.' \
+   356                                                                              'microsoft.com/en-us/azure/role-based-' \
+   357                                                                              'access-control/overview\n' % cloud_error2
+   358                                                                       raise ProviderConnectionException(mess)
+   359                                           
+   360                                                                   elif cloud_error2.error.error == \
+   361                                                                           "StorageAccountAlreadyTaken":
+   362                                                                       mess = 'The following error was ' \
+   363                                                                              'returned by Azure:\n%s\n\n' \
+   364                                                                              'Note that Storage Account names must be ' \
+   365                                                                              'unique across Azure (not just in your ' \
+   366                                                                              'subscription).\nFor more information ' \
+   367                                                                              'see https://docs.microsoft.com/en-us/' \
+   368                                                                              'azure/azure-resource-manager/resource-' \
+   369                                                                              'manager-storage-account-name-errors\n' \
+   370                                                                              % cloud_error2
+   371                                                                       raise InvalidLabelException(mess)
+   372                                                                   else:
+   373                                                                       raise cloud_error2
+   374                                                           else:
+   375                                                               raise cloud_error
+
+Total time: 0.037122 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_locations at line 377
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   377                                               @profile
+   378                                               def list_locations(self):
+   379         1      37095.0  37095.0     99.9          return self.subscription_client.subscriptions. \
+   380         1         27.0     27.0      0.1              list_locations(self.subscription_id)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm_firewall at line 382
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   382                                               @profile
+   383                                               def list_vm_firewall(self):
+   384                                                   return self.network_management_client.network_security_groups. \
+   385                                                       list(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm_firewall at line 387
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   387                                               @profile
+   388                                               def create_vm_firewall(self, name, parameters):
+   389                                                   return self.network_management_client.network_security_groups. \
+   390                                                       create_or_update(self.resource_group, name,
+   391                                                                        parameters).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm_firewall_tags at line 393
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   393                                               @profile
+   394                                               def update_vm_firewall_tags(self, fw_id, tags):
+   395                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   396                                                                                        fw_id)
+   397                                                   name = url_params.get(VM_FIREWALL_NAME)
+   398                                                   return self.network_management_client.network_security_groups. \
+   399                                                       create_or_update(self.resource_group, name,
+   400                                                                        {'tags': tags,
+   401                                                                         'location': self.region_name}).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_vm_firewall at line 403
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   403                                               @profile
+   404                                               def get_vm_firewall(self, fw_id):
+   405                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   406                                                                                        fw_id)
+   407                                                   fw_name = url_params.get(VM_FIREWALL_NAME)
+   408                                                   return self.network_management_client.network_security_groups. \
+   409                                                       get(self.resource_group, fw_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm_firewall at line 411
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   411                                               @profile
+   412                                               def delete_vm_firewall(self, fw_id):
+   413                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   414                                                                                        fw_id)
+   415                                                   name = url_params.get(VM_FIREWALL_NAME)
+   416                                                   self.network_management_client \
+   417                                                       .network_security_groups.delete(self.resource_group, name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm_firewall_rule at line 419
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   419                                               @profile
+   420                                               def create_vm_firewall_rule(self, fw_id,
+   421                                                                           rule_name, parameters):
+   422                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   423                                                                                        fw_id)
+   424                                                   vm_firewall_name = url_params.get(VM_FIREWALL_NAME)
+   425                                                   return self.network_management_client.security_rules. \
+   426                                                       create_or_update(self.resource_group, vm_firewall_name,
+   427                                                                        rule_name, parameters).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm_firewall_rule at line 429
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   429                                               @profile
+   430                                               def delete_vm_firewall_rule(self, fw_rule_id, vm_firewall):
+   431                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RULE_RESOURCE_ID,
+   432                                                                                        fw_rule_id)
+   433                                                   name = url_params.get(VM_FIREWALL_RULE_NAME)
+   434                                                   return self.network_management_client.security_rules. \
+   435                                                       delete(self.resource_group, vm_firewall, name).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_containers at line 437
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   437                                               @profile
+   438                                               def list_containers(self, prefix=None, limit=None, marker=None):
+   439                                                   results = self.blob_service.list_containers(prefix=prefix,
+   440                                                                                               num_results=limit,
+   441                                                                                               marker=marker)
+   442                                                   return (results.items, results.next_marker)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_container at line 444
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   444                                               @profile
+   445                                               def create_container(self, container_name):
+   446                                                   try:
+   447                                                       self.blob_service.create_container(container_name,
+   448                                                                                          fail_on_exist=True)
+   449                                                   except AzureConflictHttpError as cloud_error:
+   450                                                       if cloud_error.error_code == "ContainerAlreadyExists":
+   451                                                           msg = "The given Bucket name '%s' already exists. Please " \
+   452                                                                 "use the `get` or `find` method to get a reference to " \
+   453                                                                 "an existing Bucket, or specify a new Bucket name to " \
+   454                                                                 "create.\nNote that in Azure, Buckets are contained " \
+   455                                                                 "in Storage Accounts." % container_name
+   456                                                           raise DuplicateResourceException(msg)
+   457                                           
+   458                                                   return self.blob_service.get_container_properties(container_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_container at line 460
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   460                                               @profile
+   461                                               def get_container(self, container_name):
+   462                                                   return self.blob_service.get_container_properties(container_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_container at line 464
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   464                                               @profile
+   465                                               def delete_container(self, container_name):
+   466                                                   self.blob_service.delete_container(container_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_blobs at line 468
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   468                                               @profile
+   469                                               def list_blobs(self, container_name, prefix=None):
+   470                                                   return self.blob_service.list_blobs(container_name, prefix=prefix)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob at line 472
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   472                                               @profile
+   473                                               def get_blob(self, container_name, blob_name):
+   474                                                   return self.blob_service.get_blob_properties(container_name, blob_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_blob_from_text at line 476
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   476                                               @profile
+   477                                               def create_blob_from_text(self, container_name, blob_name, text):
+   478                                                   self.blob_service.create_blob_from_text(container_name,
+   479                                                                                           blob_name, text)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_blob_from_file at line 481
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   481                                               @profile
+   482                                               def create_blob_from_file(self, container_name, blob_name, file_path):
+   483                                                   self.blob_service.create_blob_from_path(container_name,
+   484                                                                                           blob_name, file_path)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_blob at line 486
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   486                                               @profile
+   487                                               def delete_blob(self, container_name, blob_name):
+   488                                                   self.blob_service.delete_blob(container_name, blob_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob_url at line 490
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   490                                               @profile
+   491                                               def get_blob_url(self, container_name, blob_name, expiry_time):
+   492                                                   expiry_date = datetime.datetime.utcnow() + datetime.timedelta(
+   493                                                       seconds=expiry_time)
+   494                                                   sas = self.blob_service.generate_blob_shared_access_signature(
+   495                                                       container_name, blob_name, permission=BlobPermissions.READ,
+   496                                                       expiry=expiry_date)
+   497                                                   return self.blob_service.make_blob_url(container_name, blob_name,
+   498                                                                                          sas_token=sas)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob_content at line 500
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   500                                               @profile
+   501                                               def get_blob_content(self, container_name, blob_name):
+   502                                                   out_stream = BytesIO()
+   503                                                   self.blob_service.get_blob_to_stream(container_name,
+   504                                                                                        blob_name, out_stream)
+   505                                                   return out_stream
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_empty_disk at line 507
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   507                                               @profile
+   508                                               def create_empty_disk(self, disk_name, params):
+   509                                                   return self.compute_client.disks.create_or_update(
+   510                                                       self.resource_group,
+   511                                                       disk_name,
+   512                                                       params
+   513                                                   ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_snapshot_disk at line 515
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   515                                               @profile
+   516                                               def create_snapshot_disk(self, disk_name, params):
+   517                                                   return self.compute_client.disks.create_or_update(
+   518                                                       self.resource_group,
+   519                                                       disk_name,
+   520                                                       params
+   521                                                   ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_disk at line 523
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   523                                               @profile
+   524                                               def get_disk(self, disk_id):
+   525                                                   url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   526                                                                                        disk_id)
+   527                                                   disk_name = url_params.get(VOLUME_NAME)
+   528                                                   return self.compute_client.disks.get(self.resource_group, disk_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_disks at line 530
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   530                                               @profile
+   531                                               def list_disks(self):
+   532                                                   return self.compute_client.disks. \
+   533                                                       list_by_resource_group(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_disk at line 535
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   535                                               @profile
+   536                                               def delete_disk(self, disk_id):
+   537                                                   url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   538                                                                                        disk_id)
+   539                                                   disk_name = url_params.get(VOLUME_NAME)
+   540                                                   self.compute_client.disks.delete(self.resource_group, disk_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_disk_tags at line 542
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   542                                               @profile
+   543                                               def update_disk_tags(self, disk_id, tags):
+   544                                                   url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   545                                                                                        disk_id)
+   546                                                   disk_name = url_params.get(VOLUME_NAME)
+   547                                                   return self.compute_client.disks.update(
+   548                                                       self.resource_group,
+   549                                                       disk_name,
+   550                                                       {'tags': tags},
+   551                                                       raw=True
+   552                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_snapshots at line 554
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   554                                               @profile
+   555                                               def list_snapshots(self):
+   556                                                   return self.compute_client.snapshots. \
+   557                                                       list_by_resource_group(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_snapshot at line 559
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   559                                               @profile
+   560                                               def get_snapshot(self, snapshot_id):
+   561                                                   url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   562                                                                                        snapshot_id)
+   563                                                   snapshot_name = url_params.get(SNAPSHOT_NAME)
+   564                                                   return self.compute_client.snapshots.get(self.resource_group,
+   565                                                                                            snapshot_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_snapshot at line 567
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   567                                               @profile
+   568                                               def create_snapshot(self, snapshot_name, params):
+   569                                                   return self.compute_client.snapshots.create_or_update(
+   570                                                       self.resource_group,
+   571                                                       snapshot_name,
+   572                                                       params
+   573                                                   ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_snapshot at line 575
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   575                                               @profile
+   576                                               def delete_snapshot(self, snapshot_id):
+   577                                                   url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   578                                                                                        snapshot_id)
+   579                                                   snapshot_name = url_params.get(SNAPSHOT_NAME)
+   580                                                   self.compute_client.snapshots.delete(self.resource_group,
+   581                                                                                        snapshot_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_snapshot_tags at line 583
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   583                                               @profile
+   584                                               def update_snapshot_tags(self, snapshot_id, tags):
+   585                                                   url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   586                                                                                        snapshot_id)
+   587                                                   snapshot_name = url_params.get(SNAPSHOT_NAME)
+   588                                                   return self.compute_client.snapshots.update(
+   589                                                       self.resource_group,
+   590                                                       snapshot_name,
+   591                                                       {'tags': tags},
+   592                                                       raw=True
+   593                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: is_gallery_image at line 595
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   595                                               @profile
+   596                                               def is_gallery_image(self, image_id):
+   597                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   598                                                                                        image_id)
+   599                                                   # If it is a gallery image, it will always have an offer
+   600                                                   return 'offer' in url_params
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_image at line 602
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   602                                               @profile
+   603                                               def create_image(self, name, params):
+   604                                                   return self.compute_client.images. \
+   605                                                       create_or_update(self.resource_group, name,
+   606                                                                        params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_image at line 608
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   608                                               @profile
+   609                                               def delete_image(self, image_id):
+   610                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   611                                                                                        image_id)
+   612                                                   if not self.is_gallery_image(image_id):
+   613                                                       name = url_params.get(IMAGE_NAME)
+   614                                                       self.compute_client.images.delete(self.resource_group, name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_images at line 616
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   616                                               @profile
+   617                                               def list_images(self):
+   618                                                   azure_images = list(self.compute_client.images.
+   619                                                                       list_by_resource_group(self.resource_group))
+   620                                                   return azure_images
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_gallery_refs at line 622
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   622                                               @profile
+   623                                               def list_gallery_refs(self):
+   624                                                   return gallery_image_references
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_image at line 626
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   626                                               @profile
+   627                                               def get_image(self, image_id):
+   628                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   629                                                                                        image_id)
+   630                                                   if self.is_gallery_image(image_id):
+   631                                                       return GalleryImageReference(publisher=url_params['publisher'],
+   632                                                                                    offer=url_params['offer'],
+   633                                                                                    sku=url_params['sku'],
+   634                                                                                    version=url_params['version'])
+   635                                                   else:
+   636                                                       name = url_params.get(IMAGE_NAME)
+   637                                                       return self.compute_client.images.get(self.resource_group, name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_image_tags at line 639
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   639                                               @profile
+   640                                               def update_image_tags(self, image_id, tags):
+   641                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   642                                                                                        image_id)
+   643                                                   if self.is_gallery_image(image_id):
+   644                                                       return True
+   645                                                   else:
+   646                                                       name = url_params.get(IMAGE_NAME)
+   647                                                       return self.compute_client.images. \
+   648                                                           create_or_update(self.resource_group, name,
+   649                                                                            {
+   650                                                                                'tags': tags,
+   651                                                                                'location': self.region_name
+   652                                                                            }).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm_types at line 654
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   654                                               @profile
+   655                                               def list_vm_types(self):
+   656                                                   return self.compute_client.virtual_machine_sizes. \
+   657                                                       list(self.region_name)
+
+Total time: 0.043537 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_networks at line 659
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   659                                               @profile
+   660                                               def list_networks(self):
+   661        17      42673.0   2510.2     98.0          return self.network_management_client.virtual_networks.list(
+   662        17        864.0     50.8      2.0              self.resource_group)
+
+Total time: 13.8214 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_network at line 664
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   664                                               @profile
+   665                                               def get_network(self, network_id):
+   666        51         52.0      1.0      0.0          url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID,
+   667        51       1048.0     20.5      0.0                                               network_id)
+   668        51         61.0      1.2      0.0          network_name = url_params.get(NETWORK_NAME)
+   669        51      39447.0    773.5      0.3          return self.network_management_client.virtual_networks.get(
+   670        51   13780837.0 270212.5     99.7              self.resource_group, network_name)
+
+Total time: 43.0886 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_network at line 672
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   672                                               @profile
+   673                                               def create_network(self, name, params):
+   674         3      23255.0   7751.7      0.1          return self.network_management_client.virtual_networks. \
+   675         3         27.0      9.0      0.0              create_or_update(self.resource_group,
+   676         3          1.0      0.3      0.0                               name,
+   677         3   43065283.0 14355094.3     99.9                               parameters=params).result()
+
+Total time: 31.9886 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_network at line 679
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   679                                               @profile
+   680                                               def delete_network(self, network_id):
+   681         3        100.0     33.3      0.0          url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   682         3          5.0      1.7      0.0          network_name = url_params.get(NETWORK_NAME)
+   683         3       2606.0    868.7      0.0          return self.network_management_client.virtual_networks. \
+   684         3   31985926.0 10661975.3    100.0              delete(self.resource_group, network_name).wait()
+
+Total time: 278.504 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_network_tags at line 686
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   686                                               @profile
+   687                                               def update_network_tags(self, network_id, tags):
+   688         9        267.0     29.7      0.0          url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   689         9         13.0      1.4      0.0          network_name = url_params.get(NETWORK_NAME)
+   690         9       7020.0    780.0      0.0          return self.network_management_client.virtual_networks. \
+   691         9         77.0      8.6      0.0              create_or_update(self.resource_group,
+   692         9  278496853.0 30944094.8    100.0                               network_name, tags).result()
+
+Total time: 0.002848 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_network_id_for_subnet at line 694
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   694                                               @profile
+   695                                               def get_network_id_for_subnet(self, subnet_id):
+   696        65       2020.0     31.1     70.9          url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID, subnet_id)
+   697        65         82.0      1.3      2.9          network_id = NETWORK_RESOURCE_ID[0]
+   698       325        235.0      0.7      8.3          for key, val in url_params.items():
+   699       260        482.0      1.9     16.9              network_id = network_id.replace("{" + key + "}", val)
+   700        65         29.0      0.4      1.0          return network_id
+
+Total time: 0.01436 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_subnets at line 702
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   702                                               @profile
+   703                                               def list_subnets(self, network_id):
+   704        17        510.0     30.0      3.6          url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   705        17         30.0      1.8      0.2          network_name = url_params.get(NETWORK_NAME)
+   706        17      12977.0    763.4     90.4          return self.network_management_client.subnets. \
+   707        17        843.0     49.6      5.9              list(self.resource_group, network_name)
+
+Total time: 0.692427 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_subnet at line 709
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   709                                               @profile
+   710                                               def get_subnet(self, subnet_id):
+   711         4         11.0      2.8      0.0          url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   712         4        120.0     30.0      0.0                                               subnet_id)
+   713         3          4.0      1.3      0.0          network_name = url_params.get(NETWORK_NAME)
+   714         3          3.0      1.0      0.0          subnet_name = url_params.get(SUBNET_NAME)
+   715         3       2342.0    780.7      0.3          return self.network_management_client.subnets. \
+   716         3     689947.0 229982.3     99.6              get(self.resource_group, network_name, subnet_name)
+
+Total time: 12.6378 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_subnet at line 718
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   718                                               @profile
+   719                                               def create_subnet(self, network_id, subnet_name, params):
+   720         3         89.0     29.7      0.0          url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   721         3          5.0      1.7      0.0          network_name = url_params.get(NETWORK_NAME)
+   722         3       2362.0    787.3      0.0          result_create = self.network_management_client \
+   723                                                       .subnets.create_or_update(
+   724         3         25.0      8.3      0.0                  self.resource_group,
+   725         3          2.0      0.7      0.0                  network_name,
+   726         3          2.0      0.7      0.0                  subnet_name,
+   727         3    1937083.0 645694.3     15.3                  params
+   728                                                       )
+   729         3   10698204.0 3566068.0     84.7          subnet_info = result_create.result()
+   730                                           
+   731         3          6.0      2.0      0.0          return subnet_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: __if_subnet_in_use at line 733
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   733                                               @profile
+   734                                               def __if_subnet_in_use(e):
+   735                                                   # return True if the CloudError exception is due to subnet being in use
+   736                                                   if isinstance(e, CloudError):
+   737                                                       if e.error.error == "InUseSubnetCannotBeDeleted":
+   738                                                           return True
+   739                                                   return False
+
+Total time: 32.2194 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_subnet at line 741
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   741                                               @tenacity.retry(stop=tenacity.stop_after_attempt(5),
+   742                                                               retry=tenacity.retry_if_exception(__if_subnet_in_use),
+   743                                                               wait=tenacity.wait_fixed(5),
+   744                                                               reraise=True)
+   745                                               @profile
+   746                                               def delete_subnet(self, subnet_id):
+   747         3          7.0      2.3      0.0          url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   748         3         83.0     27.7      0.0                                               subnet_id)
+   749         3          3.0      1.0      0.0          network_name = url_params.get(NETWORK_NAME)
+   750         3          3.0      1.0      0.0          subnet_name = url_params.get(SUBNET_NAME)
+   751                                           
+   752         3          1.0      0.3      0.0          try:
+   753         3       2586.0    862.0      0.0              result_delete = self.network_management_client \
+   754                                                           .subnets.delete(
+   755         3         34.0     11.3      0.0                      self.resource_group,
+   756         3          2.0      0.7      0.0                      network_name,
+   757         3    1488381.0 496127.0      4.6                      subnet_name
+   758                                                           )
+   759         3   30728309.0 10242769.7     95.4              result_delete.wait()
+   760                                                   except CloudError as cloud_error:
+   761                                                       log.exception(cloud_error.message)
+   762                                                       raise cloud_error
+
+Total time: 8.33538 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_floating_ip at line 764
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   764                                               @profile
+   765                                               def create_floating_ip(self, public_ip_name, public_ip_parameters):
+   766         2       1479.0    739.5      0.0          return self.network_management_client.public_ip_addresses. \
+   767         2         16.0      8.0      0.0              create_or_update(self.resource_group,
+   768         2          1.0      0.5      0.0                               public_ip_name,
+   769         2    8333886.0 4166943.0    100.0                               public_ip_parameters).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_floating_ip at line 771
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   771                                               @profile
+   772                                               def get_floating_ip(self, public_ip_id):
+   773                                                   url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   774                                                                                        public_ip_id)
+   775                                                   public_ip_name = url_params.get(PUBLIC_IP_NAME)
+   776                                                   return self.network_management_client. \
+   777                                                       public_ip_addresses.get(self.resource_group, public_ip_name)
+
+Total time: 41.8774 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_floating_ip at line 779
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   779                                               @profile
+   780                                               def delete_floating_ip(self, public_ip_id):
+   781         2          6.0      3.0      0.0          url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   782         2         58.0     29.0      0.0                                               public_ip_id)
+   783         2          2.0      1.0      0.0          public_ip_name = url_params.get(PUBLIC_IP_NAME)
+   784         2       1594.0    797.0      0.0          self.network_management_client. \
+   785         2         17.0      8.5      0.0              public_ip_addresses.delete(self.resource_group,
+   786         2   41875687.0 20937843.5    100.0                                         public_ip_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_fip_tags at line 788
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   788                                               @profile
+   789                                               def update_fip_tags(self, fip_id, tags):
+   790                                                   url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   791                                                                                        fip_id)
+   792                                                   fip_name = url_params.get(PUBLIC_IP_NAME)
+   793                                                   self.network_management_client.public_ip_addresses. \
+   794                                                       create_or_update(self.resource_group,
+   795                                                                        fip_name, tags).result()
+
+Total time: 0.008277 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_floating_ips at line 797
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   797                                               @profile
+   798                                               def list_floating_ips(self):
+   799        10       7752.0    775.2     93.7          return self.network_management_client.public_ip_addresses.list(
+   800        10        525.0     52.5      6.3              self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm at line 802
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   802                                               @profile
+   803                                               def list_vm(self):
+   804                                                   return self.compute_client.virtual_machines.list(
+   805                                                       self.resource_group
+   806                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: restart_vm at line 808
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   808                                               @profile
+   809                                               def restart_vm(self, vm_id):
+   810                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   811                                                                                        vm_id)
+   812                                                   vm_name = url_params.get(VM_NAME)
+   813                                                   return self.compute_client.virtual_machines.restart(
+   814                                                       self.resource_group, vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm at line 816
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   816                                               @profile
+   817                                               def delete_vm(self, vm_id):
+   818                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   819                                                                                        vm_id)
+   820                                                   vm_name = url_params.get(VM_NAME)
+   821                                                   return self.compute_client.virtual_machines.delete(
+   822                                                       self.resource_group, vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_vm at line 824
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   824                                               @profile
+   825                                               def get_vm(self, vm_id):
+   826                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   827                                                                                        vm_id)
+   828                                                   vm_name = url_params.get(VM_NAME)
+   829                                                   return self.compute_client.virtual_machines.get(
+   830                                                       self.resource_group,
+   831                                                       vm_name,
+   832                                                       expand='instanceView'
+   833                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm at line 835
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   835                                               @profile
+   836                                               def create_vm(self, vm_name, params):
+   837                                                   return self.compute_client.virtual_machines. \
+   838                                                       create_or_update(self.resource_group,
+   839                                                                        vm_name, params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm at line 841
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   841                                               @profile
+   842                                               def update_vm(self, vm_id, params):
+   843                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   844                                                                                        vm_id)
+   845                                                   vm_name = url_params.get(VM_NAME)
+   846                                                   return self.compute_client.virtual_machines. \
+   847                                                       create_or_update(self.resource_group,
+   848                                                                        vm_name, params, raw=True)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: deallocate_vm at line 850
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   850                                               @profile
+   851                                               def deallocate_vm(self, vm_id):
+   852                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   853                                                                                        vm_id)
+   854                                                   vm_name = url_params.get(VM_NAME)
+   855                                                   self.compute_client. \
+   856                                                       virtual_machines.deallocate(self.resource_group,
+   857                                                                                   vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: generalize_vm at line 859
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   859                                               @profile
+   860                                               def generalize_vm(self, vm_id):
+   861                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   862                                                                                        vm_id)
+   863                                                   vm_name = url_params.get(VM_NAME)
+   864                                                   self.compute_client.virtual_machines. \
+   865                                                       generalize(self.resource_group, vm_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: start_vm at line 867
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   867                                               @profile
+   868                                               def start_vm(self, vm_id):
+   869                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   870                                                                                        vm_id)
+   871                                                   vm_name = url_params.get(VM_NAME)
+   872                                                   self.compute_client.virtual_machines. \
+   873                                                       start(self.resource_group,
+   874                                                             vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm_tags at line 876
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   876                                               @profile
+   877                                               def update_vm_tags(self, vm_id, tags):
+   878                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   879                                                                                        vm_id)
+   880                                                   vm_name = url_params.get(VM_NAME)
+   881                                                   self.compute_client.virtual_machines. \
+   882                                                       create_or_update(self.resource_group,
+   883                                                                        vm_name, tags).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_nic at line 885
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   885                                               @profile
+   886                                               def delete_nic(self, nic_id):
+   887                                                   nic_params = azure_helpers.\
+   888                                                       parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   889                                                   nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   890                                                   self.network_management_client. \
+   891                                                       network_interfaces.delete(self.resource_group,
+   892                                                                                 nic_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_nic at line 894
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   894                                               @profile
+   895                                               def get_nic(self, nic_id):
+   896                                                   nic_params = azure_helpers.\
+   897                                                       parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   898                                                   nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   899                                                   return self.network_management_client. \
+   900                                                       network_interfaces.get(self.resource_group, nic_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_nic at line 902
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   902                                               @profile
+   903                                               def update_nic(self, nic_id, params):
+   904                                                   nic_params = azure_helpers.\
+   905                                                       parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   906                                                   nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   907                                                   async_nic_creation = self.network_management_client. \
+   908                                                       network_interfaces.create_or_update(
+   909                                                           self.resource_group,
+   910                                                           nic_name,
+   911                                                           params
+   912                                                       )
+   913                                                   nic_info = async_nic_creation.result()
+   914                                                   return nic_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_nic at line 916
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   916                                               @profile
+   917                                               def create_nic(self, nic_name, params):
+   918                                                   return self.network_management_client. \
+   919                                                       network_interfaces.create_or_update(
+   920                                                           self.resource_group,
+   921                                                           nic_name,
+   922                                                           params
+   923                                                       ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_public_key at line 925
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   925                                               @profile
+   926                                               def create_public_key(self, entity):
+   927                                                   return self.table_service. \
+   928                                                       insert_or_replace_entity(self.public_key_storage_table_name,
+   929                                                                                entity)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_public_key at line 931
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   931                                               @profile
+   932                                               def get_public_key(self, name):
+   933                                                   entities = self.table_service. \
+   934                                                       query_entities(self.public_key_storage_table_name,
+   935                                                                      "Name eq '{0}'".format(name), num_results=1)
+   936                                           
+   937                                                   return entities.items[0] if len(entities.items) > 0 else None
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_public_key at line 939
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   939                                               @profile
+   940                                               def delete_public_key(self, entity):
+   941                                                   self.table_service.delete_entity(self.public_key_storage_table_name,
+   942                                                                                    entity.PartitionKey, entity.RowKey)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_public_keys at line 944
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   944                                               @profile
+   945                                               def list_public_keys(self, partition_key, limit=None, marker=None):
+   946                                                   entities = self.table_service. \
+   947                                                       query_entities(self.public_key_storage_table_name,
+   948                                                                      "PartitionKey eq '{0}'".format(partition_key),
+   949                                                                      marker=marker, num_results=limit)
+   950                                                   return (entities.items, entities.next_marker)
+
+Total time: 10.7532 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_route_table at line 952
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   952                                               @profile
+   953                                               def delete_route_table(self, route_table_name):
+   954         1        780.0    780.0      0.0          self.network_management_client. \
+   955         1   10752378.0 10752378.0    100.0              route_tables.delete(self.resource_group, route_table_name
+   956                                                                           ).wait()
+
+Total time: 4.17054 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: attach_subnet_to_route_table at line 958
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   958                                               @profile
+   959                                               def attach_subnet_to_route_table(self, subnet_id, route_table_id):
+   960         1          3.0      3.0      0.0          url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   961         1         29.0     29.0      0.0                                               subnet_id)
+   962         1          1.0      1.0      0.0          network_name = url_params.get(NETWORK_NAME)
+   963         1          0.0      0.0      0.0          subnet_name = url_params.get(SUBNET_NAME)
+   964                                           
+   965         1        834.0    834.0      0.0          subnet_info = self.network_management_client.subnets.get(
+   966         1          8.0      8.0      0.0              self.resource_group,
+   967         1          0.0      0.0      0.0              network_name,
+   968         1     194838.0 194838.0      4.7              subnet_name
+   969                                                   )
+   970         1          2.0      2.0      0.0          if subnet_info:
+   971                                                       subnet_info.route_table = {
+   972         1          1.0      1.0      0.0                  'id': route_table_id
+   973                                                       }
+   974                                           
+   975         1        809.0    809.0      0.0              result_create = self.network_management_client. \
+   976                                                           subnets.create_or_update(
+   977         1          9.0      9.0      0.0                   self.resource_group,
+   978         1          1.0      1.0      0.0                   network_name,
+   979         1          1.0      1.0      0.0                   subnet_name,
+   980         1     539670.0 539670.0     12.9                   subnet_info)
+   981         1    3434328.0 3434328.0     82.3              subnet_info = result_create.result()
+   982                                           
+   983         1          2.0      2.0      0.0          return subnet_info
+
+Total time: 4.59488 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: detach_subnet_to_route_table at line 985
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   985                                               @profile
+   986                                               def detach_subnet_to_route_table(self, subnet_id, route_table_id):
+   987         1          3.0      3.0      0.0          url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   988         1         22.0     22.0      0.0                                               subnet_id)
+   989         1          1.0      1.0      0.0          network_name = url_params.get(NETWORK_NAME)
+   990         1          0.0      0.0      0.0          subnet_name = url_params.get(SUBNET_NAME)
+   991                                           
+   992         1        584.0    584.0      0.0          subnet_info = self.network_management_client.subnets.get(
+   993         1          7.0      7.0      0.0              self.resource_group,
+   994         1          1.0      1.0      0.0              network_name,
+   995         1     418440.0 418440.0      9.1              subnet_name
+   996                                                   )
+   997                                           
+   998         1          2.0      2.0      0.0          if subnet_info and subnet_info.route_table.id == route_table_id:
+   999         1          1.0      1.0      0.0              subnet_info.route_table = None
+  1000                                           
+  1001         1        711.0    711.0      0.0              result_create = self.network_management_client. \
+  1002                                                           subnets.create_or_update(
+  1003         1          8.0      8.0      0.0                   self.resource_group,
+  1004         1          1.0      1.0      0.0                   network_name,
+  1005         1          1.0      1.0      0.0                   subnet_name,
+  1006         1     743687.0 743687.0     16.2                   subnet_info)
+  1007         1    3431407.0 3431407.0     74.7              subnet_info = result_create.result()
+  1008                                           
+  1009         1          2.0      2.0      0.0          return subnet_info
+
+Total time: 0.004834 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_route_tables at line 1011
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1011                                               @profile
+  1012                                               def list_route_tables(self):
+  1013         6       4533.0    755.5     93.8          return self.network_management_client. \
+  1014         6        301.0     50.2      6.2              route_tables.list(self.resource_group)
+
+Total time: 2.13352 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_route_table at line 1016
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1016                                               @profile
+  1017                                               def get_route_table(self, router_id):
+  1018         8         20.0      2.5      0.0          url_params = azure_helpers.parse_url(ROUTER_RESOURCE_ID,
+  1019         8        173.0     21.6      0.0                                               router_id)
+  1020         8          8.0      1.0      0.0          router_name = url_params.get(ROUTER_NAME)
+  1021         8       6325.0    790.6      0.3          return self.network_management_client. \
+  1022         8    2126996.0 265874.5     99.7              route_tables.get(self.resource_group, router_name)
+
+Total time: 11.1182 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_route_table at line 1024
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1024                                               @profile
+  1025                                               def create_route_table(self, route_table_name, params):
+  1026         1        770.0    770.0      0.0          return self.network_management_client. \
+  1027                                                       route_tables.create_or_update(
+  1028         1          8.0      8.0      0.0               self.resource_group,
+  1029         1   11117413.0 11117413.0    100.0               route_table_name, params).result()
+
+Total time: 93.1682 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_route_table_tags at line 1031
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1031                                               @profile
+  1032                                               def update_route_table_tags(self, route_table_name, tags):
+  1033         3       2496.0    832.0      0.0          self.network_management_client.route_tables. \
+  1034         3         28.0      9.3      0.0              create_or_update(self.resource_group,
+  1035         3   93165711.0 31055237.0    100.0                               route_table_name, tags).result()
+

+ 1470 - 0
results/object_life_cycle.res

@@ -0,0 +1,1470 @@
+cloudbridge.test.test_object_life_cycle.CloudObjectLifeCycleTestCase
+
+
+Test output
+ .
+----------------------------------------------------------------------
+Ran 1 test in 64.886s
+
+OK
+
+Wrote profile results to run_tests.py.lprof
+Timer unit: 1e-06 s
+
+Total time: 0.367839 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: __init__ at line 160
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   160                                               @profile
+   161                                               def __init__(self, config):
+   162         1          5.0      5.0      0.0          self._config = config
+   163         1          2.0      2.0      0.0          self.subscription_id = str(config.get('azure_subscription_id'))
+   164         1          0.0      0.0      0.0          self._credentials = ServicePrincipalCredentials(
+   165         1          1.0      1.0      0.0              client_id=config.get('azure_client_id'),
+   166         1          1.0      1.0      0.0              secret=config.get('azure_secret'),
+   167         1     367810.0 367810.0    100.0              tenant=config.get('azure_tenant')
+   168                                                   )
+   169                                           
+   170         1          3.0      3.0      0.0          self._access_token = config.get('azure_access_token')
+   171         1          1.0      1.0      0.0          self._resource_client = None
+   172         1          2.0      2.0      0.0          self._storage_client = None
+   173         1          1.0      1.0      0.0          self._network_management_client = None
+   174         1          1.0      1.0      0.0          self._subscription_client = None
+   175         1          0.0      0.0      0.0          self._compute_client = None
+   176         1          1.0      1.0      0.0          self._access_key_result = None
+   177         1          1.0      1.0      0.0          self._block_blob_service = None
+   178         1          1.0      1.0      0.0          self._table_service = None
+   179         1          1.0      1.0      0.0          self._storage_account = None
+   180                                           
+   181         1          8.0      8.0      0.0          log.debug("azure subscription : %s", self.subscription_id)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: access_key_result at line 183
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   183                                               @property
+   184                                               @tenacity.retry(stop=tenacity.stop_after_attempt(5), reraise=True)
+   185                                               @profile
+   186                                               def access_key_result(self):
+   187                                                   if not self._access_key_result:
+   188                                                       storage_account = self.storage_account
+   189                                           
+   190                                                       if self.get_storage_account(storage_account).\
+   191                                                               provisioning_state.value != 'Succeeded':
+   192                                                           log.debug(
+   193                                                               "Storage account %s is not in Succeeded state yet. ",
+   194                                                               storage_account)
+   195                                                           raise WaitStateException(
+   196                                                               "Waited too long for storage account: {0} to "
+   197                                                               "become ready.".format(
+   198                                                                   storage_account,
+   199                                                                   self.get_storage_account(storage_account).
+   200                                                                   provisioning_state))
+   201                                           
+   202                                                       self._access_key_result = self.storage_client.storage_accounts. \
+   203                                                           list_keys(self.resource_group, storage_account)
+   204                                                   return self._access_key_result
+
+Total time: 6e-06 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: resource_group at line 206
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   206                                               @property
+   207                                               @profile
+   208                                               def resource_group(self):
+   209         3          6.0      2.0    100.0          return self._config.get('azure_resource_group')
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: storage_account at line 211
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   211                                               @property
+   212                                               @profile
+   213                                               def storage_account(self):
+   214                                                   return self._config.get('azure_storage_account')
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: region_name at line 216
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   216                                               @property
+   217                                               @profile
+   218                                               def region_name(self):
+   219                                                   return self._config.get('azure_region_name')
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: public_key_storage_table_name at line 221
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   221                                               @property
+   222                                               @profile
+   223                                               def public_key_storage_table_name(self):
+   224                                                   return self._config.get('azure_public_key_storage_table_name')
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: storage_client at line 226
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   226                                               @property
+   227                                               @profile
+   228                                               def storage_client(self):
+   229                                                   if not self._storage_client:
+   230                                                       self._storage_client = \
+   231                                                           StorageManagementClient(self._credentials,
+   232                                                                                   self.subscription_id)
+   233                                                   return self._storage_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: subscription_client at line 235
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   235                                               @property
+   236                                               @profile
+   237                                               def subscription_client(self):
+   238                                                   if not self._subscription_client:
+   239                                                       self._subscription_client = SubscriptionClient(self._credentials)
+   240                                                   return self._subscription_client
+
+Total time: 0.019954 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: resource_client at line 242
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   242                                               @property
+   243                                               @profile
+   244                                               def resource_client(self):
+   245         1          1.0      1.0      0.0          if not self._resource_client:
+   246                                                       self._resource_client = \
+   247         1          1.0      1.0      0.0                  ResourceManagementClient(self._credentials,
+   248         1      19949.0  19949.0    100.0                                           self.subscription_id)
+   249         1          3.0      3.0      0.0          return self._resource_client
+
+Total time: 0.007118 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: compute_client at line 251
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   251                                               @property
+   252                                               @profile
+   253                                               def compute_client(self):
+   254         3          3.0      1.0      0.0          if not self._compute_client:
+   255                                                       self._compute_client = \
+   256         1          2.0      2.0      0.0                  ComputeManagementClient(self._credentials,
+   257         1       7109.0   7109.0     99.9                                          self.subscription_id)
+   258         3          4.0      1.3      0.1          return self._compute_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: network_management_client at line 260
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   260                                               @property
+   261                                               @profile
+   262                                               def network_management_client(self):
+   263                                                   if not self._network_management_client:
+   264                                                       self._network_management_client = NetworkManagementClient(
+   265                                                           self._credentials, self.subscription_id)
+   266                                                   return self._network_management_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: blob_service at line 268
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   268                                               @property
+   269                                               @profile
+   270                                               def blob_service(self):
+   271                                                   self._get_or_create_storage_account()
+   272                                                   if not self._block_blob_service:
+   273                                                       if self._access_token:
+   274                                                           token_credential = TokenCredential(self._access_token)
+   275                                                           self._block_blob_service = BlockBlobService(
+   276                                                               account_name=self.storage_account,
+   277                                                               token_credential=token_credential)
+   278                                                       else:
+   279                                                           self._block_blob_service = BlockBlobService(
+   280                                                               account_name=self.storage_account,
+   281                                                               account_key=self.access_key_result.keys[0].value)
+   282                                                   return self._block_blob_service
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: table_service at line 284
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   284                                               @property
+   285                                               @profile
+   286                                               def table_service(self):
+   287                                                   self._get_or_create_storage_account()
+   288                                                   if not self._table_service:
+   289                                                       self._table_service = TableService(
+   290                                                           self.storage_account,
+   291                                                           self.access_key_result.keys[0].value)
+   292                                                   if not self._table_service. \
+   293                                                           exists(table_name=self.public_key_storage_table_name):
+   294                                                       self._table_service.create_table(
+   295                                                           self.public_key_storage_table_name)
+   296                                                   return self._table_service
+
+Total time: 0.693881 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_resource_group at line 298
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   298                                               @profile
+   299                                               def get_resource_group(self, name):
+   300         1     693881.0 693881.0    100.0          return self.resource_client.resource_groups.get(name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_resource_group at line 302
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   302                                               @profile
+   303                                               def create_resource_group(self, name, parameters):
+   304                                                   return self.resource_client.resource_groups. \
+   305                                                       create_or_update(name, parameters)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_storage_account at line 307
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   307                                               @profile
+   308                                               def get_storage_account(self, storage_account):
+   309                                                   return self.storage_client.storage_accounts. \
+   310                                                       get_properties(self.resource_group, storage_account)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_storage_account at line 312
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   312                                               @profile
+   313                                               def create_storage_account(self, name, params):
+   314                                                   return self.storage_client.storage_accounts. \
+   315                                                       create(self.resource_group, name.lower(), params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: _get_or_create_storage_account at line 319
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   319                                               @tenacity.retry(stop=tenacity.stop_after_attempt(2),
+   320                                                               retry=tenacity.retry_if_exception_type(CloudError),
+   321                                                               reraise=True)
+   322                                               @profile
+   323                                               def _get_or_create_storage_account(self):
+   324                                                   if self._storage_account:
+   325                                                       return self._storage_account
+   326                                                   else:
+   327                                                       try:
+   328                                                           self._storage_account = \
+   329                                                               self.get_storage_account(self.storage_account)
+   330                                                       except CloudError as cloud_error:
+   331                                                           if cloud_error.error.error == "ResourceNotFound":
+   332                                                               storage_account_params = {
+   333                                                                   'sku': {
+   334                                                                       'name': 'Standard_LRS'
+   335                                                                   },
+   336                                                                   'kind': 'storage',
+   337                                                                   'location': self.region_name,
+   338                                                               }
+   339                                                               try:
+   340                                                                   self._storage_account = \
+   341                                                                       self.create_storage_account(self.storage_account,
+   342                                                                                                   storage_account_params)
+   343                                                               except CloudError as cloud_error2:  # pragma: no cover
+   344                                                                   if cloud_error2.error.error == "AuthorizationFailed":
+   345                                                                       mess = 'The following error was returned by ' \
+   346                                                                              'Azure:\n%s\n\nThis is likely because the' \
+   347                                                                              ' Role associated with the provided ' \
+   348                                                                              'credentials does not allow for Storage ' \
+   349                                                                              'Account creation.\nA Storage Account is ' \
+   350                                                                              'necessary in order to perform the ' \
+   351                                                                              'desired operation. You must either ' \
+   352                                                                              'provide an existing Storage Account name' \
+   353                                                                              ' as part of the configuration, or ' \
+   354                                                                              'elevate the associated Role.\nFor more ' \
+   355                                                                              'information on roles, see: https://docs.' \
+   356                                                                              'microsoft.com/en-us/azure/role-based-' \
+   357                                                                              'access-control/overview\n' % cloud_error2
+   358                                                                       raise ProviderConnectionException(mess)
+   359                                           
+   360                                                                   elif cloud_error2.error.error == \
+   361                                                                           "StorageAccountAlreadyTaken":
+   362                                                                       mess = 'The following error was ' \
+   363                                                                              'returned by Azure:\n%s\n\n' \
+   364                                                                              'Note that Storage Account names must be ' \
+   365                                                                              'unique across Azure (not just in your ' \
+   366                                                                              'subscription).\nFor more information ' \
+   367                                                                              'see https://docs.microsoft.com/en-us/' \
+   368                                                                              'azure/azure-resource-manager/resource-' \
+   369                                                                              'manager-storage-account-name-errors\n' \
+   370                                                                              % cloud_error2
+   371                                                                       raise InvalidLabelException(mess)
+   372                                                                   else:
+   373                                                                       raise cloud_error2
+   374                                                           else:
+   375                                                               raise cloud_error
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_locations at line 377
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   377                                               @profile
+   378                                               def list_locations(self):
+   379                                                   return self.subscription_client.subscriptions. \
+   380                                                       list_locations(self.subscription_id)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm_firewall at line 382
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   382                                               @profile
+   383                                               def list_vm_firewall(self):
+   384                                                   return self.network_management_client.network_security_groups. \
+   385                                                       list(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm_firewall at line 387
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   387                                               @profile
+   388                                               def create_vm_firewall(self, name, parameters):
+   389                                                   return self.network_management_client.network_security_groups. \
+   390                                                       create_or_update(self.resource_group, name,
+   391                                                                        parameters).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm_firewall_tags at line 393
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   393                                               @profile
+   394                                               def update_vm_firewall_tags(self, fw_id, tags):
+   395                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   396                                                                                        fw_id)
+   397                                                   name = url_params.get(VM_FIREWALL_NAME)
+   398                                                   return self.network_management_client.network_security_groups. \
+   399                                                       create_or_update(self.resource_group, name,
+   400                                                                        {'tags': tags,
+   401                                                                         'location': self.region_name}).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_vm_firewall at line 403
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   403                                               @profile
+   404                                               def get_vm_firewall(self, fw_id):
+   405                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   406                                                                                        fw_id)
+   407                                                   fw_name = url_params.get(VM_FIREWALL_NAME)
+   408                                                   return self.network_management_client.network_security_groups. \
+   409                                                       get(self.resource_group, fw_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm_firewall at line 411
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   411                                               @profile
+   412                                               def delete_vm_firewall(self, fw_id):
+   413                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   414                                                                                        fw_id)
+   415                                                   name = url_params.get(VM_FIREWALL_NAME)
+   416                                                   self.network_management_client \
+   417                                                       .network_security_groups.delete(self.resource_group, name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm_firewall_rule at line 419
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   419                                               @profile
+   420                                               def create_vm_firewall_rule(self, fw_id,
+   421                                                                           rule_name, parameters):
+   422                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   423                                                                                        fw_id)
+   424                                                   vm_firewall_name = url_params.get(VM_FIREWALL_NAME)
+   425                                                   return self.network_management_client.security_rules. \
+   426                                                       create_or_update(self.resource_group, vm_firewall_name,
+   427                                                                        rule_name, parameters).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm_firewall_rule at line 429
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   429                                               @profile
+   430                                               def delete_vm_firewall_rule(self, fw_rule_id, vm_firewall):
+   431                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RULE_RESOURCE_ID,
+   432                                                                                        fw_rule_id)
+   433                                                   name = url_params.get(VM_FIREWALL_RULE_NAME)
+   434                                                   return self.network_management_client.security_rules. \
+   435                                                       delete(self.resource_group, vm_firewall, name).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_containers at line 437
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   437                                               @profile
+   438                                               def list_containers(self, prefix=None, limit=None, marker=None):
+   439                                                   results = self.blob_service.list_containers(prefix=prefix,
+   440                                                                                               num_results=limit,
+   441                                                                                               marker=marker)
+   442                                                   return (results.items, results.next_marker)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_container at line 444
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   444                                               @profile
+   445                                               def create_container(self, container_name):
+   446                                                   try:
+   447                                                       self.blob_service.create_container(container_name,
+   448                                                                                          fail_on_exist=True)
+   449                                                   except AzureConflictHttpError as cloud_error:
+   450                                                       if cloud_error.error_code == "ContainerAlreadyExists":
+   451                                                           msg = "The given Bucket name '%s' already exists. Please " \
+   452                                                                 "use the `get` or `find` method to get a reference to " \
+   453                                                                 "an existing Bucket, or specify a new Bucket name to " \
+   454                                                                 "create.\nNote that in Azure, Buckets are contained " \
+   455                                                                 "in Storage Accounts." % container_name
+   456                                                           raise DuplicateResourceException(msg)
+   457                                           
+   458                                                   return self.blob_service.get_container_properties(container_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_container at line 460
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   460                                               @profile
+   461                                               def get_container(self, container_name):
+   462                                                   return self.blob_service.get_container_properties(container_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_container at line 464
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   464                                               @profile
+   465                                               def delete_container(self, container_name):
+   466                                                   self.blob_service.delete_container(container_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_blobs at line 468
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   468                                               @profile
+   469                                               def list_blobs(self, container_name, prefix=None):
+   470                                                   return self.blob_service.list_blobs(container_name, prefix=prefix)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob at line 472
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   472                                               @profile
+   473                                               def get_blob(self, container_name, blob_name):
+   474                                                   return self.blob_service.get_blob_properties(container_name, blob_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_blob_from_text at line 476
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   476                                               @profile
+   477                                               def create_blob_from_text(self, container_name, blob_name, text):
+   478                                                   self.blob_service.create_blob_from_text(container_name,
+   479                                                                                           blob_name, text)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_blob_from_file at line 481
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   481                                               @profile
+   482                                               def create_blob_from_file(self, container_name, blob_name, file_path):
+   483                                                   self.blob_service.create_blob_from_path(container_name,
+   484                                                                                           blob_name, file_path)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_blob at line 486
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   486                                               @profile
+   487                                               def delete_blob(self, container_name, blob_name):
+   488                                                   self.blob_service.delete_blob(container_name, blob_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob_url at line 490
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   490                                               @profile
+   491                                               def get_blob_url(self, container_name, blob_name, expiry_time):
+   492                                                   expiry_date = datetime.datetime.utcnow() + datetime.timedelta(
+   493                                                       seconds=expiry_time)
+   494                                                   sas = self.blob_service.generate_blob_shared_access_signature(
+   495                                                       container_name, blob_name, permission=BlobPermissions.READ,
+   496                                                       expiry=expiry_date)
+   497                                                   return self.blob_service.make_blob_url(container_name, blob_name,
+   498                                                                                          sas_token=sas)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob_content at line 500
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   500                                               @profile
+   501                                               def get_blob_content(self, container_name, blob_name):
+   502                                                   out_stream = BytesIO()
+   503                                                   self.blob_service.get_blob_to_stream(container_name,
+   504                                                                                        blob_name, out_stream)
+   505                                                   return out_stream
+
+Total time: 31.2022 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_empty_disk at line 507
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   507                                               @profile
+   508                                               def create_empty_disk(self, disk_name, params):
+   509         1       7886.0   7886.0      0.0          return self.compute_client.disks.create_or_update(
+   510         1         15.0     15.0      0.0              self.resource_group,
+   511         1          1.0      1.0      0.0              disk_name,
+   512         1   31194332.0 31194332.0    100.0              params
+   513                                                   ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_snapshot_disk at line 515
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   515                                               @profile
+   516                                               def create_snapshot_disk(self, disk_name, params):
+   517                                                   return self.compute_client.disks.create_or_update(
+   518                                                       self.resource_group,
+   519                                                       disk_name,
+   520                                                       params
+   521                                                   ).result()
+
+Total time: 0.664942 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_disk at line 523
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   523                                               @profile
+   524                                               def get_disk(self, disk_id):
+   525         1         10.0     10.0      0.0          url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   526         1         34.0     34.0      0.0                                               disk_id)
+   527         1          2.0      2.0      0.0          disk_name = url_params.get(VOLUME_NAME)
+   528         1     664896.0 664896.0    100.0          return self.compute_client.disks.get(self.resource_group, disk_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_disks at line 530
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   530                                               @profile
+   531                                               def list_disks(self):
+   532                                                   return self.compute_client.disks. \
+   533                                                       list_by_resource_group(self.resource_group)
+
+Total time: 30.591 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_disk at line 535
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   535                                               @profile
+   536                                               def delete_disk(self, disk_id):
+   537         1          3.0      3.0      0.0          url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   538         1         27.0     27.0      0.0                                               disk_id)
+   539         1          1.0      1.0      0.0          disk_name = url_params.get(VOLUME_NAME)
+   540         1   30590981.0 30590981.0    100.0          self.compute_client.disks.delete(self.resource_group, disk_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_disk_tags at line 542
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   542                                               @profile
+   543                                               def update_disk_tags(self, disk_id, tags):
+   544                                                   url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   545                                                                                        disk_id)
+   546                                                   disk_name = url_params.get(VOLUME_NAME)
+   547                                                   return self.compute_client.disks.update(
+   548                                                       self.resource_group,
+   549                                                       disk_name,
+   550                                                       {'tags': tags},
+   551                                                       raw=True
+   552                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_snapshots at line 554
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   554                                               @profile
+   555                                               def list_snapshots(self):
+   556                                                   return self.compute_client.snapshots. \
+   557                                                       list_by_resource_group(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_snapshot at line 559
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   559                                               @profile
+   560                                               def get_snapshot(self, snapshot_id):
+   561                                                   url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   562                                                                                        snapshot_id)
+   563                                                   snapshot_name = url_params.get(SNAPSHOT_NAME)
+   564                                                   return self.compute_client.snapshots.get(self.resource_group,
+   565                                                                                            snapshot_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_snapshot at line 567
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   567                                               @profile
+   568                                               def create_snapshot(self, snapshot_name, params):
+   569                                                   return self.compute_client.snapshots.create_or_update(
+   570                                                       self.resource_group,
+   571                                                       snapshot_name,
+   572                                                       params
+   573                                                   ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_snapshot at line 575
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   575                                               @profile
+   576                                               def delete_snapshot(self, snapshot_id):
+   577                                                   url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   578                                                                                        snapshot_id)
+   579                                                   snapshot_name = url_params.get(SNAPSHOT_NAME)
+   580                                                   self.compute_client.snapshots.delete(self.resource_group,
+   581                                                                                        snapshot_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_snapshot_tags at line 583
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   583                                               @profile
+   584                                               def update_snapshot_tags(self, snapshot_id, tags):
+   585                                                   url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   586                                                                                        snapshot_id)
+   587                                                   snapshot_name = url_params.get(SNAPSHOT_NAME)
+   588                                                   return self.compute_client.snapshots.update(
+   589                                                       self.resource_group,
+   590                                                       snapshot_name,
+   591                                                       {'tags': tags},
+   592                                                       raw=True
+   593                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: is_gallery_image at line 595
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   595                                               @profile
+   596                                               def is_gallery_image(self, image_id):
+   597                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   598                                                                                        image_id)
+   599                                                   # If it is a gallery image, it will always have an offer
+   600                                                   return 'offer' in url_params
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_image at line 602
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   602                                               @profile
+   603                                               def create_image(self, name, params):
+   604                                                   return self.compute_client.images. \
+   605                                                       create_or_update(self.resource_group, name,
+   606                                                                        params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_image at line 608
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   608                                               @profile
+   609                                               def delete_image(self, image_id):
+   610                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   611                                                                                        image_id)
+   612                                                   if not self.is_gallery_image(image_id):
+   613                                                       name = url_params.get(IMAGE_NAME)
+   614                                                       self.compute_client.images.delete(self.resource_group, name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_images at line 616
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   616                                               @profile
+   617                                               def list_images(self):
+   618                                                   azure_images = list(self.compute_client.images.
+   619                                                                       list_by_resource_group(self.resource_group))
+   620                                                   return azure_images
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_gallery_refs at line 622
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   622                                               @profile
+   623                                               def list_gallery_refs(self):
+   624                                                   return gallery_image_references
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_image at line 626
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   626                                               @profile
+   627                                               def get_image(self, image_id):
+   628                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   629                                                                                        image_id)
+   630                                                   if self.is_gallery_image(image_id):
+   631                                                       return GalleryImageReference(publisher=url_params['publisher'],
+   632                                                                                    offer=url_params['offer'],
+   633                                                                                    sku=url_params['sku'],
+   634                                                                                    version=url_params['version'])
+   635                                                   else:
+   636                                                       name = url_params.get(IMAGE_NAME)
+   637                                                       return self.compute_client.images.get(self.resource_group, name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_image_tags at line 639
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   639                                               @profile
+   640                                               def update_image_tags(self, image_id, tags):
+   641                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   642                                                                                        image_id)
+   643                                                   if self.is_gallery_image(image_id):
+   644                                                       return True
+   645                                                   else:
+   646                                                       name = url_params.get(IMAGE_NAME)
+   647                                                       return self.compute_client.images. \
+   648                                                           create_or_update(self.resource_group, name,
+   649                                                                            {
+   650                                                                                'tags': tags,
+   651                                                                                'location': self.region_name
+   652                                                                            }).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm_types at line 654
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   654                                               @profile
+   655                                               def list_vm_types(self):
+   656                                                   return self.compute_client.virtual_machine_sizes. \
+   657                                                       list(self.region_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_networks at line 659
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   659                                               @profile
+   660                                               def list_networks(self):
+   661                                                   return self.network_management_client.virtual_networks.list(
+   662                                                       self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_network at line 664
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   664                                               @profile
+   665                                               def get_network(self, network_id):
+   666                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID,
+   667                                                                                        network_id)
+   668                                                   network_name = url_params.get(NETWORK_NAME)
+   669                                                   return self.network_management_client.virtual_networks.get(
+   670                                                       self.resource_group, network_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_network at line 672
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   672                                               @profile
+   673                                               def create_network(self, name, params):
+   674                                                   return self.network_management_client.virtual_networks. \
+   675                                                       create_or_update(self.resource_group,
+   676                                                                        name,
+   677                                                                        parameters=params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_network at line 679
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   679                                               @profile
+   680                                               def delete_network(self, network_id):
+   681                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   682                                                   network_name = url_params.get(NETWORK_NAME)
+   683                                                   return self.network_management_client.virtual_networks. \
+   684                                                       delete(self.resource_group, network_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_network_tags at line 686
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   686                                               @profile
+   687                                               def update_network_tags(self, network_id, tags):
+   688                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   689                                                   network_name = url_params.get(NETWORK_NAME)
+   690                                                   return self.network_management_client.virtual_networks. \
+   691                                                       create_or_update(self.resource_group,
+   692                                                                        network_name, tags).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_network_id_for_subnet at line 694
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   694                                               @profile
+   695                                               def get_network_id_for_subnet(self, subnet_id):
+   696                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID, subnet_id)
+   697                                                   network_id = NETWORK_RESOURCE_ID[0]
+   698                                                   for key, val in url_params.items():
+   699                                                       network_id = network_id.replace("{" + key + "}", val)
+   700                                                   return network_id
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_subnets at line 702
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   702                                               @profile
+   703                                               def list_subnets(self, network_id):
+   704                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   705                                                   network_name = url_params.get(NETWORK_NAME)
+   706                                                   return self.network_management_client.subnets. \
+   707                                                       list(self.resource_group, network_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_subnet at line 709
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   709                                               @profile
+   710                                               def get_subnet(self, subnet_id):
+   711                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   712                                                                                        subnet_id)
+   713                                                   network_name = url_params.get(NETWORK_NAME)
+   714                                                   subnet_name = url_params.get(SUBNET_NAME)
+   715                                                   return self.network_management_client.subnets. \
+   716                                                       get(self.resource_group, network_name, subnet_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_subnet at line 718
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   718                                               @profile
+   719                                               def create_subnet(self, network_id, subnet_name, params):
+   720                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   721                                                   network_name = url_params.get(NETWORK_NAME)
+   722                                                   result_create = self.network_management_client \
+   723                                                       .subnets.create_or_update(
+   724                                                           self.resource_group,
+   725                                                           network_name,
+   726                                                           subnet_name,
+   727                                                           params
+   728                                                       )
+   729                                                   subnet_info = result_create.result()
+   730                                           
+   731                                                   return subnet_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: __if_subnet_in_use at line 733
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   733                                               @profile
+   734                                               def __if_subnet_in_use(e):
+   735                                                   # return True if the CloudError exception is due to subnet being in use
+   736                                                   if isinstance(e, CloudError):
+   737                                                       if e.error.error == "InUseSubnetCannotBeDeleted":
+   738                                                           return True
+   739                                                   return False
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_subnet at line 741
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   741                                               @tenacity.retry(stop=tenacity.stop_after_attempt(5),
+   742                                                               retry=tenacity.retry_if_exception(__if_subnet_in_use),
+   743                                                               wait=tenacity.wait_fixed(5),
+   744                                                               reraise=True)
+   745                                               @profile
+   746                                               def delete_subnet(self, subnet_id):
+   747                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   748                                                                                        subnet_id)
+   749                                                   network_name = url_params.get(NETWORK_NAME)
+   750                                                   subnet_name = url_params.get(SUBNET_NAME)
+   751                                           
+   752                                                   try:
+   753                                                       result_delete = self.network_management_client \
+   754                                                           .subnets.delete(
+   755                                                               self.resource_group,
+   756                                                               network_name,
+   757                                                               subnet_name
+   758                                                           )
+   759                                                       result_delete.wait()
+   760                                                   except CloudError as cloud_error:
+   761                                                       log.exception(cloud_error.message)
+   762                                                       raise cloud_error
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_floating_ip at line 764
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   764                                               @profile
+   765                                               def create_floating_ip(self, public_ip_name, public_ip_parameters):
+   766                                                   return self.network_management_client.public_ip_addresses. \
+   767                                                       create_or_update(self.resource_group,
+   768                                                                        public_ip_name,
+   769                                                                        public_ip_parameters).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_floating_ip at line 771
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   771                                               @profile
+   772                                               def get_floating_ip(self, public_ip_id):
+   773                                                   url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   774                                                                                        public_ip_id)
+   775                                                   public_ip_name = url_params.get(PUBLIC_IP_NAME)
+   776                                                   return self.network_management_client. \
+   777                                                       public_ip_addresses.get(self.resource_group, public_ip_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_floating_ip at line 779
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   779                                               @profile
+   780                                               def delete_floating_ip(self, public_ip_id):
+   781                                                   url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   782                                                                                        public_ip_id)
+   783                                                   public_ip_name = url_params.get(PUBLIC_IP_NAME)
+   784                                                   self.network_management_client. \
+   785                                                       public_ip_addresses.delete(self.resource_group,
+   786                                                                                  public_ip_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_fip_tags at line 788
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   788                                               @profile
+   789                                               def update_fip_tags(self, fip_id, tags):
+   790                                                   url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   791                                                                                        fip_id)
+   792                                                   fip_name = url_params.get(PUBLIC_IP_NAME)
+   793                                                   self.network_management_client.public_ip_addresses. \
+   794                                                       create_or_update(self.resource_group,
+   795                                                                        fip_name, tags).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_floating_ips at line 797
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   797                                               @profile
+   798                                               def list_floating_ips(self):
+   799                                                   return self.network_management_client.public_ip_addresses.list(
+   800                                                       self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm at line 802
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   802                                               @profile
+   803                                               def list_vm(self):
+   804                                                   return self.compute_client.virtual_machines.list(
+   805                                                       self.resource_group
+   806                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: restart_vm at line 808
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   808                                               @profile
+   809                                               def restart_vm(self, vm_id):
+   810                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   811                                                                                        vm_id)
+   812                                                   vm_name = url_params.get(VM_NAME)
+   813                                                   return self.compute_client.virtual_machines.restart(
+   814                                                       self.resource_group, vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm at line 816
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   816                                               @profile
+   817                                               def delete_vm(self, vm_id):
+   818                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   819                                                                                        vm_id)
+   820                                                   vm_name = url_params.get(VM_NAME)
+   821                                                   return self.compute_client.virtual_machines.delete(
+   822                                                       self.resource_group, vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_vm at line 824
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   824                                               @profile
+   825                                               def get_vm(self, vm_id):
+   826                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   827                                                                                        vm_id)
+   828                                                   vm_name = url_params.get(VM_NAME)
+   829                                                   return self.compute_client.virtual_machines.get(
+   830                                                       self.resource_group,
+   831                                                       vm_name,
+   832                                                       expand='instanceView'
+   833                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm at line 835
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   835                                               @profile
+   836                                               def create_vm(self, vm_name, params):
+   837                                                   return self.compute_client.virtual_machines. \
+   838                                                       create_or_update(self.resource_group,
+   839                                                                        vm_name, params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm at line 841
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   841                                               @profile
+   842                                               def update_vm(self, vm_id, params):
+   843                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   844                                                                                        vm_id)
+   845                                                   vm_name = url_params.get(VM_NAME)
+   846                                                   return self.compute_client.virtual_machines. \
+   847                                                       create_or_update(self.resource_group,
+   848                                                                        vm_name, params, raw=True)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: deallocate_vm at line 850
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   850                                               @profile
+   851                                               def deallocate_vm(self, vm_id):
+   852                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   853                                                                                        vm_id)
+   854                                                   vm_name = url_params.get(VM_NAME)
+   855                                                   self.compute_client. \
+   856                                                       virtual_machines.deallocate(self.resource_group,
+   857                                                                                   vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: generalize_vm at line 859
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   859                                               @profile
+   860                                               def generalize_vm(self, vm_id):
+   861                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   862                                                                                        vm_id)
+   863                                                   vm_name = url_params.get(VM_NAME)
+   864                                                   self.compute_client.virtual_machines. \
+   865                                                       generalize(self.resource_group, vm_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: start_vm at line 867
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   867                                               @profile
+   868                                               def start_vm(self, vm_id):
+   869                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   870                                                                                        vm_id)
+   871                                                   vm_name = url_params.get(VM_NAME)
+   872                                                   self.compute_client.virtual_machines. \
+   873                                                       start(self.resource_group,
+   874                                                             vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm_tags at line 876
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   876                                               @profile
+   877                                               def update_vm_tags(self, vm_id, tags):
+   878                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   879                                                                                        vm_id)
+   880                                                   vm_name = url_params.get(VM_NAME)
+   881                                                   self.compute_client.virtual_machines. \
+   882                                                       create_or_update(self.resource_group,
+   883                                                                        vm_name, tags).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_nic at line 885
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   885                                               @profile
+   886                                               def delete_nic(self, nic_id):
+   887                                                   nic_params = azure_helpers.\
+   888                                                       parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   889                                                   nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   890                                                   self.network_management_client. \
+   891                                                       network_interfaces.delete(self.resource_group,
+   892                                                                                 nic_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_nic at line 894
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   894                                               @profile
+   895                                               def get_nic(self, nic_id):
+   896                                                   nic_params = azure_helpers.\
+   897                                                       parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   898                                                   nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   899                                                   return self.network_management_client. \
+   900                                                       network_interfaces.get(self.resource_group, nic_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_nic at line 902
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   902                                               @profile
+   903                                               def update_nic(self, nic_id, params):
+   904                                                   nic_params = azure_helpers.\
+   905                                                       parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   906                                                   nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   907                                                   async_nic_creation = self.network_management_client. \
+   908                                                       network_interfaces.create_or_update(
+   909                                                           self.resource_group,
+   910                                                           nic_name,
+   911                                                           params
+   912                                                       )
+   913                                                   nic_info = async_nic_creation.result()
+   914                                                   return nic_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_nic at line 916
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   916                                               @profile
+   917                                               def create_nic(self, nic_name, params):
+   918                                                   return self.network_management_client. \
+   919                                                       network_interfaces.create_or_update(
+   920                                                           self.resource_group,
+   921                                                           nic_name,
+   922                                                           params
+   923                                                       ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_public_key at line 925
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   925                                               @profile
+   926                                               def create_public_key(self, entity):
+   927                                                   return self.table_service. \
+   928                                                       insert_or_replace_entity(self.public_key_storage_table_name,
+   929                                                                                entity)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_public_key at line 931
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   931                                               @profile
+   932                                               def get_public_key(self, name):
+   933                                                   entities = self.table_service. \
+   934                                                       query_entities(self.public_key_storage_table_name,
+   935                                                                      "Name eq '{0}'".format(name), num_results=1)
+   936                                           
+   937                                                   return entities.items[0] if len(entities.items) > 0 else None
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_public_key at line 939
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   939                                               @profile
+   940                                               def delete_public_key(self, entity):
+   941                                                   self.table_service.delete_entity(self.public_key_storage_table_name,
+   942                                                                                    entity.PartitionKey, entity.RowKey)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_public_keys at line 944
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   944                                               @profile
+   945                                               def list_public_keys(self, partition_key, limit=None, marker=None):
+   946                                                   entities = self.table_service. \
+   947                                                       query_entities(self.public_key_storage_table_name,
+   948                                                                      "PartitionKey eq '{0}'".format(partition_key),
+   949                                                                      marker=marker, num_results=limit)
+   950                                                   return (entities.items, entities.next_marker)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_route_table at line 952
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   952                                               @profile
+   953                                               def delete_route_table(self, route_table_name):
+   954                                                   self.network_management_client. \
+   955                                                       route_tables.delete(self.resource_group, route_table_name
+   956                                                                           ).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: attach_subnet_to_route_table at line 958
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   958                                               @profile
+   959                                               def attach_subnet_to_route_table(self, subnet_id, route_table_id):
+   960                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   961                                                                                        subnet_id)
+   962                                                   network_name = url_params.get(NETWORK_NAME)
+   963                                                   subnet_name = url_params.get(SUBNET_NAME)
+   964                                           
+   965                                                   subnet_info = self.network_management_client.subnets.get(
+   966                                                       self.resource_group,
+   967                                                       network_name,
+   968                                                       subnet_name
+   969                                                   )
+   970                                                   if subnet_info:
+   971                                                       subnet_info.route_table = {
+   972                                                           'id': route_table_id
+   973                                                       }
+   974                                           
+   975                                                       result_create = self.network_management_client. \
+   976                                                           subnets.create_or_update(
+   977                                                            self.resource_group,
+   978                                                            network_name,
+   979                                                            subnet_name,
+   980                                                            subnet_info)
+   981                                                       subnet_info = result_create.result()
+   982                                           
+   983                                                   return subnet_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: detach_subnet_to_route_table at line 985
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   985                                               @profile
+   986                                               def detach_subnet_to_route_table(self, subnet_id, route_table_id):
+   987                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   988                                                                                        subnet_id)
+   989                                                   network_name = url_params.get(NETWORK_NAME)
+   990                                                   subnet_name = url_params.get(SUBNET_NAME)
+   991                                           
+   992                                                   subnet_info = self.network_management_client.subnets.get(
+   993                                                       self.resource_group,
+   994                                                       network_name,
+   995                                                       subnet_name
+   996                                                   )
+   997                                           
+   998                                                   if subnet_info and subnet_info.route_table.id == route_table_id:
+   999                                                       subnet_info.route_table = None
+  1000                                           
+  1001                                                       result_create = self.network_management_client. \
+  1002                                                           subnets.create_or_update(
+  1003                                                            self.resource_group,
+  1004                                                            network_name,
+  1005                                                            subnet_name,
+  1006                                                            subnet_info)
+  1007                                                       subnet_info = result_create.result()
+  1008                                           
+  1009                                                   return subnet_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_route_tables at line 1011
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1011                                               @profile
+  1012                                               def list_route_tables(self):
+  1013                                                   return self.network_management_client. \
+  1014                                                       route_tables.list(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_route_table at line 1016
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1016                                               @profile
+  1017                                               def get_route_table(self, router_id):
+  1018                                                   url_params = azure_helpers.parse_url(ROUTER_RESOURCE_ID,
+  1019                                                                                        router_id)
+  1020                                                   router_name = url_params.get(ROUTER_NAME)
+  1021                                                   return self.network_management_client. \
+  1022                                                       route_tables.get(self.resource_group, router_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_route_table at line 1024
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1024                                               @profile
+  1025                                               def create_route_table(self, route_table_name, params):
+  1026                                                   return self.network_management_client. \
+  1027                                                       route_tables.create_or_update(
+  1028                                                        self.resource_group,
+  1029                                                        route_table_name, params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_route_table_tags at line 1031
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1031                                               @profile
+  1032                                               def update_route_table_tags(self, route_table_name, tags):
+  1033                                                   self.network_management_client.route_tables. \
+  1034                                                       create_or_update(self.resource_group,
+  1035                                                                        route_table_name, tags).result()
+

+ 1467 - 0
results/object_store.res

@@ -0,0 +1,1467 @@
+Test output
+ ......s
+----------------------------------------------------------------------
+Ran 7 tests in 12.892s
+
+OK (skipped=1)
+
+Wrote profile results to run_tests.py.lprof
+Timer unit: 1e-06 s
+
+Total time: 2.08263 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: __init__ at line 160
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   160                                               @profile
+   161                                               def __init__(self, config):
+   162         6         19.0      3.2      0.0          self._config = config
+   163         6         17.0      2.8      0.0          self.subscription_id = str(config.get('azure_subscription_id'))
+   164         6          5.0      0.8      0.0          self._credentials = ServicePrincipalCredentials(
+   165         6          4.0      0.7      0.0              client_id=config.get('azure_client_id'),
+   166         6          5.0      0.8      0.0              secret=config.get('azure_secret'),
+   167         6    2082469.0 347078.2    100.0              tenant=config.get('azure_tenant')
+   168                                                   )
+   169                                           
+   170         6         21.0      3.5      0.0          self._access_token = config.get('azure_access_token')
+   171         6          6.0      1.0      0.0          self._resource_client = None
+   172         6          4.0      0.7      0.0          self._storage_client = None
+   173         6          7.0      1.2      0.0          self._network_management_client = None
+   174         6          5.0      0.8      0.0          self._subscription_client = None
+   175         6          5.0      0.8      0.0          self._compute_client = None
+   176         6          3.0      0.5      0.0          self._access_key_result = None
+   177         6          6.0      1.0      0.0          self._block_blob_service = None
+   178         6          5.0      0.8      0.0          self._table_service = None
+   179         6          6.0      1.0      0.0          self._storage_account = None
+   180                                           
+   181         6         41.0      6.8      0.0          log.debug("azure subscription : %s", self.subscription_id)
+
+Total time: 3.13512 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: access_key_result at line 183
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   183                                               @property
+   184                                               @tenacity.retry(stop=tenacity.stop_after_attempt(5), reraise=True)
+   185                                               @profile
+   186                                               def access_key_result(self):
+   187         6          5.0      0.8      0.0          if not self._access_key_result:
+   188         6         25.0      4.2      0.0              storage_account = self.storage_account
+   189                                           
+   190         6    1608318.0 268053.0     51.3              if self.get_storage_account(storage_account).\
+   191         6          9.0      1.5      0.0                      provisioning_state.value != 'Succeeded':
+   192                                                           log.debug(
+   193                                                               "Storage account %s is not in Succeeded state yet. ",
+   194                                                               storage_account)
+   195                                                           raise WaitStateException(
+   196                                                               "Waited too long for storage account: {0} to "
+   197                                                               "become ready.".format(
+   198                                                                   storage_account,
+   199                                                                   self.get_storage_account(storage_account).
+   200                                                                   provisioning_state))
+   201                                           
+   202         6       1660.0    276.7      0.1              self._access_key_result = self.storage_client.storage_accounts. \
+   203         6    1525091.0 254181.8     48.6                  list_keys(self.resource_group, storage_account)
+   204         6         14.0      2.3      0.0          return self._access_key_result
+
+Total time: 2.2e-05 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: resource_group at line 206
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   206                                               @property
+   207                                               @profile
+   208                                               def resource_group(self):
+   209        18         22.0      1.2    100.0          return self._config.get('azure_resource_group')
+
+Total time: 2.6e-05 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: storage_account at line 211
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   211                                               @property
+   212                                               @profile
+   213                                               def storage_account(self):
+   214        18         26.0      1.4    100.0          return self._config.get('azure_storage_account')
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: region_name at line 216
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   216                                               @property
+   217                                               @profile
+   218                                               def region_name(self):
+   219                                                   return self._config.get('azure_region_name')
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: public_key_storage_table_name at line 221
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   221                                               @property
+   222                                               @profile
+   223                                               def public_key_storage_table_name(self):
+   224                                                   return self._config.get('azure_public_key_storage_table_name')
+
+Total time: 0.043331 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: storage_client at line 226
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   226                                               @property
+   227                                               @profile
+   228                                               def storage_client(self):
+   229        18         30.0      1.7      0.1          if not self._storage_client:
+   230                                                       self._storage_client = \
+   231         6          9.0      1.5      0.0                  StorageManagementClient(self._credentials,
+   232         6      43274.0   7212.3     99.9                                          self.subscription_id)
+   233        18         18.0      1.0      0.0          return self._storage_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: subscription_client at line 235
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   235                                               @property
+   236                                               @profile
+   237                                               def subscription_client(self):
+   238                                                   if not self._subscription_client:
+   239                                                       self._subscription_client = SubscriptionClient(self._credentials)
+   240                                                   return self._subscription_client
+
+Total time: 0.057845 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: resource_client at line 242
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   242                                               @property
+   243                                               @profile
+   244                                               def resource_client(self):
+   245         6          5.0      0.8      0.0          if not self._resource_client:
+   246                                                       self._resource_client = \
+   247         6          8.0      1.3      0.0                  ResourceManagementClient(self._credentials,
+   248         6      57816.0   9636.0     99.9                                           self.subscription_id)
+   249         6         16.0      2.7      0.0          return self._resource_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: compute_client at line 251
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   251                                               @property
+   252                                               @profile
+   253                                               def compute_client(self):
+   254                                                   if not self._compute_client:
+   255                                                       self._compute_client = \
+   256                                                           ComputeManagementClient(self._credentials,
+   257                                                                                   self.subscription_id)
+   258                                                   return self._compute_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: network_management_client at line 260
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   260                                               @property
+   261                                               @profile
+   262                                               def network_management_client(self):
+   263                                                   if not self._network_management_client:
+   264                                                       self._network_management_client = NetworkManagementClient(
+   265                                                           self._credentials, self.subscription_id)
+   266                                                   return self._network_management_client
+
+Total time: 4.79624 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: blob_service at line 268
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   268                                               @property
+   269                                               @profile
+   270                                               def blob_service(self):
+   271        68    1658205.0  24385.4     34.6          self._get_or_create_storage_account()
+   272        68         95.0      1.4      0.0          if not self._block_blob_service:
+   273         6          5.0      0.8      0.0              if self._access_token:
+   274                                                           token_credential = TokenCredential(self._access_token)
+   275                                                           self._block_blob_service = BlockBlobService(
+   276                                                               account_name=self.storage_account,
+   277                                                               token_credential=token_credential)
+   278                                                       else:
+   279         6          9.0      1.5      0.0                  self._block_blob_service = BlockBlobService(
+   280         6        100.0     16.7      0.0                      account_name=self.storage_account,
+   281         6    3137787.0 522964.5     65.4                      account_key=self.access_key_result.keys[0].value)
+   282        68         42.0      0.6      0.0          return self._block_blob_service
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: table_service at line 284
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   284                                               @property
+   285                                               @profile
+   286                                               def table_service(self):
+   287                                                   self._get_or_create_storage_account()
+   288                                                   if not self._table_service:
+   289                                                       self._table_service = TableService(
+   290                                                           self.storage_account,
+   291                                                           self.access_key_result.keys[0].value)
+   292                                                   if not self._table_service. \
+   293                                                           exists(table_name=self.public_key_storage_table_name):
+   294                                                       self._table_service.create_table(
+   295                                                           self.public_key_storage_table_name)
+   296                                                   return self._table_service
+
+Total time: 1.54847 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_resource_group at line 298
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   298                                               @profile
+   299                                               def get_resource_group(self, name):
+   300         6    1548472.0 258078.7    100.0          return self.resource_client.resource_groups.get(name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_resource_group at line 302
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   302                                               @profile
+   303                                               def create_resource_group(self, name, parameters):
+   304                                                   return self.resource_client.resource_groups. \
+   305                                                       create_or_update(name, parameters)
+
+Total time: 3.25765 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_storage_account at line 307
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   307                                               @profile
+   308                                               def get_storage_account(self, storage_account):
+   309        12     115043.0   9586.9      3.5          return self.storage_client.storage_accounts. \
+   310        12    3142603.0 261883.6     96.5              get_properties(self.resource_group, storage_account)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_storage_account at line 312
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   312                                               @profile
+   313                                               def create_storage_account(self, name, params):
+   314                                                   return self.storage_client.storage_accounts. \
+   315                                                       create(self.resource_group, name.lower(), params).result()
+
+Total time: 1.64978 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: _get_or_create_storage_account at line 319
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   319                                               @tenacity.retry(stop=tenacity.stop_after_attempt(2),
+   320                                                               retry=tenacity.retry_if_exception_type(CloudError),
+   321                                                               reraise=True)
+   322                                               @profile
+   323                                               def _get_or_create_storage_account(self):
+   324        68        125.0      1.8      0.0          if self._storage_account:
+   325        62         56.0      0.9      0.0              return self._storage_account
+   326                                                   else:
+   327         6          3.0      0.5      0.0              try:
+   328                                                           self._storage_account = \
+   329         6    1649597.0 274932.8    100.0                      self.get_storage_account(self.storage_account)
+   330                                                       except CloudError as cloud_error:
+   331                                                           if cloud_error.error.error == "ResourceNotFound":
+   332                                                               storage_account_params = {
+   333                                                                   'sku': {
+   334                                                                       'name': 'Standard_LRS'
+   335                                                                   },
+   336                                                                   'kind': 'storage',
+   337                                                                   'location': self.region_name,
+   338                                                               }
+   339                                                               try:
+   340                                                                   self._storage_account = \
+   341                                                                       self.create_storage_account(self.storage_account,
+   342                                                                                                   storage_account_params)
+   343                                                               except CloudError as cloud_error2:  # pragma: no cover
+   344                                                                   if cloud_error2.error.error == "AuthorizationFailed":
+   345                                                                       mess = 'The following error was returned by ' \
+   346                                                                              'Azure:\n%s\n\nThis is likely because the' \
+   347                                                                              ' Role associated with the provided ' \
+   348                                                                              'credentials does not allow for Storage ' \
+   349                                                                              'Account creation.\nA Storage Account is ' \
+   350                                                                              'necessary in order to perform the ' \
+   351                                                                              'desired operation. You must either ' \
+   352                                                                              'provide an existing Storage Account name' \
+   353                                                                              ' as part of the configuration, or ' \
+   354                                                                              'elevate the associated Role.\nFor more ' \
+   355                                                                              'information on roles, see: https://docs.' \
+   356                                                                              'microsoft.com/en-us/azure/role-based-' \
+   357                                                                              'access-control/overview\n' % cloud_error2
+   358                                                                       raise ProviderConnectionException(mess)
+   359                                           
+   360                                                                   elif cloud_error2.error.error == \
+   361                                                                           "StorageAccountAlreadyTaken":
+   362                                                                       mess = 'The following error was ' \
+   363                                                                              'returned by Azure:\n%s\n\n' \
+   364                                                                              'Note that Storage Account names must be ' \
+   365                                                                              'unique across Azure (not just in your ' \
+   366                                                                              'subscription).\nFor more information ' \
+   367                                                                              'see https://docs.microsoft.com/en-us/' \
+   368                                                                              'azure/azure-resource-manager/resource-' \
+   369                                                                              'manager-storage-account-name-errors\n' \
+   370                                                                              % cloud_error2
+   371                                                                       raise InvalidLabelException(mess)
+   372                                                                   else:
+   373                                                                       raise cloud_error2
+   374                                                           else:
+   375                                                               raise cloud_error
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_locations at line 377
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   377                                               @profile
+   378                                               def list_locations(self):
+   379                                                   return self.subscription_client.subscriptions. \
+   380                                                       list_locations(self.subscription_id)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm_firewall at line 382
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   382                                               @profile
+   383                                               def list_vm_firewall(self):
+   384                                                   return self.network_management_client.network_security_groups. \
+   385                                                       list(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm_firewall at line 387
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   387                                               @profile
+   388                                               def create_vm_firewall(self, name, parameters):
+   389                                                   return self.network_management_client.network_security_groups. \
+   390                                                       create_or_update(self.resource_group, name,
+   391                                                                        parameters).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm_firewall_tags at line 393
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   393                                               @profile
+   394                                               def update_vm_firewall_tags(self, fw_id, tags):
+   395                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   396                                                                                        fw_id)
+   397                                                   name = url_params.get(VM_FIREWALL_NAME)
+   398                                                   return self.network_management_client.network_security_groups. \
+   399                                                       create_or_update(self.resource_group, name,
+   400                                                                        {'tags': tags,
+   401                                                                         'location': self.region_name}).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_vm_firewall at line 403
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   403                                               @profile
+   404                                               def get_vm_firewall(self, fw_id):
+   405                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   406                                                                                        fw_id)
+   407                                                   fw_name = url_params.get(VM_FIREWALL_NAME)
+   408                                                   return self.network_management_client.network_security_groups. \
+   409                                                       get(self.resource_group, fw_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm_firewall at line 411
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   411                                               @profile
+   412                                               def delete_vm_firewall(self, fw_id):
+   413                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   414                                                                                        fw_id)
+   415                                                   name = url_params.get(VM_FIREWALL_NAME)
+   416                                                   self.network_management_client \
+   417                                                       .network_security_groups.delete(self.resource_group, name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm_firewall_rule at line 419
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   419                                               @profile
+   420                                               def create_vm_firewall_rule(self, fw_id,
+   421                                                                           rule_name, parameters):
+   422                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   423                                                                                        fw_id)
+   424                                                   vm_firewall_name = url_params.get(VM_FIREWALL_NAME)
+   425                                                   return self.network_management_client.security_rules. \
+   426                                                       create_or_update(self.resource_group, vm_firewall_name,
+   427                                                                        rule_name, parameters).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm_firewall_rule at line 429
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   429                                               @profile
+   430                                               def delete_vm_firewall_rule(self, fw_rule_id, vm_firewall):
+   431                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RULE_RESOURCE_ID,
+   432                                                                                        fw_rule_id)
+   433                                                   name = url_params.get(VM_FIREWALL_RULE_NAME)
+   434                                                   return self.network_management_client.security_rules. \
+   435                                                       delete(self.resource_group, vm_firewall, name).result()
+
+Total time: 0.177743 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_containers at line 437
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   437                                               @profile
+   438                                               def list_containers(self, prefix=None, limit=None, marker=None):
+   439         6        838.0    139.7      0.5          results = self.blob_service.list_containers(prefix=prefix,
+   440         6          4.0      0.7      0.0                                                      num_results=limit,
+   441         6     176888.0  29481.3     99.5                                                      marker=marker)
+   442         6         13.0      2.2      0.0          return (results.items, results.next_marker)
+
+Total time: 5.92442 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_container at line 444
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   444                                               @profile
+   445                                               def create_container(self, container_name):
+   446         7         11.0      1.6      0.0          try:
+   447         7    4788596.0 684085.1     80.8              self.blob_service.create_container(container_name,
+   448         7     962741.0 137534.4     16.3                                                 fail_on_exist=True)
+   449         1          4.0      4.0      0.0          except AzureConflictHttpError as cloud_error:
+   450         1          2.0      2.0      0.0              if cloud_error.error_code == "ContainerAlreadyExists":
+   451         1          6.0      6.0      0.0                  msg = "The given Bucket name '%s' already exists. Please " \
+   452                                                                 "use the `get` or `find` method to get a reference to " \
+   453                                                                 "an existing Bucket, or specify a new Bucket name to " \
+   454                                                                 "create.\nNote that in Azure, Buckets are contained " \
+   455         1          3.0      3.0      0.0                        "in Storage Accounts." % container_name
+   456         1          3.0      3.0      0.0                  raise DuplicateResourceException(msg)
+   457                                           
+   458         6     173054.0  28842.3      2.9          return self.blob_service.get_container_properties(container_name)
+
+Total time: 0.056791 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_container at line 460
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   460                                               @profile
+   461                                               def get_container(self, container_name):
+   462         2      56791.0  28395.5    100.0          return self.blob_service.get_container_properties(container_name)
+
+Total time: 0.244088 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_container at line 464
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   464                                               @profile
+   465                                               def delete_container(self, container_name):
+   466         6     244088.0  40681.3    100.0          self.blob_service.delete_container(container_name)
+
+Total time: 0.360032 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_blobs at line 468
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   468                                               @profile
+   469                                               def list_blobs(self, container_name, prefix=None):
+   470        11     360032.0  32730.2    100.0          return self.blob_service.list_blobs(container_name, prefix=prefix)
+
+Total time: 0.298887 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob at line 472
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   472                                               @profile
+   473                                               def get_blob(self, container_name, blob_name):
+   474         9     298887.0  33209.7    100.0          return self.blob_service.get_blob_properties(container_name, blob_name)
+
+Total time: 0.329594 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_blob_from_text at line 476
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   476                                               @profile
+   477                                               def create_blob_from_text(self, container_name, blob_name, text):
+   478         9       1293.0    143.7      0.4          self.blob_service.create_blob_from_text(container_name,
+   479         9     328301.0  36477.9     99.6                                                  blob_name, text)
+
+Total time: 0.101667 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_blob_from_file at line 481
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   481                                               @profile
+   482                                               def create_blob_from_file(self, container_name, blob_name, file_path):
+   483         1        163.0    163.0      0.2          self.blob_service.create_blob_from_path(container_name,
+   484         1     101504.0 101504.0     99.8                                                  blob_name, file_path)
+
+Total time: 0.160735 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_blob at line 486
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   486                                               @profile
+   487                                               def delete_blob(self, container_name, blob_name):
+   488         5     160735.0  32147.0    100.0          self.blob_service.delete_blob(container_name, blob_name)
+
+Total time: 0.000904 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob_url at line 490
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   490                                               @profile
+   491                                               def get_blob_url(self, container_name, blob_name, expiry_time):
+   492         1          8.0      8.0      0.9          expiry_date = datetime.datetime.utcnow() + datetime.timedelta(
+   493         1          6.0      6.0      0.7              seconds=expiry_time)
+   494         1        182.0    182.0     20.1          sas = self.blob_service.generate_blob_shared_access_signature(
+   495         1         14.0     14.0      1.5              container_name, blob_name, permission=BlobPermissions.READ,
+   496         1        503.0    503.0     55.6              expiry=expiry_date)
+   497         1        167.0    167.0     18.5          return self.blob_service.make_blob_url(container_name, blob_name,
+   498         1         24.0     24.0      2.7                                                 sas_token=sas)
+
+Total time: 0.125755 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob_content at line 500
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   500                                               @profile
+   501                                               def get_blob_content(self, container_name, blob_name):
+   502         4          5.0      1.2      0.0          out_stream = BytesIO()
+   503         4        486.0    121.5      0.4          self.blob_service.get_blob_to_stream(container_name,
+   504         4     125256.0  31314.0     99.6                                               blob_name, out_stream)
+   505         4          8.0      2.0      0.0          return out_stream
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_empty_disk at line 507
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   507                                               @profile
+   508                                               def create_empty_disk(self, disk_name, params):
+   509                                                   return self.compute_client.disks.create_or_update(
+   510                                                       self.resource_group,
+   511                                                       disk_name,
+   512                                                       params
+   513                                                   ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_snapshot_disk at line 515
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   515                                               @profile
+   516                                               def create_snapshot_disk(self, disk_name, params):
+   517                                                   return self.compute_client.disks.create_or_update(
+   518                                                       self.resource_group,
+   519                                                       disk_name,
+   520                                                       params
+   521                                                   ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_disk at line 523
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   523                                               @profile
+   524                                               def get_disk(self, disk_id):
+   525                                                   url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   526                                                                                        disk_id)
+   527                                                   disk_name = url_params.get(VOLUME_NAME)
+   528                                                   return self.compute_client.disks.get(self.resource_group, disk_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_disks at line 530
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   530                                               @profile
+   531                                               def list_disks(self):
+   532                                                   return self.compute_client.disks. \
+   533                                                       list_by_resource_group(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_disk at line 535
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   535                                               @profile
+   536                                               def delete_disk(self, disk_id):
+   537                                                   url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   538                                                                                        disk_id)
+   539                                                   disk_name = url_params.get(VOLUME_NAME)
+   540                                                   self.compute_client.disks.delete(self.resource_group, disk_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_disk_tags at line 542
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   542                                               @profile
+   543                                               def update_disk_tags(self, disk_id, tags):
+   544                                                   url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   545                                                                                        disk_id)
+   546                                                   disk_name = url_params.get(VOLUME_NAME)
+   547                                                   return self.compute_client.disks.update(
+   548                                                       self.resource_group,
+   549                                                       disk_name,
+   550                                                       {'tags': tags},
+   551                                                       raw=True
+   552                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_snapshots at line 554
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   554                                               @profile
+   555                                               def list_snapshots(self):
+   556                                                   return self.compute_client.snapshots. \
+   557                                                       list_by_resource_group(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_snapshot at line 559
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   559                                               @profile
+   560                                               def get_snapshot(self, snapshot_id):
+   561                                                   url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   562                                                                                        snapshot_id)
+   563                                                   snapshot_name = url_params.get(SNAPSHOT_NAME)
+   564                                                   return self.compute_client.snapshots.get(self.resource_group,
+   565                                                                                            snapshot_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_snapshot at line 567
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   567                                               @profile
+   568                                               def create_snapshot(self, snapshot_name, params):
+   569                                                   return self.compute_client.snapshots.create_or_update(
+   570                                                       self.resource_group,
+   571                                                       snapshot_name,
+   572                                                       params
+   573                                                   ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_snapshot at line 575
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   575                                               @profile
+   576                                               def delete_snapshot(self, snapshot_id):
+   577                                                   url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   578                                                                                        snapshot_id)
+   579                                                   snapshot_name = url_params.get(SNAPSHOT_NAME)
+   580                                                   self.compute_client.snapshots.delete(self.resource_group,
+   581                                                                                        snapshot_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_snapshot_tags at line 583
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   583                                               @profile
+   584                                               def update_snapshot_tags(self, snapshot_id, tags):
+   585                                                   url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   586                                                                                        snapshot_id)
+   587                                                   snapshot_name = url_params.get(SNAPSHOT_NAME)
+   588                                                   return self.compute_client.snapshots.update(
+   589                                                       self.resource_group,
+   590                                                       snapshot_name,
+   591                                                       {'tags': tags},
+   592                                                       raw=True
+   593                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: is_gallery_image at line 595
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   595                                               @profile
+   596                                               def is_gallery_image(self, image_id):
+   597                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   598                                                                                        image_id)
+   599                                                   # If it is a gallery image, it will always have an offer
+   600                                                   return 'offer' in url_params
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_image at line 602
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   602                                               @profile
+   603                                               def create_image(self, name, params):
+   604                                                   return self.compute_client.images. \
+   605                                                       create_or_update(self.resource_group, name,
+   606                                                                        params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_image at line 608
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   608                                               @profile
+   609                                               def delete_image(self, image_id):
+   610                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   611                                                                                        image_id)
+   612                                                   if not self.is_gallery_image(image_id):
+   613                                                       name = url_params.get(IMAGE_NAME)
+   614                                                       self.compute_client.images.delete(self.resource_group, name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_images at line 616
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   616                                               @profile
+   617                                               def list_images(self):
+   618                                                   azure_images = list(self.compute_client.images.
+   619                                                                       list_by_resource_group(self.resource_group))
+   620                                                   return azure_images
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_gallery_refs at line 622
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   622                                               @profile
+   623                                               def list_gallery_refs(self):
+   624                                                   return gallery_image_references
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_image at line 626
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   626                                               @profile
+   627                                               def get_image(self, image_id):
+   628                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   629                                                                                        image_id)
+   630                                                   if self.is_gallery_image(image_id):
+   631                                                       return GalleryImageReference(publisher=url_params['publisher'],
+   632                                                                                    offer=url_params['offer'],
+   633                                                                                    sku=url_params['sku'],
+   634                                                                                    version=url_params['version'])
+   635                                                   else:
+   636                                                       name = url_params.get(IMAGE_NAME)
+   637                                                       return self.compute_client.images.get(self.resource_group, name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_image_tags at line 639
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   639                                               @profile
+   640                                               def update_image_tags(self, image_id, tags):
+   641                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   642                                                                                        image_id)
+   643                                                   if self.is_gallery_image(image_id):
+   644                                                       return True
+   645                                                   else:
+   646                                                       name = url_params.get(IMAGE_NAME)
+   647                                                       return self.compute_client.images. \
+   648                                                           create_or_update(self.resource_group, name,
+   649                                                                            {
+   650                                                                                'tags': tags,
+   651                                                                                'location': self.region_name
+   652                                                                            }).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm_types at line 654
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   654                                               @profile
+   655                                               def list_vm_types(self):
+   656                                                   return self.compute_client.virtual_machine_sizes. \
+   657                                                       list(self.region_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_networks at line 659
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   659                                               @profile
+   660                                               def list_networks(self):
+   661                                                   return self.network_management_client.virtual_networks.list(
+   662                                                       self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_network at line 664
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   664                                               @profile
+   665                                               def get_network(self, network_id):
+   666                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID,
+   667                                                                                        network_id)
+   668                                                   network_name = url_params.get(NETWORK_NAME)
+   669                                                   return self.network_management_client.virtual_networks.get(
+   670                                                       self.resource_group, network_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_network at line 672
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   672                                               @profile
+   673                                               def create_network(self, name, params):
+   674                                                   return self.network_management_client.virtual_networks. \
+   675                                                       create_or_update(self.resource_group,
+   676                                                                        name,
+   677                                                                        parameters=params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_network at line 679
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   679                                               @profile
+   680                                               def delete_network(self, network_id):
+   681                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   682                                                   network_name = url_params.get(NETWORK_NAME)
+   683                                                   return self.network_management_client.virtual_networks. \
+   684                                                       delete(self.resource_group, network_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_network_tags at line 686
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   686                                               @profile
+   687                                               def update_network_tags(self, network_id, tags):
+   688                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   689                                                   network_name = url_params.get(NETWORK_NAME)
+   690                                                   return self.network_management_client.virtual_networks. \
+   691                                                       create_or_update(self.resource_group,
+   692                                                                        network_name, tags).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_network_id_for_subnet at line 694
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   694                                               @profile
+   695                                               def get_network_id_for_subnet(self, subnet_id):
+   696                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID, subnet_id)
+   697                                                   network_id = NETWORK_RESOURCE_ID[0]
+   698                                                   for key, val in url_params.items():
+   699                                                       network_id = network_id.replace("{" + key + "}", val)
+   700                                                   return network_id
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_subnets at line 702
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   702                                               @profile
+   703                                               def list_subnets(self, network_id):
+   704                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   705                                                   network_name = url_params.get(NETWORK_NAME)
+   706                                                   return self.network_management_client.subnets. \
+   707                                                       list(self.resource_group, network_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_subnet at line 709
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   709                                               @profile
+   710                                               def get_subnet(self, subnet_id):
+   711                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   712                                                                                        subnet_id)
+   713                                                   network_name = url_params.get(NETWORK_NAME)
+   714                                                   subnet_name = url_params.get(SUBNET_NAME)
+   715                                                   return self.network_management_client.subnets. \
+   716                                                       get(self.resource_group, network_name, subnet_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_subnet at line 718
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   718                                               @profile
+   719                                               def create_subnet(self, network_id, subnet_name, params):
+   720                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   721                                                   network_name = url_params.get(NETWORK_NAME)
+   722                                                   result_create = self.network_management_client \
+   723                                                       .subnets.create_or_update(
+   724                                                           self.resource_group,
+   725                                                           network_name,
+   726                                                           subnet_name,
+   727                                                           params
+   728                                                       )
+   729                                                   subnet_info = result_create.result()
+   730                                           
+   731                                                   return subnet_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: __if_subnet_in_use at line 733
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   733                                               @profile
+   734                                               def __if_subnet_in_use(e):
+   735                                                   # return True if the CloudError exception is due to subnet being in use
+   736                                                   if isinstance(e, CloudError):
+   737                                                       if e.error.error == "InUseSubnetCannotBeDeleted":
+   738                                                           return True
+   739                                                   return False
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_subnet at line 741
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   741                                               @tenacity.retry(stop=tenacity.stop_after_attempt(5),
+   742                                                               retry=tenacity.retry_if_exception(__if_subnet_in_use),
+   743                                                               wait=tenacity.wait_fixed(5),
+   744                                                               reraise=True)
+   745                                               @profile
+   746                                               def delete_subnet(self, subnet_id):
+   747                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   748                                                                                        subnet_id)
+   749                                                   network_name = url_params.get(NETWORK_NAME)
+   750                                                   subnet_name = url_params.get(SUBNET_NAME)
+   751                                           
+   752                                                   try:
+   753                                                       result_delete = self.network_management_client \
+   754                                                           .subnets.delete(
+   755                                                               self.resource_group,
+   756                                                               network_name,
+   757                                                               subnet_name
+   758                                                           )
+   759                                                       result_delete.wait()
+   760                                                   except CloudError as cloud_error:
+   761                                                       log.exception(cloud_error.message)
+   762                                                       raise cloud_error
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_floating_ip at line 764
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   764                                               @profile
+   765                                               def create_floating_ip(self, public_ip_name, public_ip_parameters):
+   766                                                   return self.network_management_client.public_ip_addresses. \
+   767                                                       create_or_update(self.resource_group,
+   768                                                                        public_ip_name,
+   769                                                                        public_ip_parameters).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_floating_ip at line 771
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   771                                               @profile
+   772                                               def get_floating_ip(self, public_ip_id):
+   773                                                   url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   774                                                                                        public_ip_id)
+   775                                                   public_ip_name = url_params.get(PUBLIC_IP_NAME)
+   776                                                   return self.network_management_client. \
+   777                                                       public_ip_addresses.get(self.resource_group, public_ip_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_floating_ip at line 779
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   779                                               @profile
+   780                                               def delete_floating_ip(self, public_ip_id):
+   781                                                   url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   782                                                                                        public_ip_id)
+   783                                                   public_ip_name = url_params.get(PUBLIC_IP_NAME)
+   784                                                   self.network_management_client. \
+   785                                                       public_ip_addresses.delete(self.resource_group,
+   786                                                                                  public_ip_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_fip_tags at line 788
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   788                                               @profile
+   789                                               def update_fip_tags(self, fip_id, tags):
+   790                                                   url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   791                                                                                        fip_id)
+   792                                                   fip_name = url_params.get(PUBLIC_IP_NAME)
+   793                                                   self.network_management_client.public_ip_addresses. \
+   794                                                       create_or_update(self.resource_group,
+   795                                                                        fip_name, tags).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_floating_ips at line 797
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   797                                               @profile
+   798                                               def list_floating_ips(self):
+   799                                                   return self.network_management_client.public_ip_addresses.list(
+   800                                                       self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm at line 802
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   802                                               @profile
+   803                                               def list_vm(self):
+   804                                                   return self.compute_client.virtual_machines.list(
+   805                                                       self.resource_group
+   806                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: restart_vm at line 808
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   808                                               @profile
+   809                                               def restart_vm(self, vm_id):
+   810                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   811                                                                                        vm_id)
+   812                                                   vm_name = url_params.get(VM_NAME)
+   813                                                   return self.compute_client.virtual_machines.restart(
+   814                                                       self.resource_group, vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm at line 816
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   816                                               @profile
+   817                                               def delete_vm(self, vm_id):
+   818                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   819                                                                                        vm_id)
+   820                                                   vm_name = url_params.get(VM_NAME)
+   821                                                   return self.compute_client.virtual_machines.delete(
+   822                                                       self.resource_group, vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_vm at line 824
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   824                                               @profile
+   825                                               def get_vm(self, vm_id):
+   826                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   827                                                                                        vm_id)
+   828                                                   vm_name = url_params.get(VM_NAME)
+   829                                                   return self.compute_client.virtual_machines.get(
+   830                                                       self.resource_group,
+   831                                                       vm_name,
+   832                                                       expand='instanceView'
+   833                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm at line 835
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   835                                               @profile
+   836                                               def create_vm(self, vm_name, params):
+   837                                                   return self.compute_client.virtual_machines. \
+   838                                                       create_or_update(self.resource_group,
+   839                                                                        vm_name, params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm at line 841
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   841                                               @profile
+   842                                               def update_vm(self, vm_id, params):
+   843                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   844                                                                                        vm_id)
+   845                                                   vm_name = url_params.get(VM_NAME)
+   846                                                   return self.compute_client.virtual_machines. \
+   847                                                       create_or_update(self.resource_group,
+   848                                                                        vm_name, params, raw=True)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: deallocate_vm at line 850
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   850                                               @profile
+   851                                               def deallocate_vm(self, vm_id):
+   852                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   853                                                                                        vm_id)
+   854                                                   vm_name = url_params.get(VM_NAME)
+   855                                                   self.compute_client. \
+   856                                                       virtual_machines.deallocate(self.resource_group,
+   857                                                                                   vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: generalize_vm at line 859
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   859                                               @profile
+   860                                               def generalize_vm(self, vm_id):
+   861                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   862                                                                                        vm_id)
+   863                                                   vm_name = url_params.get(VM_NAME)
+   864                                                   self.compute_client.virtual_machines. \
+   865                                                       generalize(self.resource_group, vm_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: start_vm at line 867
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   867                                               @profile
+   868                                               def start_vm(self, vm_id):
+   869                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   870                                                                                        vm_id)
+   871                                                   vm_name = url_params.get(VM_NAME)
+   872                                                   self.compute_client.virtual_machines. \
+   873                                                       start(self.resource_group,
+   874                                                             vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm_tags at line 876
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   876                                               @profile
+   877                                               def update_vm_tags(self, vm_id, tags):
+   878                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   879                                                                                        vm_id)
+   880                                                   vm_name = url_params.get(VM_NAME)
+   881                                                   self.compute_client.virtual_machines. \
+   882                                                       create_or_update(self.resource_group,
+   883                                                                        vm_name, tags).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_nic at line 885
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   885                                               @profile
+   886                                               def delete_nic(self, nic_id):
+   887                                                   nic_params = azure_helpers.\
+   888                                                       parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   889                                                   nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   890                                                   self.network_management_client. \
+   891                                                       network_interfaces.delete(self.resource_group,
+   892                                                                                 nic_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_nic at line 894
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   894                                               @profile
+   895                                               def get_nic(self, nic_id):
+   896                                                   nic_params = azure_helpers.\
+   897                                                       parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   898                                                   nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   899                                                   return self.network_management_client. \
+   900                                                       network_interfaces.get(self.resource_group, nic_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_nic at line 902
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   902                                               @profile
+   903                                               def update_nic(self, nic_id, params):
+   904                                                   nic_params = azure_helpers.\
+   905                                                       parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   906                                                   nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   907                                                   async_nic_creation = self.network_management_client. \
+   908                                                       network_interfaces.create_or_update(
+   909                                                           self.resource_group,
+   910                                                           nic_name,
+   911                                                           params
+   912                                                       )
+   913                                                   nic_info = async_nic_creation.result()
+   914                                                   return nic_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_nic at line 916
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   916                                               @profile
+   917                                               def create_nic(self, nic_name, params):
+   918                                                   return self.network_management_client. \
+   919                                                       network_interfaces.create_or_update(
+   920                                                           self.resource_group,
+   921                                                           nic_name,
+   922                                                           params
+   923                                                       ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_public_key at line 925
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   925                                               @profile
+   926                                               def create_public_key(self, entity):
+   927                                                   return self.table_service. \
+   928                                                       insert_or_replace_entity(self.public_key_storage_table_name,
+   929                                                                                entity)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_public_key at line 931
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   931                                               @profile
+   932                                               def get_public_key(self, name):
+   933                                                   entities = self.table_service. \
+   934                                                       query_entities(self.public_key_storage_table_name,
+   935                                                                      "Name eq '{0}'".format(name), num_results=1)
+   936                                           
+   937                                                   return entities.items[0] if len(entities.items) > 0 else None
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_public_key at line 939
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   939                                               @profile
+   940                                               def delete_public_key(self, entity):
+   941                                                   self.table_service.delete_entity(self.public_key_storage_table_name,
+   942                                                                                    entity.PartitionKey, entity.RowKey)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_public_keys at line 944
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   944                                               @profile
+   945                                               def list_public_keys(self, partition_key, limit=None, marker=None):
+   946                                                   entities = self.table_service. \
+   947                                                       query_entities(self.public_key_storage_table_name,
+   948                                                                      "PartitionKey eq '{0}'".format(partition_key),
+   949                                                                      marker=marker, num_results=limit)
+   950                                                   return (entities.items, entities.next_marker)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_route_table at line 952
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   952                                               @profile
+   953                                               def delete_route_table(self, route_table_name):
+   954                                                   self.network_management_client. \
+   955                                                       route_tables.delete(self.resource_group, route_table_name
+   956                                                                           ).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: attach_subnet_to_route_table at line 958
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   958                                               @profile
+   959                                               def attach_subnet_to_route_table(self, subnet_id, route_table_id):
+   960                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   961                                                                                        subnet_id)
+   962                                                   network_name = url_params.get(NETWORK_NAME)
+   963                                                   subnet_name = url_params.get(SUBNET_NAME)
+   964                                           
+   965                                                   subnet_info = self.network_management_client.subnets.get(
+   966                                                       self.resource_group,
+   967                                                       network_name,
+   968                                                       subnet_name
+   969                                                   )
+   970                                                   if subnet_info:
+   971                                                       subnet_info.route_table = {
+   972                                                           'id': route_table_id
+   973                                                       }
+   974                                           
+   975                                                       result_create = self.network_management_client. \
+   976                                                           subnets.create_or_update(
+   977                                                            self.resource_group,
+   978                                                            network_name,
+   979                                                            subnet_name,
+   980                                                            subnet_info)
+   981                                                       subnet_info = result_create.result()
+   982                                           
+   983                                                   return subnet_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: detach_subnet_to_route_table at line 985
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   985                                               @profile
+   986                                               def detach_subnet_to_route_table(self, subnet_id, route_table_id):
+   987                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   988                                                                                        subnet_id)
+   989                                                   network_name = url_params.get(NETWORK_NAME)
+   990                                                   subnet_name = url_params.get(SUBNET_NAME)
+   991                                           
+   992                                                   subnet_info = self.network_management_client.subnets.get(
+   993                                                       self.resource_group,
+   994                                                       network_name,
+   995                                                       subnet_name
+   996                                                   )
+   997                                           
+   998                                                   if subnet_info and subnet_info.route_table.id == route_table_id:
+   999                                                       subnet_info.route_table = None
+  1000                                           
+  1001                                                       result_create = self.network_management_client. \
+  1002                                                           subnets.create_or_update(
+  1003                                                            self.resource_group,
+  1004                                                            network_name,
+  1005                                                            subnet_name,
+  1006                                                            subnet_info)
+  1007                                                       subnet_info = result_create.result()
+  1008                                           
+  1009                                                   return subnet_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_route_tables at line 1011
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1011                                               @profile
+  1012                                               def list_route_tables(self):
+  1013                                                   return self.network_management_client. \
+  1014                                                       route_tables.list(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_route_table at line 1016
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1016                                               @profile
+  1017                                               def get_route_table(self, router_id):
+  1018                                                   url_params = azure_helpers.parse_url(ROUTER_RESOURCE_ID,
+  1019                                                                                        router_id)
+  1020                                                   router_name = url_params.get(ROUTER_NAME)
+  1021                                                   return self.network_management_client. \
+  1022                                                       route_tables.get(self.resource_group, router_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_route_table at line 1024
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1024                                               @profile
+  1025                                               def create_route_table(self, route_table_name, params):
+  1026                                                   return self.network_management_client. \
+  1027                                                       route_tables.create_or_update(
+  1028                                                        self.resource_group,
+  1029                                                        route_table_name, params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_route_table_tags at line 1031
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1031                                               @profile
+  1032                                               def update_route_table_tags(self, route_table_name, tags):
+  1033                                                   self.network_management_client.route_tables. \
+  1034                                                       create_or_update(self.resource_group,
+  1035                                                                        route_table_name, tags).result()
+

+ 1467 - 0
results/region.res

@@ -0,0 +1,1467 @@
+Test output
+ ....
+----------------------------------------------------------------------
+Ran 4 tests in 7.997s
+
+OK
+
+Wrote profile results to run_tests.py.lprof
+Timer unit: 1e-06 s
+
+Total time: 1.30032 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: __init__ at line 160
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   160                                               @profile
+   161                                               def __init__(self, config):
+   162         4         15.0      3.8      0.0          self._config = config
+   163         4         12.0      3.0      0.0          self.subscription_id = str(config.get('azure_subscription_id'))
+   164         4          3.0      0.8      0.0          self._credentials = ServicePrincipalCredentials(
+   165         4          5.0      1.2      0.0              client_id=config.get('azure_client_id'),
+   166         4          2.0      0.5      0.0              secret=config.get('azure_secret'),
+   167         4    1300186.0 325046.5    100.0              tenant=config.get('azure_tenant')
+   168                                                   )
+   169                                           
+   170         4         16.0      4.0      0.0          self._access_token = config.get('azure_access_token')
+   171         4          7.0      1.8      0.0          self._resource_client = None
+   172         4          4.0      1.0      0.0          self._storage_client = None
+   173         4          4.0      1.0      0.0          self._network_management_client = None
+   174         4          4.0      1.0      0.0          self._subscription_client = None
+   175         4          5.0      1.2      0.0          self._compute_client = None
+   176         4          3.0      0.8      0.0          self._access_key_result = None
+   177         4          7.0      1.8      0.0          self._block_blob_service = None
+   178         4          3.0      0.8      0.0          self._table_service = None
+   179         4          6.0      1.5      0.0          self._storage_account = None
+   180                                           
+   181         4         38.0      9.5      0.0          log.debug("azure subscription : %s", self.subscription_id)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: access_key_result at line 183
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   183                                               @property
+   184                                               @tenacity.retry(stop=tenacity.stop_after_attempt(5), reraise=True)
+   185                                               @profile
+   186                                               def access_key_result(self):
+   187                                                   if not self._access_key_result:
+   188                                                       storage_account = self.storage_account
+   189                                           
+   190                                                       if self.get_storage_account(storage_account).\
+   191                                                               provisioning_state.value != 'Succeeded':
+   192                                                           log.debug(
+   193                                                               "Storage account %s is not in Succeeded state yet. ",
+   194                                                               storage_account)
+   195                                                           raise WaitStateException(
+   196                                                               "Waited too long for storage account: {0} to "
+   197                                                               "become ready.".format(
+   198                                                                   storage_account,
+   199                                                                   self.get_storage_account(storage_account).
+   200                                                                   provisioning_state))
+   201                                           
+   202                                                       self._access_key_result = self.storage_client.storage_accounts. \
+   203                                                           list_keys(self.resource_group, storage_account)
+   204                                                   return self._access_key_result
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: resource_group at line 206
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   206                                               @property
+   207                                               @profile
+   208                                               def resource_group(self):
+   209                                                   return self._config.get('azure_resource_group')
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: storage_account at line 211
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   211                                               @property
+   212                                               @profile
+   213                                               def storage_account(self):
+   214                                                   return self._config.get('azure_storage_account')
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: region_name at line 216
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   216                                               @property
+   217                                               @profile
+   218                                               def region_name(self):
+   219                                                   return self._config.get('azure_region_name')
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: public_key_storage_table_name at line 221
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   221                                               @property
+   222                                               @profile
+   223                                               def public_key_storage_table_name(self):
+   224                                                   return self._config.get('azure_public_key_storage_table_name')
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: storage_client at line 226
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   226                                               @property
+   227                                               @profile
+   228                                               def storage_client(self):
+   229                                                   if not self._storage_client:
+   230                                                       self._storage_client = \
+   231                                                           StorageManagementClient(self._credentials,
+   232                                                                                   self.subscription_id)
+   233                                                   return self._storage_client
+
+Total time: 0.032752 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: subscription_client at line 235
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   235                                               @property
+   236                                               @profile
+   237                                               def subscription_client(self):
+   238        17         22.0      1.3      0.1          if not self._subscription_client:
+   239         4      32709.0   8177.2     99.9              self._subscription_client = SubscriptionClient(self._credentials)
+   240        17         21.0      1.2      0.1          return self._subscription_client
+
+Total time: 0.065299 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: resource_client at line 242
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   242                                               @property
+   243                                               @profile
+   244                                               def resource_client(self):
+   245         4          4.0      1.0      0.0          if not self._resource_client:
+   246                                                       self._resource_client = \
+   247         4         11.0      2.8      0.0                  ResourceManagementClient(self._credentials,
+   248         4      65272.0  16318.0    100.0                                           self.subscription_id)
+   249         4         12.0      3.0      0.0          return self._resource_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: compute_client at line 251
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   251                                               @property
+   252                                               @profile
+   253                                               def compute_client(self):
+   254                                                   if not self._compute_client:
+   255                                                       self._compute_client = \
+   256                                                           ComputeManagementClient(self._credentials,
+   257                                                                                   self.subscription_id)
+   258                                                   return self._compute_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: network_management_client at line 260
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   260                                               @property
+   261                                               @profile
+   262                                               def network_management_client(self):
+   263                                                   if not self._network_management_client:
+   264                                                       self._network_management_client = NetworkManagementClient(
+   265                                                           self._credentials, self.subscription_id)
+   266                                                   return self._network_management_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: blob_service at line 268
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   268                                               @property
+   269                                               @profile
+   270                                               def blob_service(self):
+   271                                                   self._get_or_create_storage_account()
+   272                                                   if not self._block_blob_service:
+   273                                                       if self._access_token:
+   274                                                           token_credential = TokenCredential(self._access_token)
+   275                                                           self._block_blob_service = BlockBlobService(
+   276                                                               account_name=self.storage_account,
+   277                                                               token_credential=token_credential)
+   278                                                       else:
+   279                                                           self._block_blob_service = BlockBlobService(
+   280                                                               account_name=self.storage_account,
+   281                                                               account_key=self.access_key_result.keys[0].value)
+   282                                                   return self._block_blob_service
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: table_service at line 284
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   284                                               @property
+   285                                               @profile
+   286                                               def table_service(self):
+   287                                                   self._get_or_create_storage_account()
+   288                                                   if not self._table_service:
+   289                                                       self._table_service = TableService(
+   290                                                           self.storage_account,
+   291                                                           self.access_key_result.keys[0].value)
+   292                                                   if not self._table_service. \
+   293                                                           exists(table_name=self.public_key_storage_table_name):
+   294                                                       self._table_service.create_table(
+   295                                                           self.public_key_storage_table_name)
+   296                                                   return self._table_service
+
+Total time: 1.24978 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_resource_group at line 298
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   298                                               @profile
+   299                                               def get_resource_group(self, name):
+   300         4    1249778.0 312444.5    100.0          return self.resource_client.resource_groups.get(name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_resource_group at line 302
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   302                                               @profile
+   303                                               def create_resource_group(self, name, parameters):
+   304                                                   return self.resource_client.resource_groups. \
+   305                                                       create_or_update(name, parameters)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_storage_account at line 307
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   307                                               @profile
+   308                                               def get_storage_account(self, storage_account):
+   309                                                   return self.storage_client.storage_accounts. \
+   310                                                       get_properties(self.resource_group, storage_account)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_storage_account at line 312
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   312                                               @profile
+   313                                               def create_storage_account(self, name, params):
+   314                                                   return self.storage_client.storage_accounts. \
+   315                                                       create(self.resource_group, name.lower(), params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: _get_or_create_storage_account at line 319
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   319                                               @tenacity.retry(stop=tenacity.stop_after_attempt(2),
+   320                                                               retry=tenacity.retry_if_exception_type(CloudError),
+   321                                                               reraise=True)
+   322                                               @profile
+   323                                               def _get_or_create_storage_account(self):
+   324                                                   if self._storage_account:
+   325                                                       return self._storage_account
+   326                                                   else:
+   327                                                       try:
+   328                                                           self._storage_account = \
+   329                                                               self.get_storage_account(self.storage_account)
+   330                                                       except CloudError as cloud_error:
+   331                                                           if cloud_error.error.error == "ResourceNotFound":
+   332                                                               storage_account_params = {
+   333                                                                   'sku': {
+   334                                                                       'name': 'Standard_LRS'
+   335                                                                   },
+   336                                                                   'kind': 'storage',
+   337                                                                   'location': self.region_name,
+   338                                                               }
+   339                                                               try:
+   340                                                                   self._storage_account = \
+   341                                                                       self.create_storage_account(self.storage_account,
+   342                                                                                                   storage_account_params)
+   343                                                               except CloudError as cloud_error2:  # pragma: no cover
+   344                                                                   if cloud_error2.error.error == "AuthorizationFailed":
+   345                                                                       mess = 'The following error was returned by ' \
+   346                                                                              'Azure:\n%s\n\nThis is likely because the' \
+   347                                                                              ' Role associated with the provided ' \
+   348                                                                              'credentials does not allow for Storage ' \
+   349                                                                              'Account creation.\nA Storage Account is ' \
+   350                                                                              'necessary in order to perform the ' \
+   351                                                                              'desired operation. You must either ' \
+   352                                                                              'provide an existing Storage Account name' \
+   353                                                                              ' as part of the configuration, or ' \
+   354                                                                              'elevate the associated Role.\nFor more ' \
+   355                                                                              'information on roles, see: https://docs.' \
+   356                                                                              'microsoft.com/en-us/azure/role-based-' \
+   357                                                                              'access-control/overview\n' % cloud_error2
+   358                                                                       raise ProviderConnectionException(mess)
+   359                                           
+   360                                                                   elif cloud_error2.error.error == \
+   361                                                                           "StorageAccountAlreadyTaken":
+   362                                                                       mess = 'The following error was ' \
+   363                                                                              'returned by Azure:\n%s\n\n' \
+   364                                                                              'Note that Storage Account names must be ' \
+   365                                                                              'unique across Azure (not just in your ' \
+   366                                                                              'subscription).\nFor more information ' \
+   367                                                                              'see https://docs.microsoft.com/en-us/' \
+   368                                                                              'azure/azure-resource-manager/resource-' \
+   369                                                                              'manager-storage-account-name-errors\n' \
+   370                                                                              % cloud_error2
+   371                                                                       raise InvalidLabelException(mess)
+   372                                                                   else:
+   373                                                                       raise cloud_error2
+   374                                                           else:
+   375                                                               raise cloud_error
+
+Total time: 0.06917 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_locations at line 377
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   377                                               @profile
+   378                                               def list_locations(self):
+   379        17      68576.0   4033.9     99.1          return self.subscription_client.subscriptions. \
+   380        17        594.0     34.9      0.9              list_locations(self.subscription_id)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm_firewall at line 382
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   382                                               @profile
+   383                                               def list_vm_firewall(self):
+   384                                                   return self.network_management_client.network_security_groups. \
+   385                                                       list(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm_firewall at line 387
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   387                                               @profile
+   388                                               def create_vm_firewall(self, name, parameters):
+   389                                                   return self.network_management_client.network_security_groups. \
+   390                                                       create_or_update(self.resource_group, name,
+   391                                                                        parameters).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm_firewall_tags at line 393
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   393                                               @profile
+   394                                               def update_vm_firewall_tags(self, fw_id, tags):
+   395                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   396                                                                                        fw_id)
+   397                                                   name = url_params.get(VM_FIREWALL_NAME)
+   398                                                   return self.network_management_client.network_security_groups. \
+   399                                                       create_or_update(self.resource_group, name,
+   400                                                                        {'tags': tags,
+   401                                                                         'location': self.region_name}).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_vm_firewall at line 403
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   403                                               @profile
+   404                                               def get_vm_firewall(self, fw_id):
+   405                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   406                                                                                        fw_id)
+   407                                                   fw_name = url_params.get(VM_FIREWALL_NAME)
+   408                                                   return self.network_management_client.network_security_groups. \
+   409                                                       get(self.resource_group, fw_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm_firewall at line 411
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   411                                               @profile
+   412                                               def delete_vm_firewall(self, fw_id):
+   413                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   414                                                                                        fw_id)
+   415                                                   name = url_params.get(VM_FIREWALL_NAME)
+   416                                                   self.network_management_client \
+   417                                                       .network_security_groups.delete(self.resource_group, name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm_firewall_rule at line 419
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   419                                               @profile
+   420                                               def create_vm_firewall_rule(self, fw_id,
+   421                                                                           rule_name, parameters):
+   422                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   423                                                                                        fw_id)
+   424                                                   vm_firewall_name = url_params.get(VM_FIREWALL_NAME)
+   425                                                   return self.network_management_client.security_rules. \
+   426                                                       create_or_update(self.resource_group, vm_firewall_name,
+   427                                                                        rule_name, parameters).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm_firewall_rule at line 429
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   429                                               @profile
+   430                                               def delete_vm_firewall_rule(self, fw_rule_id, vm_firewall):
+   431                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RULE_RESOURCE_ID,
+   432                                                                                        fw_rule_id)
+   433                                                   name = url_params.get(VM_FIREWALL_RULE_NAME)
+   434                                                   return self.network_management_client.security_rules. \
+   435                                                       delete(self.resource_group, vm_firewall, name).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_containers at line 437
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   437                                               @profile
+   438                                               def list_containers(self, prefix=None, limit=None, marker=None):
+   439                                                   results = self.blob_service.list_containers(prefix=prefix,
+   440                                                                                               num_results=limit,
+   441                                                                                               marker=marker)
+   442                                                   return (results.items, results.next_marker)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_container at line 444
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   444                                               @profile
+   445                                               def create_container(self, container_name):
+   446                                                   try:
+   447                                                       self.blob_service.create_container(container_name,
+   448                                                                                          fail_on_exist=True)
+   449                                                   except AzureConflictHttpError as cloud_error:
+   450                                                       if cloud_error.error_code == "ContainerAlreadyExists":
+   451                                                           msg = "The given Bucket name '%s' already exists. Please " \
+   452                                                                 "use the `get` or `find` method to get a reference to " \
+   453                                                                 "an existing Bucket, or specify a new Bucket name to " \
+   454                                                                 "create.\nNote that in Azure, Buckets are contained " \
+   455                                                                 "in Storage Accounts." % container_name
+   456                                                           raise DuplicateResourceException(msg)
+   457                                           
+   458                                                   return self.blob_service.get_container_properties(container_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_container at line 460
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   460                                               @profile
+   461                                               def get_container(self, container_name):
+   462                                                   return self.blob_service.get_container_properties(container_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_container at line 464
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   464                                               @profile
+   465                                               def delete_container(self, container_name):
+   466                                                   self.blob_service.delete_container(container_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_blobs at line 468
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   468                                               @profile
+   469                                               def list_blobs(self, container_name, prefix=None):
+   470                                                   return self.blob_service.list_blobs(container_name, prefix=prefix)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob at line 472
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   472                                               @profile
+   473                                               def get_blob(self, container_name, blob_name):
+   474                                                   return self.blob_service.get_blob_properties(container_name, blob_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_blob_from_text at line 476
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   476                                               @profile
+   477                                               def create_blob_from_text(self, container_name, blob_name, text):
+   478                                                   self.blob_service.create_blob_from_text(container_name,
+   479                                                                                           blob_name, text)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_blob_from_file at line 481
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   481                                               @profile
+   482                                               def create_blob_from_file(self, container_name, blob_name, file_path):
+   483                                                   self.blob_service.create_blob_from_path(container_name,
+   484                                                                                           blob_name, file_path)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_blob at line 486
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   486                                               @profile
+   487                                               def delete_blob(self, container_name, blob_name):
+   488                                                   self.blob_service.delete_blob(container_name, blob_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob_url at line 490
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   490                                               @profile
+   491                                               def get_blob_url(self, container_name, blob_name, expiry_time):
+   492                                                   expiry_date = datetime.datetime.utcnow() + datetime.timedelta(
+   493                                                       seconds=expiry_time)
+   494                                                   sas = self.blob_service.generate_blob_shared_access_signature(
+   495                                                       container_name, blob_name, permission=BlobPermissions.READ,
+   496                                                       expiry=expiry_date)
+   497                                                   return self.blob_service.make_blob_url(container_name, blob_name,
+   498                                                                                          sas_token=sas)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob_content at line 500
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   500                                               @profile
+   501                                               def get_blob_content(self, container_name, blob_name):
+   502                                                   out_stream = BytesIO()
+   503                                                   self.blob_service.get_blob_to_stream(container_name,
+   504                                                                                        blob_name, out_stream)
+   505                                                   return out_stream
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_empty_disk at line 507
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   507                                               @profile
+   508                                               def create_empty_disk(self, disk_name, params):
+   509                                                   return self.compute_client.disks.create_or_update(
+   510                                                       self.resource_group,
+   511                                                       disk_name,
+   512                                                       params
+   513                                                   ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_snapshot_disk at line 515
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   515                                               @profile
+   516                                               def create_snapshot_disk(self, disk_name, params):
+   517                                                   return self.compute_client.disks.create_or_update(
+   518                                                       self.resource_group,
+   519                                                       disk_name,
+   520                                                       params
+   521                                                   ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_disk at line 523
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   523                                               @profile
+   524                                               def get_disk(self, disk_id):
+   525                                                   url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   526                                                                                        disk_id)
+   527                                                   disk_name = url_params.get(VOLUME_NAME)
+   528                                                   return self.compute_client.disks.get(self.resource_group, disk_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_disks at line 530
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   530                                               @profile
+   531                                               def list_disks(self):
+   532                                                   return self.compute_client.disks. \
+   533                                                       list_by_resource_group(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_disk at line 535
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   535                                               @profile
+   536                                               def delete_disk(self, disk_id):
+   537                                                   url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   538                                                                                        disk_id)
+   539                                                   disk_name = url_params.get(VOLUME_NAME)
+   540                                                   self.compute_client.disks.delete(self.resource_group, disk_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_disk_tags at line 542
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   542                                               @profile
+   543                                               def update_disk_tags(self, disk_id, tags):
+   544                                                   url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   545                                                                                        disk_id)
+   546                                                   disk_name = url_params.get(VOLUME_NAME)
+   547                                                   return self.compute_client.disks.update(
+   548                                                       self.resource_group,
+   549                                                       disk_name,
+   550                                                       {'tags': tags},
+   551                                                       raw=True
+   552                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_snapshots at line 554
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   554                                               @profile
+   555                                               def list_snapshots(self):
+   556                                                   return self.compute_client.snapshots. \
+   557                                                       list_by_resource_group(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_snapshot at line 559
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   559                                               @profile
+   560                                               def get_snapshot(self, snapshot_id):
+   561                                                   url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   562                                                                                        snapshot_id)
+   563                                                   snapshot_name = url_params.get(SNAPSHOT_NAME)
+   564                                                   return self.compute_client.snapshots.get(self.resource_group,
+   565                                                                                            snapshot_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_snapshot at line 567
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   567                                               @profile
+   568                                               def create_snapshot(self, snapshot_name, params):
+   569                                                   return self.compute_client.snapshots.create_or_update(
+   570                                                       self.resource_group,
+   571                                                       snapshot_name,
+   572                                                       params
+   573                                                   ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_snapshot at line 575
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   575                                               @profile
+   576                                               def delete_snapshot(self, snapshot_id):
+   577                                                   url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   578                                                                                        snapshot_id)
+   579                                                   snapshot_name = url_params.get(SNAPSHOT_NAME)
+   580                                                   self.compute_client.snapshots.delete(self.resource_group,
+   581                                                                                        snapshot_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_snapshot_tags at line 583
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   583                                               @profile
+   584                                               def update_snapshot_tags(self, snapshot_id, tags):
+   585                                                   url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   586                                                                                        snapshot_id)
+   587                                                   snapshot_name = url_params.get(SNAPSHOT_NAME)
+   588                                                   return self.compute_client.snapshots.update(
+   589                                                       self.resource_group,
+   590                                                       snapshot_name,
+   591                                                       {'tags': tags},
+   592                                                       raw=True
+   593                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: is_gallery_image at line 595
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   595                                               @profile
+   596                                               def is_gallery_image(self, image_id):
+   597                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   598                                                                                        image_id)
+   599                                                   # If it is a gallery image, it will always have an offer
+   600                                                   return 'offer' in url_params
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_image at line 602
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   602                                               @profile
+   603                                               def create_image(self, name, params):
+   604                                                   return self.compute_client.images. \
+   605                                                       create_or_update(self.resource_group, name,
+   606                                                                        params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_image at line 608
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   608                                               @profile
+   609                                               def delete_image(self, image_id):
+   610                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   611                                                                                        image_id)
+   612                                                   if not self.is_gallery_image(image_id):
+   613                                                       name = url_params.get(IMAGE_NAME)
+   614                                                       self.compute_client.images.delete(self.resource_group, name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_images at line 616
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   616                                               @profile
+   617                                               def list_images(self):
+   618                                                   azure_images = list(self.compute_client.images.
+   619                                                                       list_by_resource_group(self.resource_group))
+   620                                                   return azure_images
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_gallery_refs at line 622
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   622                                               @profile
+   623                                               def list_gallery_refs(self):
+   624                                                   return gallery_image_references
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_image at line 626
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   626                                               @profile
+   627                                               def get_image(self, image_id):
+   628                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   629                                                                                        image_id)
+   630                                                   if self.is_gallery_image(image_id):
+   631                                                       return GalleryImageReference(publisher=url_params['publisher'],
+   632                                                                                    offer=url_params['offer'],
+   633                                                                                    sku=url_params['sku'],
+   634                                                                                    version=url_params['version'])
+   635                                                   else:
+   636                                                       name = url_params.get(IMAGE_NAME)
+   637                                                       return self.compute_client.images.get(self.resource_group, name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_image_tags at line 639
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   639                                               @profile
+   640                                               def update_image_tags(self, image_id, tags):
+   641                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   642                                                                                        image_id)
+   643                                                   if self.is_gallery_image(image_id):
+   644                                                       return True
+   645                                                   else:
+   646                                                       name = url_params.get(IMAGE_NAME)
+   647                                                       return self.compute_client.images. \
+   648                                                           create_or_update(self.resource_group, name,
+   649                                                                            {
+   650                                                                                'tags': tags,
+   651                                                                                'location': self.region_name
+   652                                                                            }).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm_types at line 654
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   654                                               @profile
+   655                                               def list_vm_types(self):
+   656                                                   return self.compute_client.virtual_machine_sizes. \
+   657                                                       list(self.region_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_networks at line 659
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   659                                               @profile
+   660                                               def list_networks(self):
+   661                                                   return self.network_management_client.virtual_networks.list(
+   662                                                       self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_network at line 664
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   664                                               @profile
+   665                                               def get_network(self, network_id):
+   666                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID,
+   667                                                                                        network_id)
+   668                                                   network_name = url_params.get(NETWORK_NAME)
+   669                                                   return self.network_management_client.virtual_networks.get(
+   670                                                       self.resource_group, network_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_network at line 672
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   672                                               @profile
+   673                                               def create_network(self, name, params):
+   674                                                   return self.network_management_client.virtual_networks. \
+   675                                                       create_or_update(self.resource_group,
+   676                                                                        name,
+   677                                                                        parameters=params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_network at line 679
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   679                                               @profile
+   680                                               def delete_network(self, network_id):
+   681                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   682                                                   network_name = url_params.get(NETWORK_NAME)
+   683                                                   return self.network_management_client.virtual_networks. \
+   684                                                       delete(self.resource_group, network_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_network_tags at line 686
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   686                                               @profile
+   687                                               def update_network_tags(self, network_id, tags):
+   688                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   689                                                   network_name = url_params.get(NETWORK_NAME)
+   690                                                   return self.network_management_client.virtual_networks. \
+   691                                                       create_or_update(self.resource_group,
+   692                                                                        network_name, tags).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_network_id_for_subnet at line 694
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   694                                               @profile
+   695                                               def get_network_id_for_subnet(self, subnet_id):
+   696                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID, subnet_id)
+   697                                                   network_id = NETWORK_RESOURCE_ID[0]
+   698                                                   for key, val in url_params.items():
+   699                                                       network_id = network_id.replace("{" + key + "}", val)
+   700                                                   return network_id
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_subnets at line 702
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   702                                               @profile
+   703                                               def list_subnets(self, network_id):
+   704                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   705                                                   network_name = url_params.get(NETWORK_NAME)
+   706                                                   return self.network_management_client.subnets. \
+   707                                                       list(self.resource_group, network_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_subnet at line 709
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   709                                               @profile
+   710                                               def get_subnet(self, subnet_id):
+   711                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   712                                                                                        subnet_id)
+   713                                                   network_name = url_params.get(NETWORK_NAME)
+   714                                                   subnet_name = url_params.get(SUBNET_NAME)
+   715                                                   return self.network_management_client.subnets. \
+   716                                                       get(self.resource_group, network_name, subnet_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_subnet at line 718
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   718                                               @profile
+   719                                               def create_subnet(self, network_id, subnet_name, params):
+   720                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   721                                                   network_name = url_params.get(NETWORK_NAME)
+   722                                                   result_create = self.network_management_client \
+   723                                                       .subnets.create_or_update(
+   724                                                           self.resource_group,
+   725                                                           network_name,
+   726                                                           subnet_name,
+   727                                                           params
+   728                                                       )
+   729                                                   subnet_info = result_create.result()
+   730                                           
+   731                                                   return subnet_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: __if_subnet_in_use at line 733
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   733                                               @profile
+   734                                               def __if_subnet_in_use(e):
+   735                                                   # return True if the CloudError exception is due to subnet being in use
+   736                                                   if isinstance(e, CloudError):
+   737                                                       if e.error.error == "InUseSubnetCannotBeDeleted":
+   738                                                           return True
+   739                                                   return False
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_subnet at line 741
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   741                                               @tenacity.retry(stop=tenacity.stop_after_attempt(5),
+   742                                                               retry=tenacity.retry_if_exception(__if_subnet_in_use),
+   743                                                               wait=tenacity.wait_fixed(5),
+   744                                                               reraise=True)
+   745                                               @profile
+   746                                               def delete_subnet(self, subnet_id):
+   747                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   748                                                                                        subnet_id)
+   749                                                   network_name = url_params.get(NETWORK_NAME)
+   750                                                   subnet_name = url_params.get(SUBNET_NAME)
+   751                                           
+   752                                                   try:
+   753                                                       result_delete = self.network_management_client \
+   754                                                           .subnets.delete(
+   755                                                               self.resource_group,
+   756                                                               network_name,
+   757                                                               subnet_name
+   758                                                           )
+   759                                                       result_delete.wait()
+   760                                                   except CloudError as cloud_error:
+   761                                                       log.exception(cloud_error.message)
+   762                                                       raise cloud_error
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_floating_ip at line 764
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   764                                               @profile
+   765                                               def create_floating_ip(self, public_ip_name, public_ip_parameters):
+   766                                                   return self.network_management_client.public_ip_addresses. \
+   767                                                       create_or_update(self.resource_group,
+   768                                                                        public_ip_name,
+   769                                                                        public_ip_parameters).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_floating_ip at line 771
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   771                                               @profile
+   772                                               def get_floating_ip(self, public_ip_id):
+   773                                                   url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   774                                                                                        public_ip_id)
+   775                                                   public_ip_name = url_params.get(PUBLIC_IP_NAME)
+   776                                                   return self.network_management_client. \
+   777                                                       public_ip_addresses.get(self.resource_group, public_ip_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_floating_ip at line 779
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   779                                               @profile
+   780                                               def delete_floating_ip(self, public_ip_id):
+   781                                                   url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   782                                                                                        public_ip_id)
+   783                                                   public_ip_name = url_params.get(PUBLIC_IP_NAME)
+   784                                                   self.network_management_client. \
+   785                                                       public_ip_addresses.delete(self.resource_group,
+   786                                                                                  public_ip_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_fip_tags at line 788
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   788                                               @profile
+   789                                               def update_fip_tags(self, fip_id, tags):
+   790                                                   url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   791                                                                                        fip_id)
+   792                                                   fip_name = url_params.get(PUBLIC_IP_NAME)
+   793                                                   self.network_management_client.public_ip_addresses. \
+   794                                                       create_or_update(self.resource_group,
+   795                                                                        fip_name, tags).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_floating_ips at line 797
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   797                                               @profile
+   798                                               def list_floating_ips(self):
+   799                                                   return self.network_management_client.public_ip_addresses.list(
+   800                                                       self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm at line 802
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   802                                               @profile
+   803                                               def list_vm(self):
+   804                                                   return self.compute_client.virtual_machines.list(
+   805                                                       self.resource_group
+   806                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: restart_vm at line 808
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   808                                               @profile
+   809                                               def restart_vm(self, vm_id):
+   810                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   811                                                                                        vm_id)
+   812                                                   vm_name = url_params.get(VM_NAME)
+   813                                                   return self.compute_client.virtual_machines.restart(
+   814                                                       self.resource_group, vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm at line 816
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   816                                               @profile
+   817                                               def delete_vm(self, vm_id):
+   818                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   819                                                                                        vm_id)
+   820                                                   vm_name = url_params.get(VM_NAME)
+   821                                                   return self.compute_client.virtual_machines.delete(
+   822                                                       self.resource_group, vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_vm at line 824
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   824                                               @profile
+   825                                               def get_vm(self, vm_id):
+   826                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   827                                                                                        vm_id)
+   828                                                   vm_name = url_params.get(VM_NAME)
+   829                                                   return self.compute_client.virtual_machines.get(
+   830                                                       self.resource_group,
+   831                                                       vm_name,
+   832                                                       expand='instanceView'
+   833                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm at line 835
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   835                                               @profile
+   836                                               def create_vm(self, vm_name, params):
+   837                                                   return self.compute_client.virtual_machines. \
+   838                                                       create_or_update(self.resource_group,
+   839                                                                        vm_name, params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm at line 841
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   841                                               @profile
+   842                                               def update_vm(self, vm_id, params):
+   843                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   844                                                                                        vm_id)
+   845                                                   vm_name = url_params.get(VM_NAME)
+   846                                                   return self.compute_client.virtual_machines. \
+   847                                                       create_or_update(self.resource_group,
+   848                                                                        vm_name, params, raw=True)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: deallocate_vm at line 850
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   850                                               @profile
+   851                                               def deallocate_vm(self, vm_id):
+   852                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   853                                                                                        vm_id)
+   854                                                   vm_name = url_params.get(VM_NAME)
+   855                                                   self.compute_client. \
+   856                                                       virtual_machines.deallocate(self.resource_group,
+   857                                                                                   vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: generalize_vm at line 859
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   859                                               @profile
+   860                                               def generalize_vm(self, vm_id):
+   861                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   862                                                                                        vm_id)
+   863                                                   vm_name = url_params.get(VM_NAME)
+   864                                                   self.compute_client.virtual_machines. \
+   865                                                       generalize(self.resource_group, vm_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: start_vm at line 867
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   867                                               @profile
+   868                                               def start_vm(self, vm_id):
+   869                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   870                                                                                        vm_id)
+   871                                                   vm_name = url_params.get(VM_NAME)
+   872                                                   self.compute_client.virtual_machines. \
+   873                                                       start(self.resource_group,
+   874                                                             vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm_tags at line 876
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   876                                               @profile
+   877                                               def update_vm_tags(self, vm_id, tags):
+   878                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   879                                                                                        vm_id)
+   880                                                   vm_name = url_params.get(VM_NAME)
+   881                                                   self.compute_client.virtual_machines. \
+   882                                                       create_or_update(self.resource_group,
+   883                                                                        vm_name, tags).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_nic at line 885
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   885                                               @profile
+   886                                               def delete_nic(self, nic_id):
+   887                                                   nic_params = azure_helpers.\
+   888                                                       parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   889                                                   nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   890                                                   self.network_management_client. \
+   891                                                       network_interfaces.delete(self.resource_group,
+   892                                                                                 nic_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_nic at line 894
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   894                                               @profile
+   895                                               def get_nic(self, nic_id):
+   896                                                   nic_params = azure_helpers.\
+   897                                                       parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   898                                                   nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   899                                                   return self.network_management_client. \
+   900                                                       network_interfaces.get(self.resource_group, nic_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_nic at line 902
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   902                                               @profile
+   903                                               def update_nic(self, nic_id, params):
+   904                                                   nic_params = azure_helpers.\
+   905                                                       parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   906                                                   nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   907                                                   async_nic_creation = self.network_management_client. \
+   908                                                       network_interfaces.create_or_update(
+   909                                                           self.resource_group,
+   910                                                           nic_name,
+   911                                                           params
+   912                                                       )
+   913                                                   nic_info = async_nic_creation.result()
+   914                                                   return nic_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_nic at line 916
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   916                                               @profile
+   917                                               def create_nic(self, nic_name, params):
+   918                                                   return self.network_management_client. \
+   919                                                       network_interfaces.create_or_update(
+   920                                                           self.resource_group,
+   921                                                           nic_name,
+   922                                                           params
+   923                                                       ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_public_key at line 925
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   925                                               @profile
+   926                                               def create_public_key(self, entity):
+   927                                                   return self.table_service. \
+   928                                                       insert_or_replace_entity(self.public_key_storage_table_name,
+   929                                                                                entity)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_public_key at line 931
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   931                                               @profile
+   932                                               def get_public_key(self, name):
+   933                                                   entities = self.table_service. \
+   934                                                       query_entities(self.public_key_storage_table_name,
+   935                                                                      "Name eq '{0}'".format(name), num_results=1)
+   936                                           
+   937                                                   return entities.items[0] if len(entities.items) > 0 else None
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_public_key at line 939
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   939                                               @profile
+   940                                               def delete_public_key(self, entity):
+   941                                                   self.table_service.delete_entity(self.public_key_storage_table_name,
+   942                                                                                    entity.PartitionKey, entity.RowKey)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_public_keys at line 944
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   944                                               @profile
+   945                                               def list_public_keys(self, partition_key, limit=None, marker=None):
+   946                                                   entities = self.table_service. \
+   947                                                       query_entities(self.public_key_storage_table_name,
+   948                                                                      "PartitionKey eq '{0}'".format(partition_key),
+   949                                                                      marker=marker, num_results=limit)
+   950                                                   return (entities.items, entities.next_marker)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_route_table at line 952
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   952                                               @profile
+   953                                               def delete_route_table(self, route_table_name):
+   954                                                   self.network_management_client. \
+   955                                                       route_tables.delete(self.resource_group, route_table_name
+   956                                                                           ).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: attach_subnet_to_route_table at line 958
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   958                                               @profile
+   959                                               def attach_subnet_to_route_table(self, subnet_id, route_table_id):
+   960                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   961                                                                                        subnet_id)
+   962                                                   network_name = url_params.get(NETWORK_NAME)
+   963                                                   subnet_name = url_params.get(SUBNET_NAME)
+   964                                           
+   965                                                   subnet_info = self.network_management_client.subnets.get(
+   966                                                       self.resource_group,
+   967                                                       network_name,
+   968                                                       subnet_name
+   969                                                   )
+   970                                                   if subnet_info:
+   971                                                       subnet_info.route_table = {
+   972                                                           'id': route_table_id
+   973                                                       }
+   974                                           
+   975                                                       result_create = self.network_management_client. \
+   976                                                           subnets.create_or_update(
+   977                                                            self.resource_group,
+   978                                                            network_name,
+   979                                                            subnet_name,
+   980                                                            subnet_info)
+   981                                                       subnet_info = result_create.result()
+   982                                           
+   983                                                   return subnet_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: detach_subnet_to_route_table at line 985
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   985                                               @profile
+   986                                               def detach_subnet_to_route_table(self, subnet_id, route_table_id):
+   987                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   988                                                                                        subnet_id)
+   989                                                   network_name = url_params.get(NETWORK_NAME)
+   990                                                   subnet_name = url_params.get(SUBNET_NAME)
+   991                                           
+   992                                                   subnet_info = self.network_management_client.subnets.get(
+   993                                                       self.resource_group,
+   994                                                       network_name,
+   995                                                       subnet_name
+   996                                                   )
+   997                                           
+   998                                                   if subnet_info and subnet_info.route_table.id == route_table_id:
+   999                                                       subnet_info.route_table = None
+  1000                                           
+  1001                                                       result_create = self.network_management_client. \
+  1002                                                           subnets.create_or_update(
+  1003                                                            self.resource_group,
+  1004                                                            network_name,
+  1005                                                            subnet_name,
+  1006                                                            subnet_info)
+  1007                                                       subnet_info = result_create.result()
+  1008                                           
+  1009                                                   return subnet_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_route_tables at line 1011
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1011                                               @profile
+  1012                                               def list_route_tables(self):
+  1013                                                   return self.network_management_client. \
+  1014                                                       route_tables.list(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_route_table at line 1016
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1016                                               @profile
+  1017                                               def get_route_table(self, router_id):
+  1018                                                   url_params = azure_helpers.parse_url(ROUTER_RESOURCE_ID,
+  1019                                                                                        router_id)
+  1020                                                   router_name = url_params.get(ROUTER_NAME)
+  1021                                                   return self.network_management_client. \
+  1022                                                       route_tables.get(self.resource_group, router_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_route_table at line 1024
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1024                                               @profile
+  1025                                               def create_route_table(self, route_table_name, params):
+  1026                                                   return self.network_management_client. \
+  1027                                                       route_tables.create_or_update(
+  1028                                                        self.resource_group,
+  1029                                                        route_table_name, params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_route_table_tags at line 1031
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1031                                               @profile
+  1032                                               def update_route_table_tags(self, route_table_name, tags):
+  1033                                                   self.network_management_client.route_tables. \
+  1034                                                       create_or_update(self.resource_group,
+  1035                                                                        route_table_name, tags).result()
+

+ 1467 - 0
results/security.res

@@ -0,0 +1,1467 @@
+Test output
+ .........
+----------------------------------------------------------------------
+Ran 9 tests in 788.805s
+
+OK
+
+Wrote profile results to run_tests.py.lprof
+Timer unit: 1e-06 s
+
+Total time: 3.0717 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: __init__ at line 160
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   160                                               @profile
+   161                                               def __init__(self, config):
+   162         9         28.0      3.1      0.0          self._config = config
+   163         9         21.0      2.3      0.0          self.subscription_id = str(config.get('azure_subscription_id'))
+   164         9          8.0      0.9      0.0          self._credentials = ServicePrincipalCredentials(
+   165         9          8.0      0.9      0.0              client_id=config.get('azure_client_id'),
+   166         9         11.0      1.2      0.0              secret=config.get('azure_secret'),
+   167         9    3071465.0 341273.9    100.0              tenant=config.get('azure_tenant')
+   168                                                   )
+   169                                           
+   170         9         27.0      3.0      0.0          self._access_token = config.get('azure_access_token')
+   171         9          9.0      1.0      0.0          self._resource_client = None
+   172         9          8.0      0.9      0.0          self._storage_client = None
+   173         9          6.0      0.7      0.0          self._network_management_client = None
+   174         9          9.0      1.0      0.0          self._subscription_client = None
+   175         9          6.0      0.7      0.0          self._compute_client = None
+   176         9          7.0      0.8      0.0          self._access_key_result = None
+   177         9         10.0      1.1      0.0          self._block_blob_service = None
+   178         9          7.0      0.8      0.0          self._table_service = None
+   179         9          6.0      0.7      0.0          self._storage_account = None
+   180                                           
+   181         9         62.0      6.9      0.0          log.debug("azure subscription : %s", self.subscription_id)
+
+Total time: 1.4842 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: access_key_result at line 183
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   183                                               @property
+   184                                               @tenacity.retry(stop=tenacity.stop_after_attempt(5), reraise=True)
+   185                                               @profile
+   186                                               def access_key_result(self):
+   187         3          3.0      1.0      0.0          if not self._access_key_result:
+   188         3         13.0      4.3      0.0              storage_account = self.storage_account
+   189                                           
+   190         3     696130.0 232043.3     46.9              if self.get_storage_account(storage_account).\
+   191         3          5.0      1.7      0.0                      provisioning_state.value != 'Succeeded':
+   192                                                           log.debug(
+   193                                                               "Storage account %s is not in Succeeded state yet. ",
+   194                                                               storage_account)
+   195                                                           raise WaitStateException(
+   196                                                               "Waited too long for storage account: {0} to "
+   197                                                               "become ready.".format(
+   198                                                                   storage_account,
+   199                                                                   self.get_storage_account(storage_account).
+   200                                                                   provisioning_state))
+   201                                           
+   202         3        699.0    233.0      0.0              self._access_key_result = self.storage_client.storage_accounts. \
+   203         3     787347.0 262449.0     53.0                  list_keys(self.resource_group, storage_account)
+   204         3          6.0      2.0      0.0          return self._access_key_result
+
+Total time: 0.000205 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: resource_group at line 206
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   206                                               @property
+   207                                               @profile
+   208                                               def resource_group(self):
+   209       115        205.0      1.8    100.0          return self._config.get('azure_resource_group')
+
+Total time: 1.5e-05 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: storage_account at line 211
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   211                                               @property
+   212                                               @profile
+   213                                               def storage_account(self):
+   214         9         15.0      1.7    100.0          return self._config.get('azure_storage_account')
+
+Total time: 3e-06 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: region_name at line 216
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   216                                               @property
+   217                                               @profile
+   218                                               def region_name(self):
+   219         3          3.0      1.0    100.0          return self._config.get('azure_region_name')
+
+Total time: 0.000115 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: public_key_storage_table_name at line 221
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   221                                               @property
+   222                                               @profile
+   223                                               def public_key_storage_table_name(self):
+   224        46        115.0      2.5    100.0          return self._config.get('azure_public_key_storage_table_name')
+
+Total time: 0.020725 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: storage_client at line 226
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   226                                               @property
+   227                                               @profile
+   228                                               def storage_client(self):
+   229         9         11.0      1.2      0.1          if not self._storage_client:
+   230                                                       self._storage_client = \
+   231         3          8.0      2.7      0.0                  StorageManagementClient(self._credentials,
+   232         3      20698.0   6899.3     99.9                                          self.subscription_id)
+   233         9          8.0      0.9      0.0          return self._storage_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: subscription_client at line 235
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   235                                               @property
+   236                                               @profile
+   237                                               def subscription_client(self):
+   238                                                   if not self._subscription_client:
+   239                                                       self._subscription_client = SubscriptionClient(self._credentials)
+   240                                                   return self._subscription_client
+
+Total time: 0.081115 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: resource_client at line 242
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   242                                               @property
+   243                                               @profile
+   244                                               def resource_client(self):
+   245         9          6.0      0.7      0.0          if not self._resource_client:
+   246                                                       self._resource_client = \
+   247         9          8.0      0.9      0.0                  ResourceManagementClient(self._credentials,
+   248         9      81081.0   9009.0    100.0                                           self.subscription_id)
+   249         9         20.0      2.2      0.0          return self._resource_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: compute_client at line 251
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   251                                               @property
+   252                                               @profile
+   253                                               def compute_client(self):
+   254                                                   if not self._compute_client:
+   255                                                       self._compute_client = \
+   256                                                           ComputeManagementClient(self._credentials,
+   257                                                                                   self.subscription_id)
+   258                                                   return self._compute_client
+
+Total time: 0.043287 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: network_management_client at line 260
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   260                                               @property
+   261                                               @profile
+   262                                               def network_management_client(self):
+   263       106        110.0      1.0      0.3          if not self._network_management_client:
+   264         6         10.0      1.7      0.0              self._network_management_client = NetworkManagementClient(
+   265         6      43100.0   7183.3     99.6                  self._credentials, self.subscription_id)
+   266       106         67.0      0.6      0.2          return self._network_management_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: blob_service at line 268
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   268                                               @property
+   269                                               @profile
+   270                                               def blob_service(self):
+   271                                                   self._get_or_create_storage_account()
+   272                                                   if not self._block_blob_service:
+   273                                                       if self._access_token:
+   274                                                           token_credential = TokenCredential(self._access_token)
+   275                                                           self._block_blob_service = BlockBlobService(
+   276                                                               account_name=self.storage_account,
+   277                                                               token_credential=token_credential)
+   278                                                       else:
+   279                                                           self._block_blob_service = BlockBlobService(
+   280                                                               account_name=self.storage_account,
+   281                                                               account_key=self.access_key_result.keys[0].value)
+   282                                                   return self._block_blob_service
+
+Total time: 3.8387 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: table_service at line 284
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   284                                               @property
+   285                                               @profile
+   286                                               def table_service(self):
+   287        23     990231.0  43053.5     25.8          self._get_or_create_storage_account()
+   288        23         27.0      1.2      0.0          if not self._table_service:
+   289         3          3.0      1.0      0.0              self._table_service = TableService(
+   290         3         22.0      7.3      0.0                  self.storage_account,
+   291         3    1485303.0 495101.0     38.7                  self.access_key_result.keys[0].value)
+   292        23         25.0      1.1      0.0          if not self._table_service. \
+   293        23    1363026.0  59262.0     35.5                  exists(table_name=self.public_key_storage_table_name):
+   294                                                       self._table_service.create_table(
+   295                                                           self.public_key_storage_table_name)
+   296        23         67.0      2.9      0.0          return self._table_service
+
+Total time: 1.99059 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_resource_group at line 298
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   298                                               @profile
+   299                                               def get_resource_group(self, name):
+   300         9    1990586.0 221176.2    100.0          return self.resource_client.resource_groups.get(name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_resource_group at line 302
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   302                                               @profile
+   303                                               def create_resource_group(self, name, parameters):
+   304                                                   return self.resource_client.resource_groups. \
+   305                                                       create_or_update(name, parameters)
+
+Total time: 1.68342 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_storage_account at line 307
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   307                                               @profile
+   308                                               def get_storage_account(self, storage_account):
+   309         6     100101.0  16683.5      5.9          return self.storage_client.storage_accounts. \
+   310         6    1583319.0 263886.5     94.1              get_properties(self.resource_group, storage_account)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_storage_account at line 312
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   312                                               @profile
+   313                                               def create_storage_account(self, name, params):
+   314                                                   return self.storage_client.storage_accounts. \
+   315                                                       create(self.resource_group, name.lower(), params).result()
+
+Total time: 0.987488 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: _get_or_create_storage_account at line 319
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   319                                               @tenacity.retry(stop=tenacity.stop_after_attempt(2),
+   320                                                               retry=tenacity.retry_if_exception_type(CloudError),
+   321                                                               reraise=True)
+   322                                               @profile
+   323                                               def _get_or_create_storage_account(self):
+   324        23         37.0      1.6      0.0          if self._storage_account:
+   325        20         17.0      0.8      0.0              return self._storage_account
+   326                                                   else:
+   327         3          2.0      0.7      0.0              try:
+   328                                                           self._storage_account = \
+   329         3     987432.0 329144.0    100.0                      self.get_storage_account(self.storage_account)
+   330                                                       except CloudError as cloud_error:
+   331                                                           if cloud_error.error.error == "ResourceNotFound":
+   332                                                               storage_account_params = {
+   333                                                                   'sku': {
+   334                                                                       'name': 'Standard_LRS'
+   335                                                                   },
+   336                                                                   'kind': 'storage',
+   337                                                                   'location': self.region_name,
+   338                                                               }
+   339                                                               try:
+   340                                                                   self._storage_account = \
+   341                                                                       self.create_storage_account(self.storage_account,
+   342                                                                                                   storage_account_params)
+   343                                                               except CloudError as cloud_error2:  # pragma: no cover
+   344                                                                   if cloud_error2.error.error == "AuthorizationFailed":
+   345                                                                       mess = 'The following error was returned by ' \
+   346                                                                              'Azure:\n%s\n\nThis is likely because the' \
+   347                                                                              ' Role associated with the provided ' \
+   348                                                                              'credentials does not allow for Storage ' \
+   349                                                                              'Account creation.\nA Storage Account is ' \
+   350                                                                              'necessary in order to perform the ' \
+   351                                                                              'desired operation. You must either ' \
+   352                                                                              'provide an existing Storage Account name' \
+   353                                                                              ' as part of the configuration, or ' \
+   354                                                                              'elevate the associated Role.\nFor more ' \
+   355                                                                              'information on roles, see: https://docs.' \
+   356                                                                              'microsoft.com/en-us/azure/role-based-' \
+   357                                                                              'access-control/overview\n' % cloud_error2
+   358                                                                       raise ProviderConnectionException(mess)
+   359                                           
+   360                                                                   elif cloud_error2.error.error == \
+   361                                                                           "StorageAccountAlreadyTaken":
+   362                                                                       mess = 'The following error was ' \
+   363                                                                              'returned by Azure:\n%s\n\n' \
+   364                                                                              'Note that Storage Account names must be ' \
+   365                                                                              'unique across Azure (not just in your ' \
+   366                                                                              'subscription).\nFor more information ' \
+   367                                                                              'see https://docs.microsoft.com/en-us/' \
+   368                                                                              'azure/azure-resource-manager/resource-' \
+   369                                                                              'manager-storage-account-name-errors\n' \
+   370                                                                              % cloud_error2
+   371                                                                       raise InvalidLabelException(mess)
+   372                                                                   else:
+   373                                                                       raise cloud_error2
+   374                                                           else:
+   375                                                               raise cloud_error
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_locations at line 377
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   377                                               @profile
+   378                                               def list_locations(self):
+   379                                                   return self.subscription_client.subscriptions. \
+   380                                                       list_locations(self.subscription_id)
+
+Total time: 0.005836 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm_firewall at line 382
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   382                                               @profile
+   383                                               def list_vm_firewall(self):
+   384         7       5458.0    779.7     93.5          return self.network_management_client.network_security_groups. \
+   385         7        378.0     54.0      6.5              list(self.resource_group)
+
+Total time: 68.5755 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm_firewall at line 387
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   387                                               @profile
+   388                                               def create_vm_firewall(self, name, parameters):
+   389         6       4447.0    741.2      0.0          return self.network_management_client.network_security_groups. \
+   390         6         51.0      8.5      0.0              create_or_update(self.resource_group, name,
+   391         6   68570982.0 11428497.0    100.0                               parameters).result()
+
+Total time: 72.8747 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm_firewall_tags at line 393
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   393                                               @profile
+   394                                               def update_vm_firewall_tags(self, fw_id, tags):
+   395         3          8.0      2.7      0.0          url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   396         3         73.0     24.3      0.0                                               fw_id)
+   397         3          3.0      1.0      0.0          name = url_params.get(VM_FIREWALL_NAME)
+   398         3       2084.0    694.7      0.0          return self.network_management_client.network_security_groups. \
+   399         3         23.0      7.7      0.0              create_or_update(self.resource_group, name,
+   400         3          2.0      0.7      0.0                               {'tags': tags,
+   401         3   72872468.0 24290822.7    100.0                                'location': self.region_name}).result()
+
+Total time: 1.05494 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_vm_firewall at line 403
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   403                                               @profile
+   404                                               def get_vm_firewall(self, fw_id):
+   405         4         11.0      2.8      0.0          url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   406         4         99.0     24.8      0.0                                               fw_id)
+   407         4          4.0      1.0      0.0          fw_name = url_params.get(VM_FIREWALL_NAME)
+   408         4       2974.0    743.5      0.3          return self.network_management_client.network_security_groups. \
+   409         4    1051851.0 262962.8     99.7              get(self.resource_group, fw_name)
+
+Total time: 64.2852 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm_firewall at line 411
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   411                                               @profile
+   412                                               def delete_vm_firewall(self, fw_id):
+   413         6         16.0      2.7      0.0          url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   414         6        154.0     25.7      0.0                                               fw_id)
+   415         6          6.0      1.0      0.0          name = url_params.get(VM_FIREWALL_NAME)
+   416         6       4320.0    720.0      0.0          self.network_management_client \
+   417         6   64280695.0 10713449.2    100.0              .network_security_groups.delete(self.resource_group, name).wait()
+
+Total time: 528.549 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm_firewall_rule at line 419
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   419                                               @profile
+   420                                               def create_vm_firewall_rule(self, fw_id,
+   421                                                                           rule_name, parameters):
+   422        47        123.0      2.6      0.0          url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   423        47       1298.0     27.6      0.0                                               fw_id)
+   424        47         71.0      1.5      0.0          vm_firewall_name = url_params.get(VM_FIREWALL_NAME)
+   425        47      35143.0    747.7      0.0          return self.network_management_client.security_rules. \
+   426        47        457.0      9.7      0.0              create_or_update(self.resource_group, vm_firewall_name,
+   427        47  528511698.0 11244929.7    100.0                               rule_name, parameters).result()
+
+Total time: 32.4044 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm_firewall_rule at line 429
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   429                                               @profile
+   430                                               def delete_vm_firewall_rule(self, fw_rule_id, vm_firewall):
+   431         3          8.0      2.7      0.0          url_params = azure_helpers.parse_url(VM_FIREWALL_RULE_RESOURCE_ID,
+   432         3         92.0     30.7      0.0                                               fw_rule_id)
+   433         3          5.0      1.7      0.0          name = url_params.get(VM_FIREWALL_RULE_NAME)
+   434         3       2354.0    784.7      0.0          return self.network_management_client.security_rules. \
+   435         3   32401986.0 10800662.0    100.0              delete(self.resource_group, vm_firewall, name).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_containers at line 437
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   437                                               @profile
+   438                                               def list_containers(self, prefix=None, limit=None, marker=None):
+   439                                                   results = self.blob_service.list_containers(prefix=prefix,
+   440                                                                                               num_results=limit,
+   441                                                                                               marker=marker)
+   442                                                   return (results.items, results.next_marker)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_container at line 444
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   444                                               @profile
+   445                                               def create_container(self, container_name):
+   446                                                   try:
+   447                                                       self.blob_service.create_container(container_name,
+   448                                                                                          fail_on_exist=True)
+   449                                                   except AzureConflictHttpError as cloud_error:
+   450                                                       if cloud_error.error_code == "ContainerAlreadyExists":
+   451                                                           msg = "The given Bucket name '%s' already exists. Please " \
+   452                                                                 "use the `get` or `find` method to get a reference to " \
+   453                                                                 "an existing Bucket, or specify a new Bucket name to " \
+   454                                                                 "create.\nNote that in Azure, Buckets are contained " \
+   455                                                                 "in Storage Accounts." % container_name
+   456                                                           raise DuplicateResourceException(msg)
+   457                                           
+   458                                                   return self.blob_service.get_container_properties(container_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_container at line 460
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   460                                               @profile
+   461                                               def get_container(self, container_name):
+   462                                                   return self.blob_service.get_container_properties(container_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_container at line 464
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   464                                               @profile
+   465                                               def delete_container(self, container_name):
+   466                                                   self.blob_service.delete_container(container_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_blobs at line 468
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   468                                               @profile
+   469                                               def list_blobs(self, container_name, prefix=None):
+   470                                                   return self.blob_service.list_blobs(container_name, prefix=prefix)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob at line 472
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   472                                               @profile
+   473                                               def get_blob(self, container_name, blob_name):
+   474                                                   return self.blob_service.get_blob_properties(container_name, blob_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_blob_from_text at line 476
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   476                                               @profile
+   477                                               def create_blob_from_text(self, container_name, blob_name, text):
+   478                                                   self.blob_service.create_blob_from_text(container_name,
+   479                                                                                           blob_name, text)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_blob_from_file at line 481
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   481                                               @profile
+   482                                               def create_blob_from_file(self, container_name, blob_name, file_path):
+   483                                                   self.blob_service.create_blob_from_path(container_name,
+   484                                                                                           blob_name, file_path)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_blob at line 486
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   486                                               @profile
+   487                                               def delete_blob(self, container_name, blob_name):
+   488                                                   self.blob_service.delete_blob(container_name, blob_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob_url at line 490
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   490                                               @profile
+   491                                               def get_blob_url(self, container_name, blob_name, expiry_time):
+   492                                                   expiry_date = datetime.datetime.utcnow() + datetime.timedelta(
+   493                                                       seconds=expiry_time)
+   494                                                   sas = self.blob_service.generate_blob_shared_access_signature(
+   495                                                       container_name, blob_name, permission=BlobPermissions.READ,
+   496                                                       expiry=expiry_date)
+   497                                                   return self.blob_service.make_blob_url(container_name, blob_name,
+   498                                                                                          sas_token=sas)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob_content at line 500
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   500                                               @profile
+   501                                               def get_blob_content(self, container_name, blob_name):
+   502                                                   out_stream = BytesIO()
+   503                                                   self.blob_service.get_blob_to_stream(container_name,
+   504                                                                                        blob_name, out_stream)
+   505                                                   return out_stream
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_empty_disk at line 507
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   507                                               @profile
+   508                                               def create_empty_disk(self, disk_name, params):
+   509                                                   return self.compute_client.disks.create_or_update(
+   510                                                       self.resource_group,
+   511                                                       disk_name,
+   512                                                       params
+   513                                                   ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_snapshot_disk at line 515
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   515                                               @profile
+   516                                               def create_snapshot_disk(self, disk_name, params):
+   517                                                   return self.compute_client.disks.create_or_update(
+   518                                                       self.resource_group,
+   519                                                       disk_name,
+   520                                                       params
+   521                                                   ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_disk at line 523
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   523                                               @profile
+   524                                               def get_disk(self, disk_id):
+   525                                                   url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   526                                                                                        disk_id)
+   527                                                   disk_name = url_params.get(VOLUME_NAME)
+   528                                                   return self.compute_client.disks.get(self.resource_group, disk_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_disks at line 530
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   530                                               @profile
+   531                                               def list_disks(self):
+   532                                                   return self.compute_client.disks. \
+   533                                                       list_by_resource_group(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_disk at line 535
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   535                                               @profile
+   536                                               def delete_disk(self, disk_id):
+   537                                                   url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   538                                                                                        disk_id)
+   539                                                   disk_name = url_params.get(VOLUME_NAME)
+   540                                                   self.compute_client.disks.delete(self.resource_group, disk_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_disk_tags at line 542
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   542                                               @profile
+   543                                               def update_disk_tags(self, disk_id, tags):
+   544                                                   url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   545                                                                                        disk_id)
+   546                                                   disk_name = url_params.get(VOLUME_NAME)
+   547                                                   return self.compute_client.disks.update(
+   548                                                       self.resource_group,
+   549                                                       disk_name,
+   550                                                       {'tags': tags},
+   551                                                       raw=True
+   552                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_snapshots at line 554
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   554                                               @profile
+   555                                               def list_snapshots(self):
+   556                                                   return self.compute_client.snapshots. \
+   557                                                       list_by_resource_group(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_snapshot at line 559
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   559                                               @profile
+   560                                               def get_snapshot(self, snapshot_id):
+   561                                                   url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   562                                                                                        snapshot_id)
+   563                                                   snapshot_name = url_params.get(SNAPSHOT_NAME)
+   564                                                   return self.compute_client.snapshots.get(self.resource_group,
+   565                                                                                            snapshot_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_snapshot at line 567
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   567                                               @profile
+   568                                               def create_snapshot(self, snapshot_name, params):
+   569                                                   return self.compute_client.snapshots.create_or_update(
+   570                                                       self.resource_group,
+   571                                                       snapshot_name,
+   572                                                       params
+   573                                                   ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_snapshot at line 575
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   575                                               @profile
+   576                                               def delete_snapshot(self, snapshot_id):
+   577                                                   url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   578                                                                                        snapshot_id)
+   579                                                   snapshot_name = url_params.get(SNAPSHOT_NAME)
+   580                                                   self.compute_client.snapshots.delete(self.resource_group,
+   581                                                                                        snapshot_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_snapshot_tags at line 583
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   583                                               @profile
+   584                                               def update_snapshot_tags(self, snapshot_id, tags):
+   585                                                   url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   586                                                                                        snapshot_id)
+   587                                                   snapshot_name = url_params.get(SNAPSHOT_NAME)
+   588                                                   return self.compute_client.snapshots.update(
+   589                                                       self.resource_group,
+   590                                                       snapshot_name,
+   591                                                       {'tags': tags},
+   592                                                       raw=True
+   593                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: is_gallery_image at line 595
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   595                                               @profile
+   596                                               def is_gallery_image(self, image_id):
+   597                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   598                                                                                        image_id)
+   599                                                   # If it is a gallery image, it will always have an offer
+   600                                                   return 'offer' in url_params
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_image at line 602
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   602                                               @profile
+   603                                               def create_image(self, name, params):
+   604                                                   return self.compute_client.images. \
+   605                                                       create_or_update(self.resource_group, name,
+   606                                                                        params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_image at line 608
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   608                                               @profile
+   609                                               def delete_image(self, image_id):
+   610                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   611                                                                                        image_id)
+   612                                                   if not self.is_gallery_image(image_id):
+   613                                                       name = url_params.get(IMAGE_NAME)
+   614                                                       self.compute_client.images.delete(self.resource_group, name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_images at line 616
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   616                                               @profile
+   617                                               def list_images(self):
+   618                                                   azure_images = list(self.compute_client.images.
+   619                                                                       list_by_resource_group(self.resource_group))
+   620                                                   return azure_images
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_gallery_refs at line 622
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   622                                               @profile
+   623                                               def list_gallery_refs(self):
+   624                                                   return gallery_image_references
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_image at line 626
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   626                                               @profile
+   627                                               def get_image(self, image_id):
+   628                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   629                                                                                        image_id)
+   630                                                   if self.is_gallery_image(image_id):
+   631                                                       return GalleryImageReference(publisher=url_params['publisher'],
+   632                                                                                    offer=url_params['offer'],
+   633                                                                                    sku=url_params['sku'],
+   634                                                                                    version=url_params['version'])
+   635                                                   else:
+   636                                                       name = url_params.get(IMAGE_NAME)
+   637                                                       return self.compute_client.images.get(self.resource_group, name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_image_tags at line 639
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   639                                               @profile
+   640                                               def update_image_tags(self, image_id, tags):
+   641                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   642                                                                                        image_id)
+   643                                                   if self.is_gallery_image(image_id):
+   644                                                       return True
+   645                                                   else:
+   646                                                       name = url_params.get(IMAGE_NAME)
+   647                                                       return self.compute_client.images. \
+   648                                                           create_or_update(self.resource_group, name,
+   649                                                                            {
+   650                                                                                'tags': tags,
+   651                                                                                'location': self.region_name
+   652                                                                            }).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm_types at line 654
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   654                                               @profile
+   655                                               def list_vm_types(self):
+   656                                                   return self.compute_client.virtual_machine_sizes. \
+   657                                                       list(self.region_name)
+
+Total time: 0.048469 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_networks at line 659
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   659                                               @profile
+   660                                               def list_networks(self):
+   661         6      48111.0   8018.5     99.3          return self.network_management_client.virtual_networks.list(
+   662         6        358.0     59.7      0.7              self.resource_group)
+
+Total time: 4.84816 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_network at line 664
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   664                                               @profile
+   665                                               def get_network(self, network_id):
+   666        18         16.0      0.9      0.0          url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID,
+   667        18        323.0     17.9      0.0                                               network_id)
+   668        18         18.0      1.0      0.0          network_name = url_params.get(NETWORK_NAME)
+   669        18      13505.0    750.3      0.3          return self.network_management_client.virtual_networks.get(
+   670        18    4834293.0 268571.8     99.7              self.resource_group, network_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_network at line 672
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   672                                               @profile
+   673                                               def create_network(self, name, params):
+   674                                                   return self.network_management_client.virtual_networks. \
+   675                                                       create_or_update(self.resource_group,
+   676                                                                        name,
+   677                                                                        parameters=params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_network at line 679
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   679                                               @profile
+   680                                               def delete_network(self, network_id):
+   681                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   682                                                   network_name = url_params.get(NETWORK_NAME)
+   683                                                   return self.network_management_client.virtual_networks. \
+   684                                                       delete(self.resource_group, network_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_network_tags at line 686
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   686                                               @profile
+   687                                               def update_network_tags(self, network_id, tags):
+   688                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   689                                                   network_name = url_params.get(NETWORK_NAME)
+   690                                                   return self.network_management_client.virtual_networks. \
+   691                                                       create_or_update(self.resource_group,
+   692                                                                        network_name, tags).result()
+
+Total time: 0.000751 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_network_id_for_subnet at line 694
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   694                                               @profile
+   695                                               def get_network_id_for_subnet(self, subnet_id):
+   696        18        522.0     29.0     69.5          url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID, subnet_id)
+   697        18         26.0      1.4      3.5          network_id = NETWORK_RESOURCE_ID[0]
+   698        90         63.0      0.7      8.4          for key, val in url_params.items():
+   699        72        130.0      1.8     17.3              network_id = network_id.replace("{" + key + "}", val)
+   700        18         10.0      0.6      1.3          return network_id
+
+Total time: 0.004972 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_subnets at line 702
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   702                                               @profile
+   703                                               def list_subnets(self, network_id):
+   704         6        180.0     30.0      3.6          url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   705         6         11.0      1.8      0.2          network_name = url_params.get(NETWORK_NAME)
+   706         6       4469.0    744.8     89.9          return self.network_management_client.subnets. \
+   707         6        312.0     52.0      6.3              list(self.resource_group, network_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_subnet at line 709
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   709                                               @profile
+   710                                               def get_subnet(self, subnet_id):
+   711                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   712                                                                                        subnet_id)
+   713                                                   network_name = url_params.get(NETWORK_NAME)
+   714                                                   subnet_name = url_params.get(SUBNET_NAME)
+   715                                                   return self.network_management_client.subnets. \
+   716                                                       get(self.resource_group, network_name, subnet_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_subnet at line 718
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   718                                               @profile
+   719                                               def create_subnet(self, network_id, subnet_name, params):
+   720                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   721                                                   network_name = url_params.get(NETWORK_NAME)
+   722                                                   result_create = self.network_management_client \
+   723                                                       .subnets.create_or_update(
+   724                                                           self.resource_group,
+   725                                                           network_name,
+   726                                                           subnet_name,
+   727                                                           params
+   728                                                       )
+   729                                                   subnet_info = result_create.result()
+   730                                           
+   731                                                   return subnet_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: __if_subnet_in_use at line 733
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   733                                               @profile
+   734                                               def __if_subnet_in_use(e):
+   735                                                   # return True if the CloudError exception is due to subnet being in use
+   736                                                   if isinstance(e, CloudError):
+   737                                                       if e.error.error == "InUseSubnetCannotBeDeleted":
+   738                                                           return True
+   739                                                   return False
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_subnet at line 741
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   741                                               @tenacity.retry(stop=tenacity.stop_after_attempt(5),
+   742                                                               retry=tenacity.retry_if_exception(__if_subnet_in_use),
+   743                                                               wait=tenacity.wait_fixed(5),
+   744                                                               reraise=True)
+   745                                               @profile
+   746                                               def delete_subnet(self, subnet_id):
+   747                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   748                                                                                        subnet_id)
+   749                                                   network_name = url_params.get(NETWORK_NAME)
+   750                                                   subnet_name = url_params.get(SUBNET_NAME)
+   751                                           
+   752                                                   try:
+   753                                                       result_delete = self.network_management_client \
+   754                                                           .subnets.delete(
+   755                                                               self.resource_group,
+   756                                                               network_name,
+   757                                                               subnet_name
+   758                                                           )
+   759                                                       result_delete.wait()
+   760                                                   except CloudError as cloud_error:
+   761                                                       log.exception(cloud_error.message)
+   762                                                       raise cloud_error
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_floating_ip at line 764
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   764                                               @profile
+   765                                               def create_floating_ip(self, public_ip_name, public_ip_parameters):
+   766                                                   return self.network_management_client.public_ip_addresses. \
+   767                                                       create_or_update(self.resource_group,
+   768                                                                        public_ip_name,
+   769                                                                        public_ip_parameters).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_floating_ip at line 771
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   771                                               @profile
+   772                                               def get_floating_ip(self, public_ip_id):
+   773                                                   url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   774                                                                                        public_ip_id)
+   775                                                   public_ip_name = url_params.get(PUBLIC_IP_NAME)
+   776                                                   return self.network_management_client. \
+   777                                                       public_ip_addresses.get(self.resource_group, public_ip_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_floating_ip at line 779
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   779                                               @profile
+   780                                               def delete_floating_ip(self, public_ip_id):
+   781                                                   url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   782                                                                                        public_ip_id)
+   783                                                   public_ip_name = url_params.get(PUBLIC_IP_NAME)
+   784                                                   self.network_management_client. \
+   785                                                       public_ip_addresses.delete(self.resource_group,
+   786                                                                                  public_ip_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_fip_tags at line 788
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   788                                               @profile
+   789                                               def update_fip_tags(self, fip_id, tags):
+   790                                                   url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   791                                                                                        fip_id)
+   792                                                   fip_name = url_params.get(PUBLIC_IP_NAME)
+   793                                                   self.network_management_client.public_ip_addresses. \
+   794                                                       create_or_update(self.resource_group,
+   795                                                                        fip_name, tags).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_floating_ips at line 797
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   797                                               @profile
+   798                                               def list_floating_ips(self):
+   799                                                   return self.network_management_client.public_ip_addresses.list(
+   800                                                       self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm at line 802
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   802                                               @profile
+   803                                               def list_vm(self):
+   804                                                   return self.compute_client.virtual_machines.list(
+   805                                                       self.resource_group
+   806                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: restart_vm at line 808
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   808                                               @profile
+   809                                               def restart_vm(self, vm_id):
+   810                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   811                                                                                        vm_id)
+   812                                                   vm_name = url_params.get(VM_NAME)
+   813                                                   return self.compute_client.virtual_machines.restart(
+   814                                                       self.resource_group, vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm at line 816
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   816                                               @profile
+   817                                               def delete_vm(self, vm_id):
+   818                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   819                                                                                        vm_id)
+   820                                                   vm_name = url_params.get(VM_NAME)
+   821                                                   return self.compute_client.virtual_machines.delete(
+   822                                                       self.resource_group, vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_vm at line 824
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   824                                               @profile
+   825                                               def get_vm(self, vm_id):
+   826                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   827                                                                                        vm_id)
+   828                                                   vm_name = url_params.get(VM_NAME)
+   829                                                   return self.compute_client.virtual_machines.get(
+   830                                                       self.resource_group,
+   831                                                       vm_name,
+   832                                                       expand='instanceView'
+   833                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm at line 835
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   835                                               @profile
+   836                                               def create_vm(self, vm_name, params):
+   837                                                   return self.compute_client.virtual_machines. \
+   838                                                       create_or_update(self.resource_group,
+   839                                                                        vm_name, params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm at line 841
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   841                                               @profile
+   842                                               def update_vm(self, vm_id, params):
+   843                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   844                                                                                        vm_id)
+   845                                                   vm_name = url_params.get(VM_NAME)
+   846                                                   return self.compute_client.virtual_machines. \
+   847                                                       create_or_update(self.resource_group,
+   848                                                                        vm_name, params, raw=True)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: deallocate_vm at line 850
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   850                                               @profile
+   851                                               def deallocate_vm(self, vm_id):
+   852                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   853                                                                                        vm_id)
+   854                                                   vm_name = url_params.get(VM_NAME)
+   855                                                   self.compute_client. \
+   856                                                       virtual_machines.deallocate(self.resource_group,
+   857                                                                                   vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: generalize_vm at line 859
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   859                                               @profile
+   860                                               def generalize_vm(self, vm_id):
+   861                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   862                                                                                        vm_id)
+   863                                                   vm_name = url_params.get(VM_NAME)
+   864                                                   self.compute_client.virtual_machines. \
+   865                                                       generalize(self.resource_group, vm_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: start_vm at line 867
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   867                                               @profile
+   868                                               def start_vm(self, vm_id):
+   869                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   870                                                                                        vm_id)
+   871                                                   vm_name = url_params.get(VM_NAME)
+   872                                                   self.compute_client.virtual_machines. \
+   873                                                       start(self.resource_group,
+   874                                                             vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm_tags at line 876
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   876                                               @profile
+   877                                               def update_vm_tags(self, vm_id, tags):
+   878                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   879                                                                                        vm_id)
+   880                                                   vm_name = url_params.get(VM_NAME)
+   881                                                   self.compute_client.virtual_machines. \
+   882                                                       create_or_update(self.resource_group,
+   883                                                                        vm_name, tags).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_nic at line 885
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   885                                               @profile
+   886                                               def delete_nic(self, nic_id):
+   887                                                   nic_params = azure_helpers.\
+   888                                                       parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   889                                                   nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   890                                                   self.network_management_client. \
+   891                                                       network_interfaces.delete(self.resource_group,
+   892                                                                                 nic_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_nic at line 894
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   894                                               @profile
+   895                                               def get_nic(self, nic_id):
+   896                                                   nic_params = azure_helpers.\
+   897                                                       parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   898                                                   nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   899                                                   return self.network_management_client. \
+   900                                                       network_interfaces.get(self.resource_group, nic_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_nic at line 902
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   902                                               @profile
+   903                                               def update_nic(self, nic_id, params):
+   904                                                   nic_params = azure_helpers.\
+   905                                                       parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   906                                                   nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   907                                                   async_nic_creation = self.network_management_client. \
+   908                                                       network_interfaces.create_or_update(
+   909                                                           self.resource_group,
+   910                                                           nic_name,
+   911                                                           params
+   912                                                       )
+   913                                                   nic_info = async_nic_creation.result()
+   914                                                   return nic_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_nic at line 916
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   916                                               @profile
+   917                                               def create_nic(self, nic_name, params):
+   918                                                   return self.network_management_client. \
+   919                                                       network_interfaces.create_or_update(
+   920                                                           self.resource_group,
+   921                                                           nic_name,
+   922                                                           params
+   923                                                       ).result()
+
+Total time: 0.295365 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_public_key at line 925
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   925                                               @profile
+   926                                               def create_public_key(self, entity):
+   927         3     148018.0  49339.3     50.1          return self.table_service. \
+   928         3         25.0      8.3      0.0              insert_or_replace_entity(self.public_key_storage_table_name,
+   929         3     147322.0  49107.3     49.9                                       entity)
+
+Total time: 3.71449 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_public_key at line 931
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   931                                               @profile
+   932                                               def get_public_key(self, name):
+   933        11    3360211.0 305473.7     90.5          entities = self.table_service. \
+   934        11         93.0      8.5      0.0              query_entities(self.public_key_storage_table_name,
+   935        11     354149.0  32195.4      9.5                             "Name eq '{0}'".format(name), num_results=1)
+   936                                           
+   937        11         37.0      3.4      0.0          return entities.items[0] if len(entities.items) > 0 else None
+
+Total time: 0.195861 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_public_key at line 939
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   939                                               @profile
+   940                                               def delete_public_key(self, entity):
+   941         3     106261.0  35420.3     54.3          self.table_service.delete_entity(self.public_key_storage_table_name,
+   942         3      89600.0  29866.7     45.7                                           entity.PartitionKey, entity.RowKey)
+
+Total time: 0.458264 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_public_keys at line 944
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   944                                               @profile
+   945                                               def list_public_keys(self, partition_key, limit=None, marker=None):
+   946         6     224624.0  37437.3     49.0          entities = self.table_service. \
+   947         6         58.0      9.7      0.0              query_entities(self.public_key_storage_table_name,
+   948         6         11.0      1.8      0.0                             "PartitionKey eq '{0}'".format(partition_key),
+   949         6     233558.0  38926.3     51.0                             marker=marker, num_results=limit)
+   950         6         13.0      2.2      0.0          return (entities.items, entities.next_marker)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_route_table at line 952
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   952                                               @profile
+   953                                               def delete_route_table(self, route_table_name):
+   954                                                   self.network_management_client. \
+   955                                                       route_tables.delete(self.resource_group, route_table_name
+   956                                                                           ).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: attach_subnet_to_route_table at line 958
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   958                                               @profile
+   959                                               def attach_subnet_to_route_table(self, subnet_id, route_table_id):
+   960                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   961                                                                                        subnet_id)
+   962                                                   network_name = url_params.get(NETWORK_NAME)
+   963                                                   subnet_name = url_params.get(SUBNET_NAME)
+   964                                           
+   965                                                   subnet_info = self.network_management_client.subnets.get(
+   966                                                       self.resource_group,
+   967                                                       network_name,
+   968                                                       subnet_name
+   969                                                   )
+   970                                                   if subnet_info:
+   971                                                       subnet_info.route_table = {
+   972                                                           'id': route_table_id
+   973                                                       }
+   974                                           
+   975                                                       result_create = self.network_management_client. \
+   976                                                           subnets.create_or_update(
+   977                                                            self.resource_group,
+   978                                                            network_name,
+   979                                                            subnet_name,
+   980                                                            subnet_info)
+   981                                                       subnet_info = result_create.result()
+   982                                           
+   983                                                   return subnet_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: detach_subnet_to_route_table at line 985
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   985                                               @profile
+   986                                               def detach_subnet_to_route_table(self, subnet_id, route_table_id):
+   987                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   988                                                                                        subnet_id)
+   989                                                   network_name = url_params.get(NETWORK_NAME)
+   990                                                   subnet_name = url_params.get(SUBNET_NAME)
+   991                                           
+   992                                                   subnet_info = self.network_management_client.subnets.get(
+   993                                                       self.resource_group,
+   994                                                       network_name,
+   995                                                       subnet_name
+   996                                                   )
+   997                                           
+   998                                                   if subnet_info and subnet_info.route_table.id == route_table_id:
+   999                                                       subnet_info.route_table = None
+  1000                                           
+  1001                                                       result_create = self.network_management_client. \
+  1002                                                           subnets.create_or_update(
+  1003                                                            self.resource_group,
+  1004                                                            network_name,
+  1005                                                            subnet_name,
+  1006                                                            subnet_info)
+  1007                                                       subnet_info = result_create.result()
+  1008                                           
+  1009                                                   return subnet_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_route_tables at line 1011
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1011                                               @profile
+  1012                                               def list_route_tables(self):
+  1013                                                   return self.network_management_client. \
+  1014                                                       route_tables.list(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_route_table at line 1016
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1016                                               @profile
+  1017                                               def get_route_table(self, router_id):
+  1018                                                   url_params = azure_helpers.parse_url(ROUTER_RESOURCE_ID,
+  1019                                                                                        router_id)
+  1020                                                   router_name = url_params.get(ROUTER_NAME)
+  1021                                                   return self.network_management_client. \
+  1022                                                       route_tables.get(self.resource_group, router_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_route_table at line 1024
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1024                                               @profile
+  1025                                               def create_route_table(self, route_table_name, params):
+  1026                                                   return self.network_management_client. \
+  1027                                                       route_tables.create_or_update(
+  1028                                                        self.resource_group,
+  1029                                                        route_table_name, params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_route_table_tags at line 1031
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1031                                               @profile
+  1032                                               def update_route_table_tags(self, route_table_name, tags):
+  1033                                                   self.network_management_client.route_tables. \
+  1034                                                       create_or_update(self.resource_group,
+  1035                                                                        route_table_name, tags).result()
+

+ 1470 - 0
results/vm_types.res

@@ -0,0 +1,1470 @@
+cloudbridge.test.test_vm_types_service.CloudVMTypesServiceTestCase
+
+
+Test output
+ ..
+----------------------------------------------------------------------
+Ran 2 tests in 40.693s
+
+OK
+
+Wrote profile results to run_tests.py.lprof
+Timer unit: 1e-06 s
+
+Total time: 0.601946 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: __init__ at line 160
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   160                                               @profile
+   161                                               def __init__(self, config):
+   162         2         10.0      5.0      0.0          self._config = config
+   163         2          7.0      3.5      0.0          self.subscription_id = str(config.get('azure_subscription_id'))
+   164         2          2.0      1.0      0.0          self._credentials = ServicePrincipalCredentials(
+   165         2          3.0      1.5      0.0              client_id=config.get('azure_client_id'),
+   166         2          1.0      0.5      0.0              secret=config.get('azure_secret'),
+   167         2     601876.0 300938.0    100.0              tenant=config.get('azure_tenant')
+   168                                                   )
+   169                                           
+   170         2          5.0      2.5      0.0          self._access_token = config.get('azure_access_token')
+   171         2          3.0      1.5      0.0          self._resource_client = None
+   172         2          2.0      1.0      0.0          self._storage_client = None
+   173         2          2.0      1.0      0.0          self._network_management_client = None
+   174         2          2.0      1.0      0.0          self._subscription_client = None
+   175         2          2.0      1.0      0.0          self._compute_client = None
+   176         2          2.0      1.0      0.0          self._access_key_result = None
+   177         2          3.0      1.5      0.0          self._block_blob_service = None
+   178         2          2.0      1.0      0.0          self._table_service = None
+   179         2          2.0      1.0      0.0          self._storage_account = None
+   180                                           
+   181         2         22.0     11.0      0.0          log.debug("azure subscription : %s", self.subscription_id)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: access_key_result at line 183
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   183                                               @property
+   184                                               @tenacity.retry(stop=tenacity.stop_after_attempt(5), reraise=True)
+   185                                               @profile
+   186                                               def access_key_result(self):
+   187                                                   if not self._access_key_result:
+   188                                                       storage_account = self.storage_account
+   189                                           
+   190                                                       if self.get_storage_account(storage_account).\
+   191                                                               provisioning_state.value != 'Succeeded':
+   192                                                           log.debug(
+   193                                                               "Storage account %s is not in Succeeded state yet. ",
+   194                                                               storage_account)
+   195                                                           raise WaitStateException(
+   196                                                               "Waited too long for storage account: {0} to "
+   197                                                               "become ready.".format(
+   198                                                                   storage_account,
+   199                                                                   self.get_storage_account(storage_account).
+   200                                                                   provisioning_state))
+   201                                           
+   202                                                       self._access_key_result = self.storage_client.storage_accounts. \
+   203                                                           list_keys(self.resource_group, storage_account)
+   204                                                   return self._access_key_result
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: resource_group at line 206
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   206                                               @property
+   207                                               @profile
+   208                                               def resource_group(self):
+   209                                                   return self._config.get('azure_resource_group')
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: storage_account at line 211
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   211                                               @property
+   212                                               @profile
+   213                                               def storage_account(self):
+   214                                                   return self._config.get('azure_storage_account')
+
+Total time: 6e-05 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: region_name at line 216
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   216                                               @property
+   217                                               @profile
+   218                                               def region_name(self):
+   219        48         60.0      1.2    100.0          return self._config.get('azure_region_name')
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: public_key_storage_table_name at line 221
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   221                                               @property
+   222                                               @profile
+   223                                               def public_key_storage_table_name(self):
+   224                                                   return self._config.get('azure_public_key_storage_table_name')
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: storage_client at line 226
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   226                                               @property
+   227                                               @profile
+   228                                               def storage_client(self):
+   229                                                   if not self._storage_client:
+   230                                                       self._storage_client = \
+   231                                                           StorageManagementClient(self._credentials,
+   232                                                                                   self.subscription_id)
+   233                                                   return self._storage_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: subscription_client at line 235
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   235                                               @property
+   236                                               @profile
+   237                                               def subscription_client(self):
+   238                                                   if not self._subscription_client:
+   239                                                       self._subscription_client = SubscriptionClient(self._credentials)
+   240                                                   return self._subscription_client
+
+Total time: 0.03009 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: resource_client at line 242
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   242                                               @property
+   243                                               @profile
+   244                                               def resource_client(self):
+   245         2          1.0      0.5      0.0          if not self._resource_client:
+   246                                                       self._resource_client = \
+   247         2          5.0      2.5      0.0                  ResourceManagementClient(self._credentials,
+   248         2      30077.0  15038.5    100.0                                           self.subscription_id)
+   249         2          7.0      3.5      0.0          return self._resource_client
+
+Total time: 0.015064 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: compute_client at line 251
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   251                                               @property
+   252                                               @profile
+   253                                               def compute_client(self):
+   254        48         44.0      0.9      0.3          if not self._compute_client:
+   255                                                       self._compute_client = \
+   256         2          2.0      1.0      0.0                  ComputeManagementClient(self._credentials,
+   257         2      14977.0   7488.5     99.4                                          self.subscription_id)
+   258        48         41.0      0.9      0.3          return self._compute_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: network_management_client at line 260
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   260                                               @property
+   261                                               @profile
+   262                                               def network_management_client(self):
+   263                                                   if not self._network_management_client:
+   264                                                       self._network_management_client = NetworkManagementClient(
+   265                                                           self._credentials, self.subscription_id)
+   266                                                   return self._network_management_client
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: blob_service at line 268
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   268                                               @property
+   269                                               @profile
+   270                                               def blob_service(self):
+   271                                                   self._get_or_create_storage_account()
+   272                                                   if not self._block_blob_service:
+   273                                                       if self._access_token:
+   274                                                           token_credential = TokenCredential(self._access_token)
+   275                                                           self._block_blob_service = BlockBlobService(
+   276                                                               account_name=self.storage_account,
+   277                                                               token_credential=token_credential)
+   278                                                       else:
+   279                                                           self._block_blob_service = BlockBlobService(
+   280                                                               account_name=self.storage_account,
+   281                                                               account_key=self.access_key_result.keys[0].value)
+   282                                                   return self._block_blob_service
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: table_service at line 284
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   284                                               @property
+   285                                               @profile
+   286                                               def table_service(self):
+   287                                                   self._get_or_create_storage_account()
+   288                                                   if not self._table_service:
+   289                                                       self._table_service = TableService(
+   290                                                           self.storage_account,
+   291                                                           self.access_key_result.keys[0].value)
+   292                                                   if not self._table_service. \
+   293                                                           exists(table_name=self.public_key_storage_table_name):
+   294                                                       self._table_service.create_table(
+   295                                                           self.public_key_storage_table_name)
+   296                                                   return self._table_service
+
+Total time: 1.61388 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_resource_group at line 298
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   298                                               @profile
+   299                                               def get_resource_group(self, name):
+   300         2    1613879.0 806939.5    100.0          return self.resource_client.resource_groups.get(name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_resource_group at line 302
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   302                                               @profile
+   303                                               def create_resource_group(self, name, parameters):
+   304                                                   return self.resource_client.resource_groups. \
+   305                                                       create_or_update(name, parameters)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_storage_account at line 307
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   307                                               @profile
+   308                                               def get_storage_account(self, storage_account):
+   309                                                   return self.storage_client.storage_accounts. \
+   310                                                       get_properties(self.resource_group, storage_account)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_storage_account at line 312
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   312                                               @profile
+   313                                               def create_storage_account(self, name, params):
+   314                                                   return self.storage_client.storage_accounts. \
+   315                                                       create(self.resource_group, name.lower(), params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: _get_or_create_storage_account at line 319
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   319                                               @tenacity.retry(stop=tenacity.stop_after_attempt(2),
+   320                                                               retry=tenacity.retry_if_exception_type(CloudError),
+   321                                                               reraise=True)
+   322                                               @profile
+   323                                               def _get_or_create_storage_account(self):
+   324                                                   if self._storage_account:
+   325                                                       return self._storage_account
+   326                                                   else:
+   327                                                       try:
+   328                                                           self._storage_account = \
+   329                                                               self.get_storage_account(self.storage_account)
+   330                                                       except CloudError as cloud_error:
+   331                                                           if cloud_error.error.error == "ResourceNotFound":
+   332                                                               storage_account_params = {
+   333                                                                   'sku': {
+   334                                                                       'name': 'Standard_LRS'
+   335                                                                   },
+   336                                                                   'kind': 'storage',
+   337                                                                   'location': self.region_name,
+   338                                                               }
+   339                                                               try:
+   340                                                                   self._storage_account = \
+   341                                                                       self.create_storage_account(self.storage_account,
+   342                                                                                                   storage_account_params)
+   343                                                               except CloudError as cloud_error2:  # pragma: no cover
+   344                                                                   if cloud_error2.error.error == "AuthorizationFailed":
+   345                                                                       mess = 'The following error was returned by ' \
+   346                                                                              'Azure:\n%s\n\nThis is likely because the' \
+   347                                                                              ' Role associated with the provided ' \
+   348                                                                              'credentials does not allow for Storage ' \
+   349                                                                              'Account creation.\nA Storage Account is ' \
+   350                                                                              'necessary in order to perform the ' \
+   351                                                                              'desired operation. You must either ' \
+   352                                                                              'provide an existing Storage Account name' \
+   353                                                                              ' as part of the configuration, or ' \
+   354                                                                              'elevate the associated Role.\nFor more ' \
+   355                                                                              'information on roles, see: https://docs.' \
+   356                                                                              'microsoft.com/en-us/azure/role-based-' \
+   357                                                                              'access-control/overview\n' % cloud_error2
+   358                                                                       raise ProviderConnectionException(mess)
+   359                                           
+   360                                                                   elif cloud_error2.error.error == \
+   361                                                                           "StorageAccountAlreadyTaken":
+   362                                                                       mess = 'The following error was ' \
+   363                                                                              'returned by Azure:\n%s\n\n' \
+   364                                                                              'Note that Storage Account names must be ' \
+   365                                                                              'unique across Azure (not just in your ' \
+   366                                                                              'subscription).\nFor more information ' \
+   367                                                                              'see https://docs.microsoft.com/en-us/' \
+   368                                                                              'azure/azure-resource-manager/resource-' \
+   369                                                                              'manager-storage-account-name-errors\n' \
+   370                                                                              % cloud_error2
+   371                                                                       raise InvalidLabelException(mess)
+   372                                                                   else:
+   373                                                                       raise cloud_error2
+   374                                                           else:
+   375                                                               raise cloud_error
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_locations at line 377
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   377                                               @profile
+   378                                               def list_locations(self):
+   379                                                   return self.subscription_client.subscriptions. \
+   380                                                       list_locations(self.subscription_id)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm_firewall at line 382
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   382                                               @profile
+   383                                               def list_vm_firewall(self):
+   384                                                   return self.network_management_client.network_security_groups. \
+   385                                                       list(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm_firewall at line 387
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   387                                               @profile
+   388                                               def create_vm_firewall(self, name, parameters):
+   389                                                   return self.network_management_client.network_security_groups. \
+   390                                                       create_or_update(self.resource_group, name,
+   391                                                                        parameters).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm_firewall_tags at line 393
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   393                                               @profile
+   394                                               def update_vm_firewall_tags(self, fw_id, tags):
+   395                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   396                                                                                        fw_id)
+   397                                                   name = url_params.get(VM_FIREWALL_NAME)
+   398                                                   return self.network_management_client.network_security_groups. \
+   399                                                       create_or_update(self.resource_group, name,
+   400                                                                        {'tags': tags,
+   401                                                                         'location': self.region_name}).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_vm_firewall at line 403
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   403                                               @profile
+   404                                               def get_vm_firewall(self, fw_id):
+   405                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   406                                                                                        fw_id)
+   407                                                   fw_name = url_params.get(VM_FIREWALL_NAME)
+   408                                                   return self.network_management_client.network_security_groups. \
+   409                                                       get(self.resource_group, fw_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm_firewall at line 411
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   411                                               @profile
+   412                                               def delete_vm_firewall(self, fw_id):
+   413                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   414                                                                                        fw_id)
+   415                                                   name = url_params.get(VM_FIREWALL_NAME)
+   416                                                   self.network_management_client \
+   417                                                       .network_security_groups.delete(self.resource_group, name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm_firewall_rule at line 419
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   419                                               @profile
+   420                                               def create_vm_firewall_rule(self, fw_id,
+   421                                                                           rule_name, parameters):
+   422                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RESOURCE_ID,
+   423                                                                                        fw_id)
+   424                                                   vm_firewall_name = url_params.get(VM_FIREWALL_NAME)
+   425                                                   return self.network_management_client.security_rules. \
+   426                                                       create_or_update(self.resource_group, vm_firewall_name,
+   427                                                                        rule_name, parameters).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm_firewall_rule at line 429
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   429                                               @profile
+   430                                               def delete_vm_firewall_rule(self, fw_rule_id, vm_firewall):
+   431                                                   url_params = azure_helpers.parse_url(VM_FIREWALL_RULE_RESOURCE_ID,
+   432                                                                                        fw_rule_id)
+   433                                                   name = url_params.get(VM_FIREWALL_RULE_NAME)
+   434                                                   return self.network_management_client.security_rules. \
+   435                                                       delete(self.resource_group, vm_firewall, name).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_containers at line 437
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   437                                               @profile
+   438                                               def list_containers(self, prefix=None, limit=None, marker=None):
+   439                                                   results = self.blob_service.list_containers(prefix=prefix,
+   440                                                                                               num_results=limit,
+   441                                                                                               marker=marker)
+   442                                                   return (results.items, results.next_marker)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_container at line 444
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   444                                               @profile
+   445                                               def create_container(self, container_name):
+   446                                                   try:
+   447                                                       self.blob_service.create_container(container_name,
+   448                                                                                          fail_on_exist=True)
+   449                                                   except AzureConflictHttpError as cloud_error:
+   450                                                       if cloud_error.error_code == "ContainerAlreadyExists":
+   451                                                           msg = "The given Bucket name '%s' already exists. Please " \
+   452                                                                 "use the `get` or `find` method to get a reference to " \
+   453                                                                 "an existing Bucket, or specify a new Bucket name to " \
+   454                                                                 "create.\nNote that in Azure, Buckets are contained " \
+   455                                                                 "in Storage Accounts." % container_name
+   456                                                           raise DuplicateResourceException(msg)
+   457                                           
+   458                                                   return self.blob_service.get_container_properties(container_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_container at line 460
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   460                                               @profile
+   461                                               def get_container(self, container_name):
+   462                                                   return self.blob_service.get_container_properties(container_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_container at line 464
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   464                                               @profile
+   465                                               def delete_container(self, container_name):
+   466                                                   self.blob_service.delete_container(container_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_blobs at line 468
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   468                                               @profile
+   469                                               def list_blobs(self, container_name, prefix=None):
+   470                                                   return self.blob_service.list_blobs(container_name, prefix=prefix)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob at line 472
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   472                                               @profile
+   473                                               def get_blob(self, container_name, blob_name):
+   474                                                   return self.blob_service.get_blob_properties(container_name, blob_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_blob_from_text at line 476
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   476                                               @profile
+   477                                               def create_blob_from_text(self, container_name, blob_name, text):
+   478                                                   self.blob_service.create_blob_from_text(container_name,
+   479                                                                                           blob_name, text)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_blob_from_file at line 481
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   481                                               @profile
+   482                                               def create_blob_from_file(self, container_name, blob_name, file_path):
+   483                                                   self.blob_service.create_blob_from_path(container_name,
+   484                                                                                           blob_name, file_path)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_blob at line 486
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   486                                               @profile
+   487                                               def delete_blob(self, container_name, blob_name):
+   488                                                   self.blob_service.delete_blob(container_name, blob_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob_url at line 490
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   490                                               @profile
+   491                                               def get_blob_url(self, container_name, blob_name, expiry_time):
+   492                                                   expiry_date = datetime.datetime.utcnow() + datetime.timedelta(
+   493                                                       seconds=expiry_time)
+   494                                                   sas = self.blob_service.generate_blob_shared_access_signature(
+   495                                                       container_name, blob_name, permission=BlobPermissions.READ,
+   496                                                       expiry=expiry_date)
+   497                                                   return self.blob_service.make_blob_url(container_name, blob_name,
+   498                                                                                          sas_token=sas)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_blob_content at line 500
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   500                                               @profile
+   501                                               def get_blob_content(self, container_name, blob_name):
+   502                                                   out_stream = BytesIO()
+   503                                                   self.blob_service.get_blob_to_stream(container_name,
+   504                                                                                        blob_name, out_stream)
+   505                                                   return out_stream
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_empty_disk at line 507
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   507                                               @profile
+   508                                               def create_empty_disk(self, disk_name, params):
+   509                                                   return self.compute_client.disks.create_or_update(
+   510                                                       self.resource_group,
+   511                                                       disk_name,
+   512                                                       params
+   513                                                   ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_snapshot_disk at line 515
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   515                                               @profile
+   516                                               def create_snapshot_disk(self, disk_name, params):
+   517                                                   return self.compute_client.disks.create_or_update(
+   518                                                       self.resource_group,
+   519                                                       disk_name,
+   520                                                       params
+   521                                                   ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_disk at line 523
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   523                                               @profile
+   524                                               def get_disk(self, disk_id):
+   525                                                   url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   526                                                                                        disk_id)
+   527                                                   disk_name = url_params.get(VOLUME_NAME)
+   528                                                   return self.compute_client.disks.get(self.resource_group, disk_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_disks at line 530
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   530                                               @profile
+   531                                               def list_disks(self):
+   532                                                   return self.compute_client.disks. \
+   533                                                       list_by_resource_group(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_disk at line 535
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   535                                               @profile
+   536                                               def delete_disk(self, disk_id):
+   537                                                   url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   538                                                                                        disk_id)
+   539                                                   disk_name = url_params.get(VOLUME_NAME)
+   540                                                   self.compute_client.disks.delete(self.resource_group, disk_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_disk_tags at line 542
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   542                                               @profile
+   543                                               def update_disk_tags(self, disk_id, tags):
+   544                                                   url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+   545                                                                                        disk_id)
+   546                                                   disk_name = url_params.get(VOLUME_NAME)
+   547                                                   return self.compute_client.disks.update(
+   548                                                       self.resource_group,
+   549                                                       disk_name,
+   550                                                       {'tags': tags},
+   551                                                       raw=True
+   552                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_snapshots at line 554
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   554                                               @profile
+   555                                               def list_snapshots(self):
+   556                                                   return self.compute_client.snapshots. \
+   557                                                       list_by_resource_group(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_snapshot at line 559
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   559                                               @profile
+   560                                               def get_snapshot(self, snapshot_id):
+   561                                                   url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   562                                                                                        snapshot_id)
+   563                                                   snapshot_name = url_params.get(SNAPSHOT_NAME)
+   564                                                   return self.compute_client.snapshots.get(self.resource_group,
+   565                                                                                            snapshot_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_snapshot at line 567
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   567                                               @profile
+   568                                               def create_snapshot(self, snapshot_name, params):
+   569                                                   return self.compute_client.snapshots.create_or_update(
+   570                                                       self.resource_group,
+   571                                                       snapshot_name,
+   572                                                       params
+   573                                                   ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_snapshot at line 575
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   575                                               @profile
+   576                                               def delete_snapshot(self, snapshot_id):
+   577                                                   url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   578                                                                                        snapshot_id)
+   579                                                   snapshot_name = url_params.get(SNAPSHOT_NAME)
+   580                                                   self.compute_client.snapshots.delete(self.resource_group,
+   581                                                                                        snapshot_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_snapshot_tags at line 583
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   583                                               @profile
+   584                                               def update_snapshot_tags(self, snapshot_id, tags):
+   585                                                   url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+   586                                                                                        snapshot_id)
+   587                                                   snapshot_name = url_params.get(SNAPSHOT_NAME)
+   588                                                   return self.compute_client.snapshots.update(
+   589                                                       self.resource_group,
+   590                                                       snapshot_name,
+   591                                                       {'tags': tags},
+   592                                                       raw=True
+   593                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: is_gallery_image at line 595
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   595                                               @profile
+   596                                               def is_gallery_image(self, image_id):
+   597                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   598                                                                                        image_id)
+   599                                                   # If it is a gallery image, it will always have an offer
+   600                                                   return 'offer' in url_params
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_image at line 602
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   602                                               @profile
+   603                                               def create_image(self, name, params):
+   604                                                   return self.compute_client.images. \
+   605                                                       create_or_update(self.resource_group, name,
+   606                                                                        params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_image at line 608
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   608                                               @profile
+   609                                               def delete_image(self, image_id):
+   610                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   611                                                                                        image_id)
+   612                                                   if not self.is_gallery_image(image_id):
+   613                                                       name = url_params.get(IMAGE_NAME)
+   614                                                       self.compute_client.images.delete(self.resource_group, name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_images at line 616
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   616                                               @profile
+   617                                               def list_images(self):
+   618                                                   azure_images = list(self.compute_client.images.
+   619                                                                       list_by_resource_group(self.resource_group))
+   620                                                   return azure_images
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_gallery_refs at line 622
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   622                                               @profile
+   623                                               def list_gallery_refs(self):
+   624                                                   return gallery_image_references
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_image at line 626
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   626                                               @profile
+   627                                               def get_image(self, image_id):
+   628                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   629                                                                                        image_id)
+   630                                                   if self.is_gallery_image(image_id):
+   631                                                       return GalleryImageReference(publisher=url_params['publisher'],
+   632                                                                                    offer=url_params['offer'],
+   633                                                                                    sku=url_params['sku'],
+   634                                                                                    version=url_params['version'])
+   635                                                   else:
+   636                                                       name = url_params.get(IMAGE_NAME)
+   637                                                       return self.compute_client.images.get(self.resource_group, name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_image_tags at line 639
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   639                                               @profile
+   640                                               def update_image_tags(self, image_id, tags):
+   641                                                   url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+   642                                                                                        image_id)
+   643                                                   if self.is_gallery_image(image_id):
+   644                                                       return True
+   645                                                   else:
+   646                                                       name = url_params.get(IMAGE_NAME)
+   647                                                       return self.compute_client.images. \
+   648                                                           create_or_update(self.resource_group, name,
+   649                                                                            {
+   650                                                                                'tags': tags,
+   651                                                                                'location': self.region_name
+   652                                                                            }).result()
+
+Total time: 0.038587 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm_types at line 654
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   654                                               @profile
+   655                                               def list_vm_types(self):
+   656        48      36514.0    760.7     94.6          return self.compute_client.virtual_machine_sizes. \
+   657        48       2073.0     43.2      5.4              list(self.region_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_networks at line 659
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   659                                               @profile
+   660                                               def list_networks(self):
+   661                                                   return self.network_management_client.virtual_networks.list(
+   662                                                       self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_network at line 664
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   664                                               @profile
+   665                                               def get_network(self, network_id):
+   666                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID,
+   667                                                                                        network_id)
+   668                                                   network_name = url_params.get(NETWORK_NAME)
+   669                                                   return self.network_management_client.virtual_networks.get(
+   670                                                       self.resource_group, network_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_network at line 672
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   672                                               @profile
+   673                                               def create_network(self, name, params):
+   674                                                   return self.network_management_client.virtual_networks. \
+   675                                                       create_or_update(self.resource_group,
+   676                                                                        name,
+   677                                                                        parameters=params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_network at line 679
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   679                                               @profile
+   680                                               def delete_network(self, network_id):
+   681                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   682                                                   network_name = url_params.get(NETWORK_NAME)
+   683                                                   return self.network_management_client.virtual_networks. \
+   684                                                       delete(self.resource_group, network_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_network_tags at line 686
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   686                                               @profile
+   687                                               def update_network_tags(self, network_id, tags):
+   688                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   689                                                   network_name = url_params.get(NETWORK_NAME)
+   690                                                   return self.network_management_client.virtual_networks. \
+   691                                                       create_or_update(self.resource_group,
+   692                                                                        network_name, tags).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_network_id_for_subnet at line 694
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   694                                               @profile
+   695                                               def get_network_id_for_subnet(self, subnet_id):
+   696                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID, subnet_id)
+   697                                                   network_id = NETWORK_RESOURCE_ID[0]
+   698                                                   for key, val in url_params.items():
+   699                                                       network_id = network_id.replace("{" + key + "}", val)
+   700                                                   return network_id
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_subnets at line 702
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   702                                               @profile
+   703                                               def list_subnets(self, network_id):
+   704                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   705                                                   network_name = url_params.get(NETWORK_NAME)
+   706                                                   return self.network_management_client.subnets. \
+   707                                                       list(self.resource_group, network_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_subnet at line 709
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   709                                               @profile
+   710                                               def get_subnet(self, subnet_id):
+   711                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   712                                                                                        subnet_id)
+   713                                                   network_name = url_params.get(NETWORK_NAME)
+   714                                                   subnet_name = url_params.get(SUBNET_NAME)
+   715                                                   return self.network_management_client.subnets. \
+   716                                                       get(self.resource_group, network_name, subnet_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_subnet at line 718
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   718                                               @profile
+   719                                               def create_subnet(self, network_id, subnet_name, params):
+   720                                                   url_params = azure_helpers.parse_url(NETWORK_RESOURCE_ID, network_id)
+   721                                                   network_name = url_params.get(NETWORK_NAME)
+   722                                                   result_create = self.network_management_client \
+   723                                                       .subnets.create_or_update(
+   724                                                           self.resource_group,
+   725                                                           network_name,
+   726                                                           subnet_name,
+   727                                                           params
+   728                                                       )
+   729                                                   subnet_info = result_create.result()
+   730                                           
+   731                                                   return subnet_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: __if_subnet_in_use at line 733
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   733                                               @profile
+   734                                               def __if_subnet_in_use(e):
+   735                                                   # return True if the CloudError exception is due to subnet being in use
+   736                                                   if isinstance(e, CloudError):
+   737                                                       if e.error.error == "InUseSubnetCannotBeDeleted":
+   738                                                           return True
+   739                                                   return False
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_subnet at line 741
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   741                                               @tenacity.retry(stop=tenacity.stop_after_attempt(5),
+   742                                                               retry=tenacity.retry_if_exception(__if_subnet_in_use),
+   743                                                               wait=tenacity.wait_fixed(5),
+   744                                                               reraise=True)
+   745                                               @profile
+   746                                               def delete_subnet(self, subnet_id):
+   747                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   748                                                                                        subnet_id)
+   749                                                   network_name = url_params.get(NETWORK_NAME)
+   750                                                   subnet_name = url_params.get(SUBNET_NAME)
+   751                                           
+   752                                                   try:
+   753                                                       result_delete = self.network_management_client \
+   754                                                           .subnets.delete(
+   755                                                               self.resource_group,
+   756                                                               network_name,
+   757                                                               subnet_name
+   758                                                           )
+   759                                                       result_delete.wait()
+   760                                                   except CloudError as cloud_error:
+   761                                                       log.exception(cloud_error.message)
+   762                                                       raise cloud_error
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_floating_ip at line 764
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   764                                               @profile
+   765                                               def create_floating_ip(self, public_ip_name, public_ip_parameters):
+   766                                                   return self.network_management_client.public_ip_addresses. \
+   767                                                       create_or_update(self.resource_group,
+   768                                                                        public_ip_name,
+   769                                                                        public_ip_parameters).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_floating_ip at line 771
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   771                                               @profile
+   772                                               def get_floating_ip(self, public_ip_id):
+   773                                                   url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   774                                                                                        public_ip_id)
+   775                                                   public_ip_name = url_params.get(PUBLIC_IP_NAME)
+   776                                                   return self.network_management_client. \
+   777                                                       public_ip_addresses.get(self.resource_group, public_ip_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_floating_ip at line 779
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   779                                               @profile
+   780                                               def delete_floating_ip(self, public_ip_id):
+   781                                                   url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   782                                                                                        public_ip_id)
+   783                                                   public_ip_name = url_params.get(PUBLIC_IP_NAME)
+   784                                                   self.network_management_client. \
+   785                                                       public_ip_addresses.delete(self.resource_group,
+   786                                                                                  public_ip_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_fip_tags at line 788
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   788                                               @profile
+   789                                               def update_fip_tags(self, fip_id, tags):
+   790                                                   url_params = azure_helpers.parse_url(PUBLIC_IP_RESOURCE_ID,
+   791                                                                                        fip_id)
+   792                                                   fip_name = url_params.get(PUBLIC_IP_NAME)
+   793                                                   self.network_management_client.public_ip_addresses. \
+   794                                                       create_or_update(self.resource_group,
+   795                                                                        fip_name, tags).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_floating_ips at line 797
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   797                                               @profile
+   798                                               def list_floating_ips(self):
+   799                                                   return self.network_management_client.public_ip_addresses.list(
+   800                                                       self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_vm at line 802
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   802                                               @profile
+   803                                               def list_vm(self):
+   804                                                   return self.compute_client.virtual_machines.list(
+   805                                                       self.resource_group
+   806                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: restart_vm at line 808
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   808                                               @profile
+   809                                               def restart_vm(self, vm_id):
+   810                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   811                                                                                        vm_id)
+   812                                                   vm_name = url_params.get(VM_NAME)
+   813                                                   return self.compute_client.virtual_machines.restart(
+   814                                                       self.resource_group, vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_vm at line 816
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   816                                               @profile
+   817                                               def delete_vm(self, vm_id):
+   818                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   819                                                                                        vm_id)
+   820                                                   vm_name = url_params.get(VM_NAME)
+   821                                                   return self.compute_client.virtual_machines.delete(
+   822                                                       self.resource_group, vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_vm at line 824
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   824                                               @profile
+   825                                               def get_vm(self, vm_id):
+   826                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   827                                                                                        vm_id)
+   828                                                   vm_name = url_params.get(VM_NAME)
+   829                                                   return self.compute_client.virtual_machines.get(
+   830                                                       self.resource_group,
+   831                                                       vm_name,
+   832                                                       expand='instanceView'
+   833                                                   )
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_vm at line 835
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   835                                               @profile
+   836                                               def create_vm(self, vm_name, params):
+   837                                                   return self.compute_client.virtual_machines. \
+   838                                                       create_or_update(self.resource_group,
+   839                                                                        vm_name, params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm at line 841
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   841                                               @profile
+   842                                               def update_vm(self, vm_id, params):
+   843                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   844                                                                                        vm_id)
+   845                                                   vm_name = url_params.get(VM_NAME)
+   846                                                   return self.compute_client.virtual_machines. \
+   847                                                       create_or_update(self.resource_group,
+   848                                                                        vm_name, params, raw=True)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: deallocate_vm at line 850
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   850                                               @profile
+   851                                               def deallocate_vm(self, vm_id):
+   852                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   853                                                                                        vm_id)
+   854                                                   vm_name = url_params.get(VM_NAME)
+   855                                                   self.compute_client. \
+   856                                                       virtual_machines.deallocate(self.resource_group,
+   857                                                                                   vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: generalize_vm at line 859
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   859                                               @profile
+   860                                               def generalize_vm(self, vm_id):
+   861                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   862                                                                                        vm_id)
+   863                                                   vm_name = url_params.get(VM_NAME)
+   864                                                   self.compute_client.virtual_machines. \
+   865                                                       generalize(self.resource_group, vm_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: start_vm at line 867
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   867                                               @profile
+   868                                               def start_vm(self, vm_id):
+   869                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   870                                                                                        vm_id)
+   871                                                   vm_name = url_params.get(VM_NAME)
+   872                                                   self.compute_client.virtual_machines. \
+   873                                                       start(self.resource_group,
+   874                                                             vm_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_vm_tags at line 876
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   876                                               @profile
+   877                                               def update_vm_tags(self, vm_id, tags):
+   878                                                   url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+   879                                                                                        vm_id)
+   880                                                   vm_name = url_params.get(VM_NAME)
+   881                                                   self.compute_client.virtual_machines. \
+   882                                                       create_or_update(self.resource_group,
+   883                                                                        vm_name, tags).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_nic at line 885
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   885                                               @profile
+   886                                               def delete_nic(self, nic_id):
+   887                                                   nic_params = azure_helpers.\
+   888                                                       parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   889                                                   nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   890                                                   self.network_management_client. \
+   891                                                       network_interfaces.delete(self.resource_group,
+   892                                                                                 nic_name).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_nic at line 894
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   894                                               @profile
+   895                                               def get_nic(self, nic_id):
+   896                                                   nic_params = azure_helpers.\
+   897                                                       parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   898                                                   nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   899                                                   return self.network_management_client. \
+   900                                                       network_interfaces.get(self.resource_group, nic_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_nic at line 902
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   902                                               @profile
+   903                                               def update_nic(self, nic_id, params):
+   904                                                   nic_params = azure_helpers.\
+   905                                                       parse_url(NETWORK_INTERFACE_RESOURCE_ID, nic_id)
+   906                                                   nic_name = nic_params.get(NETWORK_INTERFACE_NAME)
+   907                                                   async_nic_creation = self.network_management_client. \
+   908                                                       network_interfaces.create_or_update(
+   909                                                           self.resource_group,
+   910                                                           nic_name,
+   911                                                           params
+   912                                                       )
+   913                                                   nic_info = async_nic_creation.result()
+   914                                                   return nic_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_nic at line 916
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   916                                               @profile
+   917                                               def create_nic(self, nic_name, params):
+   918                                                   return self.network_management_client. \
+   919                                                       network_interfaces.create_or_update(
+   920                                                           self.resource_group,
+   921                                                           nic_name,
+   922                                                           params
+   923                                                       ).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_public_key at line 925
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   925                                               @profile
+   926                                               def create_public_key(self, entity):
+   927                                                   return self.table_service. \
+   928                                                       insert_or_replace_entity(self.public_key_storage_table_name,
+   929                                                                                entity)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_public_key at line 931
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   931                                               @profile
+   932                                               def get_public_key(self, name):
+   933                                                   entities = self.table_service. \
+   934                                                       query_entities(self.public_key_storage_table_name,
+   935                                                                      "Name eq '{0}'".format(name), num_results=1)
+   936                                           
+   937                                                   return entities.items[0] if len(entities.items) > 0 else None
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_public_key at line 939
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   939                                               @profile
+   940                                               def delete_public_key(self, entity):
+   941                                                   self.table_service.delete_entity(self.public_key_storage_table_name,
+   942                                                                                    entity.PartitionKey, entity.RowKey)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_public_keys at line 944
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   944                                               @profile
+   945                                               def list_public_keys(self, partition_key, limit=None, marker=None):
+   946                                                   entities = self.table_service. \
+   947                                                       query_entities(self.public_key_storage_table_name,
+   948                                                                      "PartitionKey eq '{0}'".format(partition_key),
+   949                                                                      marker=marker, num_results=limit)
+   950                                                   return (entities.items, entities.next_marker)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: delete_route_table at line 952
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   952                                               @profile
+   953                                               def delete_route_table(self, route_table_name):
+   954                                                   self.network_management_client. \
+   955                                                       route_tables.delete(self.resource_group, route_table_name
+   956                                                                           ).wait()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: attach_subnet_to_route_table at line 958
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   958                                               @profile
+   959                                               def attach_subnet_to_route_table(self, subnet_id, route_table_id):
+   960                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   961                                                                                        subnet_id)
+   962                                                   network_name = url_params.get(NETWORK_NAME)
+   963                                                   subnet_name = url_params.get(SUBNET_NAME)
+   964                                           
+   965                                                   subnet_info = self.network_management_client.subnets.get(
+   966                                                       self.resource_group,
+   967                                                       network_name,
+   968                                                       subnet_name
+   969                                                   )
+   970                                                   if subnet_info:
+   971                                                       subnet_info.route_table = {
+   972                                                           'id': route_table_id
+   973                                                       }
+   974                                           
+   975                                                       result_create = self.network_management_client. \
+   976                                                           subnets.create_or_update(
+   977                                                            self.resource_group,
+   978                                                            network_name,
+   979                                                            subnet_name,
+   980                                                            subnet_info)
+   981                                                       subnet_info = result_create.result()
+   982                                           
+   983                                                   return subnet_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: detach_subnet_to_route_table at line 985
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+   985                                               @profile
+   986                                               def detach_subnet_to_route_table(self, subnet_id, route_table_id):
+   987                                                   url_params = azure_helpers.parse_url(SUBNET_RESOURCE_ID,
+   988                                                                                        subnet_id)
+   989                                                   network_name = url_params.get(NETWORK_NAME)
+   990                                                   subnet_name = url_params.get(SUBNET_NAME)
+   991                                           
+   992                                                   subnet_info = self.network_management_client.subnets.get(
+   993                                                       self.resource_group,
+   994                                                       network_name,
+   995                                                       subnet_name
+   996                                                   )
+   997                                           
+   998                                                   if subnet_info and subnet_info.route_table.id == route_table_id:
+   999                                                       subnet_info.route_table = None
+  1000                                           
+  1001                                                       result_create = self.network_management_client. \
+  1002                                                           subnets.create_or_update(
+  1003                                                            self.resource_group,
+  1004                                                            network_name,
+  1005                                                            subnet_name,
+  1006                                                            subnet_info)
+  1007                                                       subnet_info = result_create.result()
+  1008                                           
+  1009                                                   return subnet_info
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: list_route_tables at line 1011
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1011                                               @profile
+  1012                                               def list_route_tables(self):
+  1013                                                   return self.network_management_client. \
+  1014                                                       route_tables.list(self.resource_group)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: get_route_table at line 1016
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1016                                               @profile
+  1017                                               def get_route_table(self, router_id):
+  1018                                                   url_params = azure_helpers.parse_url(ROUTER_RESOURCE_ID,
+  1019                                                                                        router_id)
+  1020                                                   router_name = url_params.get(ROUTER_NAME)
+  1021                                                   return self.network_management_client. \
+  1022                                                       route_tables.get(self.resource_group, router_name)
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: create_route_table at line 1024
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1024                                               @profile
+  1025                                               def create_route_table(self, route_table_name, params):
+  1026                                                   return self.network_management_client. \
+  1027                                                       route_tables.create_or_update(
+  1028                                                        self.resource_group,
+  1029                                                        route_table_name, params).result()
+
+Total time: 0 s
+File: /Users/alex/Desktop/work/cb-profiled/cloudbridge/cloudbridge/cloud/providers/azure/azure_client.py
+Function: update_route_table_tags at line 1031
+
+Line #      Hits         Time  Per Hit   % Time  Line Contents
+==============================================================
+  1031                                               @profile
+  1032                                               def update_route_table_tags(self, route_table_name, tags):
+  1033                                                   self.network_management_client.route_tables. \
+  1034                                                       create_or_update(self.resource_group,
+  1035                                                                        route_table_name, tags).result()
+