Explorar el Código

Image Service Test Passing

almahmoud hace 7 años
padre
commit
5a64b54ced

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

@@ -452,9 +452,11 @@ class AzureClient(object):
     def list_images(self):
     def list_images(self):
         azure_images = list(self.compute_client.images.
         azure_images = list(self.compute_client.images.
                             list_by_resource_group(self.resource_group))
                             list_by_resource_group(self.resource_group))
-        azure_images.extend(gallery_image_references)
         return azure_images
         return azure_images
 
 
+    def list_gallery_refs(self):
+        return gallery_image_references
+
     def get_image(self, image_id):
     def get_image(self, image_id):
         url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
         url_params = azure_helpers.parse_url(IMAGE_RESOURCE_ID,
                                              image_id)
                                              image_id)

+ 13 - 0
cloudbridge/cloud/providers/azure/helpers.py

@@ -51,3 +51,16 @@ def parse_url(template_urls, original_url):
         if key.startswith('{') and key.endswith('}'):
         if key.startswith('{') and key.endswith('}'):
             resource_param.update({key[1:-1]: value})
             resource_param.update({key[1:-1]: value})
     return resource_param
     return resource_param
+
+
+def generate_urn(gallery_image):
+    """
+    This function takes an azure gallery image and outputs a corresponding URN
+    :param gallery_image: a GalleryImageReference object
+    :return: URN as string
+    """
+    reference_dict = gallery_image.as_dict()
+    return ':'.join([reference_dict['publisher'],
+                     reference_dict['offer'],
+                     reference_dict['sku'],
+                     reference_dict['version']])

+ 5 - 11
cloudbridge/cloud/providers/azure/resources.py

@@ -26,6 +26,8 @@ from msrestazure.azure_exceptions import CloudError
 
 
 import pysftp
 import pysftp
 
 
+from . import helpers as azure_helpers
+
 log = logging.getLogger(__name__)
 log = logging.getLogger(__name__)
 
 
 
 
@@ -693,18 +695,14 @@ class AzureMachineImage(BaseMachineImage):
         :return: ID for this instance as returned by the cloud middleware.
         :return: ID for this instance as returned by the cloud middleware.
         """
         """
         if isinstance(self._image, GalleryImageReference):
         if isinstance(self._image, GalleryImageReference):
-            return self._image.as_dict()['offer']
+            return azure_helpers.generate_urn(self._image)
         else:
         else:
             return self._image.id
             return self._image.id
 
 
     @property
     @property
     def resource_id(self):
     def resource_id(self):
         if isinstance(self._image, GalleryImageReference):
         if isinstance(self._image, GalleryImageReference):
-            reference_dict = self._image.as_dict()
-            return ':'.join([reference_dict['publisher'],
-                             reference_dict['offer'],
-                             reference_dict['sku'],
-                             reference_dict['version']])
+            return azure_helpers.generate_urn(self._image)
         else:
         else:
             return self._image.id
             return self._image.id
 
 
@@ -717,11 +715,7 @@ class AzureMachineImage(BaseMachineImage):
         :return: Name for this image as returned by the cloud middleware.
         :return: Name for this image as returned by the cloud middleware.
         """
         """
         if isinstance(self._image, GalleryImageReference):
         if isinstance(self._image, GalleryImageReference):
-            reference_dict = self._image.as_dict()
-            return ':'.join([reference_dict['publisher'],
-                             reference_dict['offer'],
-                             reference_dict['sku'],
-                             reference_dict['version']])
+            return azure_helpers.generate_urn(self._image)
         else:
         else:
             return self._image.tags.get('Name', self._image.name)
             return self._image.tags.get('Name', self._image.name)
 
 

+ 47 - 40
cloudbridge/cloud/providers/azure/services.py

@@ -116,7 +116,7 @@ class AzureVMFirewallService(BaseVMFirewallService):
         filters = {'Name': name}
         filters = {'Name': name}
         fws = [AzureVMFirewall(self.provider, vm_firewall)
         fws = [AzureVMFirewall(self.provider, vm_firewall)
                for vm_firewall in azure_helpers.filter_by_tag(
                for vm_firewall in azure_helpers.filter_by_tag(
-                self.provider.azure_client.list_vm_firewall(), filters)]
+               self.provider.azure_client.list_vm_firewall(), filters)]
         return ClientPagedResultList(self.provider, fws)
         return ClientPagedResultList(self.provider, fws)
 
 
     def delete(self, group_id):
     def delete(self, group_id):
@@ -143,7 +143,7 @@ class AzureKeyPairService(BaseKeyPairService):
 
 
     def list(self, limit=None, marker=None):
     def list(self, limit=None, marker=None):
         key_pairs, resume_marker = self.provider.azure_client.list_public_keys(
         key_pairs, resume_marker = self.provider.azure_client.list_public_keys(
-            AzureKeyPairService.PARTITION_KEY,  marker=marker,
+            AzureKeyPairService.PARTITION_KEY, marker=marker,
             limit=limit or self.provider.config.default_result_limit)
             limit=limit or self.provider.config.default_result_limit)
         results = [AzureKeyPair(self.provider, key_pair)
         results = [AzureKeyPair(self.provider, key_pair)
                    for key_pair in key_pairs]
                    for key_pair in key_pairs]
