1 // Copyright (C) 2009-2012 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.
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 SALOME_NamingService(_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()
92 std::list<std::string> resource_list;
96 Engines::ResourceParameters params;
98 Engines::ResourceList * resourceList = NULL;
101 resourceList = _resources_manager->GetFittingResources(params);
103 catch (const SALOME::SALOME_Exception & ex)
105 DEBMSG("SALOME Exception in addResource ! " << ex.details.text.in());
107 catch (const CORBA::SystemException& ex)
109 DEBMSG("Receive SALOME System Exception: " << ex);
110 DEBMSG("Check SALOME servers...");
114 for (int i = 0; i < resourceList->length(); i++)
116 const char* aResource = (*resourceList)[i];
117 resource_list.push_back(aResource);
122 return resource_list;
126 BL::SALOMEServices::getResourceDescr(const std::string& name)
128 Engines::ResourceDefinition * resource_definition = NULL;
129 BL::ResourceDescr resource_descr;
133 resource_definition = _resources_manager-> GetResourceDefinition(name.c_str());
135 catch (const SALOME::SALOME_Exception & ex)
137 DEBMSG("SALOME Exception in addResource ! " << ex.details.text.in());
139 catch (const CORBA::SystemException& ex)
141 DEBMSG("Receive SALOME System Exception: " << ex);
142 DEBMSG("Check SALOME servers...");
145 if(resource_definition)
147 resource_descr.name = resource_definition->name.in();
148 resource_descr.hostname = resource_definition->hostname.in();
149 resource_descr.protocol = resource_definition->protocol.in();
150 resource_descr.username = resource_definition->username.in();
151 resource_descr.applipath = resource_definition->applipath.in();
152 for (int i = 0; i < resource_definition->componentList.length(); i++)
154 resource_descr.componentList.push_back(resource_definition->componentList[i].in());
157 resource_descr.OS = resource_definition->OS.in();
158 resource_descr.mem_mb = resource_definition->mem_mb;
159 resource_descr.cpu_clock = resource_definition->cpu_clock;
160 resource_descr.nb_node = resource_definition->nb_node;
161 resource_descr.nb_proc_per_node = resource_definition->nb_proc_per_node;
162 resource_descr.batch = resource_definition->batch.in();
163 resource_descr.mpiImpl = resource_definition->mpiImpl.in();
164 resource_descr.iprotocol = resource_definition->iprotocol.in();
165 resource_descr.is_cluster_head = resource_definition->is_cluster_head;
166 resource_descr.working_directory = resource_definition->working_directory.in();
168 delete resource_definition;
170 return resource_descr;
174 BL::SALOMEServices::addResource(BL::ResourceDescr & new_resource)
176 Engines::ResourceDefinition_var resource_definition = new Engines::ResourceDefinition;
178 resource_definition->name = CORBA::string_dup(new_resource.name.c_str());
179 resource_definition->hostname = CORBA::string_dup(new_resource.hostname.c_str());
180 resource_definition->protocol = CORBA::string_dup(new_resource.protocol.c_str());
181 resource_definition->username = CORBA::string_dup(new_resource.username.c_str());
182 resource_definition->applipath = CORBA::string_dup(new_resource.applipath.c_str());
185 std::list<std::string>::iterator it = new_resource.componentList.begin();
186 resource_definition->componentList.length(new_resource.componentList.size());
187 for(; it != new_resource.componentList.end(); it++)
189 resource_definition->componentList[i] = CORBA::string_dup((*it).c_str());
193 resource_definition->OS = CORBA::string_dup(new_resource.OS.c_str());
194 resource_definition->mem_mb = new_resource.mem_mb;
195 resource_definition->cpu_clock = new_resource.cpu_clock;
196 resource_definition->nb_node = new_resource.nb_node;
197 resource_definition->nb_proc_per_node = new_resource.nb_proc_per_node;
198 resource_definition->batch = CORBA::string_dup(new_resource.batch.c_str());
199 resource_definition->mpiImpl = CORBA::string_dup(new_resource.mpiImpl.c_str());
200 resource_definition->iprotocol = CORBA::string_dup(new_resource.iprotocol.c_str());
201 resource_definition->is_cluster_head = new_resource.is_cluster_head;
202 resource_definition->working_directory = CORBA::string_dup(new_resource.working_directory.c_str());
206 _resources_manager->AddResource(resource_definition, true, "");
208 catch (const SALOME::SALOME_Exception & ex)
210 DEBMSG("SALOME Exception in addResource ! " << ex.details.text.in());
212 catch (const CORBA::SystemException& ex)
214 DEBMSG("Receive SALOME System Exception: " << ex);
215 DEBMSG("Check SALOME servers...");
220 BL::SALOMEServices::removeResource(const std::string & name)
224 _resources_manager->RemoveResource(name.c_str(), true, "");
226 catch (const SALOME::SALOME_Exception & ex)
228 DEBMSG("SALOME Exception in removeResource ! " << ex.details.text.in());
230 catch (const CORBA::SystemException& ex)
232 DEBMSG("Receive SALOME System Exception: " << ex);
233 DEBMSG("Check SALOME servers...");
238 BL::SALOMEServices::create_job(BL::Job * job)
240 DEBMSG("Begin of create_job");
241 std::string ret = "";
242 Engines::JobParameters_var job_parameters = new Engines::JobParameters;
245 if (job->getType() == BL::Job::COMMAND)
247 job_parameters->job_type = CORBA::string_dup("command");
249 else if (job->getType() == BL::Job::YACS_SCHEMA)
251 job_parameters->job_type = CORBA::string_dup("yacs_file");
253 else if (job->getType() == BL::Job::PYTHON_SALOME)
255 job_parameters->job_type = CORBA::string_dup("python_salome");
258 // Specific parameters
259 if (job->getType() == BL::Job::YACS_SCHEMA)
261 if (job->getDumpYACSState() > 0)
263 job_parameters->specific_parameters.length(job_parameters->specific_parameters.length() + 1);
264 std::ostringstream oss;
265 oss << job->getDumpYACSState();
266 Engines::Parameter_var new_parameter = new Engines::Parameter;
267 new_parameter->name = CORBA::string_dup("EnableDumpYACS");
268 new_parameter->value = CORBA::string_dup(oss.str().c_str());
269 job_parameters->specific_parameters[job_parameters->specific_parameters.length() - 1] = new_parameter;
272 if (job->getLoadLevelerJobType() != "")
274 job_parameters->specific_parameters.length(job_parameters->specific_parameters.length() + 1);
275 Engines::Parameter_var new_parameter = new Engines::Parameter;
276 new_parameter->name = CORBA::string_dup("LoalLevelerJobType");
277 new_parameter->value = CORBA::string_dup(job->getLoadLevelerJobType().c_str());
278 job_parameters->specific_parameters[job_parameters->specific_parameters.length() - 1] = new_parameter;
282 job_parameters->job_name = CORBA::string_dup(job->getName().c_str());
283 job_parameters->job_file = CORBA::string_dup(job->getJobFile().c_str());
284 job_parameters->env_file = CORBA::string_dup(job->getEnvFile().c_str());
285 BL::Job::FilesParam files = job->getFilesParameters();
286 std::list<std::string>::iterator it;
290 job_parameters->in_files.length(files.input_files_list.size());
291 for (it = files.input_files_list.begin() ; it != files.input_files_list.end(); it++)
293 job_parameters->in_files[i] = CORBA::string_dup((*it).c_str());
297 job_parameters->out_files.length(files.output_files_list.size());
298 for (it = files.output_files_list.begin() ; it != files.output_files_list.end(); it++)
300 job_parameters->out_files[j] = CORBA::string_dup((*it).c_str());
303 job_parameters->local_directory = CORBA::string_dup("");
304 job_parameters->result_directory = CORBA::string_dup(files.result_directory.c_str());
306 BL::Job::BatchParam cpp_batch_params = job->getBatchParameters();
307 job_parameters->work_directory = CORBA::string_dup(cpp_batch_params.batch_directory.c_str());
310 job_parameters->maximum_duration = CORBA::string_dup(cpp_batch_params.maximum_duration.c_str());
311 job_parameters->resource_required.name = CORBA::string_dup(job->getResource().c_str());
312 job_parameters->resource_required.nb_proc = cpp_batch_params.nb_proc;
313 job_parameters->queue = CORBA::string_dup(job->getBatchQueue().c_str());
317 std::string ram = cpp_batch_params.expected_memory.substr(0,cpp_batch_params.expected_memory.size()-2);
318 std::istringstream iss(ram);
320 std::string unity = cpp_batch_params.expected_memory.substr(cpp_batch_params.expected_memory.size()-2, 2);
321 if((unity.find("gb") != std::string::npos))
322 memory = memory * 1024;
323 job_parameters->resource_required.mem_mb = memory;
328 int job_id = _salome_launcher->createJob(job_parameters);
329 job->setSalomeLauncherId(job_id);
331 catch (const SALOME::SALOME_Exception & ex)
333 DEBMSG("SALOME Exception in createJob !");
334 ret = ex.details.text.in();
336 catch (const CORBA::SystemException& ex)
338 DEBMSG("Receive SALOME System Exception: " << ex);
339 DEBMSG("Check SALOME servers...");
340 ret = "SALOME System Exception - see logs";
346 BL::SALOMEServices::start_job(BL::Job * job)
348 std::string ret = "";
352 _salome_launcher->launchJob(job->getSalomeLauncherId());
354 catch (const SALOME::SALOME_Exception & ex)
356 DEBMSG("SALOME Exception in launchJob !");
357 ret = ex.details.text.in();
359 catch (const CORBA::SystemException& ex)
361 DEBMSG("Receive SALOME System Exception: " << ex);
362 DEBMSG("Check SALOME servers...");
363 ret = "SALOME System Exception - see logs";
369 BL::SALOMEServices::refresh_job(BL::Job * job)
371 std::string ret = "";
376 CORBA::String_var result = _salome_launcher->getJobState(job->getSalomeLauncherId());
379 catch (const SALOME::SALOME_Exception & ex)
381 DEBMSG("SALOME Exception in getJobState !");
382 ret = ex.details.text.in();
384 catch (const CORBA::SystemException& ex)
386 DEBMSG("Receive SALOME System Exception: " << ex);
387 DEBMSG("Check SALOME servers...");
388 ret = "SALOME System Exception - see logs";
394 BL::SALOMEServices::delete_job(BL::Job * job)
396 std::string ret = "";
400 _salome_launcher->removeJob(job->getSalomeLauncherId());
402 catch (const SALOME::SALOME_Exception & ex)
404 DEBMSG("SALOME Exception in removeJob !");
405 ret = ex.details.text.in();
407 catch (const CORBA::SystemException& ex)
409 DEBMSG("Receive SALOME System Exception: " << ex);
410 DEBMSG("Check SALOME servers...");
411 ret = "SALOME System Exception - see logs";
417 BL::SALOMEServices::stop_job(BL::Job * job)
419 std::string ret = "";
422 _salome_launcher->stopJob(job->getSalomeLauncherId());
424 catch (const SALOME::SALOME_Exception & ex)
426 DEBMSG("SALOME Exception in stopJob !");
427 ret = ex.details.text.in();
429 catch (const CORBA::SystemException& ex)
431 DEBMSG("Receive SALOME System Exception: " << ex);
432 DEBMSG("Check SALOME servers...");
433 ret = "SALOME System Exception - see logs";
439 BL::SALOMEServices::get_results_job(BL::Job * job)
441 std::string ret = "";
443 BL::Job::FilesParam files = job->getFilesParameters();
444 CORBA::String_var directory = CORBA::string_dup(files.result_directory.c_str());
449 _salome_launcher->getJobResults(job->getSalomeLauncherId(), directory);
451 catch (const SALOME::SALOME_Exception & ex)
453 DEBMSG("SALOME Exception in refresh_job !");
454 ret = ex.details.text.in();
456 catch (const CORBA::SystemException& ex)
458 DEBMSG("Receive SALOME System Exception: " << ex);
459 DEBMSG("Check SALOME servers...");
460 ret = "SALOME System Exception - see logs";
466 BL::SALOMEServices::save_jobs(const std::string & file_name)
468 CORBA::String_var file = CORBA::string_dup(file_name.c_str());
469 std::string ret = "";
472 _salome_launcher->saveJobs(file);
474 catch (const SALOME::SALOME_Exception & ex)
476 DEBMSG("SALOME Exception in saveJobs !");
477 ret = ex.details.text.in();
479 catch (const CORBA::SystemException& ex)
481 DEBMSG("Receive CORBA System Exception: " << ex);
482 DEBMSG("Check SALOME servers...");
483 ret = "CORBA System Exception - see SALOME logs";
489 BL::SALOMEServices::load_jobs(const std::string & file_name)
491 CORBA::String_var file = CORBA::string_dup(file_name.c_str());
492 std::string ret = "";
495 _salome_launcher->loadJobs(file);
497 catch (const SALOME::SALOME_Exception & ex)
499 DEBMSG("SALOME Exception in loadJobs !");
500 ret = ex.details.text.in();
502 catch (const CORBA::SystemException& ex)
504 DEBMSG("Receive CORBA System Exception: " << ex);
505 DEBMSG("Check SALOME servers...");
506 ret = "CORBA System Exception - see SALOME logs";
512 BL::SALOMEServices::notify(const char* event_name, const char * event_data)
514 DEBMSG("Launcher event received " << event_name << " " << event_data);
516 std::string event(event_name);
517 std::string data(event_data);
519 if (event == "SAVE_JOBS")
521 _manager->launcher_event_save_jobs(data);
523 else if (event == "LOAD_JOBS")
525 _manager->launcher_event_load_jobs(data);
527 else if (event == "NEW_JOB")
529 _manager->launcher_event_new_job(data);
531 else if (event == "REMOVE_JOB")
533 _manager->launcher_event_remove_job(data);
535 else if (event == "UPDATE_JOB_STATE")
537 _manager->launcher_event_update_job_state(data);
541 DEBMSG("Unkown launcher event received");
546 BL::SALOMEServices::get_new_job(int job_number)
548 DEBMSG("Start of BL::SALOMEServices::get_new_job");
549 BL::Job * job_return = NULL;
550 Engines::JobParameters * job_parameters = NULL;
553 job_parameters = _salome_launcher->getJobParameters(job_number);
555 catch (const SALOME::SALOME_Exception & ex)
557 DEBMSG("SALOME Exception in saveJobs !");
559 catch (const CORBA::SystemException& ex)
561 DEBMSG("Receive CORBA System Exception: " << ex);
562 DEBMSG("Check SALOME servers...");
567 job_return = new BL::Job();
568 job_return->setSalomeLauncherId(job_number);
570 job_return->setName(job_parameters->job_name.in());
571 job_return->setType(job_parameters->job_type.in());
572 job_return->setJobFile(job_parameters->job_file.in());
573 job_return->setEnvFile(job_parameters->env_file.in());
574 job_return->setBatchQueue(job_parameters->queue.in());
576 BL::Job::FilesParam param;
577 param.result_directory = job_parameters->result_directory.in();
578 for (CORBA::ULong i = 0; i < job_parameters->in_files.length(); i++)
579 param.input_files_list.push_back(job_parameters->in_files[i].in());
580 for (CORBA::ULong i = 0; i < job_parameters->out_files.length(); i++)
581 param.output_files_list.push_back(job_parameters->out_files[i].in());
582 job_return->setFilesParameters(param);
584 BL::Job::BatchParam batch_param;
585 batch_param.batch_directory = job_parameters->work_directory.in();
586 batch_param.maximum_duration = job_parameters->maximum_duration.in();
587 batch_param.nb_proc = job_parameters->resource_required.nb_proc;
588 std::ostringstream mem_stream;
589 mem_stream << job_parameters->resource_required.mem_mb << "mb";
590 batch_param.expected_memory = mem_stream.str();
591 job_return->setBatchParameters(batch_param);
593 job_return->setResource(job_parameters->resource_required.name.in());
595 // Specific parameters
596 for (CORBA::ULong i = 0; i < job_parameters->specific_parameters.length(); i++)
598 if (std::string(job_parameters->specific_parameters[i].name.in()) == "EnableDumpYACS")
600 std::string user_value = job_parameters->specific_parameters[i].value.in();
601 std::istringstream iss(user_value);
604 job_return->setDumpYACSState(value);
606 if (std::string(job_parameters->specific_parameters[i].name.in()) == "LoalLevelerJobType")
608 std::string user_value = job_parameters->specific_parameters[i].value.in();
609 job_return->setLoadLevelerJobType(user_value);
614 std::string result_job = job_return->setStringState(refresh_job(job_return));
615 if (result_job != "RefreshError") {}
618 // Error in getting state
619 DEBMSG("Error in getting state of the new job!");
623 delete job_parameters;