def delete_collection(self, irods_collection): """Delete a collection in iRODS irods_collection : path (str)""" collInp = irods.collInp_t() irods.addKeyVal(collInp.condInput, irods.RECURSIVE_OPR__KW, "") collInp.collName = irods_collection return irods.rcRmColl(self.conn, collInp, 0)
def update_from_file(self, obj, file_name=None, create=False, **kwargs): assert 'dir_only' not in kwargs, 'update_from_file(): `dir_only` parameter is invalid here' # do not create if not requested if create and not self.exists(obj, **kwargs): raise ObjectNotFound() if file_name is None: file_name = self.__get_cache_path(obj, **kwargs) # put will create if necessary doi = irods.dataObjInp_t() doi.objPath = self.__get_rods_path(obj, **kwargs) doi.createMode = 0o640 doi.dataSize = os.stat(file_name).st_size doi.numThreads = 0 irods.addKeyVal(doi.condInput, irods.DEST_RESC_NAME_KW, self.default_resource) irods.addKeyVal(doi.condInput, irods.FORCE_FLAG_KW, '') # TODO: might want to VERIFY_CHKSUM_KW log.debug('update_from_file(): updating %s to %s', file_name, doi.objPath) # do the iput status = irods.rcDataObjPut(self.rods_conn, doi, file_name) assert status == 0, 'update_from_file(): iput %s failed (%s): %s' % ( doi.objPath, status, irods.strerror(status))
def update_from_file(self, obj, file_name=None, create=False, **kwargs): assert "dir_only" not in kwargs, "update_from_file(): `dir_only` parameter is invalid here" # do not create if not requested if create and not self.exists(obj, **kwargs): raise ObjectNotFound() if file_name is None: file_name = self.__get_cache_path(obj, **kwargs) # put will create if necessary doi = irods.dataObjInp_t() doi.objPath = self.__get_rods_path(obj, **kwargs) doi.createMode = 0640 doi.dataSize = os.stat(file_name).st_size doi.numThreads = 0 irods.addKeyVal(doi.condInput, irods.DEST_RESC_NAME_KW, self.default_resource) irods.addKeyVal(doi.condInput, irods.FORCE_FLAG_KW, "") # TODO: might want to VERIFY_CHKSUM_KW log.debug("update_from_file(): updating %s to %s", file_name, doi.objPath) # do the iput status = irods.rcDataObjPut(self.rods_conn, doi, file_name) assert status == 0, "update_from_file(): iput %s failed (%s): %s" % ( doi.objPath, status, irods.strerror(status), )
def download_files(self, irods_files, targPath, overwrite=False): """Download a list of files from irods to a local directory irods_files : list of tuples (collection, file, resource) targPath : local path If some files already exist in the local directory and if the overwrite option is not set then a structure is returned, the caller will then have to define a strategy.""" dataObjOprInp = irods.dataObjInp_t() dataObjOprInp.openFlags = irods.O_RDONLY if overwrite: irods.addKeyVal(dataObjOprInp.condInput, irods.FORCE_FLAG_KW, "") already_there = [] for (collection, irods_file, resource) in irods_files: if resource: irods.addKeyVal(dataObjOprInp.condInput, irods.RESC_NAME_KW, resource) dataObjOprInp.objPath = collection + '/' + irods_file status = irods.rcDataObjGet(self.conn, dataObjOprInp, targPath + os.sep + irods_file) # If the file is already present we catch the error if status == irods.OVERWRITE_WITHOUT_FORCE_FLAG: already_there.append((collection, irods_file, resource)) return already_there
def new_collection(self, irods_path): """Make a new directory in iRods""" collCreateInp = irods.collInp_t() irods.addKeyVal(collCreateInp.condInput, irods.RECURSIVE_OPR__KW, "") collCreateInp.collName = irods_path status = irods.rcCollCreate(self.conn, collCreateInp) return status
def delete_file(self, path, resc=None): """Delete a file in iRODS path : irods path (str) resc : Resource""" dataObjInp = irods.dataObjInp_t() dataObjInp.openFlags = irods.O_RDONLY if resc: d = irods.getFileInfo(path, resc) irods.addKeyVal(dataObjInp.condInput, irods.REPL_NUM_KW, d['data_repl_num']) dataObjInp.objPath = path status = irods.rcDataObjUnlink(self.conn, dataObjInp) return status
def delete_files(self, irods_files): """Delete a list of files from iRODS irods_files : list of tuples (collection, file, resource)""" dataObjInp = irods.dataObjInp_t() dataObjInp.openFlags = irods.O_RDONLY st = [] for (collection, irods_file, resource) in irods_files: d = irods.getFileInfo(self.conn, collection, irods_file, resource) irods.addKeyVal(dataObjInp.condInput, irods.REPL_NUM_KW, d['data_repl_num']) dataObjInp.objPath = collection + '/' + irods_file status = irods.rcDataObjUnlink(self.conn, dataObjInp) st.append(status) return st
def upload_file(self, local_path, irods_path, resource=None, overwrite=False): """Upload a file to irods return True if the file is already present""" dataObjOprInp = irods.dataObjInp_t() dataObjOprInp.oprType = irods.PUT_OPR dataObjOprInp.openFlags = irods.O_RDWR if overwrite: irods.addKeyVal(dataObjOprInp.condInput, irods.FORCE_FLAG_KW, "") if resource: irods.addKeyVal(dataObjOprInp.condInput, irods.DEST_RESC_NAME_KW, resource) dataObjOprInp.objPath = irods_path status = irods.rcDataObjPut(self.conn, dataObjOprInp, local_path) return status == irods.OVERWRITE_WITHOUT_FORCE_FLAG
def download_file(self, irods_path, local_path, resource=None, overwrite=False): """Download a file from irods to a local directory - irods_files : list of tuples (collection, file, resource) - local path - resource - overwrite the exisiting file if it exists""" dataObjOprInp = irods.dataObjInp_t() dataObjOprInp.openFlags = irods.O_RDONLY if overwrite: irods.addKeyVal(dataObjOprInp.condInput, irods.FORCE_FLAG_KW, "") if resource: irods.addKeyVal(dataObjOprInp.condInput, irods.RESC_NAME_KW, resource) dataObjOprInp.objPath = irods_path status = irods.rcDataObjGet(self.conn, dataObjOprInp, local_path) return status == irods.OVERWRITE_WITHOUT_FORCE_FLAG
def create(self, obj, **kwargs): if not self.exists( obj, **kwargs ): rods_path = self.__get_rods_path( obj, **kwargs ) log.debug( 'create(): %s', rods_path ) dir_only = kwargs.get( 'dir_only', False ) # short circuit collection creation since most of the time it will # be the root collection which already exists collection_path = rods_path if dir_only else path_dirname( rods_path ) if collection_path != self.root_collection_path: self.__mkcolls( collection_path ) if not dir_only: # rcDataObjCreate is used instead of the irodsOpen wrapper so # that we can prevent overwriting doi = irods.dataObjInp_t() doi.objPath = rods_path doi.createMode = 0o640 doi.dataSize = 0 # 0 actually means "unknown", although literally 0 would be preferable irods.addKeyVal( doi.condInput, irods.DEST_RESC_NAME_KW, self.default_resource ) status = irods.rcDataObjCreate( self.rods_conn, doi ) assert status >= 0, 'create(): rcDataObjCreate() failed: %s: %s: %s' % ( rods_path, status, irods.strerror( status ) )
def replicate_file(self, file_info, dst_resource): """Replicate a file in irods file_info : (collection, file, resource) dst_resource : str""" (collection, irods_file, src_resource) = file_info dataObjInp = irods.dataObjInp_t() d = irods.getFileInfo(self.conn, collection, irods_file, src_resource) cond_inp = dataObjInp.condInput irods.addKeyVal(cond_inp, irods.REPL_NUM_KW, d['data_repl_num']) irods.addKeyVal(cond_inp, irods.RESC_NAME_KW, src_resource) irods.addKeyVal(cond_inp, irods.DEST_RESC_NAME_KW, dst_resource) dataObjInp.objPath = collection + '/' + irods_file status = irods.rcDataObjRepl(self.conn, dataObjInp) return status