@@ -178,11 +178,11 @@ class AzureKeyPairService(BaseKeyPairService):
             public_key_material, private_key = cb_helpers.generate_key_pair()
             public_key_material, private_key = cb_helpers.generate_key_pair()
 
 
         entity = {
         entity = {
-                  'PartitionKey': AzureKeyPairService.PARTITION_KEY,
-                  'RowKey': str(uuid.uuid4()),
-                  'Name': name,
-                  'Key': public_key_material
-                 }
+            'PartitionKey': AzureKeyPairService.PARTITION_KEY,
+            'RowKey': str(uuid.uuid4()),
+            'Name': name,
+            'Key': public_key_material
+        }
 
 
         self.provider.azure_client.create_public_key(entity)
         self.provider.azure_client.create_public_key(entity)
         key_pair = self.get(name)
         key_pair = self.get(name)
@@ -286,7 +286,7 @@ class AzureVolumeService(BaseVolumeService):
         filters = {'Name': name}
         filters = {'Name': name}
         cb_vols = [AzureVolume(self.provider, volume)
         cb_vols = [AzureVolume(self.provider, volume)
                    for volume in azure_helpers.filter_by_tag(
                    for volume in azure_helpers.filter_by_tag(
-                self.provider.azure_client.list_disks(), filters)]
+                   self.provider.azure_client.list_disks(), filters)]
         return ClientPagedResultList(self.provider, cb_vols)
         return ClientPagedResultList(self.provider, cb_vols)
 
 
     def list(self, limit=None, marker=None):
     def list(self, limit=None, marker=None):
@@ -370,7 +370,7 @@ class AzureSnapshotService(BaseSnapshotService):
         filters = {'Name': name}
         filters = {'Name': name}
         cb_snapshots = [AzureSnapshot(self.provider, snapshot)
         cb_snapshots = [AzureSnapshot(self.provider, snapshot)
                         for snapshot in azure_helpers.filter_by_tag(
                         for snapshot in azure_helpers.filter_by_tag(
-                self.provider.azure_client.list_snapshots(), filters)]
+                        self.provider.azure_client.list_snapshots(), filters)]
         return ClientPagedResultList(self.provider, cb_snapshots)
         return ClientPagedResultList(self.provider, cb_snapshots)
 
 
     def list(self, limit=None, marker=None):
     def list(self, limit=None, marker=None):
@@ -495,15 +495,15 @@ class AzureInstanceService(BaseInstanceService):
                                                        instance_name, zone_id)
                                                        instance_name, zone_id)
 
 
         nic_params = {
         nic_params = {
-                'location': self._provider.region_name,
-                'ip_configurations': [{
-                    'name': instance_name + '_ip_config',
-                    'private_ip_allocation_method': 'Dynamic',
-                    'subnet': {
-                        'id': subnet_id
-                    }
-                }]
-            }
+            'location': self._provider.region_name,
+            'ip_configurations': [{
+                'name': instance_name + '_ip_config',
+                'private_ip_allocation_method': 'Dynamic',
+                'subnet': {
+                    'id': subnet_id
+                }
+            }]
+        }
 
 
         if vm_firewall_id:
         if vm_firewall_id:
             nic_params['network_security_group'] = {
             nic_params['network_security_group'] = {
@@ -524,16 +524,16 @@ class AzureInstanceService(BaseInstanceService):
                 'admin_username': self.provider.vm_default_user_name,
                 'admin_username': self.provider.vm_default_user_name,
                 'computer_name': instance_name,
                 'computer_name': instance_name,
                 'linux_configuration': {
                 'linux_configuration': {
-                             "disable_password_authentication": True,
-                             "ssh": {
-                                 "public_keys": [{
-                                      "path":
-                                      "/home/{}/.ssh/authorized_keys".format(
-                                          self.provider.vm_default_user_name),
-                                      "key_data": key_pair._key_pair.Key
-                                     }]
-                                   }
-                           }
+                    "disable_password_authentication": True,
+                    "ssh": {
+                        "public_keys": [{
+                            "path":
+                                "/home/{}/.ssh/authorized_keys".format(
+                                        self.provider.vm_default_user_name),
+                                "key_data": key_pair._key_pair.Key
+                        }]
+                    }
+                }
             },
             },
             'hardware_profile': {
             'hardware_profile': {
                 'vm_size': instance_size
                 'vm_size': instance_size
@@ -741,7 +741,7 @@ class AzureInstanceService(BaseInstanceService):
         filtr = {'Name': name}
         filtr = {'Name': name}
         instances = [AzureInstance(self.provider, inst)
         instances = [AzureInstance(self.provider, inst)
                      for inst in azure_helpers.filter_by_tag(
                      for inst in azure_helpers.filter_by_tag(
-                self.provider.azure_client.list_vm(), filtr)]
+                     self.provider.azure_client.list_vm(), filtr)]
         return ClientPagedResultList(self.provider, instances)
         return ClientPagedResultList(self.provider, instances)
 
 
 
 
@@ -772,7 +772,12 @@ class AzureImageService(BaseImageService):
         filters = {'Name': name}
         filters = {'Name': name}
         cb_images = [AzureMachineImage(self.provider, image)
         cb_images = [AzureMachineImage(self.provider, image)
                      for image in azure_helpers.filter_by_tag(
                      for image in azure_helpers.filter_by_tag(
-                self.provider.azure_client.list_images(), filters)]
+                     self.provider.azure_client.list_images(), filters)]
+        # All gallery image properties (id, resource_id, name) are the URN
+        # Improvement: wrap the filters by publisher, offer, etc...
+        cb_images.extend([AzureMachineImage(self.provider, image) for image
+                          in self.provider.azure_client.list_gallery_refs()
+                          if azure_helpers.generate_urn(image) == name])
         return ClientPagedResultList(self.provider, cb_images)
         return ClientPagedResultList(self.provider, cb_images)
 
 
     def list(self, limit=None, marker=None):
     def list(self, limit=None, marker=None):
@@ -780,8 +785,9 @@ class AzureImageService(BaseImageService):
         List all images.
         List all images.
         """
         """
         azure_images = self.provider.azure_client.list_images()
         azure_images = self.provider.azure_client.list_images()
+        azure_gallery_refs = self.provider.azure_client.list_gallery_refs()
         cb_images = [AzureMachineImage(self.provider, img)
         cb_images = [AzureMachineImage(self.provider, img)
-                     for img in azure_images]
+                     for img in azure_images + azure_gallery_refs]
         return ClientPagedResultList(self.provider, cb_images,
         return ClientPagedResultList(self.provider, cb_images,
                                      limit=limit, marker=marker)
                                      limit=limit, marker=marker)
 
 
@@ -857,8 +863,9 @@ class AzureNetworkService(BaseNetworkService):
                             " Supported attributes: %s" % (kwargs, 'name'))
                             " Supported attributes: %s" % (kwargs, 'name'))
 
 
         filters = {'Name': name}
         filters = {'Name': name}
