Răsfoiți Sursa

Move azure resources to use resource id instead of name

Nuwan Goonasekera 8 ani în urmă
părinte
comite
29bac10c8c

+ 140 - 83
cloudbridge/cloud/providers/azure/azure_client.py

@@ -16,6 +16,9 @@ from . import helpers as azure_helpers
 
 
 log = logging.getLogger(__name__)
 log = logging.getLogger(__name__)
 
 
+IMAGE_RESOURCE_ID = '/subscriptions/{subscriptionId}/resourceGroups/' \
+                    '{resourceGroupName}/providers/Microsoft.Compute/' \
+                    'images/{imageName}'
 NETWORK_INTERFACE_RESOURCE_ID = '/subscriptions/{subscriptionId}/' \
 NETWORK_INTERFACE_RESOURCE_ID = '/subscriptions/{subscriptionId}/' \
                                 'resourceGroups/{resourceGroupName}' \
                                 'resourceGroups/{resourceGroupName}' \
                                 '/providers/Microsoft.Network/' \
                                 '/providers/Microsoft.Network/' \
@@ -23,15 +26,28 @@ NETWORK_INTERFACE_RESOURCE_ID = '/subscriptions/{subscriptionId}/' \
 PUBLIC_IP_RESOURCE_ID = '/subscriptions/{subscriptionId}/resourceGroups' \
 PUBLIC_IP_RESOURCE_ID = '/subscriptions/{subscriptionId}/resourceGroups' \
                         '/{resourceGroupName}/providers/Microsoft.Network' \
                         '/{resourceGroupName}/providers/Microsoft.Network' \
                         '/publicIPAddresses/{publicIpAddressName}'
                         '/publicIPAddresses/{publicIpAddressName}'
+SNAPSHOT_RESOURCE_ID = '/subscriptions/{subscriptionId}/resourceGroups/' \
+                       '{resourceGroupName}/providers/Microsoft.Compute/' \
+                       'snapshots/{snapshotName}'
+VM_RESOURCE_ID = '/subscriptions/{subscriptionId}/resourceGroups/' \
+                       '{resourceGroupName}/providers/Microsoft.Compute/' \
+                       'virtualMachines/{vmName}'
 VM_FIREWALL_RESOURCE_ID = '/subscriptions/{subscriptionId}/' \
 VM_FIREWALL_RESOURCE_ID = '/subscriptions/{subscriptionId}/' \
                              'resourceGroups/{resourceGroupName}/' \
                              'resourceGroups/{resourceGroupName}/' \
                              'providers/Microsoft.Network/' \
                              'providers/Microsoft.Network/' \
                              'networkSecurityGroups/' \
                              'networkSecurityGroups/' \
                              '{networkSecurityGroupName}'
                              '{networkSecurityGroupName}'
+VOLUME_RESOURCE_ID = '/subscriptions/{subscriptionId}/resourceGroups/' \
+                     '{resourceGroupName}/providers/Microsoft.Compute/' \
+                     'disks/{diskName}'
 
 
+IMAGE_NAME = 'imageName'
 NETWORK_INTERFACE_NAME = 'networkInterfaceName'
 NETWORK_INTERFACE_NAME = 'networkInterfaceName'
 PUBLIC_IP_NAME = 'publicIpAddressName'
 PUBLIC_IP_NAME = 'publicIpAddressName'
+SNAPSHOT_NAME = 'snapshotName'
+VM_NAME = 'vmName'
 VM_FIREWALL_NAME = 'networkSecurityGroupName'
 VM_FIREWALL_NAME = 'networkSecurityGroupName'
+VOLUME_NAME = 'diskName'
 
 
 
 
 class AzureClient(object):
 class AzureClient(object):
@@ -256,11 +272,26 @@ class AzureClient(object):
             raw=True
             raw=True
         )
         )
 
 
-    def list_snapshots(self):
-        return self.compute_client.snapshots. \
+    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)
+
+    def list_disks(self):
+        return self.compute_client.disks. \
             list_by_resource_group(self.resource_group)
             list_by_resource_group(self.resource_group)
 
 
-    def update_disk_tags(self, disk_name, tags):
+    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()
+
+    def update_disk_tags(self, disk_id, tags):
+        url_params = azure_helpers.parse_url(VOLUME_RESOURCE_ID,
+                                             disk_id)
+        disk_name = url_params.get(VOLUME_NAME)
         return self.compute_client.disks.update(
         return self.compute_client.disks.update(
             self.resource_group,
             self.resource_group,
             disk_name,
             disk_name,
@@ -268,9 +299,78 @@ class AzureClient(object):
             raw=True
             raw=True
         )
         )
 
 
