Przeglądaj źródła

Implemented initial changes of Get method for images

vikramdoda 9 lat temu
rodzic
commit
db4c4fa9da

+ 5 - 9
azure_integration_test/test_integration_azure_image_service.py

@@ -4,19 +4,15 @@ from azure_integration_test.helpers import ProviderTestBase
 
 
 class AzureIntegrationImageServiceTestCase(ProviderTestBase):
-    @helpers.skipIfNoService(['security.security_groups'])
+    @helpers.skipIfNoService(['compute.images'])
     def test_azure_image_service(self):
-        image_id = "/subscriptions/7904d702-e01c-4826-8519-f5a25c866a96" \
-                   "/resourceGroups/cloudbridge-azure/providers" \
-                   "/Microsoft.Compute/images/sampleImage"
 
         images_list = self.provider.compute.images.list()
-        print("List image - " + str(images_list))
-        self.assertEqual(len(images_list), 2)
 
-        image_get = self.provider.compute.images.get(image_id)
-        print("Get Image - " + str(image_get))
-        self.assertIsNotNone(image_get)
+        if images_list.total_results > 0:
+            image_get = self.provider.compute.images.get(images_list[0].id)
+            print("Get Image - " + str(image_get))
+            self.assertIsNotNone(image_get)
 
         # print("Before updating tag - " + str(image_get.name))
         # image_get.name("NewTestImage")

+ 3 - 1
azure_test/test_azure_image_service.py

@@ -7,7 +7,7 @@ class AzureImageServiceTestCase(ProviderTestBase):
     def test_azure_images_list(self):
         images_list = self.provider.compute.images.list()
         print("List Images - " + str(images_list))
-        self.assertEqual(len(images_list), 2)
+        self.assertTrue(images_list.total_results > 0)
 
     @helpers.skipIfNoService(['security.security_groups'])
     def test_azure_images_get_exist(self):
@@ -18,6 +18,8 @@ class AzureImageServiceTestCase(ProviderTestBase):
         print("Get Image Exist - " + str(image_get))
         print(str(image_get.min_disk))
         print(str(image_get.state))
+        self.assertIsNone(image_get.description)
+        image_get.refresh()
         image_get.delete()
         image_get.refresh()
         self.assertIsNotNone(image_get)

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

@@ -262,6 +262,10 @@ class AzureClient(object):
         return self.compute_client.\
             virtual_machines.list(self.resource_group_name)
 
+    def delete_image(self, name):
+        self.compute_client.images.\
+            delete(self.resource_group_name, name).wait()
+
     def list_images(self):
         return self.compute_client.images. \
             list_by_resource_group(self.resource_group_name)

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

@@ -169,6 +169,9 @@ class MockAzureClient:
     image1.id = '/subscriptions/7904d702-e01c-4826-8519-f5a25c866a96/' \
                 'resourceGroups/CLOUDBRIDGE-AZURE/providers/' \
                 'Microsoft.Compute/images/image1'
+    image1.storage_profile = StorageProfile()
+    image1.storage_profile.os_disk = ManagedDiskParameters(id='')
+    image1.storage_profile.os_disk.disk_size_gb = 10
 
     image2 = Image(location='eastus')
     image2.name = 'image2'
@@ -468,3 +471,7 @@ class MockAzureClient:
         response = Response()
         response.status_code = 404
         raise CloudError(response=response, error='Resource Not found')
+
+    def delete_image(self, name):
+        img = self.get_image(name)
+        self.images.remove(img)

+ 27 - 46
cloudbridge/cloud/providers/azure/resources.py

@@ -33,9 +33,6 @@ VOLUME_RESOURCE_ID = '/subscriptions/{subscriptionId}/resourceGroups/' \
 SNAPSHOT_RESOURCE_ID = '/subscriptions/{subscriptionId}/resourceGroups/' \
                        '{resourceGroupName}/providers/Microsoft.Compute/' \
                        'snapshots/{snapshotName}'
-IMAGE_RESOURCE_ID = '/subscriptions/{subscriptionId}/resourceGroups/' \
-                    '{resourceGroupName}/providers/Microsoft.Compute/' \
-                    'images/{imageName}'
 NETWORK_SECURITY_GROUP_RESOURCE_ID = '/subscriptions/{subscriptionId}/' \
                                      'resourceGroups/{resourceGroupName}/' \
                                      'providers/Microsoft.Network/' \
@@ -714,19 +711,18 @@ class AzureSnapshot(BaseSnapshot):
 
 
 class AzureMachineImage(BaseMachineImage):
