def export(server, vm_obj): # Request an export request = VI.ExportVmRequestMsg() _this = request.new__this(vm_obj._mor) _this.set_attribute_type(vm_obj._mor.get_attribute_type()) request.set_element__this(_this) ret = server._proxy.ExportVm(request) # List of urls to download mor = ret._returnval http = VIProperty(connection, ret._returnval) url = http.info.deviceUrl[0].url # TODO: actually download them. # Set to 100% request = VI.HttpNfcLeaseProgressRequestMsg() _this = request.new__this(mor) _this.set_attribute_type(MORTypes.HttpNfcLease) request.set_element__this(_this) request.set_element_percent(100) server._proxy.HttpNfcLeaseProgress(request) # Completes the request request = VI.HttpNfcLeaseCompleteRequestMsg() _this = request.new__this(mor) _this.set_attribute_type(MORTypes.HttpNfcLease) request.set_element__this(_this) server._proxy.HttpNfcLeaseComplete(request)
def lease(http_nfc_lease, ovf_file_path, server): u"""Uploading request files. @param http_nfc_lease Lease @param server Insrance of VIServer """ # Import import time import threading from pysphere import VIProperty from pysphere.resources import VimService_services as VI go_on = True lease = VIProperty(server, http_nfc_lease) while lease.state == 'initializing': print lease.state lease._flush_cache() if lease.state != 'ready': print "something went wrong" exit() def keep_lease_alive(lease): u"""プロセスを継続させる @param leaese 仮のVM """ request = VI.HttpNfcLeaseProgressRequestMsg() _this = request.new__this(lease) _this.set_attribute_type(lease.get_attribute_type()) request.set_element__this(_this) request.set_element_percent(50) while go_on: server._proxy.HttpNfcLeaseProgress(request) time.sleep(5) t = threading.Thread(target=keep_lease_alive, args=(http_nfc_lease,)) t.start() # Upload print 'Uploading...' upload_format_file(lease, '.vmdk', ovf_file_path, server) go_on = False t.join() request = VI.HttpNfcLeaseCompleteRequestMsg() _this = request.new__this(http_nfc_lease) _this.set_attribute_type(http_nfc_lease.get_attribute_type()) request.set_element__this(_this) server._proxy.HttpNfcLeaseComplete(request)
t.start() for dev_url in lease.info.deviceUrl: filename = dev_url.targetId hostname = urlparse(s._proxy.binding.url).hostname upload_url = dev_url.ulr.replace("*", hostname) filename = os.path.join(os.path.dirname(OVF_FILE), filename) fsize = os.stat(filename).st_size f = open(filename, 'rb') mmapped_file = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) request = urllib2.Request(upload_url, upload_url=mmapped_file) request.add_header("Content-Type", "application/x-vnd.vmware-streamVmdk") request.add_header("Connection", "Keep-Alive") request.add_header("Content-Length", str(fsize)) opener = urllib2.build_opener(urllib2.HTTPHandler) resp = opener.open(request) mmapped_file.close() f.close() go_on = False t.join() request = VI.HttpNfcLeaseCompleteRequestMsg() _this = request.new__this(http_nfc_lease) _this.set_attribute_type(http_nfc_lease.get_attribute_type()) request.set_element__this(_this) s._proxy.HttpNfcLeaseComplete(request) finally: s.disconnect()