def get_fed_zone_files(irods_fnames): """ Get the files from iRODS federated zone to Django server for metadata extraction on-demand for specific resource types Args: irods_fnames: the logical iRODS file names with full logical path separated by comma Returns: a list of the named temp files which have been copied over to local Django server or raise exceptions if input parameter is wrong or iRODS operations fail """ ret_file_list = [] if isinstance(irods_fnames, basestring): ifnames = string.split(irods_fnames, ',') elif isinstance(irods_fnames, list): ifnames = irods_fnames else: raise ValueError( "Input parameter to get_fed_zone_files() must be String or List") irods_storage = IrodsStorage('federated') for ifname in ifnames: fname = os.path.basename(ifname.rstrip(os.sep)) tmpdir = os.path.join(settings.TEMP_FILE_DIR, uuid4().hex) tmpfile = os.path.join(tmpdir, fname) try: os.makedirs(tmpdir) except OSError as ex: if ex.errno == errno.EEXIST: shutil.rmtree(tmpdir) os.makedirs(tmpdir) else: raise Exception(ex.message) irods_storage.getFile(ifname, tmpfile) ret_file_list.append(tmpfile) return ret_file_list
def get_file_from_irods(res_file): """ Copy the file (res_file) from iRODS (local or federated zone) over to django (temp directory) which is necessary for manipulating the file (e.g. metadata extraction). Note: The caller is responsible for cleaning the temp directory :param res_file: an instance of ResourceFile :return: location of the copied file """ res = res_file.resource if res_file.fed_resource_file or res_file.fed_resource_file_name_or_path: istorage = IrodsStorage('federated') else: istorage = IrodsStorage() if res_file.resource_file: res_file_path = res_file.resource_file.name file_name = os.path.basename(res_file.resource_file.name) elif res_file.fed_resource_file: res_file_path = res_file.fed_resource_file.name file_name = os.path.basename(res_file.fed_resource_file.name) else: res_file_path = os.path.join(res.resource_federation_path, res.short_id, res_file.fed_resource_file_name_or_path) file_name = os.path.basename(res_file.fed_resource_file_name_or_path) tmpdir = os.path.join(settings.TEMP_FILE_DIR, uuid4().hex) tmpfile = os.path.join(tmpdir, file_name) try: os.makedirs(tmpdir) except OSError as ex: if ex.errno == errno.EEXIST: shutil.rmtree(tmpdir) os.makedirs(tmpdir) else: raise Exception(ex.message) istorage.getFile(res_file_path, tmpfile) copied_file = tmpfile return copied_file
def get_fed_zone_files(irods_fnames): """ Get the files from iRODS federated zone to Django server for metadata extraction on-demand for specific resource types Args: irods_fnames: the logical iRODS file names with full logical path separated by comma Returns: a list of the named temp files which have been copied over to local Django server or raise exceptions if input parameter is wrong or iRODS operations fail Note: application must delete these files after use. """ ret_file_list = [] if isinstance(irods_fnames, basestring): ifnames = string.split(irods_fnames, ',') elif isinstance(irods_fnames, list): ifnames = irods_fnames else: raise ValueError("Input parameter to get_fed_zone_files() must be String or List") irods_storage = IrodsStorage('federated') for ifname in ifnames: fname = os.path.basename(ifname.rstrip(os.sep)) # TODO: this is statistically unique but not guaranteed to be unique. tmpdir = os.path.join(settings.TEMP_FILE_DIR, uuid4().hex) tmpfile = os.path.join(tmpdir, fname) try: os.makedirs(tmpdir) except OSError as ex: if ex.errno == errno.EEXIST: shutil.rmtree(tmpdir) os.makedirs(tmpdir) else: raise Exception(ex.message) irods_storage.getFile(ifname, tmpfile) ret_file_list.append(tmpfile) return ret_file_list