def test_create_vm(self): expected_goldimage_name = NameUtil.goldimage_vmdisk_name( "ubuntu1604-x86_64", "os") vm_name = NameUtil.goldimage_vm_name(self.scenario, "ubuntu1604") datastore_name = self.cluster._mgmt_server_info.prism_container_id node_id = self.cluster.nodes()[0].node_id() vm = self.cluster.create_vm(self.scenario.goldimages_directory, "ubuntu1604", vm_name, vcpus=1, ram_mb=1024, node_id=node_id, datastore_name=datastore_name, data_disks=[10, 20, 30]) vms = self.cluster.find_vms([vm_name]) assert len(vms) == 1, "Too many VMs found for %s" % vm_name assert vms[0].vm_name() == vm_name, "VM found %s wasn't %s" % ( vms[0].vm_name(), vm_name) assert isinstance(vms[0], AcropolisVm), ("VM is %s instead of AcropolisVm" % str(type(vms[0]))) found_images = self.__get_image_names() assert expected_goldimage_name in found_images, \ "Goldimage disk wasn't found in image service." self.scenario.cluster.cleanup() found_images = self.__get_image_names() assert expected_goldimage_name not in found_images, \ "Goldimage disk wasn't found in image service."
def deploy_goldimage_image_service(self, goldimages_directory, goldimage_name): """ Deploy a gold image to the image service. Args: goldimage_name (str): Name of the gold image to deploy. Returns: str: ID of the created disk image. """ arch = self.get_cluster_architecture() # Select a vdisk format to use. Currently PPC64LE goldimages are only built # using qcow2 format and the x86_64 in vmdk. We could have the manager # perform a conversion, but acropolis can already do the image conversion # for us. if arch == GoldImageManager.ARCH_PPC64LE: disk_format = GoldImageManager.FORMAT_QCOW2 else: disk_format = GoldImageManager.FORMAT_VMDK # Use the GoldImage manager to get a path to our appropriate goldimage goldimage_manager = GoldImageManager(goldimages_directory) goldimage_path = goldimage_manager.get_goldimage_path( goldimage_name, format_str=disk_format, arch=arch) log.debug("Deploying %s to cluster", goldimage_path) # Deploy the image to service disk_name = os.path.splitext(os.path.basename(goldimage_path))[0] img_uuid, tid, _ = self._prism_client.images_create( NameUtil.goldimage_vmdisk_name(disk_name, "os"), goldimage_path, self._container_id) TaskPoller.execute_parallel_tasks(tasks=PrismTask.from_task_id( self._prism_client, tid), timeout_secs=3600) # NB: Required due to possible AHV bug. See XRAY-225. num_images_get_retries = 5 for attempt_num in xrange(num_images_get_retries): images_get_data = self._prism_client.images_get(image_id=img_uuid) image_state = images_get_data["image_state"] if image_state.lower() == "active": # Return the disk image return images_get_data["vm_disk_id"] else: log.info( "Waiting for created image to become active " "(imageState: %s, retry %d of %d)", image_state, attempt_num + 1, num_images_get_retries) log.debug(images_get_data) time.sleep(1) else: raise CurieException( CurieError.kInternalError, "Created image failed to become active within " "%d attempts" % num_images_get_retries)