-        networks = [AzureNetwork(self.provider, network)
-                    for network in azure_helpers.filter_by_tag(
+        networks = [
+            AzureNetwork(self.provider, network) for network
+            in azure_helpers.filter_by_tag(
                 self.provider.azure_client.list_networks(), filters)]
                 self.provider.azure_client.list_networks(), filters)]
         return ClientPagedResultList(self.provider, networks)
         return ClientPagedResultList(self.provider, networks)
 
 
@@ -976,12 +983,12 @@ class AzureSubnetService(BaseSubnetService):
 
 
         subnet_info = self.provider.azure_client\
         subnet_info = self.provider.azure_client\
             .create_subnet(
             .create_subnet(
-                            network_id,
-                            subnet_name,
-                            {
-                                'address_prefix': cidr_block
-                            }
-                          )
+                network_id,
+                subnet_name,
+                {
+                    'address_prefix': cidr_block
+                }
+            )
 
 
         return AzureSubnet(self.provider, subnet_info)
         return AzureSubnet(self.provider, subnet_info)
 
 
@@ -1036,7 +1043,7 @@ class AzureRouterService(BaseRouterService):
         filters = {'Name': name}
         filters = {'Name': name}
         routes = [AzureRouter(self.provider, route)
         routes = [AzureRouter(self.provider, route)
                   for route in azure_helpers.filter_by_tag(
                   for route in azure_helpers.filter_by_tag(
-                self.provider.azure_client.list_route_tables(), filters)]
+                  self.provider.azure_client.list_route_tables(), filters)]
 
 
         return ClientPagedResultList(self.provider, routes)
         return ClientPagedResultList(self.provider, routes)
 
 

+ 1 - 1
test/test_image_service.py

@@ -24,6 +24,7 @@ class CloudImageServiceTestCase(ProviderTestBase):
         # the cleanup method access to the most current values
         # the cleanup method access to the most current values
         test_instance = None
         test_instance = None
         net = None
         net = None
+        subnet = None
 
 
         def create_img(name):
         def create_img(name):
             return test_instance.create_image(name)
             return test_instance.create_image(name)
@@ -45,7 +46,6 @@ class CloudImageServiceTestCase(ProviderTestBase):
                 self.provider, instance_name)
                 self.provider, instance_name)
             test_instance = helpers.get_test_instance(
             test_instance = helpers.get_test_instance(
                 self.provider, instance_name, subnet=subnet)
                 self.provider, instance_name, subnet=subnet)
-
             sit.check_crud(self, self.provider.compute.images, MachineImage,
             sit.check_crud(self, self.provider.compute.images, MachineImage,
                            "cb_listimg", create_img, cleanup_img,
                            "cb_listimg", create_img, cleanup_img,
                            extra_test_func=extra_tests)
                            extra_test_func=extra_tests)