-    def get_disk(self, disk_name):
-        return self.compute_client.disks. \
-            get(self.resource_group, disk_name)
+    def list_snapshots(self):
+        return self.compute_client.snapshots. \
+            list_by_resource_group(self.resource_group)
+
+    def get_snapshot(self, snapshot_id):
+        url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+                                             snapshot_id)
+        snapshot_name = url_params.get(SNAPSHOT_NAME)
+        return self.compute_client.snapshots.get(self.resource_group,
+                                                 snapshot_name)
+
+    def create_snapshot(self, snapshot_name, params):
+        return self.compute_client.snapshots.create_or_update(
+            self.resource_group,
+            snapshot_name,
+            params,
+            raw=True
+        )
+
+    def delete_snapshot(self, snapshot_id):
+        url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+                                             snapshot_id)
+        snapshot_name = url_params.get(SNAPSHOT_NAME)
+        self.compute_client.snapshots.delete(self.resource_group,
+                                             snapshot_name).wait()
+
+    def update_snapshot_tags(self, snapshot_id, tags):
+        url_params = azure_helpers.parse_url(SNAPSHOT_RESOURCE_ID,
+                                             snapshot_id)
+        snapshot_name = url_params.get(SNAPSHOT_NAME)
+        return self.compute_client.snapshots.update(
+            self.resource_group,
+            snapshot_name,
+            {'tags': tags},
+            raw=True
+        )
+
+    def create_image(self, name, params):
+        return self.compute_client.images. \
+            create_or_update(self.resource_group, name,
+                             params, raw=True)
+
+    def delete_image(self, image_id):
+        url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+                                             image_id)
+        name = url_params.get(IMAGE_NAME)
+        self.compute_client.images.delete(self.resource_group, name).wait()
+
+    def list_images(self):
+        return self.compute_client.images. \
+            list_by_resource_group(self.resource_group)
+
+    def get_image(self, image_id):
+        url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+                                             image_id)
+        name = url_params.get(IMAGE_NAME)
+        return self.compute_client.images.get(self.resource_group, name)
+
+    def update_image_tags(self, image_id, tags):
+        url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
+                                             image_id)
+        name = url_params.get(IMAGE_NAME)
+        return self.compute_client.images. \
+            create_or_update(self.resource_group, name,
+                             {
+                                 'tags': tags,
+                                 'location': self.region_name
+                             }).result()
+
+    def list_vm_types(self):
+        return self.compute_client.virtual_machine_sizes. \
+            list(self.region_name)
 
 
     def list_networks(self):
     def list_networks(self):
         return self.network_management_client.virtual_networks.list(
         return self.network_management_client.virtual_networks.list(
@@ -321,69 +421,6 @@ class AzureClient(object):
             create_or_update(self.resource_group,
             create_or_update(self.resource_group,
                              network_name, tags).result()
                              network_name, tags).result()
 
 
-    def list_disks(self):
-        return self.compute_client.disks. \
-            list_by_resource_group(self.resource_group)
-
-    def delete_disk(self, disk_name):
-        async_deletion = self.compute_client.disks. \
-            delete(self.resource_group, disk_name)
-        async_deletion.wait()
-
-    def get_snapshot(self, snapshot_name):
-        return self.compute_client.snapshots.get(self.resource_group,
-                                                 snapshot_name)
-
-    def create_snapshot(self, snapshot_name, params):
-        return self.compute_client.snapshots.create_or_update(
-            self.resource_group,
-            snapshot_name,
-            params,
-            raw=True
-        )
-
-    def delete_snapshot(self, snapshot_name):
-        async_delete = self.compute_client.snapshots. \
-            delete(self.resource_group, snapshot_name)
-        async_delete.wait()
-
-    def update_snapshot_tags(self, snapshot_name, tags):
-        return self.compute_client.snapshots.update(
-            self.resource_group,
-            snapshot_name,
-            {'tags': tags},
-            raw=True
-        )
-
-    def create_image(self, name, params):
-        return self.compute_client.images. \
-            create_or_update(self.resource_group, name,
-                             params, raw=True)
-
-    def delete_image(self, name):
-        self.compute_client.images. \
-            delete(self.resource_group, name).wait()
-
-    def list_images(self):
-        return self.compute_client.images. \
-            list_by_resource_group(self.resource_group)
-
-    def get_image(self, image_name):
-        return self.compute_client.images. \
-            get(self.resource_group, image_name)
-
-    def update_image_tags(self, name, tags):
-        return self.compute_client.images. \
-            create_or_update(self.resource_group, name,
-                             {
-                                 'tags': tags,
-                                 'location': self.region_name
-                             }).result()
-
-    def list_vm_types(self):
-        return self.compute_client.virtual_machine_sizes. \
-            list(self.region_name)
-
     def list_subnets(self, network_name):
     def list_subnets(self, network_name):
         return self.network_management_client.subnets. \
         return self.network_management_client.subnets. \
             list(self.resource_group, network_name)
             list(self.resource_group, network_name)
@@ -419,19 +456,24 @@ class AzureClient(object):
             self.resource_group
             self.resource_group
         )
         )
 
 
