def request_synthesis(server_address, token, end_point, key_name=None, server_name=None, overlay_url=None): # read meta data from vm overlay URL from elijah.provisioning.package import VMOverlayPackage try: from elijah.provisioning import msgpack except ImportError as e: import msgpack overlay_package = VMOverlayPackage(overlay_url) meta_raw = overlay_package.read_meta() meta_info = msgpack.unpackb(meta_raw) requested_basevm_id = meta_info['base_vm_sha256'] # find matching base VM image_list = get_list(server_address, token, end_point, "images") basevm_uuid = None basevm_xml = None basevm_name = None basevm_disk = 0 for image in image_list: properties = image.get("metadata", None) if properties is None or len(properties) == 0: continue if properties.get(CLOUDLET_TYPE.PROPERTY_KEY_CLOUDLET_TYPE) != \ CLOUDLET_TYPE.IMAGE_TYPE_BASE_DISK: continue base_sha256_uuid = properties.get(CLOUDLET_TYPE.PROPERTY_KEY_BASE_UUID) if base_sha256_uuid == requested_basevm_id: basevm_uuid = image['id'] basevm_name = image['name'] basevm_xml = properties.get( CLOUDLET_TYPE.PROPERTY_KEY_BASE_RESOURCE, None) basevm_disk = image.get('minDisk', 0) break if basevm_uuid is None: raise CloudletClientError("Cannot find matching Base VM with (%s)" % str(requested_basevm_id)) # find matching flavor. if basevm_xml is None: msg = "Cannot find resource allocation information of base VM (%s)" %\ str(requested_basevm_id) raise CloudletClientError(msg) cpu_count, memory_mb = get_resource_size(basevm_xml) flavor_list = get_list(server_address, token, end_point, "flavors") flavor_ref, flavor_id = find_matching_flavor(flavor_list, cpu_count, memory_mb, basevm_disk) if flavor_ref == None or flavor_id == None: msg = "Cannot find matching flavor: vcpu (%d), ram (%d MB), disk (%d GB)\n" % ( cpu_count, memory_mb, basevm_disk) msg += "Please create the matching at your OpenStack" raise CloudletClientError(msg) # generate request meta_data = {"overlay_url": overlay_url} s = { "server": { "name": server_name, "imageRef": str(basevm_uuid), "flavorRef": flavor_id, "metadata": meta_data, "min_count": "1", "max_count": "1", "key_name": key_name, } } params = json.dumps(s) headers = {"X-Auth-Token": token, "Content-type": "application/json"} conn = httplib.HTTPConnection(end_point[1]) conn.request("POST", "%s/servers" % end_point[2], params, headers) sys.stdout.write("request new server: %s/servers\n" % (end_point[2])) response = conn.getresponse() data = response.read() dd = json.loads(data) conn.close() return dd
def request_synthesis(server_address, token, end_point, key_name=None, server_name=None, overlay_url=None): # read meta data from vm overlay URL from elijah.provisioning.package import VMOverlayPackage try: from elijah.provisioning import msgpack except ImportError as e: import msgpack overlay_package = VMOverlayPackage(overlay_url) meta_raw = overlay_package.read_meta() meta_info = msgpack.unpackb(meta_raw) requested_basevm_id = meta_info['base_vm_sha256'] # find matching base VM image_list = get_list(server_address, token, end_point, "images") basevm_uuid = None basevm_xml = None basevm_name = None basevm_disk = 0 for image in image_list: properties = image.get("metadata", None) if properties is None or len(properties) == 0: continue if properties.get(CLOUDLET_TYPE.PROPERTY_KEY_CLOUDLET_TYPE) != \ CLOUDLET_TYPE.IMAGE_TYPE_BASE_DISK: continue base_sha256_uuid = properties.get(CLOUDLET_TYPE.PROPERTY_KEY_BASE_UUID) if base_sha256_uuid == requested_basevm_id: basevm_uuid = image['id'] basevm_name = image['name'] basevm_xml = properties.get( CLOUDLET_TYPE.PROPERTY_KEY_BASE_RESOURCE, None) basevm_disk = image.get('minDisk', 0) break if basevm_uuid is None: raise CloudletClientError("Cannot find matching Base VM with (%s)" % str(requested_basevm_id)) # find matching flavor. if basevm_xml is None: msg = "Cannot find resource allocation information of base VM (%s)" %\ str(requested_basevm_id) raise CloudletClientError(msg) cpu_count, memory_mb = get_resource_size(basevm_xml) flavor_list = get_list(server_address, token, end_point, "flavors") flavor_ref, flavor_id = find_matching_flavor(flavor_list, cpu_count, memory_mb, basevm_disk) if flavor_ref == None or flavor_id == None: msg = "Cannot find matching flavor: vcpu (%d), ram (%d MB), disk (%d GB)\n" % ( cpu_count, memory_mb, basevm_disk) msg += "Please create the matching at your OpenStack" raise CloudletClientError(msg) # generate request meta_data = {"overlay_url": overlay_url} s = { "server": { "name": server_name, "imageRef": str(basevm_uuid), "flavorRef": flavor_id, "metadata": meta_data, "min_count": "1", "max_count": "1", "key_name": key_name, }} params = json.dumps(s) headers = {"X-Auth-Token": token, "Content-type": "application/json"} conn = httplib.HTTPConnection(end_point[1]) conn.request("POST", "%s/servers" % end_point[2], params, headers) sys.stdout.write("request new server: %s/servers\n" % (end_point[2])) response = conn.getresponse() data = response.read() dd = json.loads(data) conn.close() return dd
def _spawn_using_synthesis(self, context, instance, xml, image_meta, overlay_url): # download vm overlay overlay_package = VMOverlayPackage(overlay_url) meta_raw = overlay_package.read_meta() meta_info = msgpack.unpackb(meta_raw) basevm_sha256 = meta_info.get(Cloudlet_Const.META_BASE_VM_SHA256, None) image_properties = image_meta.get("properties", None) if image_properties is None: msg = "image does not have properties for cloudlet metadata" raise exception.ImageNotFound(msg) image_sha256 = image_properties.get(CloudletAPI.PROPERTY_KEY_BASE_UUID) # check basevm if basevm_sha256 != image_sha256: msg = "requested base vm is not compatible with openstack base disk %s != %s" \ % (basevm_sha256, image_sha256) raise exception.ImageNotFound(msg) memory_snap_id = str( image_properties.get(CloudletAPI.IMAGE_TYPE_BASE_MEM)) diskhash_snap_id = str( image_properties.get(CloudletAPI.IMAGE_TYPE_BASE_DISK_HASH)) memhash_snap_id = str( image_properties.get(CloudletAPI.IMAGE_TYPE_BASE_MEM_HASH)) basedisk_path = self._get_cache_image(context, instance, image_meta['id']) basemem_path = self._get_cache_image(context, instance, memory_snap_id) diskhash_path = self._get_cache_image(context, instance, diskhash_snap_id) memhash_path = self._get_cache_image(context, instance, memhash_snap_id) # download blob fileutils.ensure_tree(libvirt_utils.get_instance_path(instance)) decomp_overlay = os.path.join( libvirt_utils.get_instance_path(instance), 'decomp_overlay') meta_info = compression.decomp_overlayzip(overlay_url, decomp_overlay) # recover VM launch_disk, launch_mem, fuse, delta_proc, fuse_proc = \ synthesis.recover_launchVM(basedisk_path, meta_info, decomp_overlay, base_mem=basemem_path, base_diskmeta=diskhash_path, base_memmeta=memhash_path) # resume VM LOG.info(_("Starting VM synthesis"), instance=instance) synthesized_vm = synthesis.SynthesizedVM(launch_disk, launch_mem, fuse, disk_only=False, qemu_args=False, nova_xml=xml, nova_conn=self._conn, nova_util=libvirt_utils) # testing non-thread resume delta_proc.start() fuse_proc.start() delta_proc.join() fuse_proc.join() LOG.info(_("Finish VM synthesis"), instance=instance) synthesized_vm.resume() # rettach NIC synthesis.rettach_nic(synthesized_vm.machine, synthesized_vm.old_xml_str, xml) return synthesized_vm
def _spawn_using_synthesis(self, context, instance, xml, image_meta, overlay_url): # download vm overlay overlay_package = VMOverlayPackage(overlay_url) meta_raw = overlay_package.read_meta() meta_info = msgpack.unpackb(meta_raw) basevm_sha256 = meta_info.get(Cloudlet_Const.META_BASE_VM_SHA256, None) image_properties = image_meta.get("properties", None) if image_properties is None: msg = "image does not have properties for cloudlet metadata" raise exception.ImageNotFound(msg) image_sha256 = image_properties.get(CloudletAPI.PROPERTY_KEY_BASE_UUID) # check basevm if basevm_sha256 != image_sha256: msg = "requested base vm is not compatible with openstack base disk %s != %s" % ( basevm_sha256, image_sha256, ) raise exception.ImageNotFound(msg) memory_snap_id = str(image_properties.get(CloudletAPI.IMAGE_TYPE_BASE_MEM)) diskhash_snap_id = str(image_properties.get(CloudletAPI.IMAGE_TYPE_BASE_DISK_HASH)) memhash_snap_id = str(image_properties.get(CloudletAPI.IMAGE_TYPE_BASE_MEM_HASH)) basedisk_path = self._get_cache_image(context, instance, image_meta["id"]) basemem_path = self._get_cache_image(context, instance, memory_snap_id) diskhash_path = self._get_cache_image(context, instance, diskhash_snap_id) memhash_path = self._get_cache_image(context, instance, memhash_snap_id) # download blob fileutils.ensure_tree(libvirt_utils.get_instance_path(instance)) decomp_overlay = os.path.join(libvirt_utils.get_instance_path(instance), "decomp_overlay") meta_info = compression.decomp_overlayzip(overlay_url, decomp_overlay) # recover VM launch_disk, launch_mem, fuse, delta_proc, fuse_proc = synthesis.recover_launchVM( basedisk_path, meta_info, decomp_overlay, base_mem=basemem_path, base_diskmeta=diskhash_path, base_memmeta=memhash_path, ) # resume VM LOG.info(_("Starting VM synthesis"), instance=instance) synthesized_vm = synthesis.SynthesizedVM( launch_disk, launch_mem, fuse, disk_only=False, qemu_args=False, nova_xml=xml, nova_conn=self._conn, nova_util=libvirt_utils, ) # testing non-thread resume delta_proc.start() fuse_proc.start() delta_proc.join() fuse_proc.join() LOG.info(_("Finish VM synthesis"), instance=instance) synthesized_vm.resume() # rettach NIC synthesis.rettach_nic(synthesized_vm.machine, synthesized_vm.old_xml_str, xml) return synthesized_vm