예제 #1
0
파일: api_tms.cpp 프로젝트: SysFera/vishnu
/**
 * \brief The listJobs function gets a list of all submitted jobs
 * \param sessionKey : The session key
 * \param listOfJobs : The constructed object list of jobs
 * \param options : Additional options for jobs listing
 * \return int : an error code
 */
int
vishnu::listJobs(const std::string& sessionKey,
                 TMS_Data::ListJobs& listOfJobs,
                 const TMS_Data::ListJobsOptions& options)
throw (UMSVishnuException, TMSVishnuException, UserException, SystemException) {

  checkEmptyString(sessionKey, "The session key");

  UMS_Data::Machine_ptr machine = new UMS_Data::Machine();
  const std::string machineId = ALL_KEYWORD;

  // Here the list of machine should contain only a single machine
  machine->setMachineId(machineId);

  listOfJobs.setNbJobs(0);
  listOfJobs.setNbRunningJobs(0);
  listOfJobs.setNbWaitingJobs(0);


  std::string serviceName = (boost::format("%1%") % SERVICES_TMS[GETLISTOFJOBS_ALL]).str();
  SessionProxy sessionProxy(sessionKey);

  checkJobStatus(options.getStatus()); // check the job status options
  checkJobPriority(options.getPriority()); //check the job priority options

  QueryProxy<TMS_Data::ListJobsOptions, TMS_Data::ListJobs>
      query(options, sessionProxy, serviceName, machine->getMachineId());
  TMS_Data::ListJobs* listJobs_ptr = NULL;
  try {
    listJobs_ptr = query.list();
  } catch(...) {
    throw ;
  }
  if (listJobs_ptr != NULL) {

    TMS_Data::TMS_DataFactory_ptr ecoreFactory = TMS_Data::TMS_DataFactory::_instance();
    for (unsigned int j = 0; j < listJobs_ptr->getJobs().size(); j++) {
      TMS_Data::Job_ptr job = ecoreFactory->createJob();
      //copy the content and not the pointer
      *job = *listJobs_ptr->getJobs().get(j);
      listOfJobs.getJobs().push_back(job);
    }
    listOfJobs.setNbJobs(listOfJobs.getNbJobs()+listJobs_ptr->getJobs().size());
    listOfJobs.setNbRunningJobs(listOfJobs.getNbRunningJobs()+listJobs_ptr->getNbRunningJobs());
    listOfJobs.setNbWaitingJobs(listOfJobs.getNbWaitingJobs()+listJobs_ptr->getNbWaitingJobs());
    delete listJobs_ptr;
  }
  return 0;
}
예제 #2
0
int
main (int argc, char* argv[]) {
  /******* Parsed value containers ****************/
  std::string configFile;
  std::string sessionKey;
  std::string stateStr = "";
  int state;
  std::string fromDate;
  std::string toDate;

  int retCode = 0;
  /********** EMF data ************/
  TMS_Data::ListJobsOptions jobOp;

  /******** Callback functions ******************/
  boost::function1<void,string> setMachineIdFct(boost::bind(&TMS_Data::ListJobsOptions::setMachineId,boost::ref(jobOp),_1));
  boost::function1<void,string> setJobIdFct(boost::bind(&TMS_Data::ListJobsOptions::setJobId,boost::ref(jobOp),_1));
  boost::function1<void,int> setNbCpuFct(boost::bind(&TMS_Data::ListJobsOptions::setNbCpu,boost::ref(jobOp),_1));
  boost::function1<void,string> setOwnerFct(boost::bind(&TMS_Data::ListJobsOptions::setOwner,boost::ref(jobOp),_1));
  boost::function1<void,TMS_Data::JobPriority> setPriorityFct(boost::bind(&TMS_Data::ListJobsOptions::setPriority,boost::ref(jobOp),_1));
  boost::function1<void,string> setQueueFct(boost::bind(&TMS_Data::ListJobsOptions::setQueue,boost::ref(jobOp),_1));
  boost::function1<void,string> setMultipleStatusesFct(boost::bind(&TMS_Data::ListJobsOptions::setMultipleStatus,boost::ref(jobOp),_1));
  boost::function1<void,long long> setWorkIdFct(boost::bind(&TMS_Data::ListJobsOptions::setWorkId,boost::ref(jobOp),_1));

  /*********** Out parameters *********************/
  TMS_Data::ListJobs jobs;

  /**************** Describe options *************/
  boost::shared_ptr<Options> opt = makeListJobOp(argv[0],
                                                 setMachineIdFct,
                                                 setJobIdFct,
                                                 setNbCpuFct,
                                                 fromDate,
                                                 toDate,
                                                 setOwnerFct,
                                                 stateStr,
                                                 setPriorityFct,
                                                 setQueueFct,
                                                 setMultipleStatusesFct,
                                                 setWorkIdFct,
                                                 sessionKey,
                                                 configFile);

  opt->add("isListAll,l",
           "allows to list all information",
           CONFIG);

  // pre-process options
  bool isEmpty;
  GenericCli().processListOpt(opt, isEmpty, argc, argv);

  // Process command
  try {
    if (stateStr.size()!=0) {
      size_t pos = stateStr.find_first_not_of("0123456789");
      if (pos!=std::string::npos) {
        if (stateStr.size() == 1) {
          switch(stateStr[0]) {
          case 'S' :
            state = vishnu::STATE_SUBMITTED;
            break;
          case 'Q' :
            state = vishnu::STATE_QUEUED;
            break;
          case 'W' :
            state = vishnu::STATE_WAITING;
            break;
          case 'R' :
            state = vishnu::STATE_RUNNING;
            break;
          case 'T' :
            state = vishnu::STATE_COMPLETED;
            break;
          case 'C' :
            state = vishnu::STATE_CANCELLED;
            break;
          case 'D' :
            state = vishnu::STATE_DOWNLOADED;
            break;
          case 'F' :
            state = vishnu::STATE_FAILED;
            break;
          default:
            state = vishnu::STATE_UNDEFINED;
            break;
          }
        }
        if (stateStr.size() > 1 || state < 0) {
          std::cerr <<  (boost::format("Unknown job state: %1%")%stateStr).str();
          return CLI_ERROR_INVALID_PARAMETER;
        }
      } else {
        state = convertToInt(stateStr);
      }
      jobOp.setStatus(state);
    }
    //convert the date in long format
    if (opt->count("fromSubmitDate")) {
      jobOp.setFromSubmitDate(string_to_time_t(fromDate));
    }

    if (opt->count("toSubmitDate")) {
      jobOp.setToSubmitDate(string_to_time_t(toDate));
    }

    if (opt->count("isListAll")) {
      jobOp.setListAll(true);
    }

    if (vishnuInitialize(const_cast<char*>(configFile.c_str()), argc, argv)) {
      errorUsage(argv[0],communicationErrorMsg,EXECERROR);
      return  CLI_ERROR_COMMUNICATION ;
    }

    // Process list job
    // get the sessionKey
    if(sessionKey.empty()){
      sessionKey=getLastSessionKey(getppid());
    }

    // vishnu call: submit
    if(! sessionKey.empty()){
      listJobs(sessionKey, jobs, jobOp);
    }

    if (jobOp.getJobId().empty()
        && jobOp.getNbCpu() <= 0
        && jobOp.getFromSubmitDate() <= 0
        && jobOp.getToSubmitDate() <= 0
        && !jobOp.isListAll())
    {
      std::cout << jobs << "\n";
    } else {
      displayListJobs(jobs);
    }
  } catch(VishnuException& e) {// catch all Vishnu runtime error
    std::string  msg = e.getMsg();
    if (e.getMsgComp().compare("Bus initialization failure")==0){
      msg += " ["+e.getMsgComp()+", machineId may be invalid]";
    } else {
      msg += " ["+e.getMsgComp()+"]";
    }
    errorUsage(argv[0], msg,EXECERROR);
    //check the bad session key
    if (checkBadSessionKeyError(e)) {
      removeBadSessionKeyFromFile(getppid());
    }
    retCode = e.getMsgI();
  } catch(std::exception& e) {// catch all std runtime error
    errorUsage(argv[0],e.what());
    retCode = CLI_ERROR_RUNTIME;
  }
  return retCode;
}
예제 #3
0
파일: list_jobs.cpp 프로젝트: Ecapo/vishnu
int main (int argc, char* argv[]){

	int ret; // Return value

	/******* Parsed value containers ****************/
	string dietConfig;
	string sessionKey;
	string machineId;
	string statusStr = "";
	int status;
	std::string fromDate;
	std::string toDate;

	/********** EMF data ************/
	TMS_Data::ListJobsOptions jobOp;

	/******** Callback functions ******************/
	boost::function1<void,string> fjid(boost::bind(&TMS_Data::ListJobsOptions::setJobId,boost::ref(jobOp),_1));
	boost::function1<void,int> fnbCpu(boost::bind(&TMS_Data::ListJobsOptions::setNbCpu,boost::ref(jobOp),_1));
	boost::function1<void,string> fown(boost::bind(&TMS_Data::ListJobsOptions::setOwner,boost::ref(jobOp),_1));
	boost::function1<void,JobPriority> fpriority(boost::bind(&TMS_Data::ListJobsOptions::setPriority,boost::ref(jobOp),_1));
	boost::function1<void,string> fqueue(boost::bind(&TMS_Data::ListJobsOptions::setQueue,boost::ref(jobOp),_1));
	boost::function1<void,string> fmutlStatus(boost::bind(&TMS_Data::ListJobsOptions::setMultipleStatus,boost::ref(jobOp),_1));
	boost::function1<void,long long> fworkId(boost::bind(&TMS_Data::ListJobsOptions::setWorkId,boost::ref(jobOp),_1));
	/*********** Out parameters *********************/
	TMS_Data::ListJobs job;

	/**************** Describe options *************/
	boost::shared_ptr<Options> opt=makeListJobOp(argv[0],
			fjid,
			fnbCpu,
			fromDate,
			toDate,
			fown,
			statusStr,
			fpriority,
			fqueue,
			fmutlStatus,
			fworkId,
			dietConfig);

	opt->add("isBatchJob,b",
			"allows to select all jobs submitted  through the underlying"
			" batch scheduler (jobs submitted through vishnu and out of vishnu)",
			CONFIG);

  opt->add("isListAll,l",
      "allows to list all information",
      CONFIG);

	opt->add("machineId,m",
			"represents the id of the machine",
			HIDDEN,
			machineId,1);
	opt->setPosition("machineId",1);

	CLICmd cmd = CLICmd (argc, argv, opt);

	// Process command
	try {

		// Parse the cli and setting the options found
		ret = cmd.parse(env_name_mapper());

		if (ret != CLI_SUCCESS){
			helpUsage(*opt,"[options] machineId");
			return ret;
		}

		// PreProcess (adapt some parameters if necessary)
		checkVishnuConfig(*opt);
		if ( opt->count("help")){
			helpUsage(*opt,"[options] machineId");
			return 0;
		}

		if(statusStr.size()!=0) {
			size_t pos = statusStr.find_first_not_of("0123456789");
			if(pos!=std::string::npos) {
				if(statusStr.size()==1) {
					switch(statusStr[0]) {
					case 'S' :
						status = 1;
						break;
					case 'Q' :
						status = 2;
						break;
					case 'W' :
						status = 3;
						break;
					case 'R' :
						status = 4;
						break;
					case 'T' :
						status = 5;
						break;
					case 'C' :
						status = 6;
						break;
					case 'D' :
						status = 7;
						break;
					default:
						status = -1;
						break;
					}
				}
				if ((statusStr.size() > 1) || (status == -1)) {
					std::cerr << "Unknown job status " << statusStr << std::endl;
					return 0;
				}
			} else {
				status = convertToInt(statusStr);
			}
			jobOp.setStatus(status);
		}
		//convert the date in long format
		if(opt->count("fromSubmitDate")){
			jobOp.setFromSubmitDate(convertLocaltimeINUTCtime(string_to_time_t(fromDate)));
		}

		if(opt->count("toSubmitDate")){
			jobOp.setToSubmitDate(convertLocaltimeINUTCtime(string_to_time_t(toDate)));
		}

		if(opt->count("isBatchJob")) {
			jobOp.setBatchJob(true);
		}

    if (opt->count("isListAll")) {
      jobOp.setListAll(true);
    }

		// initializing DIET
		if (vishnuInitialize(const_cast<char*>(dietConfig.c_str()), argc, argv)) {
			errorUsage(argv[0],dietErrorMsg,EXECERROR);
			return  CLI_ERROR_DIET ;
		}

		// get the sessionKey
		sessionKey=getLastSessionKey(getppid());

		// DIET call : submit
		if(false==sessionKey.empty()){
			printSessionKeyMessage();
			listJobs(sessionKey, machineId, job, jobOp);
		}

		if(jobOp.getOwner().size()==0 && jobOp.getJobId().size()==0  && jobOp.getNbCpu() <= 0
				&& jobOp.getFromSubmitDate() <= 0 && jobOp.getToSubmitDate() <= 0 && !jobOp.isListAll()) {
			std::cout << job << std::endl;
		} else {
			displayListJobs(job);
		}
		printSuccessMessage();
	} catch(VishnuException& e){// catch all Vishnu runtime error
		std::string  msg = e.getMsg()+" ["+e.getMsgComp()+"]";
		errorUsage(argv[0], msg,EXECERROR);
		//check the bad session key
		if (checkBadSessionKeyError(e)){
			removeBadSessionKeyFromFile(getppid());
		}
		return e.getMsgI() ;
	} catch(std::exception& e){// catch all std runtime error
		errorUsage(argv[0],e.what());
		return CLI_ERROR_RUNTIME;
	}
	return 0;
}