X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FLauncher%2FLauncher_Job.cxx;h=0541c5cd0d7e0bd2fe208227673547a7d4cd94c7;hb=f2b4b2e1b8983a9fa514e2355ebaff4618cd4eea;hp=9dd61df11e33d1d38979e8ee444c1cb954855344;hpb=e0561d7cf50075cec88e1a44438f3787a314ce00;p=modules%2Fyacs.git diff --git a/src/Launcher/Launcher_Job.cxx b/src/Launcher/Launcher_Job.cxx index 9dd61df11..0541c5cd0 100644 --- a/src/Launcher/Launcher_Job.cxx +++ b/src/Launcher/Launcher_Job.cxx @@ -1,9 +1,9 @@ -// Copyright (C) 2009-2013 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2009-2017 CEA/DEN, EDF R&D, OPEN CASCADE // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -19,14 +19,21 @@ // Author: André RIBES - EDF R&D // +//#define _DEBUG_ #include "Launcher_Job.hxx" #include "Launcher.hxx" +#include #ifdef WITH_LIBBATCH #include #endif -using namespace std; +#include +#ifdef WIN32 + static const char SEPARATOR = '\\'; +#else + static const char SEPARATOR = '/'; +#endif Launcher::Job::Job() { @@ -39,20 +46,14 @@ Launcher::Job::Job() _job_file = ""; _job_file_name = ""; _job_file_name_complete = ""; + _pre_command = ""; _work_directory = ""; _local_directory = ""; _result_directory = ""; _maximum_duration = ""; _maximum_duration_in_second = -1; - _resource_required_params.name = ""; - _resource_required_params.hostname = ""; - _resource_required_params.OS = ""; - _resource_required_params.nb_proc = -1; - _resource_required_params.nb_node = -1; - _resource_required_params.nb_proc_per_node = -1; - _resource_required_params.cpu_clock = -1; - _resource_required_params.mem_mb = -1; _queue = ""; + _partition = ""; _job_type = ""; _exclusive = false; _mem_per_cpu = 0; @@ -66,7 +67,7 @@ Launcher::Job::Job() #endif } -Launcher::Job::~Job() +Launcher::Job::~Job() { LAUNCHER_MESSAGE("Deleting job number: " << _number); #ifdef WITH_LIBBATCH @@ -83,7 +84,7 @@ Launcher::Job::stopJob() #ifdef WITH_LIBBATCH if (_batch_job_id.getReference() != "undefined") { - try + try { _batch_job_id.deleteJob(); } @@ -103,7 +104,7 @@ Launcher::Job::removeJob() #ifdef WITH_LIBBATCH if (_batch_job_id.getReference() != "undefined") { - try + try { _batch_job_id.deleteJob(); } @@ -116,7 +117,7 @@ Launcher::Job::removeJob() } std::string -Launcher::Job::getJobType() +Launcher::Job::getJobType() const { return _job_type; } @@ -128,12 +129,12 @@ Launcher::Job::setJobName(const std::string & job_name) } std::string -Launcher::Job::getJobName() +Launcher::Job::getJobName() const { return _job_name; } -void +void Launcher::Job::setState(const std::string & state) { // State of a Job: CREATED, QUEUED, RUNNING, FINISHED, FAILED @@ -151,8 +152,8 @@ Launcher::Job::setState(const std::string & state) _state = state; } -std::string -Launcher::Job::getState() +std::string +Launcher::Job::getState() const { return _state; } @@ -164,7 +165,7 @@ Launcher::Job::getAssignedHostnames() return _assigned_hostnames; } -void +void Launcher::Job::setNumber(const int & number) { if (_number != -1) @@ -178,17 +179,23 @@ Launcher::Job::getNumber() return _number; } -void +void Launcher::Job::setResourceDefinition(const ParserResourcesType & resource_definition) { // Check machine_definition std::string user_name = ""; if (resource_definition.UserName == "") { +#ifndef WIN32 user_name = getenv("USER"); +#else + user_name = getenv("USERNAME"); +#endif + if (user_name == "") + user_name = getenv("LOGNAME"); if (user_name == "") { - std::string mess = "You must define a user name: into your resource description or with env variable USER"; + std::string mess = "You must define a user name: into your resource description or with one of env variables USER/LOGNAME"; throw LauncherException(mess); } } @@ -199,13 +206,13 @@ Launcher::Job::setResourceDefinition(const ParserResourcesType & resource_defini _resource_definition.UserName = user_name; } -ParserResourcesType -Launcher::Job::getResourceDefinition() +ParserResourcesType +Launcher::Job::getResourceDefinition() const { return _resource_definition; } -void +void Launcher::Job::setJobFile(const std::string & job_file) { // Check job file @@ -216,48 +223,48 @@ Launcher::Job::setJobFile(const std::string & job_file) } _job_file = job_file; - std::string::size_type p1 = _job_file.find_last_of("/"); + std::string::size_type p1 = _job_file.find_last_of(SEPARATOR); std::string::size_type p2 = _job_file.find_last_of("."); _job_file_name_complete = _job_file.substr(p1+1); _job_file_name = _job_file.substr(p1+1,p2-p1-1); } std::string -Launcher::Job::getJobFile() +Launcher::Job::getJobFile() const { return _job_file; } -void +void Launcher::Job::setEnvFile(const std::string & env_file) { _env_file = env_file; } std::string -Launcher::Job::getEnvFile() +Launcher::Job::getEnvFile() const { return _env_file; } -void +void Launcher::Job::setWorkDirectory(const std::string & work_directory) { _work_directory = work_directory; } -void +void Launcher::Job::setLocalDirectory(const std::string & local_directory) { _local_directory = local_directory; } -void +void Launcher::Job::setResultDirectory(const std::string & result_directory) { _result_directory = result_directory; } -void +void Launcher::Job::add_in_file(const std::string & file) { std::list::iterator it = std::find(_in_files.begin(), _in_files.end(), file); @@ -267,7 +274,7 @@ Launcher::Job::add_in_file(const std::string & file) std::cerr << "Launcher::Job::add_in_file -- Warning file was already entered in in_files: " << file << std::endl; } -void +void Launcher::Job::add_out_file(const std::string & file) { std::list::iterator it = std::find(_out_files.begin(), _out_files.end(), file); @@ -277,7 +284,7 @@ Launcher::Job::add_out_file(const std::string & file) std::cerr << "Launcher::Job::add_out_file -- Warning file was already entered in out_files: " << file << std::endl; } -void +void Launcher::Job::setMaximumDuration(const std::string & maximum_duration) { checkMaximumDuration(maximum_duration); @@ -289,27 +296,33 @@ Launcher::Job::setMaximumDuration(const std::string & maximum_duration) void Launcher::Job::setLauncherFile(const std::string & launcher_file) { - _launcher_file = launcher_file; + _launcher_file = launcher_file; } void Launcher::Job::setLauncherArgs(const std::string & launcher_args) { - _launcher_args = launcher_args; + _launcher_args = launcher_args; } -void +void Launcher::Job::setResourceRequiredParams(const resourceParams & resource_required_params) { checkResourceRequiredParams(resource_required_params); _resource_required_params = resource_required_params; } -void +void Launcher::Job::setQueue(const std::string & queue) { _queue = queue; } +void +Launcher::Job::setPartition(const std::string & partition) +{ + _partition = partition; +} + void Launcher::Job::setExclusive(bool exclusive) { @@ -333,68 +346,92 @@ Launcher::Job::setMemPerCpu(unsigned long mem_per_cpu) _mem_per_cpu = mem_per_cpu; } -std::string -Launcher::Job::getWorkDirectory() +void +Launcher::Job::setWCKey(const std::string & wckey) +{ + _wckey = wckey; +} + +void +Launcher::Job::setExtraParams(const std::string & extra_params) +{ + _extra_params = extra_params; +} + +void +Launcher::Job::setReference(const std::string & reference) +{ + _reference = reference; +} + +std::string +Launcher::Job::getWorkDirectory() const { return _work_directory; } -std::string -Launcher::Job::getLocalDirectory() +std::string +Launcher::Job::getLocalDirectory() const { return _local_directory; } std::string -Launcher::Job::getResultDirectory() +Launcher::Job::getResultDirectory() const { return _result_directory; } -const std::list & -Launcher::Job::get_in_files() +const std::list & +Launcher::Job::get_in_files() const { return _in_files; } -const std::list & -Launcher::Job::get_out_files() +const std::list & +Launcher::Job::get_out_files() const { return _out_files; } -std::string -Launcher::Job::getMaximumDuration() +std::string +Launcher::Job::getMaximumDuration() const { return _maximum_duration; } // For COORM std::string -Launcher::Job::getLauncherFile() +Launcher::Job::getLauncherFile() const { - return _launcher_file; + return _launcher_file; } std::string -Launcher::Job::getLauncherArgs() +Launcher::Job::getLauncherArgs() const { - return _launcher_args; + return _launcher_args; } -resourceParams -Launcher::Job::getResourceRequiredParams() +resourceParams +Launcher::Job::getResourceRequiredParams() const { return _resource_required_params; } -std::string -Launcher::Job::getQueue() +std::string +Launcher::Job::getQueue() const { return _queue; } +std::string +Launcher::Job::getPartition() const +{ + return _partition; +} + bool -Launcher::Job::getExclusive() +Launcher::Job::getExclusive() const { return _exclusive; } @@ -411,7 +448,37 @@ Launcher::Job::getMemPerCpu() const return _mem_per_cpu; } -void +std::string +Launcher::Job::getWCKey() const +{ + return _wckey; +} + +std::string +Launcher::Job::getExtraParams() const +{ + return _extra_params; +} + +std::string +Launcher::Job::getReference() const +{ + return _reference; +} + +void +Launcher::Job::setPreCommand(const std::string & preCommand) +{ + _pre_command = preCommand; +} + +std::string +Launcher::Job::getPreCommand() const +{ + return _pre_command; +} + +void Launcher::Job::checkMaximumDuration(const std::string & maximum_duration) { std::string result(""); @@ -425,7 +492,7 @@ Launcher::Job::checkMaximumDuration(const std::string & maximum_duration) std::string begin_edt_value = edt_value.substr(0, pos); std::string mid_edt_value = edt_value.substr(pos, 1); std::string end_edt_value = edt_value.substr(pos + 1, edt_value.npos); - + long value; std::istringstream iss(begin_edt_value); if (!(iss >> value)) { @@ -449,7 +516,7 @@ Launcher::Job::checkMaximumDuration(const std::string & maximum_duration) throw LauncherException(result); } -void +void Launcher::Job::checkResourceRequiredParams(const resourceParams & resource_required_params) { // nb_proc has be to > 0 @@ -460,7 +527,7 @@ Launcher::Job::checkResourceRequiredParams(const resourceParams & resource_requi } } -long +long Launcher::Job::convertMaximumDuration(const std::string & edt) { long hh, mm, ret; @@ -481,20 +548,20 @@ Launcher::Job::convertMaximumDuration(const std::string & edt) return ret; } -std::string -Launcher::Job::getLaunchDate() +std::string +Launcher::Job::getLaunchDate() const { time_t rawtime; time(&rawtime); std::string launch_date = ctime(&rawtime); - int i = 0 ; - for (;i < launch_date.size(); i++) + size_t i = 0 ; + for (;i < launch_date.size(); i++) if (launch_date[i] == '/' || launch_date[i] == '-' || launch_date[i] == ':' || - launch_date[i] == ' ') + launch_date[i] == ' ') launch_date[i] = '_'; - launch_date.erase(--launch_date.end()); // Last caracter is a \n + launch_date.erase(--launch_date.end()); // Last character is a \n return launch_date; } @@ -524,7 +591,7 @@ Launcher::Job::updateJobState() } #ifdef WITH_LIBBATCH -Batch::Job * +Batch::Job * Launcher::Job::getBatchJob() { update_job(); @@ -540,6 +607,9 @@ Launcher::Job::common_job_params() params[Batch::NBPROC] = _resource_required_params.nb_proc; params[Batch::NBPROCPERNODE] = _resource_required_params.nb_proc_per_node; + if(_resource_required_params.nb_node > 0) + params[Batch::NBNODE] = _resource_required_params.nb_node; + // Memory in megabytes if (_resource_required_params.mem_mb > 0) { @@ -550,17 +620,40 @@ Launcher::Job::common_job_params() params[Batch::MEMPERCPU] = (long)_mem_per_cpu; } - // We define a default directory based on user time + // We define a default directory if (_work_directory == "") { const size_t BUFSIZE = 32; char date[BUFSIZE]; time_t curtime = time(NULL); strftime(date, BUFSIZE, "%Y_%m_%d__%H_%M_%S", localtime(&curtime)); - _work_directory = std::string("$HOME/Batch/workdir_"); - _work_directory += date; + if(!_resource_definition.working_directory.empty()) + { + std::string date_dir = std::string("/job_") + date; + std::ostringstream str_pid; + str_pid << ::getpid(); + std::string job_dir = date_dir + "-" + str_pid.str(); + + _work_directory = _resource_definition.working_directory + job_dir; + } + else + { +#ifndef WIN32 + _work_directory = std::string("/$HOME/Batch/workdir_"); +#else + _work_directory = std::string("%USERPROFILE%\\Batch\\workdir_"); +#endif + _work_directory += date; + } } params[Batch::WORKDIR] = _work_directory; + std::string libbatch_pre_command(""); + if(!_pre_command.empty()) + { + boost::filesystem::path pre_command_path(_pre_command); + libbatch_pre_command += "./" + pre_command_path.filename().string(); + } + params[Batch::PREPROCESS] = libbatch_pre_command; // Parameters for COORM params[Batch::LAUNCHER_FILE] = _launcher_file; @@ -568,50 +661,72 @@ Launcher::Job::common_job_params() // If result_directory is not defined, we use HOME environnement if (_result_directory == "") +#ifndef WIN32 _result_directory = getenv("HOME"); - +#else + _result_directory = getenv("USERPROFILE"); +#endif // _in_files std::list in_files(_in_files); in_files.push_back(_job_file); if (_env_file != "") - in_files.push_back(_env_file); + in_files.push_back(_env_file); + if(!_pre_command.empty()) + in_files.push_back(_pre_command); for(std::list::iterator it = in_files.begin(); it != in_files.end(); it++) { std::string file = *it; // local file -> If file is not an absolute path, we apply _local_directory std::string local_file; +#ifndef WIN32 if (file.substr(0, 1) == std::string("/")) +#else + // On Windows, absolute paths may begin with something like "C:" + if (file.substr(1, 1) == std::string(":")) +#endif + local_file = file; + else if (file.substr(0, 1) == std::string("-")) // using rsync options local_file = file; else #ifndef WIN32 - local_file = _local_directory + "/" + file; + // '/./' is used by rsync to find the root of the relative path + // /a/b/./c/f -> _working_directory/c/f + local_file = _local_directory + "/./" + file; #else - local_file = file; + local_file = _local_directory + SEPARATOR + file; #endif - + // remote file -> get only file name from in_files - size_t found = file.find_last_of("/"); - std::string remote_file = _work_directory + "/" + file.substr(found+1); + std::string remote_file = _work_directory + "/"; params[Batch::INFILE] += Batch::Couple(local_file, remote_file); } - + // _out_files for(std::list::iterator it = _out_files.begin(); it != _out_files.end(); it++) { std::string file = *it; - - // local file - size_t found = file.find_last_of("/"); - std::string local_file = _result_directory + "/" + file.substr(found+1); - // remote file -> If file is not an absolute path, we apply _work_directory std::string remote_file; + std::string local_file; if (file.substr(0, 1) == std::string("/")) + { remote_file = file; + size_t found = file.find_last_of("/"); + local_file = file.substr(found+1); + } + else if (file.substr(0, 1) == std::string("-")) // using rsync options + { + remote_file = file; + local_file = ""; + } else - remote_file = _work_directory + "/" + file; + { + // '/./' is used by rsync to find the root of the relative path + remote_file = _work_directory + "/./" + file; + local_file = ""; + } params[Batch::OUTFILE] += Batch::Couple(local_file, remote_file); } @@ -624,10 +739,22 @@ Launcher::Job::common_job_params() if (_queue != "") params[Batch::QUEUE] = _queue; + // Partition + if (_partition != "") + params[Batch::PARTITION] = _partition; + // Exclusive if (getExclusive()) params[Batch::EXCLUSIVE] = true; + // WC Key + if (_wckey != "") + params[Batch::WCKEY] = _wckey; + + // Extra params + if (_extra_params != "") + params[Batch::EXTRAPARAMS] = _extra_params; + // Specific parameters std::map::iterator it = _specific_parameters.find("LoalLevelerJobType"); if (it != _specific_parameters.end()) @@ -635,20 +762,20 @@ Launcher::Job::common_job_params() return params; } -void +void Launcher::Job::setBatchManagerJobId(Batch::JobId batch_manager_job_id) { _batch_job_id = batch_manager_job_id; } -Batch::JobId -Launcher::Job::getBatchManagerJobId() +Batch::JobId +Launcher::Job::getBatchManagerJobId() const { return _batch_job_id; } #endif -void +void Launcher::Job::addSpecificParameter(const std::string & name, const std::string & value) { @@ -656,7 +783,7 @@ Launcher::Job::addSpecificParameter(const std::string & name, } const std::map & -Launcher::Job::getSpecificParameters() +Launcher::Job::getSpecificParameters() const { return _specific_parameters; }