Ver código fonte

Azure with Marketplace VMImages

almahmoud 7 anos atrás
pai
commit
37a9a2c5af

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

@@ -595,6 +595,9 @@ class AzureClient(object):
                 return [img.id for img in az_imgs]
 
         else:
+            # CPU times: user 1min 40s, sys: 5.94 s, total: 1min 46s
+            # Wall time: 10min 16s
+            # 9/18/2018 time to get the entire image list
             if offer or sku:
                 raise CloudBridgeBaseException('An offer cannot be specified '
                                                'with no publisher. Please '
@@ -607,15 +610,15 @@ class AzureClient(object):
             for pub in pubs:
                 offers = [offer.name for offer in
                           self.compute_client.virtual_machine_images.
-                              list_offers(self.region_name, pub)]
+                          list_offers(self.region_name, pub)]
                 for of in offers:
                     skus = [sku.name for sku in
                             self.compute_client.virtual_machine_images.
-                                list_skus(self.region_name, pub, of)]
+                            list_skus(self.region_name, pub, of)]
                     for s in skus:
                         az_imgs.extend(self.compute_client.
-                            virtual_machine_images.list(
-                            self.region_name, pub, of, s))
+                                       virtual_machine_images.list(
+                                            self.region_name, pub, of, s))
             return [img.id for img in az_imgs]
 
     def get_image(self, image_id):
@@ -644,8 +647,16 @@ class AzureClient(object):
                     max_ind = versions.index(max(versions))
                     version = imgs[max_ind].name
 
+            # A marketplace ID
+            else:
+                publisher = url_params['publisherName']
+                offer = url_params['offerName']
+                sku = url_params['skuName']
+                version = url_params['versionName']
+
             return self.compute_client.virtual_machine_images.get(
                 self.region_name, publisher, offer, sku, version)
+
         else:
             name = url_params.get(IMAGE_NAME)
             res_group = url_params.get(RES_GROUP_NAME, self.resource_group)

+ 1 - 1
cloudbridge/cloud/providers/azure/helpers.py

@@ -63,7 +63,7 @@ def generate_urn(image_id):
     """
     This function takes an azure marketplace image ID and outputs a
     corresponding URN
-    :param gallery_image: a GalleryImageReference object
+    :param image_id: str
     :return: URN as string
     """
     url_params = parse_url([MARKETPLACE_ID], image_id)

+ 19 - 18
cloudbridge/cloud/providers/azure/services.py

@@ -567,21 +567,22 @@ class AzureInstanceService(BaseInstanceService):
         if not temp_key_pair:
             params['tags'].update(Key_Pair=key_pair.id)
 
-        image_ref = storage_profile.get('image_reference')
-        if image_ref:
-            sku = image_ref.get('sku')
-            if sku:
-                publisher = image_ref.get("publisher")
-                offer = image_ref.get("offer")
+        if image.is_marketplace_image:
+            plan = image._image.as_dict().get('plan')
+            if plan:
+
+                plan_name = plan.get("name")
+                plan_product = plan.get("product")
+                plan_publisher = plan.get("publisher")
                 agreement = self.provider.azure_client. \
-                    get_marketplace_agreement(publisher, offer, sku)
-                # TODO: Give link to terms to user before accepting
+                    get_marketplace_agreement(plan_publisher,
+                                              plan_product,
+                                              plan_name)
+                # Implicitely accepting any terms in the plan
                 if agreement:
                     self.provider.azure_client.accept_marketplace_agreement(
-                        publisher, offer, sku, agreement)
-                    params.update(plan={"name": sku,
-                                        "publisher": publisher,
-                                        "product": offer})
+                        plan_publisher, plan_product, plan_name, agreement)
+                    params.update(plan=plan)
 
         try:
             vm = self.provider.azure_client.create_vm(instance_name, params)
@@ -634,13 +635,13 @@ class AzureInstanceService(BaseInstanceService):
     def _create_storage_profile(self, image, launch_config, instance_name,
                                 zone_id):
 
-        if image.is_gallery_image:
-            reference = image._image.as_dict()
+        if image.is_marketplace_image:
+            urn = image.name.split(':')
             image_ref = {
-                'publisher': reference['publisher'],
-                'offer': reference['offer'],
-                'sku': reference['sku'],
-                'version': reference['version']
+                'publisher': urn[0],
+                'offer': urn[1],
+                'sku': urn[2],
+                'version': urn[3]
             }
         else:
             image_ref = {