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 request_import_basevm(server_address, token, endpoint, glance_endpoint, import_filepath, basevm_name): def _create_param(filepath, image_name, image_type, disk_size, mem_size): properties = { "image_type": "snapshot", "image_location": "snapshot", CLOUDLET_TYPE.PROPERTY_KEY_CLOUDLET: "True", CLOUDLET_TYPE.PROPERTY_KEY_CLOUDLET_TYPE: image_type, CLOUDLET_TYPE.PROPERTY_KEY_BASE_UUID: base_hashvalue, } param = { "name": "%s" % image_name, "data": open(filepath, "rb"), "size": os.path.getsize(filepath), "is_public": True, "disk_format": "raw", "container_format": "bare", "min_disk": disk_size, "min_ram": mem_size, "properties": properties, } return param (base_hashvalue, disk_name, memory_name, diskhash_name, memoryhash_name) = \ PackagingUtil._get_basevm_attribute(import_filepath) # check duplicated base VM image_list = get_list(server_address, token, endpoint, "images") 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 == base_hashvalue: msg = "Duplicated base VM is already exists on the system\n" msg += "Image UUID of duplicated Base VM: %s\n" % image['id'] raise CloudletClientError(msg) # decompress files temp_dir = mkdtemp(prefix="cloudlet-base-") sys.stdout.write("Decompressing zipfile(%s) to temp dir(%s)\n" % (import_filepath, temp_dir)) zipbase = zipfile.ZipFile( _FileFile("file:///%s" % os.path.abspath(import_filepath)), 'r') zipbase.extractall(temp_dir) disk_path = os.path.join(temp_dir, disk_name) memory_path = os.path.join(temp_dir, memory_name) diskhash_path = os.path.join(temp_dir, diskhash_name) memoryhash_path = os.path.join(temp_dir, memoryhash_name) # create new flavor if nothing matches memory_header = elijah_memory_util._QemuMemoryHeader(open(memory_path)) libvirt_xml_str = memory_header.xml cpu_count, memory_size_mb = get_resource_size(libvirt_xml_str) disk_gb = int(math.ceil(os.path.getsize(disk_path) / 1024 / 1024 / 1024)) flavor_list = get_list(server_address, token, endpoint, "flavors") flavor_ref, flavor_id = find_matching_flavor(flavor_list, cpu_count, memory_size_mb, disk_gb) if flavor_id == None: flavor_name = "cloudlet-flavor-%s" % basevm_name flavor_ref, flavor_id = create_flavor(server_address, token, endpoint, cpu_count, memory_size_mb, disk_gb, flavor_name) sys.stdout.write("Create new flavor for the base VM\n") # upload Base VM disk_param = _create_param(disk_path, basevm_name + "-disk", CLOUDLET_TYPE.IMAGE_TYPE_BASE_DISK, disk_gb, memory_size_mb) memory_param = _create_param(memory_path, basevm_name + "-memory", CLOUDLET_TYPE.IMAGE_TYPE_BASE_MEM, disk_gb, memory_size_mb) diskhash_param = _create_param(diskhash_path, basevm_name + "-diskhash", CLOUDLET_TYPE.IMAGE_TYPE_BASE_DISK_HASH, disk_gb, memory_size_mb) memoryhash_param = _create_param(memoryhash_path, basevm_name + "-memhash", CLOUDLET_TYPE.IMAGE_TYPE_BASE_MEM_HASH, disk_gb, memory_size_mb) url = "://".join((glance_endpoint.scheme, glance_endpoint.netloc)) gclient = glance_client.Client('1', url, token=token, insecure=True) sys.stdout.write("upload base memory to glance\n") glance_memory = gclient.images.create(**memory_param) sys.stdout.write("upload base disk hash to glance\n") glance_diskhash = gclient.images.create(**diskhash_param) sys.stdout.write("upload base memory hash to glance\n") glance_memoryhash = gclient.images.create(**memoryhash_param) # upload Base disk at the last to have references for other image files glance_ref = { CLOUDLET_TYPE.IMAGE_TYPE_BASE_MEM: glance_memory.id, CLOUDLET_TYPE.IMAGE_TYPE_BASE_DISK_HASH: glance_diskhash.id, CLOUDLET_TYPE.IMAGE_TYPE_BASE_MEM_HASH: glance_memoryhash.id, CLOUDLET_TYPE.PROPERTY_KEY_BASE_RESOURCE: libvirt_xml_str.replace("\n", "") # API cannot send '\n' } disk_param['properties'].update(glance_ref) sys.stdout.write("upload base disk to glance\n") glance_disk = gclient.images.create(**disk_param) # delete temp dir if os.path.exists(temp_dir): shutil.rmtree(temp_dir) return glance_disk
def request_import_basevm(server_address, token, endpoint, glance_endpoint, import_filepath, basevm_name): def _create_param(filepath, image_name, image_type, disk_size, mem_size): properties = { "image_type": "snapshot", "image_location": "snapshot", CLOUDLET_TYPE.PROPERTY_KEY_CLOUDLET: "True", CLOUDLET_TYPE.PROPERTY_KEY_CLOUDLET_TYPE: image_type, CLOUDLET_TYPE.PROPERTY_KEY_BASE_UUID: base_hashvalue, } param = { "name": "%s" % image_name, "data": open(filepath, "rb"), "size": os.path.getsize(filepath), "is_public": True, "disk_format": "raw", "container_format": "bare", "min_disk": disk_size, "min_ram": mem_size, "properties": properties, } return param (base_hashvalue, disk_name, memory_name, diskhash_name, memoryhash_name) = \ PackagingUtil._get_basevm_attribute(import_filepath) # check duplicated base VM image_list = get_list(server_address, token, endpoint, "images") 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 == base_hashvalue: msg = "Duplicated base VM is already exists on the system\n" msg += "Image UUID of duplicated Base VM: %s\n" % image['id'] raise CloudletClientError(msg) # decompress files temp_dir = mkdtemp(prefix="cloudlet-base-") sys.stdout.write( "Decompressing zipfile(%s) to temp dir(%s)\n" % (import_filepath, temp_dir)) zipbase = zipfile.ZipFile(_FileFile("file:///%s" % import_filepath), 'r') zipbase.extractall(temp_dir) disk_path = os.path.join(temp_dir, disk_name) memory_path = os.path.join(temp_dir, memory_name) diskhash_path = os.path.join(temp_dir, diskhash_name) memoryhash_path = os.path.join(temp_dir, memoryhash_name) # create new flavor if nothing matches memory_header = elijah_memory_util._QemuMemoryHeader(open(memory_path)) libvirt_xml_str = memory_header.xml cpu_count, memory_size_mb = get_resource_size(libvirt_xml_str) disk_gb = int(math.ceil(os.path.getsize(disk_path)/1024/1024/1024)) flavor_list = get_list(server_address, token, endpoint, "flavors") flavor_ref, flavor_id = find_matching_flavor(flavor_list, cpu_count, memory_size_mb, disk_gb) if flavor_id == None: flavor_name = "cloudlet-flavor-%s" % basevm_name flavor_ref, flavor_id = create_flavor(server_address, token, endpoint, cpu_count, memory_size_mb, disk_gb, flavor_name) sys.stdout.write("Create new flavor for the base VM\n") # upload Base VM disk_param = _create_param(disk_path, basevm_name + "-disk", CLOUDLET_TYPE.IMAGE_TYPE_BASE_DISK, disk_gb, memory_size_mb) memory_param = _create_param(memory_path, basevm_name + "-memory", CLOUDLET_TYPE.IMAGE_TYPE_BASE_MEM, disk_gb, memory_size_mb) diskhash_param = _create_param(diskhash_path, basevm_name + "-diskhash", CLOUDLET_TYPE.IMAGE_TYPE_BASE_DISK_HASH, disk_gb, memory_size_mb) memoryhash_param = _create_param(memoryhash_path, basevm_name + "-memhash", CLOUDLET_TYPE.IMAGE_TYPE_BASE_MEM_HASH, disk_gb, memory_size_mb) url = "://".join((glance_endpoint.scheme, glance_endpoint.netloc)) gclient = glance_client.Client('1', url, token=token, insecure=True) sys.stdout.write("upload base memory to glance\n") glance_memory = gclient.images.create(**memory_param) sys.stdout.write("upload base disk hash to glance\n") glance_diskhash = gclient.images.create(**diskhash_param) sys.stdout.write("upload base memory hash to glance\n") glance_memoryhash = gclient.images.create(**memoryhash_param) # upload Base disk at the last to have references for other image files glance_ref = { CLOUDLET_TYPE.IMAGE_TYPE_BASE_MEM: glance_memory.id, CLOUDLET_TYPE.IMAGE_TYPE_BASE_DISK_HASH: glance_diskhash.id, CLOUDLET_TYPE.IMAGE_TYPE_BASE_MEM_HASH: glance_memoryhash.id, CLOUDLET_TYPE.PROPERTY_KEY_BASE_RESOURCE: libvirt_xml_str.replace("\n", "") # API cannot send '\n' } disk_param['properties'].update(glance_ref) sys.stdout.write("upload base disk to glance\n") glance_disk = gclient.images.create(**disk_param) # delete temp dir if os.path.exists(temp_dir): shutil.rmtree(temp_dir) return glance_disk