def download_file(self, catalog_name, item_name, file_name, chunk_size=DEFAULT_CHUNK_SIZE, callback=None): item = self.get_catalog_item(catalog_name, item_name) enable_href = item.Entity.get('href') + '/action/enableDownload' task = self.client.post_resource(enable_href, None, None) tm = _TaskMonitor(self.client) tm.wait_for_success(task, 60, 1) item = self.client.get_resource(item.Entity.get('href')) size = item.Files.File.get('size') download_href = item.Files.File.Link.get('href') bytes_written = self.client.download_from_uri(download_href, file_name, chunk_size=chunk_size, size=size, callback=callback) return bytes_written
def download_catalog_item(self, catalog_name, item_name, file_name, chunk_size=DEFAULT_CHUNK_SIZE, callback=None, task_callback=None): item = self.get_catalog_item(catalog_name, item_name) item_type = item.Entity.get('type') enable_href = item.Entity.get('href') + '/action/enableDownload' task = self.client.post_resource(enable_href, None, None) tm = _TaskMonitor(self.client) tm.wait_for_success(task, 60, 1, callback=task_callback) item = self.client.get_resource(item.Entity.get('href')) bytes_written = 0 if item_type == EntityType.MEDIA.value: size = item.Files.File.get('size') download_href = item.Files.File.Link.get('href') bytes_written = self.client.download_from_uri( download_href, file_name, chunk_size=chunk_size, size=size, callback=callback) elif item_type == EntityType.VAPP_TEMPLATE.value: ovf_descriptor = self.client.get_linked_resource( item, RelationType.DOWNLOAD_DEFAULT, EntityType.TEXT_XML.value) transfer_uri = find_link(item, RelationType.DOWNLOAD_DEFAULT, EntityType.TEXT_XML.value).href transfer_uri = transfer_uri.replace('/descriptor.ovf', '/') tempdir = None cwd = os.getcwd() try: tempdir = tempfile.mkdtemp(dir='.') ovf_file = os.path.join(tempdir, 'descriptor.ovf') with open(ovf_file, 'wb') as f: payload = etree.tostring( ovf_descriptor, pretty_print=True, xml_declaration=True, encoding='utf-8') f.write(payload) ns = '{' + NSMAP['ovf'] + '}' files = [] for f in ovf_descriptor.References.File: source_file = { 'href': f.get(ns + 'href'), 'name': f.get(ns + 'id'), 'size': f.get(ns + 'size') } target_file = os.path.join(tempdir, source_file['href']) uri = transfer_uri + source_file['href'] num_bytes = self.client.download_from_uri( uri, target_file, chunk_size=chunk_size, size=source_file['size'], callback=callback) if num_bytes != int(source_file['size']): raise Exception('download incomplete for file %s' % source_file['href']) files.append(source_file) with tarfile.open(file_name, 'w') as tar: os.chdir(tempdir) tar.add('descriptor.ovf') for f in files: tar.add(f['href']) finally: if tempdir is not None: os.chdir(cwd) stat_info = os.stat(file_name) bytes_written = stat_info.st_size return bytes_written
def download_catalog_item(self, catalog_name, item_name, file_name, chunk_size=DEFAULT_CHUNK_SIZE, callback=None, task_callback=None): item = self.get_catalog_item(catalog_name, item_name) item_type = item.Entity.get('type') enable_href = item.Entity.get('href') + '/action/enableDownload' task = self.client.post_resource(enable_href, None, None) tm = _TaskMonitor(self.client) tm.wait_for_success(task, 60, 1, callback=task_callback) item = self.client.get_resource(item.Entity.get('href')) bytes_written = 0 if item_type == EntityType.MEDIA.value: size = item.Files.File.get('size') download_href = item.Files.File.Link.get('href') bytes_written = self.client.download_from_uri( download_href, file_name, chunk_size=chunk_size, size=size, callback=callback) elif item_type == EntityType.VAPP_TEMPLATE.value: ovf_descriptor = self.client.get_linked_resource( item, RelationType.DOWNLOAD_DEFAULT, EntityType.TEXT_XML.value) transfer_uri = find_link(item, RelationType.DOWNLOAD_DEFAULT, EntityType.TEXT_XML.value).href transfer_uri = transfer_uri.replace('/descriptor.ovf', '/') tempdir = None cwd = os.getcwd() try: tempdir = tempfile.mkdtemp(dir='.') ovf_file = os.path.join(tempdir, 'descriptor.ovf') with open(ovf_file, 'wb') as f: payload = etree.tostring(ovf_descriptor, pretty_print=True, xml_declaration=True, encoding='utf-8') f.write(payload) ns = '{http://schemas.dmtf.org/ovf/envelope/1}' files = [] for f in ovf_descriptor.References.File: source_file = { 'href': f.get(ns + 'href'), 'name': f.get(ns + 'id'), 'size': f.get(ns + 'size') } target_file = os.path.join(tempdir, source_file['href']) uri = transfer_uri + source_file['href'] num_bytes = self.client.download_from_uri( uri, target_file, chunk_size=chunk_size, size=source_file['size'], callback=callback) if num_bytes != source_file['size']: raise Exception('download incomplete for file %s' % source_file['href']) files.append(source_file) with tarfile.open(file_name, 'w') as tar: os.chdir(tempdir) tar.add('descriptor.ovf') for f in files: tar.add(f['href']) finally: if tempdir is not None: os.chdir(cwd) stat_info = os.stat(file_name) bytes_written = stat_info.st_size # shutil.rmtree(tempdir) return bytes_written
if len(sys.argv) != 6: print("Usage: python3 {0} host org user password vdc".format(sys.argv[0])) sys.exit(1) host = sys.argv[1] org = sys.argv[2] user = sys.argv[3] password = sys.argv[4] task = sys.argv[5] # Disable warnings from self-signed certificates. requests.packages.urllib3.disable_warnings() print("Logging in: host={0}, org={1}, user={2}".format(host, org, user)) client = Client(host, api_version='29.0', verify_ssl_certs=False, log_file='pyvcloud.log', log_requests=True, log_headers=True, log_bodies=True) client.set_credentials(BasicLoginCredentials(user, org, password)) print("API URL is :" + client.get_api_uri()) print("API Version is :" + client.get_api_version()) taskhref = client.get_uriobject_uuid(task, UriObjectType.TASK.value) print("Task HREF : " + taskhref) task = _TaskMonitor(client) task_resource= task._get_task_status(taskhref) task_status = task.wait_for_success(task_resource) print("Complete")