Explorar el Código

Added tags support for images, refactored flake issue, and initial find implementation

madhugilla hace 9 años
padre
commit
9791881c68

+ 13 - 9
azure_test/test_azure_image_service.py

@@ -33,12 +33,16 @@ class AzureImageServiceTestCase(ProviderTestBase):
         print("Get Image Not Exist- " + str(image_get))
         self.assertIsNone(image_get)
 
-    @helpers.skipIfNoService(['security.security_groups'])
-    def test_azure_images_find(self):
-        image1_name = 'image1'
-        with self.assertRaises(NotImplementedError):
-            image_find = self.provider.compute.images \
-                .find(image1_name)
-            print("Find Image  - " + str(image_find))
-            self.assertEqual(
-                len(image_find), 1)
+    @helpers.skipIfNoService(['compute.images'])
+    def test_azure_image_find_exists(self):
+        images = self.provider.compute.images.find("image1")
+        for image in images:
+            self.assertTrue("image" in image.name)
+            print("Find Image  - " + str(image))
+        print(images.total_results)
+        self.assertTrue(images.total_results > 0)
+
+    @helpers.skipIfNoService(['compute.images'])
+    def test_azure_image_find_not_exists(self):
+        images = self.provider.compute.images.find('dontfindme')
+        self.assertTrue(images.total_results == 0)

+ 6 - 3
cloudbridge/cloud/providers/azure/azure_client.py

@@ -293,6 +293,9 @@ class AzureClient(object):
         return self.compute_client.images. \
             get(self.resource_group_name, image_name)
 
-    def list_instance_types(self):
-        return self.compute_client.virtual_machine_sizes. \
-            list(self.region_name)
+    def update_image_tags(self, name, tags):
+        return self.compute_client.images. \
+            create_or_update(self.resource_group_name, name,
+                             {
+                                 'tags': tags
+                             }).result()

+ 5 - 0
cloudbridge/cloud/providers/azure/mock_azure_client.py

@@ -546,3 +546,8 @@ class MockAzureClient:
 
     def list_locations(self):
         return self.regions
+
+    def update_image_tags(self, name, tags):
+        img = self.get_image(name)
+        img.tags = tags
+        return img

+ 48 - 22
cloudbridge/cloud/providers/azure/resources.py

@@ -6,7 +6,6 @@ import json
 
 from azure.common import AzureException
 
-
 from cloudbridge.cloud.base.resources import BaseAttachmentInfo, \
     BaseBucket, BaseBucketObject, BaseMachineImage, BaseNetwork, \
     BasePlacementZone, BaseRegion, BaseSecurityGroup, BaseSecurityGroupRule, \
@@ -111,7 +110,7 @@ class AzureSecurityGroup(BaseSecurityGroup):
     @description.setter
     def description(self, value):
         self._security_group.tags.update(Description=value)
-        self._provider.azure_client.\
+        self._provider.azure_client. \
             update_security_group_tags(self.resource_name,
                                        self._security_group.tags)
 
@@ -427,7 +426,7 @@ class AzureVolume(BaseVolume):
     def __init__(self, provider, volume):
         super(AzureVolume, self).__init__(provider)
         self._volume = volume
-        self._url_params = azure_helpers.\
+        self._url_params = azure_helpers. \
             parse_url(VOLUME_RESOURCE_ID, volume.id)
         self._description = None
         self._status = 'unknown'
@@ -468,7 +467,7 @@ class AzureVolume(BaseVolume):
         """
         # self._volume.name = value
         self._volume.tags.update(Name=value)
-        self._provider.azure_client.\
+        self._provider.azure_client. \
             update_disk_tags(self.resource_name,
                              self._volume.tags)
 
@@ -479,7 +478,7 @@ class AzureVolume(BaseVolume):
     @description.setter
     def description(self, value):
         self._volume.tags.update(Description=value)
-        self._provider.azure_client.\
+        self._provider.azure_client. \
             update_disk_tags(self.resource_name,
                              self._volume.tags)
 
@@ -532,7 +531,7 @@ class AzureVolume(BaseVolume):
                     'id': self.id
                 }
             })
-            self._provider.azure_client\
+            self._provider.azure_client \
                 .create_or_update_vm(params.get(VM_NAME), vm)
             return True
         except CloudError:
@@ -572,7 +571,7 @@ class AzureVolume(BaseVolume):
         Delete this volume.
         """
         try:
-            self._provider.azure_client.\
+            self._provider.azure_client. \
                 delete_disk(self.resource_name)
             return True
         except CloudError:
@@ -589,7 +588,7 @@ class AzureVolume(BaseVolume):
         for its latest state.
         """
         try:
-            self._volume = self._provider.azure_client.\
+            self._volume = self._provider.azure_client. \
                 get_disk(self.resource_name)
             self.update_status()
         except (CloudError, ValueError):
@@ -599,7 +598,6 @@ class AzureVolume(BaseVolume):
 
 
 class AzureSnapshot(BaseSnapshot):
-
     SNAPSHOT_STATE_MAP = {
         'InProgress': SnapshotState.PENDING,
         'Succeeded': SnapshotState.AVAILABLE,
@@ -613,7 +611,7 @@ class AzureSnapshot(BaseSnapshot):
         super(AzureSnapshot, self).__init__(provider)
         self._snapshot = snapshot
         self._description = None
-        self._url_params = azure_helpers.\
+        self._url_params = azure_helpers. \
             parse_url(SNAPSHOT_RESOURCE_ID, snapshot.id)
         self._status = self._snapshot.provisioning_state
         if not self._snapshot.tags:
@@ -655,7 +653,7 @@ class AzureSnapshot(BaseSnapshot):
     @description.setter
     def description(self, value):
         self._snapshot.tags.update(Description=value)
-        self._provider.azure_client.\
+        self._provider.azure_client. \
             update_snapshot_tags(self.resource_name,
                                  self._snapshot.tags)
 
@@ -674,7 +672,7 @@ class AzureSnapshot(BaseSnapshot):
     @property
     def state(self):
         return AzureSnapshot.SNAPSHOT_STATE_MAP.get(
-           self._status, SnapshotState.UNKNOWN)
+            self._status, SnapshotState.UNKNOWN)
 
     def refresh(self):
         """