+
     IMAGE_STATE_MAP = {
-        'pending': MachineImageState.PENDING,
-        'available': MachineImageState.AVAILABLE,
-        'failed': MachineImageState.ERROR
+        'InProgress': MachineImageState.PENDING,
+        'Succeeded': MachineImageState.AVAILABLE,
+        'Failed': MachineImageState.ERROR
     }
 
     def __init__(self, provider, image):
         super(AzureMachineImage, self).__init__(provider)
         self._image = image
-        self._description = None
-        self._status = self._image.provisioning_state
-        if not self._image.tags:
-            self._image.tags = {}
+        self._url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID, image.id)
+        self._state = self._image.provisioning_state
 
     @property
     def id(self):
@@ -738,34 +734,25 @@ class AzureMachineImage(BaseMachineImage):
         """
         return self._image.id
 
-    @property
-    def resource_name(self):
-        return self._image.name
-
     @property
     def name(self):
         """
-        Get the snapshot name.
+        Get the image name.
 
-        .. note:: an instance must have a (case sensitive) tag ``Name``
-        """
-        return self._image.tags.get('Name', self._image.name)
-
-    @name.setter
-    # pylint:disable=arguments-differ
-    def name(self, value):
-        """
-        Set the snapshot name.
+        :rtype: ``str``
+        :return: Name for this image as returned by the cloud middleware.
         """
-        # self._snapshot.name = value
-        self._image.tags.update(Name=value)
-        self._provider.azure_client. \
-            update_snapshot_tags(self.resource_name,
-                                 self._image.tags)
+        return self._image.name
 
     @property
     def description(self):
-        return self._image.tags.get('Description', None)
+        """
+        Get the image description.
+
+        :rtype: ``str``
+        :return: Description for this image as returned by the cloud middleware
+        """
+        return None
 
     @property
     def min_disk(self):
@@ -776,33 +763,27 @@ class AzureMachineImage(BaseMachineImage):
         :rtype: ``int``
         :return: The minimum disk size needed by this image
         """
-        # bdm = self._image.block_device_mapping
-        # return bdm[self._image.root_device_name].size
-        pass
+        return self._image.storage_profile.os_disk.disk_size_gb
 
     def delete(self):
         """
         Delete this image
         """
-        # self._image.deregister(delete_snapshot=True)
-        pass
+        self._provider.azure_client.delete_image(self.name)
 
     @property
     def state(self):
         return AzureMachineImage.IMAGE_STATE_MAP.get(
-            self._image.provisioning_state, MachineImageState.UNKNOWN)
+            self._state, MachineImageState.UNKNOWN)
 
     def refresh(self):
         """
-        Refreshes the state of this instance by re-querying
-        the cloud provider
+        Refreshes the state of this instance by re-querying the cloud provider
         for its latest state.
         """
-        # image = self._provider.compute.images.get(self.id)
-        # if image:
-        #     # pylint:disable=protected-access
-        #     self._image = image
-        # else:
-        #     # image no longer exists
-        #     self._image.state = "unknown"
-        pass
+        try:
+            self._image = self._provider.azure_client.get_image(self.name)
+            self._state = self._image.provisioning_state
+        except CloudError:
+            # image no longer exists
+            self._state = "unknown"

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

@@ -345,7 +345,7 @@ class AzureImageService(BaseImageService):
 
     def list(self, limit=None, marker=None):
         azure_images = self.provider.azure_client.list_images()
-        cb_images = [AzureMachineImage(self.provider, vol)
-                     for vol in azure_images]
+        cb_images = [AzureMachineImage(self.provider, img)
+                     for img in azure_images]
         return ClientPagedResultList(self.provider, cb_images,
                                      limit=limit, marker=marker)

+ 15 - 0
test/test_azure_provider.py

@@ -6,6 +6,21 @@ class AzureProviderTestCase(ProviderTestBase):
         compute = self.provider.compute
         self.assertTrue(compute is not None, 'Compute should not be None')
 
+        self.assertTrue(compute.images is not None,
+                        'Images should not be none')
+
+        with self.assertRaises(NotImplementedError):
+            self.assertTrue(compute.instances is not None,
+                            'Instances should not be none')
+
+        with self.assertRaises(NotImplementedError):
+            self.assertTrue(compute.instance_types is not None,
+                            'Instance types should not be none')
+
+        with self.assertRaises(NotImplementedError):
+            self.assertTrue(compute.regions is not None,
+                            'Regions should not be none')
+
         with self.assertRaises(Exception):
             network = self.provider.network
             self.assertTrue(network is not None, 'Network should not be None')