1 // Copyright (C) 2009-2021 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #include "BL_SALOMEServices.hxx"
24 operator<<(std::ostream & os, const CORBA::Exception & e)
28 CORBA::TypeCode_var tc = tmp.type();
29 const char * p = tc->name ();
37 BL::SALOMEServices::SALOMEServices()
39 int nbargs = 0; char **args = 0;
40 _orb = CORBA::ORB_init (nbargs, args);
41 _salome_naming_service = NULL;
47 BL::SALOMEServices::~SALOMEServices() {}
50 BL::SALOMEServices::end()
52 if (!CORBA::is_nil(_salome_launcher))
53 _salome_launcher->removeObserver(_this());
54 if (_salome_naming_service)
55 delete _salome_naming_service;
61 BL::SALOMEServices::initNS()
63 bool return_value = true;
64 _salome_naming_service = new BL_SALOME_NamingService_Wrapper(_orb);
65 _lcc = new SALOME_LifeCycleCORBA(_salome_naming_service);
66 CORBA::Object_var obj = _salome_naming_service->Resolve("/SalomeLauncher");
67 _salome_launcher = Engines::SalomeLauncher::_narrow(obj);
69 if (CORBA::is_nil(_salome_launcher))
71 DEBMSG("SALOME Launcher is not reachable!")
74 _salome_launcher->addObserver(_this());
75 _remove_ref(); // POA will automatically destroy the object
77 obj = _salome_naming_service->Resolve("/ResourcesManager");
78 _resources_manager = Engines::ResourcesManager::_narrow(obj);
79 if (CORBA::is_nil(_resources_manager))
81 DEBMSG("SALOME Resource Manager is not reachable !");
85 _state = return_value;
89 std::list<std::string>
90 BL::SALOMEServices::getResourceList(bool batch_only)
92 std::list<std::string> resource_list;
96 Engines::ResourceParameters params;
98 params.can_launch_batch_jobs = batch_only;
99 Engines::ResourceList * resourceList = NULL;
102 resourceList = _resources_manager->GetFittingResources(params);
104 catch (const SALOME::SALOME_Exception & ex)
106 DEBMSG("SALOME Exception in addResource ! " << ex.details.text.in());
108 catch (const CORBA::SystemException& ex)
110 DEBMSG("Receive SALOME System Exception: " << ex);
111 DEBMSG("Check SALOME servers...");
115 for (int i = 0; i < resourceList->length(); i++)
117 const char* aResource = (*resourceList)[i];
118 resource_list.push_back(aResource);
123 return resource_list;
127 BL::SALOMEServices::getResourceDescr(const std::string& name)
129 Engines::ResourceDefinition * resource_definition = NULL;
130 BL::ResourceDescr resource_descr;
134 resource_definition = _resources_manager-> GetResourceDefinition(name.c_str());
136 catch (const SALOME::SALOME_Exception & ex)
138 DEBMSG("SALOME Exception in addResource ! " << ex.details.text.in());
140 catch (const CORBA::SystemException& ex)
142 DEBMSG("Receive SALOME System Exception: " << ex);
143 DEBMSG("Check SALOME servers...");
146 if(resource_definition)
148 resource_descr.name = resource_definition->name.in();
149 resource_descr.hostname = resource_definition->hostname.in();
150 resource_descr.protocol = resource_definition->protocol.in();
151 resource_descr.username = resource_definition->username.in();
152 resource_descr.applipath = resource_definition->applipath.in();
153 for (int i = 0; i < resource_definition->componentList.length(); i++)
155 resource_descr.componentList.push_back(resource_definition->componentList[i].in());
158 resource_descr.OS = resource_definition->OS.in();
159 resource_descr.mem_mb = resource_definition->mem_mb;
160 resource_descr.cpu_clock = resource_definition->cpu_clock;
161 resource_descr.nb_node = resource_definition->nb_node;
162 resource_descr.nb_proc_per_node = resource_definition->nb_proc_per_node;
163 resource_descr.batch = resource_definition->batch.in();
164 resource_descr.mpiImpl = resource_definition->mpiImpl.in();
165 resource_descr.iprotocol = resource_definition->iprotocol.in();
166 resource_descr.can_launch_batch_jobs = resource_definition->can_launch_batch_jobs;
167 resource_descr.can_run_containers = resource_definition->can_run_containers;
168 resource_descr.working_directory = resource_definition->working_directory.in();
170 delete resource_definition;
172 return resource_descr;
176 BL::SALOMEServices::addResource(BL::ResourceDescr & new_resource)
178 Engines::ResourceDefinition_var resource_definition = new Engines::ResourceDefinition;
180 resource_definition->name = CORBA::string_dup(new_resource.name.c_str());
181 resource_definition->hostname = CORBA::string_dup(new_resource.hostname.c_str());
182 if (new_resource.batch == "none")
183 resource_definition->type = CORBA::string_dup("single_machine");
185 resource_definition->type = CORBA::string_dup("cluster");
186 resource_definition->protocol = CORBA::string_dup(new_resource.protocol.c_str());
187 resource_definition->username = CORBA::string_dup(new_resource.username.c_str());
188 resource_definition->applipath = CORBA::string_dup(new_resource.applipath.c_str());
191 std::list<std::string>::iterator it = new_resource.componentList.begin();
192 resource_definition->componentList.length(new_resource.componentList.size());
193 for(; it != new_resource.componentList.end(); it++)
195 resource_definition->componentList[i] = CORBA::string_dup((*it).c_str());
199 resource_definition->OS = CORBA::string_dup(new_resource.OS.c_str());
200 resource_definition->mem_mb = new_resource.mem_mb;
201 resource_definition->cpu_clock = new_resource.cpu_clock;
202 resource_definition->nb_node = new_resource.nb_node;
203 resource_definition->nb_proc_per_node = new_resource.nb_proc_per_node;
204 resource_definition->batch = CORBA::string_dup(new_resource.batch.c_str());
205 resource_definition->mpiImpl = CORBA::string_dup(new_resource.mpiImpl.c_str());
206 resource_definition->iprotocol = CORBA::string_dup(new_resource.iprotocol.c_str());
207 resource_definition->can_launch_batch_jobs = new_resource.can_launch_batch_jobs;
208 resource_definition->can_run_containers = new_resource.can_run_containers;
209 resource_definition->working_directory = CORBA::string_dup(new_resource.working_directory.c_str());
213 _resources_manager->AddResource(resource_definition, true, "");
215 catch (const SALOME::SALOME_Exception & ex)
217 DEBMSG("SALOME Exception in addResource ! " << ex.details.text.in());
218 throw(BL::Exception(ex.details.text.in()));
220 catch (const CORBA::SystemException& ex)
222 DEBMSG("Receive SALOME System Exception: " << ex);
223 DEBMSG("Check SALOME servers...");
224 throw(BL::Exception("SALOME System Exception"));
229 BL::SALOMEServices::removeResource(const std::string & name)
233 _resources_manager->RemoveResource(name.c_str(), true, "");
235 catch (const SALOME::SALOME_Exception & ex)
237 DEBMSG("SALOME Exception in removeResource ! " << ex.details.text.in());
239 catch (const CORBA::SystemException& ex)
241 DEBMSG("Receive SALOME System Exception: " << ex);
242 DEBMSG("Check SALOME servers...");
247 BL::SALOMEServices::create_job(BL::Job * job)
249 DEBMSG("Begin of create_job");
250 std::string ret = "";
251 Engines::JobParameters_var job_parameters = new Engines::JobParameters;
254 if (job->getType() == BL::Job::COMMAND)
256 job_parameters->job_type = CORBA::string_dup("command");
258 else if (job->getType() == BL::Job::YACS_SCHEMA)
260 job_parameters->job_type = CORBA::string_dup("yacs_file");
262 else if (job->getType() == BL::Job::PYTHON_SALOME)
264 job_parameters->job_type = CORBA::string_dup("python_salome");
266 else if (job->getType() == BL::Job::COMMAND_SALOME)
268 job_parameters->job_type = CORBA::string_dup("command_salome");
271 // Specific parameters
272 if (job->getType() == BL::Job::YACS_SCHEMA)
274 if (job->getDumpYACSState() > 0)
276 job_parameters->specific_parameters.length(job_parameters->specific_parameters.length() + 1);
277 std::ostringstream oss;
278 oss << job->getDumpYACSState();
279 Engines::Parameter_var new_parameter = new Engines::Parameter;
280 new_parameter->name = CORBA::string_dup("EnableDumpYACS");
281 new_parameter->value = CORBA::string_dup(oss.str().c_str());
282 job_parameters->specific_parameters[job_parameters->specific_parameters.length() - 1] = new_parameter;
284 if (!job->getYacsDriverOptions().empty())
286 job_parameters->specific_parameters.length(job_parameters->specific_parameters.length() + 1);
287 Engines::Parameter_var new_parameter = new Engines::Parameter;
288 new_parameter->name = CORBA::string_dup("YACSDriverOptions");
289 new_parameter->value = CORBA::string_dup(job->getYacsDriverOptions().c_str());
290 job_parameters->specific_parameters[job_parameters->specific_parameters.length() - 1] = new_parameter;
293 if (job->getLoadLevelerJobType() != "")
295 job_parameters->specific_parameters.length(job_parameters->specific_parameters.length() + 1);
296 Engines::Parameter_var new_parameter = new Engines::Parameter;
297 new_parameter->name = CORBA::string_dup("LoalLevelerJobType");
298 new_parameter->value = CORBA::string_dup(job->getLoadLevelerJobType().c_str());
299 job_parameters->specific_parameters[job_parameters->specific_parameters.length() - 1] = new_parameter;
303 job_parameters->job_name = CORBA::string_dup(job->getName().c_str());
304 job_parameters->job_file = CORBA::string_dup(job->getJobFile().c_str());
305 job_parameters->env_file = CORBA::string_dup(job->getEnvFile().c_str());
306 job_parameters->pre_command = CORBA::string_dup(job->getPreCommand().c_str());
307 BL::Job::FilesParam files = job->getFilesParameters();
308 std::list<std::string>::iterator it;
312 job_parameters->in_files.length(files.input_files_list.size());
313 for (it = files.input_files_list.begin() ; it != files.input_files_list.end(); it++)
315 job_parameters->in_files[i] = CORBA::string_dup((*it).c_str());
319 job_parameters->out_files.length(files.output_files_list.size());
320 for (it = files.output_files_list.begin() ; it != files.output_files_list.end(); it++)
322 job_parameters->out_files[j] = CORBA::string_dup((*it).c_str());
325 job_parameters->local_directory = CORBA::string_dup("");
326 job_parameters->result_directory = CORBA::string_dup(files.result_directory.c_str());
328 BL::Job::BatchParam cpp_batch_params = job->getBatchParameters();
329 job_parameters->work_directory = CORBA::string_dup(cpp_batch_params.batch_directory.c_str());
332 job_parameters->maximum_duration = CORBA::string_dup(cpp_batch_params.maximum_duration.c_str());
333 job_parameters->resource_required.name = CORBA::string_dup(job->getResource().c_str());
334 job_parameters->resource_required.nb_proc = cpp_batch_params.nb_proc;
335 job_parameters->resource_required.nb_node = cpp_batch_params.nb_node;
336 job_parameters->queue = CORBA::string_dup(job->getBatchQueue().c_str());
337 job_parameters->partition = CORBA::string_dup(job->getBatchPartition().c_str());
338 job_parameters->exclusive = cpp_batch_params.exclusive;
339 job_parameters->wckey = CORBA::string_dup(job->getWCKey().c_str());
340 job_parameters->extra_params = CORBA::string_dup(job->getExtraParams().c_str());
343 switch (cpp_batch_params.mem_req_type)
345 case BL::Job::MEM_PER_NODE:
346 job_parameters->resource_required.mem_mb = cpp_batch_params.mem_limit;
347 job_parameters->mem_per_cpu = 0;
349 case BL::Job::MEM_PER_CPU:
350 job_parameters->resource_required.mem_mb = 0;
351 job_parameters->mem_per_cpu = cpp_batch_params.mem_limit;
354 throw Exception("Unknown memory requirement, unable to create job");
358 job_parameters->resource_required.nb_proc_per_node = -1;
359 job_parameters->resource_required.cpu_clock = -1;
361 // Parameters for COORM
362 job_parameters->launcher_file = CORBA::string_dup(cpp_batch_params.launcher_file.c_str());
363 job_parameters->launcher_args = CORBA::string_dup(cpp_batch_params.launcher_args.c_str());
368 int job_id = _salome_launcher->createJob(job_parameters);
369 job->setSalomeLauncherId(job_id);
371 catch (const SALOME::SALOME_Exception & ex)
373 DEBMSG("SALOME Exception in createJob !");
374 ret = ex.details.text.in();
376 catch (const CORBA::SystemException& ex)
378 DEBMSG("Receive SALOME System Exception: " << ex);
379 DEBMSG("Check SALOME servers...");
380 ret = "SALOME System Exception - see logs";
386 BL::SALOMEServices::start_job(BL::Job * job)
388 std::string ret = "";
392 _salome_launcher->launchJob(job->getSalomeLauncherId());
394 catch (const SALOME::SALOME_Exception & ex)
396 DEBMSG("SALOME Exception in launchJob !");
397 ret = ex.details.text.in();
399 catch (const CORBA::SystemException& ex)
401 DEBMSG("Receive SALOME System Exception: " << ex);
402 DEBMSG("Check SALOME servers...");
403 ret = "SALOME System Exception - see logs";
409 BL::SALOMEServices::refresh_job(BL::Job * job)
411 std::string ret = "";
416 CORBA::String_var result = _salome_launcher->getJobState(job->getSalomeLauncherId());
419 catch (const SALOME::SALOME_Exception & ex)
421 DEBMSG("SALOME Exception in getJobState !");
422 ret = ex.details.text.in();
424 catch (const CORBA::SystemException& ex)
426 DEBMSG("Receive SALOME System Exception: " << ex);
427 DEBMSG("Check SALOME servers...");
428 ret = "SALOME System Exception - see logs";
434 BL::SALOMEServices::delete_job(BL::Job * job)
436 std::string ret = "";
440 _salome_launcher->removeJob(job->getSalomeLauncherId());
442 catch (const SALOME::SALOME_Exception & ex)
444 DEBMSG("SALOME Exception in removeJob !");
445 ret = ex.details.text.in();
447 catch (const CORBA::SystemException& ex)
449 DEBMSG("Receive SALOME System Exception: " << ex);
450 DEBMSG("Check SALOME servers...");
451 ret = "SALOME System Exception - see logs";
457 BL::SALOMEServices::stop_job(BL::Job * job)
459 std::string ret = "";
462 _salome_launcher->stopJob(job->getSalomeLauncherId());
464 catch (const SALOME::SALOME_Exception & ex)
466 DEBMSG("SALOME Exception in stopJob !");
467 ret = ex.details.text.in();
469 catch (const CORBA::SystemException& ex)
471 DEBMSG("Receive SALOME System Exception: " << ex);
472 DEBMSG("Check SALOME servers...");
473 ret = "SALOME System Exception - see logs";
479 BL::SALOMEServices::get_results_job(BL::Job * job)
481 std::string ret = "";
483 BL::Job::FilesParam files = job->getFilesParameters();
484 CORBA::String_var directory = CORBA::string_dup(files.result_directory.c_str());
489 _salome_launcher->getJobResults(job->getSalomeLauncherId(), directory);
491 catch (const SALOME::SALOME_Exception & ex)
493 DEBMSG("SALOME Exception in refresh_job !");
494 ret = ex.details.text.in();
496 catch (const CORBA::SystemException& ex)
498 DEBMSG("Receive SALOME System Exception: " << ex);
499 DEBMSG("Check SALOME servers...");
500 ret = "SALOME System Exception - see logs";
505 // Get names or ids of hosts assigned to the job
507 BL::SALOMEServices::get_assigned_hostnames(BL::Job * job)
509 std::string ret = "";
513 CORBA::String_var result = _salome_launcher->getAssignedHostnames(job->getSalomeLauncherId());
516 catch (const SALOME::SALOME_Exception & ex)
518 DEBMSG("SALOME Exception in get_assigned_hostnames !");
519 ret = ex.details.text.in();
521 catch (const CORBA::SystemException& ex)
523 DEBMSG("Receive SALOME System Exception: " << ex);
524 DEBMSG("Check SALOME servers...");
525 ret = "SALOME System Exception - see logs";
531 BL::SALOMEServices::save_jobs(const std::string & file_name)
533 CORBA::String_var file = CORBA::string_dup(file_name.c_str());
534 std::string ret = "";
537 _salome_launcher->saveJobs(file);
539 catch (const SALOME::SALOME_Exception & ex)
541 DEBMSG("SALOME Exception in saveJobs !");
542 ret = ex.details.text.in();
544 catch (const CORBA::SystemException& ex)
546 DEBMSG("Receive CORBA System Exception: " << ex);
547 DEBMSG("Check SALOME servers...");
548 ret = "CORBA System Exception - see SALOME logs";
554 BL::SALOMEServices::load_jobs(const std::string & file_name)
556 CORBA::String_var file = CORBA::string_dup(file_name.c_str());
557 std::string ret = "";
560 _salome_launcher->loadJobs(file);
562 catch (const SALOME::SALOME_Exception & ex)
564 DEBMSG("SALOME Exception in loadJobs !");
565 ret = ex.details.text.in();
567 catch (const CORBA::SystemException& ex)
569 DEBMSG("Receive CORBA System Exception: " << ex);
570 DEBMSG("Check SALOME servers...");
571 ret = "CORBA System Exception - see SALOME logs";
577 BL::SALOMEServices::notify(const char* event_name, const char * event_data)
579 DEBMSG("Launcher event received " << event_name << " " << event_data);
581 std::string event(event_name);
582 std::string data(event_data);
584 if (event == "SAVE_JOBS")
586 _manager->launcher_event_save_jobs(data);
588 else if (event == "LOAD_JOBS")
590 _manager->launcher_event_load_jobs(data);
592 else if (event == "NEW_JOB")
594 _manager->launcher_event_new_job(data);
596 else if (event == "REMOVE_JOB")
598 _manager->launcher_event_remove_job(data);
600 else if (event == "UPDATE_JOB_STATE")
602 _manager->launcher_event_update_job_state(data);
606 DEBMSG("Unkown launcher event received");
611 BL::SALOMEServices::get_new_job(int job_number)
613 DEBMSG("Start of BL::SALOMEServices::get_new_job");
614 BL::Job * job_return = NULL;
615 Engines::JobParameters * job_parameters = NULL;
618 job_parameters = _salome_launcher->getJobParameters(job_number);
620 catch (const SALOME::SALOME_Exception & ex)
622 DEBMSG("SALOME Exception in saveJobs !");
624 catch (const CORBA::SystemException& ex)
626 DEBMSG("Receive CORBA System Exception: " << ex);
627 DEBMSG("Check SALOME servers...");
632 job_return = new BL::Job();
633 job_return->setSalomeLauncherId(job_number);
635 job_return->setName(job_parameters->job_name.in());
636 job_return->setType(job_parameters->job_type.in());
637 job_return->setJobFile(job_parameters->job_file.in());
638 job_return->setEnvFile(job_parameters->env_file.in());
639 job_return->setPreCommand(job_parameters->pre_command.in());
640 job_return->setBatchQueue(job_parameters->queue.in());
641 job_return->setBatchPartition(job_parameters->partition.in());
642 job_return->setWCKey(job_parameters->wckey.in());
643 job_return->setExtraParams(job_parameters->extra_params.in());
645 BL::Job::FilesParam param;
646 param.result_directory = job_parameters->result_directory.in();
647 for (CORBA::ULong i = 0; i < job_parameters->in_files.length(); i++)
648 param.input_files_list.push_back(job_parameters->in_files[i].in());
649 for (CORBA::ULong i = 0; i < job_parameters->out_files.length(); i++)
650 param.output_files_list.push_back(job_parameters->out_files[i].in());
651 job_return->setFilesParameters(param);
653 BL::Job::BatchParam batch_param;
654 batch_param.batch_directory = job_parameters->work_directory.in();
655 batch_param.maximum_duration = job_parameters->maximum_duration.in();
656 batch_param.nb_proc = job_parameters->resource_required.nb_proc;
657 batch_param.nb_node = job_parameters->resource_required.nb_node;
658 batch_param.exclusive = job_parameters->exclusive;
660 if (job_parameters->mem_per_cpu != 0)
662 batch_param.mem_limit = job_parameters->mem_per_cpu;
663 batch_param.mem_req_type = BL::Job::MEM_PER_CPU;
667 batch_param.mem_limit = job_parameters->resource_required.mem_mb;
668 batch_param.mem_req_type = BL::Job::MEM_PER_NODE;
671 // Parameters for COORM
672 batch_param.launcher_file = job_parameters->launcher_file.in();
673 batch_param.launcher_args = job_parameters->launcher_args.in();
675 job_return->setBatchParameters(batch_param);
677 job_return->setResource(job_parameters->resource_required.name.in());
679 // Specific parameters
680 for (CORBA::ULong i = 0; i < job_parameters->specific_parameters.length(); i++)
682 if (std::string(job_parameters->specific_parameters[i].name.in()) == "EnableDumpYACS")
684 std::string user_value = job_parameters->specific_parameters[i].value.in();
685 std::istringstream iss(user_value);
688 job_return->setDumpYACSState(value);
690 if (std::string(job_parameters->specific_parameters[i].name.in()) == "YACSDriverOptions")
692 std::string user_value = job_parameters->specific_parameters[i].value.in();
693 job_return->setYacsDriverOptions(user_value);
695 if (std::string(job_parameters->specific_parameters[i].name.in()) == "LoalLevelerJobType")
697 std::string user_value = job_parameters->specific_parameters[i].value.in();
698 job_return->setLoadLevelerJobType(user_value);
703 std::string result_job = job_return->setStringState(refresh_job(job_return));
704 if (result_job != "RefreshError") {}
707 // Error in getting state
708 DEBMSG("Error in getting state of the new job!");
712 delete job_parameters;