@@ -682,7 +680,7 @@ class AzureSnapshot(BaseSnapshot):
         for its latest state.
         """
         try:
-            self._snapshot = self._provider.azure_client.\
+            self._snapshot = self._provider.azure_client. \
                 get_snapshot(self.resource_name)
             self._status = self._snapshot.provisioning_state
         except (CloudError, ValueError):
@@ -705,13 +703,12 @@ class AzureSnapshot(BaseSnapshot):
         """
         Create a new Volume from this Snapshot.
         """
-        return self._provider.block_store.volumes.\
+        return self._provider.block_store.volumes. \
             create(self.resource_name, self.size,
                    zone=placement, snapshot=self)
 
 
 class AzureMachineImage(BaseMachineImage):
-
     IMAGE_STATE_MAP = {
         'InProgress': MachineImageState.PENDING,
         'Succeeded': MachineImageState.AVAILABLE,
@@ -721,9 +718,13 @@ class AzureMachineImage(BaseMachineImage):
     def __init__(self, provider, image):
         super(AzureMachineImage, self).__init__(provider)
         self._image = image
-        self._url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID, image.id)
+        self._url_params = azure_helpers. \
+            parse_url(IMAGE_RESOURCE_ID, image.id)
         self._state = self._image.provisioning_state
 
+        if not self._image.tags:
+            self._image.tags = {}
+
     @property
     def id(self):
         """
@@ -742,7 +743,16 @@ class AzureMachineImage(BaseMachineImage):
         :rtype: ``str``
         :return: Name for this image as returned by the cloud middleware.
         """
-        return self._image.name
+        return self._image.tags.get('Name', self._image.name)
+
+    @name.setter
+    def name(self, value):
+        """
+        Set the image name.
+        """
+        self._image.tags.update(Name=value)
+        self._provider.azure_client. \
+            update_image_tags(self.resource_name, self._image.tags)
 
     @property
     def description(self):
@@ -752,7 +762,20 @@ class AzureMachineImage(BaseMachineImage):
         :rtype: ``str``
         :return: Description for this image as returned by the cloud middleware
         """
-        return None
+        return self._image.tags.get('Description', None)
+
+    @description.setter
+    def description(self, value):
+        """
+        Set the image name.
+        """
+        self._image.tags.update(Description=value)
+        self._provider.azure_client. \
+            update_image_tags(self.resource_name, self._image.tags)
+
+    @property
+    def resource_name(self):
+        return self._image.name
 
     @property
     def min_disk(self):
@@ -769,7 +792,7 @@ class AzureMachineImage(BaseMachineImage):
         """
         Delete this image
         """
-        self._provider.azure_client.delete_image(self.name)
+        self._provider.azure_client.delete_image(self.resource_name)
 
     @property
     def state(self):
@@ -782,7 +805,8 @@ class AzureMachineImage(BaseMachineImage):
         for its latest state.
         """
         try:
-            self._image = self._provider.azure_client.get_image(self.name)
+            self._image = self._provider.azure_client\
+                .get_image(self.resource_name)
             self._state = self._image.provisioning_state
         except CloudError:
             # image no longer exists
@@ -871,7 +895,6 @@ class AzureNetwork(BaseNetwork):
 
 
 class AzureRegion(BaseRegion):
-
     def __init__(self, provider, azure_region):
         super(AzureRegion, self).__init__(provider)
         self._azure_region = azure_region
@@ -897,7 +920,10 @@ class AzureRegion(BaseRegion):
 
 
 class AzurePlacementZone(BasePlacementZone):
-
+    """
+    As Azure does not provide zones (limited support), we are mapping the
+    region information in the zones.
+    """
     def __init__(self, provider, zone, region):
         super(AzurePlacementZone, self).__init__(provider)
         self._azure_zone = zone

+ 10 - 2
cloudbridge/cloud/providers/azure/services.py

@@ -340,8 +340,16 @@ class AzureImageService(BaseImageService):
             return None
 
     def find(self, name, limit=None, marker=None):
-        raise NotImplementedError('AzureImageService not '
-                                  'implemented this method')
+
+        """
+         Searches for a image by a given list of attributes.
+        """
+        filters = {'Name': name}
+        cb_images = [AzureMachineImage(self.provider, image)
+                     for image in azure_helpers.filter(
+                self.provider.azure_client.list_images(), filters)]
+        return ClientPagedResultList(self.provider, cb_images,
+                                     limit=limit, marker=marker)
 
     def list(self, limit=None, marker=None):
         azure_images = self.provider.azure_client.list_images()