-    def restart_vm(self, vm_name):
+    def restart_vm(self, vm_id):
+        url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+                                             vm_id)
+        vm_name = url_params.get(VM_NAME)
         return self.compute_client.virtual_machines.restart(
         return self.compute_client.virtual_machines.restart(
-            self.resource_group,
-            vm_name
-        ).wait()
+            self.resource_group, vm_name).wait()
 
 
-    def delete_vm(self, vm_name):
+    def delete_vm(self, vm_id):
+        url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+                                             vm_id)
+        vm_name = url_params.get(VM_NAME)
         return self.compute_client.virtual_machines.delete(
         return self.compute_client.virtual_machines.delete(
-            self.resource_group,
-            vm_name
-        ).wait()
+            self.resource_group, vm_name).wait()
 
 
-    def get_vm(self, vm_name):
+    def get_vm(self, vm_id):
+        url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+                                             vm_id)
+        vm_name = url_params.get(VM_NAME)
         return self.compute_client.virtual_machines.get(
         return self.compute_client.virtual_machines.get(
             self.resource_group,
             self.resource_group,
             vm_name,
             vm_name,
@@ -443,26 +485,41 @@ class AzureClient(object):
             create_or_update(self.resource_group,
             create_or_update(self.resource_group,
                              vm_name, params, raw=True)
                              vm_name, params, raw=True)
 
 
-    def update_vm(self, vm_name, params):
+    def update_vm(self, vm_id, params):
+        url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+                                             vm_id)
+        vm_name = url_params.get(VM_NAME)
         return self.compute_client.virtual_machines. \
         return self.compute_client.virtual_machines. \
             create_or_update(self.resource_group,
             create_or_update(self.resource_group,
                              vm_name, params, raw=True)
                              vm_name, params, raw=True)
 
 
-    def deallocate_vm(self, vm_name):
+    def deallocate_vm(self, vm_id):
+        url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+                                             vm_id)
+        vm_name = url_params.get(VM_NAME)
         self.compute_client. \
         self.compute_client. \
             virtual_machines.deallocate(self.resource_group,
             virtual_machines.deallocate(self.resource_group,
                                         vm_name).wait()
                                         vm_name).wait()
 
 
-    def generalize_vm(self, vm_name):
+    def generalize_vm(self, vm_id):
+        url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+                                             vm_id)
+        vm_name = url_params.get(VM_NAME)
         self.compute_client.virtual_machines. \
         self.compute_client.virtual_machines. \
             generalize(self.resource_group, vm_name)
             generalize(self.resource_group, vm_name)
 
 
-    def start_vm(self, vm_name):
+    def start_vm(self, vm_id):
+        url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+                                             vm_id)
+        vm_name = url_params.get(VM_NAME)
         self.compute_client.virtual_machines. \
         self.compute_client.virtual_machines. \
             start(self.resource_group,
             start(self.resource_group,
                   vm_name).wait()
                   vm_name).wait()
 
 
-    def update_vm_tags(self, vm_name, tags):
+    def update_vm_tags(self, vm_id, tags):
+        url_params = azure_helpers.parse_url(VM_RESOURCE_ID,
+                                             vm_id)
+        vm_name = url_params.get(VM_NAME)
         self.compute_client.virtual_machines. \
         self.compute_client.virtual_machines. \
             create_or_update(self.resource_group,
             create_or_update(self.resource_group,
                              vm_name, tags).result()
                              vm_name, tags).result()

+ 17 - 71
cloudbridge/cloud/providers/azure/resources.py

@@ -33,24 +33,8 @@ SUBNET_RESOURCE_ID = '/subscriptions/{subscriptionId}/resourceGroups/' \
                      '{resourceGroupName}/providers/Microsoft.Network' \
                      '{resourceGroupName}/providers/Microsoft.Network' \
                      '/virtualNetworks/{virtualNetworkName}/subnets' \
                      '/virtualNetworks/{virtualNetworkName}/subnets' \
                      '/{subnetName}'
                      '/{subnetName}'
