Exemplo n.º 1
0
int
_rsDataObjCreate( rsComm_t *rsComm, dataObjInp_t *dataObjInp ) {

    int status;
    int l1descInx;
    std::string resc_name;

    /* query rcat for resource info and sort it */
    status = getRescForCreate( rsComm, dataObjInp, resc_name );
    if ( status < 0 || resc_name.empty() ) {
        rodsLog( LOG_ERROR, "_rsDataObjCreate : failed in call to getRescForCreate. status = %d", status );
        return status;
    }

    status = l1descInx = _rsDataObjCreateWithResc( rsComm, dataObjInp, resc_name );

    // JMC - legacy resource - if (status < 0) {
    if ( status >= 0 ) {
        return status;
    }
    else {
        rodsLog( LOG_NOTICE,
                 "rsDataObjCreate: Internal error" );
        return SYS_INTERNAL_NULL_INPUT_ERR;
    }
}
Exemplo n.º 2
0
/* createEmptyRepl - Physically create a zero length file and register
 * as a replica and queue the dataObjInfo on the top of dataObjInfoHead.
 */
int
createEmptyRepl( rsComm_t *rsComm, dataObjInp_t *dataObjInp,
                 dataObjInfo_t **dataObjInfoHead ) {
    int status;
    regReplica_t regReplicaInp;
    keyValPair_t *condInput = &dataObjInp->condInput;
    dataObjInfo_t *myDataObjInfo;

    std::string resc_name;

    if ( getValByKey( condInput, DEST_RESC_NAME_KW ) == NULL &&
            getValByKey( condInput, BACKUP_RESC_NAME_KW ) == NULL &&
            getValByKey( condInput, DEF_RESC_NAME_KW ) == NULL ) {
        return USER_NO_RESC_INPUT_ERR;
    }

    status = getRescForCreate( rsComm, dataObjInp, resc_name );
    if ( status < 0 || resc_name.empty() ) {
        return status;    // JMC cppcheck
    }

    myDataObjInfo = ( dataObjInfo_t* )malloc( sizeof( dataObjInfo_t ) );
    *myDataObjInfo = *( *dataObjInfoHead );

    rstrcpy( myDataObjInfo->rescName, ( *dataObjInfoHead )->rescName, NAME_LEN );

    char* resc_hier = getValByKey( &dataObjInp->condInput, RESC_HIER_STR_KW );
    if ( resc_hier ) {
        rstrcpy( myDataObjInfo->rescHier, resc_hier, MAX_NAME_LEN ); // hier sent from upper level code
    }
    else {
        rodsLog( LOG_NOTICE, "createEmptyRepl :: using rescName for hier" );
        rstrcpy( myDataObjInfo->rescHier, ( *dataObjInfoHead )->rescName, MAX_NAME_LEN ); // in kw else
    }

    rodsLong_t resc_id;
    irods::error ret = resc_mgr.hier_to_leaf_id( myDataObjInfo->rescHier, resc_id );
    myDataObjInfo->rescId = resc_id;

    status = getFilePathName( rsComm, myDataObjInfo, dataObjInp );
    if ( status < 0 ) {
        rodsLog( LOG_ERROR, "getFilePathName failed in %s with status %d", __FUNCTION__, status );
        return status;
    }

    status = l3CreateByObjInfo( rsComm, dataObjInp, myDataObjInfo );
    if ( status < 0 ) {
        rodsLog( LOG_ERROR, "l3CreateByObjInfo failed in %s with status %d", __FUNCTION__, status );
        return status;
    }

    /* close it */
    _l3Close( rsComm, status );

    /* register the replica */
    memset( &regReplicaInp, 0, sizeof( regReplicaInp ) );
    regReplicaInp.srcDataObjInfo = *dataObjInfoHead;
    regReplicaInp.destDataObjInfo = myDataObjInfo;
    if ( getValByKey( &dataObjInp->condInput, ADMIN_KW ) != NULL ) {
        addKeyVal( &regReplicaInp.condInput, ADMIN_KW, "" );
    }
    status = rsRegReplica( rsComm, &regReplicaInp );
    clearKeyVal( &regReplicaInp.condInput );


    if ( status < 0 ) {
        free( myDataObjInfo );
    }
    else {
        /* queue it on top */
        myDataObjInfo->next = *dataObjInfoHead;
        *dataObjInfoHead = myDataObjInfo;
    }
    return status;
}
Exemplo n.º 3
0
int
rsDataObjPhymv( rsComm_t *rsComm, dataObjInp_t *dataObjInp,
                transferStat_t **transStat ) {
    int status = 0;
    dataObjInfo_t *dataObjInfoHead = NULL;
    dataObjInfo_t *oldDataObjInfoHead = NULL;
    ruleExecInfo_t rei;
    int multiCopyFlag = 0;
    char *accessPerm = NULL;
    int remoteFlag = 0;
    rodsServerHost_t *rodsServerHost = NULL;
    specCollCache_t *specCollCache = NULL;
    std::string resc_name;

    resolveLinkedPath( rsComm, dataObjInp->objPath, &specCollCache,
                       &dataObjInp->condInput );
    remoteFlag = getAndConnRemoteZone( rsComm, dataObjInp, &rodsServerHost,
                                       REMOTE_OPEN );

    if ( remoteFlag < 0 ) {
        return remoteFlag;
    }
    else if ( remoteFlag == REMOTE_HOST ) {
        status = _rcDataObjPhymv( rodsServerHost->conn, dataObjInp,
                                  transStat );
        return status;
    }

    char* dest_resc = getValByKey( &dataObjInp->condInput, DEST_RESC_NAME_KW );
    if ( dest_resc ) {
        std::string dest_hier; 
        irods::error ret = resolve_hierarchy_for_resc_from_cond_input(
                               rsComm,
                               dest_resc,
                               dest_hier );
        if( !ret.ok() ) {
            irods::log( PASS( ret ) );
            return ret.code();
        }
        addKeyVal(
            &dataObjInp->condInput,
            DEST_RESC_HIER_STR_KW,
            dest_hier.c_str() );
    }

    // =-=-=-=-=-=-=-
    // determine hierarchy string
	char* dest_hier_kw = getValByKey( &dataObjInp->condInput, DEST_RESC_HIER_STR_KW );
    if ( NULL == dest_hier_kw || 0 == strlen(dest_hier_kw) ) {
        std::string       hier;
        irods::error ret = irods::resolve_resource_hierarchy(
			irods::CREATE_OPERATION,
			rsComm,
			dataObjInp,
			hier );
        if ( !ret.ok() ) {
            std::stringstream msg;
            msg << __FUNCTION__;
            msg << " :: failed in irods::resolve_resource_hierarchy for [";
            msg << dataObjInp->objPath << "]";
            irods::log( PASSMSG( msg.str(), ret ) );
            return ret.code();
        }

        // =-=-=-=-=-=-=-
        // we resolved the redirect and have a host, set the hier str for subsequent
        // api calls, etc.
        addKeyVal(
		    &dataObjInp->condInput,
			DEST_RESC_HIER_STR_KW,
			hier.c_str() );
    } // if keyword

    char* src_resc = getValByKey( &dataObjInp->condInput, RESC_NAME_KW );
    if ( src_resc ) {
        std::string src_hier; 
        irods::error ret = resolve_hierarchy_for_resc_from_cond_input(
                               rsComm,
                               src_resc,
                               src_hier );
        if( !ret.ok() ) {
            irods::log( PASS( ret ) );
            return ret.code();
        }
        addKeyVal(
            &dataObjInp->condInput,
            RESC_HIER_STR_KW,
            src_hier.c_str() );
    }

    // =-=-=-=-=-=-=-
    // determine hierarchy string
	char* resc_hier_kw = getValByKey( &dataObjInp->condInput, RESC_HIER_STR_KW );
    if ( NULL == resc_hier_kw || 0 == strlen(resc_hier_kw) ) {
        std::string       hier;
        irods::error ret = irods::resolve_resource_hierarchy(
		                       irods::OPEN_OPERATION,
							   rsComm,
                               dataObjInp,
							   hier );
        if ( !ret.ok() ) {
            std::stringstream msg;
            msg << __FUNCTION__;
            msg << " :: failed in irods::resolve_resource_hierarchy for [";
            msg << dataObjInp->objPath << "]";
            irods::log( PASSMSG( msg.str(), ret ) );
            return ret.code();
        }

        // =-=-=-=-=-=-=-
        // we resolved the redirect and have a host, set the hier str for subsequent
        // api calls, etc.
        addKeyVal(
		    &dataObjInp->condInput,
			RESC_HIER_STR_KW,
			hier.c_str() );
    } // if keyword

    *transStat = ( transferStat_t* )malloc( sizeof( transferStat_t ) );
    memset( *transStat, 0, sizeof( transferStat_t ) );

    if( getValByKey( &dataObjInp->condInput, ADMIN_KW ) != NULL ) {
        if ( rsComm->clientUser.authInfo.authFlag < LOCAL_PRIV_USER_AUTH ) {
            return CAT_INSUFFICIENT_PRIVILEGE_LEVEL;
        }
        accessPerm = NULL;
    }
    else {
        accessPerm = ACCESS_DELETE_OBJECT;
    }

    // query rcat for resource info and sort it
    status = getRescForCreate(
	             rsComm,
				 dataObjInp,
				 resc_name );
    if( status < 0 ) {
        return status;
    }
    initReiWithDataObjInp(
	    &rei,
		rsComm,
		dataObjInp );
    status = applyRule(
	             "acSetMultiReplPerResc",
				 NULL,
				 &rei,
				 NO_SAVE_REI );
    if ( strcmp( rei.statusStr, MULTI_COPIES_PER_RESC ) == 0 ) {
        multiCopyFlag = 1;
    }
    else {
        multiCopyFlag = 0;
    }

    // query rcat for dataObjInfo and sort it
    status = getDataObjInfo(
	             rsComm,
				 dataObjInp,
				 &dataObjInfoHead,
                 accessPerm, 1 );

    if ( status < 0 ) {
        rodsLog(
		    LOG_NOTICE,
            "rsDataObjPhymv: getDataObjInfo for %s",
			dataObjInp->objPath );
        return status;
    }

    irods::error ret = test_source_replica_for_write_permissions(
	                       rsComm,
	                       dataObjInfoHead );
	if( !ret.ok() ) {
        irods::log( PASS( ret ) );
		return ret.code();
	}

    status = resolveInfoForPhymv(
	             &dataObjInfoHead,
				 &oldDataObjInfoHead,
				 resc_name,
				 &dataObjInp->condInput,
				 multiCopyFlag );
    if ( status < 0 ) {
        freeAllDataObjInfo( dataObjInfoHead );
        freeAllDataObjInfo( oldDataObjInfoHead );
        if ( status == CAT_NO_ROWS_FOUND ) {
            return 0;
        }
        else {
            return status;
        }
    }
    status = _rsDataObjPhymv(
	             rsComm,
				 dataObjInp,
				 dataObjInfoHead,
				 resc_name.c_str(),
                 *transStat,
				 multiCopyFlag );

    freeAllDataObjInfo( dataObjInfoHead );
    freeAllDataObjInfo( oldDataObjInfoHead );

    return status;
}