-VOLUME_RESOURCE_ID = '/subscriptions/{subscriptionId}/resourceGroups/' \
-                     '{resourceGroupName}/providers/Microsoft.Compute/' \
-                     'disks/{diskName}'
-SNAPSHOT_RESOURCE_ID = '/subscriptions/{subscriptionId}/resourceGroups/' \
-                       '{resourceGroupName}/providers/Microsoft.Compute/' \
-                       'snapshots/{snapshotName}'
-IMAGE_RESOURCE_ID = '/subscriptions/{subscriptionId}/resourceGroups/' \
-                    '{resourceGroupName}/providers/Microsoft.Compute/' \
-                    'images/{imageName}'
-INSTANCE_RESOURCE_ID = '/subscriptions/{subscriptionId}/resourceGroups/' \
-                       '{resourceGroupName}/providers/Microsoft.Compute/' \
-                       'virtualMachines/{vmName}'
 
 
 NETWORK_NAME = 'virtualNetworkName'
 NETWORK_NAME = 'virtualNetworkName'
-IMAGE_NAME = 'imageName'
-VM_NAME = 'vmName'
-VOLUME_NAME = 'diskName'
-SNAPSHOT_NAME = 'snapshotName'
 
 
 
 
 class AzureVMFirewall(BaseVMFirewall):
 class AzureVMFirewall(BaseVMFirewall):
@@ -101,13 +85,7 @@ class AzureVMFirewall(BaseVMFirewall):
         return self._rule_container
         return self._rule_container
 
 
     def delete(self):
     def delete(self):
-        try:
-            self._provider.azure_client.\
-                delete_vm_firewall(self.id)
-            return True
-        except CloudError as cloudError:
-            log.exception(cloudError.message)
-            return False
+        self._provider.azure_client.delete_vm_firewall(self.id)
 
 
     def refresh(self):
     def refresh(self):
         """
         """
@@ -334,13 +312,8 @@ class AzureBucketObject(BaseBucketObject):
         :rtype: bool
         :rtype: bool
         :return: True if successful
         :return: True if successful
         """
         """
-        try:
-            self._provider.azure_client.delete_blob(
-                self._container.name, self.name)
-            return True
-        except AzureException as azureEx:
-            log.exception(azureEx)
-            return False
+        self._provider.azure_client.delete_blob(self._container.name,
+                                                self.name)
 
 
     def generate_url(self, expires_in=0):
     def generate_url(self, expires_in=0):
         """
         """
@@ -458,7 +431,7 @@ class AzureVolume(BaseVolume):
 
 
     @property
     @property
     def id(self):
     def id(self):
-        return self._volume.name
+        return self._volume.id
 
 
     @property
     @property
     def resource_id(self):
     def resource_id(self):
@@ -515,13 +488,7 @@ class AzureVolume(BaseVolume):
 
 
     @property
     @property
     def source(self):
     def source(self):
-        if self._volume.creation_data.source_uri:
-            url_params = azure_helpers.\
-                parse_url(SNAPSHOT_RESOURCE_ID,
-                          self._volume.creation_data.source_uri)
-            return self._provider.storage.snapshots. \
-                get(url_params.get(SNAPSHOT_NAME))
-        return None
+        return self._volume.creation_data.source_uri
 
 
     @property
     @property
     def attachments(self):
     def attachments(self):
@@ -534,11 +501,7 @@ class AzureVolume(BaseVolume):
         :return:
         :return:
         """
         """
         if self._volume.managed_by:
         if self._volume.managed_by:
-            url_params = azure_helpers.parse_url(INSTANCE_RESOURCE_ID,
-                                                 self._volume.managed_by)
-            return BaseAttachmentInfo(self,
-                                      url_params.get(VM_NAME),
-                                      None)
+            return BaseAttachmentInfo(self, self._volume.managed_by, None)
         else:
         else:
             return None
             return None
 
 
@@ -570,7 +533,7 @@ class AzureVolume(BaseVolume):
                 if item.managed_disk and \
                 if item.managed_disk and \
                                 item.managed_disk.id == self.resource_id:
                                 item.managed_disk.id == self.resource_id:
                     vm.storage_profile.data_disks.remove(item)
                     vm.storage_profile.data_disks.remove(item)
-                    self._provider.azure_client.update_vm(vm.name, vm)
+                    self._provider.azure_client.update_vm(vm.id, vm)
 
 
     def create_snapshot(self, name, description=None):
     def create_snapshot(self, name, description=None):
         """
         """
@@ -626,7 +589,7 @@ class AzureSnapshot(BaseSnapshot):
 
 
     @property
     @property
     def id(self):
     def id(self):
-        return self._snapshot.name
+        return self._snapshot.id
 
 
     @property
     @property
     def resource_id(self):
     def resource_id(self):
@@ -670,10 +633,7 @@ class AzureSnapshot(BaseSnapshot):
 
 
     @property
     @property
     def volume_id(self):
     def volume_id(self):
-        url_params = azure_helpers.\
-            parse_url(VOLUME_RESOURCE_ID,
-                      self._snapshot.creation_data.source_resource_id)
-        return url_params.get(VOLUME_NAME)
+        return self._snapshot.creation_data.source_resource_id
 
 
     @property
     @property
     def create_time(self):
     def create_time(self):
@@ -738,7 +698,7 @@ class AzureMachineImage(BaseMachineImage):
         :rtype: ``str``
         :rtype: ``str``
         :return: ID for this instance as returned by the cloud middleware.
         :return: ID for this instance as returned by the cloud middleware.
         """
         """
-        return self._image.name
+        return self._image.id
 
 
     @property
     @property
     def resource_id(self):
     def resource_id(self):
@@ -813,8 +773,7 @@ class AzureMachineImage(BaseMachineImage):
         for its latest state.
         for its latest state.
         """
         """
         try:
         try:
-            self._image = self._provider.azure_client\
-                .get_image(self.id)
+            self._image = self._provider.azure_client.get_image(self.id)
             self._state = self._image.provisioning_state
             self._state = self._image.provisioning_state
         except CloudError as cloudError:
         except CloudError as cloudError:
             log.exception(cloudError.message)
             log.exception(cloudError.message)
@@ -1217,7 +1176,7 @@ class AzureInstance(BaseInstance):
         """
         """
         Get the instance identifier.
         Get the instance identifier.
         """
         """
-        return self._vm.name
+        return self._vm.id
 
 
     @property
     @property
     def resource_id(self):
     def resource_id(self):
@@ -1298,35 +1257,23 @@ class AzureInstance(BaseInstance):
             self._provider.azure_client.delete_nic(nic_id)
             self._provider.azure_client.delete_nic(nic_id)
         for data_disk in self._vm.storage_profile.data_disks:
         for data_disk in self._vm.storage_profile.data_disks:
             if data_disk.managed_disk:
             if data_disk.managed_disk:
-                disk_params = azure_helpers.\
-                    parse_url(VOLUME_RESOURCE_ID,
-                              data_disk.managed_disk.id)
                 disk = self._provider.azure_client.\
                 disk = self._provider.azure_client.\
-                    get_disk(disk_params.get(VOLUME_NAME))
+                    get_disk(data_disk.managed_disk.id)
                 if disk and disk.tags \
                 if disk and disk.tags \
                         and disk.tags.get('delete_on_terminate',
                         and disk.tags.get('delete_on_terminate',
                                           'False') == 'True':
                                           'False') == 'True':
                     self._provider.azure_client.\
                     self._provider.azure_client.\
-                        delete_disk(disk_params.get(VOLUME_NAME))
+                        delete_disk(data_disk.managed_disk.id)
         if self._vm.storage_profile.os_disk.managed_disk:
         if self._vm.storage_profile.os_disk.managed_disk:
-            disk_params = azure_helpers. \
-                parse_url(VOLUME_RESOURCE_ID,
-                          self._vm.storage_profile.os_disk.managed_disk.id)
             self._provider.azure_client. \
             self._provider.azure_client. \
-                delete_disk(disk_params.get(VOLUME_NAME))
+                delete_disk(self._vm.storage_profile.os_disk.managed_disk.id)
 
 
     @property
     @property
     def image_id(self):
     def image_id(self):
         """
         """
         Get the image ID for this insance.
         Get the image ID for this insance.
         """
         """
-        image_ref_id = self._vm.storage_profile.image_reference.id
-        if image_ref_id:
-            url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
-                                                 image_ref_id)
-            return url_params.get(IMAGE_NAME)
-        else:
-            return None
+        return self._vm.storage_profile.image_reference.id
 
 
     @property
     @property
     def zone_id(self):
     def zone_id(self):
@@ -1650,8 +1597,7 @@ class AzureRouter(BaseRouter):
         return None
         return None
 
 
     def delete(self):
     def delete(self):
-        self._provider.azure_client. \
-            delete_route_table(self.name)
+        self._provider.azure_client.delete_route_table(self.name)
 
 
     def attach_subnet(self, subnet):
     def attach_subnet(self, subnet):
         subnet_id_parts = subnet.id.split('|$|')
         subnet_id_parts = subnet.id.split('|$|')