21 #include "SALOME_LifeCycleCORBA.hxx"
23 #include "SALOME_ResourcesManager.hxx"
24 #include "SALOME_ContainerManager.hxx"
42 #define getpid _getpid
50 SALOME_LifeCycleCORBA::preSet(
_params);
60 _params=Engines::ContainerParameters();
65 std::map<std::string,std::string>::const_iterator it(
_propertyMap.find(name));
76 if (name ==
"container_name")
77 _params.container_name = CORBA::string_dup(value.c_str());
78 else if (name ==
"workingdir")
79 _params.workingdir = CORBA::string_dup(value.c_str());
80 else if (name ==
"nb_parallel_procs")
82 std::istringstream iss(value);
84 throw Exception(
"salomecontainer::setproperty : params.nb_proc value not correct : " + value);
86 else if (name ==
"isMPI")
90 else if (value ==
"false")
93 throw Exception(
"SalomeContainer::setProperty : params.isMPI value not correct : " + value);
95 else if (name ==
"parallelLib")
96 _params.parallelLib = CORBA::string_dup(value.c_str());
99 else if (name ==
"name")
100 _params.resource_params.name = CORBA::string_dup(value.c_str());
101 else if (name ==
"hostname")
102 _params.resource_params.hostname = CORBA::string_dup(value.c_str());
103 else if (name ==
"OS")
104 _params.resource_params.OS = CORBA::string_dup(value.c_str());
105 else if (name ==
"nb_resource_procs")
107 std::istringstream iss(value);
108 if (!(iss >>
_params.resource_params.nb_proc))
109 throw Exception(
"salomecontainer::setproperty : params.resource_params.nb_proc value not correct : " + value);
111 else if (name ==
"mem_mb")
113 std::istringstream iss(value);
114 if (!(iss >>
_params.resource_params.mem_mb))
115 throw Exception(
"salomecontainer::setproperty : params.resource_params.mem_mb value not correct : " + value);
117 else if (name ==
"cpu_clock")
119 std::istringstream iss(value);
120 if (!(iss >>
_params.resource_params.cpu_clock))
121 throw Exception(
"salomecontainer::setproperty : params.resource_params.cpu_clock value not correct : " + value);
123 else if (name ==
"nb_node")
125 std::istringstream iss(value);
126 if (!(iss >>
_params.resource_params.nb_node))
127 throw Exception(
"salomecontainer::setproperty : params.nb_node value not correct : " + value);
129 else if (name ==
"nb_proc_per_node")
131 std::istringstream iss(value);
132 if (!(iss >>
_params.resource_params.nb_proc_per_node))
133 throw Exception(
"salomecontainer::setproperty : params.nb_proc_per_node value not correct : " + value);
135 else if (name ==
"policy")
136 _params.resource_params.policy = CORBA::string_dup(value.c_str());
137 else if (name ==
"component_list")
139 std::string clean_value(value);
142 while(clean_value.find(
" ") != std::string::npos)
143 clean_value = clean_value.erase(clean_value.find(
" "), 1);
146 while(!clean_value.empty())
148 std::string result(
"");
149 std::string::size_type loc = clean_value.find(
",", 0);
150 if (loc != std::string::npos)
152 result = clean_value.substr(0, loc);
153 clean_value = clean_value.erase(0, loc+1);
157 result = clean_value;
160 if (result !=
"," && result !=
"")
167 else if (name ==
"resource_list")
169 std::string clean_value(value);
172 while(clean_value.find(
" ") != std::string::npos)
173 clean_value = clean_value.erase(clean_value.find(
" "), 1);
176 while(!clean_value.empty())
178 std::string result(
"");
179 std::string::size_type loc = clean_value.find(
",", 0);
180 if (loc != std::string::npos)
182 result = clean_value.substr(0, loc);
183 clean_value = clean_value.erase(0, loc+1);
187 result = clean_value;
190 if (result !=
"," && result !=
"")
203 for (CORBA::ULong
i = 0;
i <
_params.resource_params.componentList.length();
i++)
205 std::string component_name =
_params.resource_params.componentList[
i].in();
206 if (component_name == name)
210 CORBA::ULong lgth =
_params.resource_params.componentList.length();
211 _params.resource_params.componentList.length(lgth + 1);
212 _params.resource_params.componentList[lgth] = CORBA::string_dup(name.c_str());
218 for (CORBA::ULong
i = 0;
i <
_params.resource_params.resList.length();
i++)
220 std::string component_name =
_params.resource_params.resList[
i].in();
221 if (component_name == name)
225 CORBA::ULong lgth =
_params.resource_params.resList.length();
226 _params.resource_params.resList.length(lgth + 1);
227 _params.resource_params.resList[lgth] = CORBA::string_dup(name.c_str());
232 return std::string(
_params.container_name);
237 return _params.resource_params.nb_proc_per_node;
248 std::string name(
_params.container_name);
257 std::ostringstream stream;
269 return std::string(
_params.resource_params.hostname);
274 params.container_name=CORBA::string_dup(name.c_str());
279 std::map<std::string,std::string> properties;
283 if (!
orb)
return properties;
285 SALOME_LifeCycleCORBA lcc(&namingService);
286 CORBA::Object_var obj = namingService.
Resolve(SALOME_ResourcesManager::_ResourcesManagerNameInNS);
287 if (CORBA::is_nil(obj))
289 Engines::ResourcesManager_var resManager = Engines::ResourcesManager::_narrow(obj);
290 if (CORBA::is_nil(resManager))
293 std::ostringstream value;
294 Engines::ResourceDefinition_var resource_definition = resManager->GetResourceDefinition(name.c_str());
295 properties[
"hostname"]=resource_definition->hostname.in();
296 properties[
"OS"]=resource_definition->OS.in();
297 value.str(
""); value << resource_definition->mem_mb;
298 properties[
"mem_mb"]=value.str();
299 value.str(
""); value << resource_definition->cpu_clock;
300 properties[
"cpu_clock"]=value.str();
301 value.str(
""); value << resource_definition->nb_node;
302 properties[
"nb_node"]=value.str();
303 value.str(
""); value << resource_definition->nb_proc_per_node;
304 properties[
"nb_proc_per_node"]=value.str();
329 catch(SALOME_Exception& e)
331 throw Exception(
"SalomeContainer::start : Unable to contact the SALOME Naming Service");
333 CORBA::Object_var obj(ns.
Resolve(SALOME_ContainerManager::_ContainerManagerNameInNS));
334 Engines::ContainerManager_var contManager(Engines::ContainerManager::_narrow(obj));
342 for(std::vector<std::string>::const_iterator iter=compoNames.begin();iter!=compoNames.end();iter++)
348 myparams.mode=CORBA::string_dup(dftLauchMode.c_str());
355 myparams.mode=CORBA::string_dup(
"getorstart");
364 Engines::Container_var trueCont(Engines::Container::_nil());
365 if(!isEmptyName && shutdownLevel==999)
375 trueCont=contManager->GiveContainer(myparams);
377 catch(
const SALOME::SALOME_Exception&
ex )
379 std::string msg=
"SalomeContainer::start : no existing container : ";
381 msg +=
ex.details.text.in();
388 if(!CORBA::is_nil(trueCont))
396 myparams.mode=
"start";
397 DEBUG_YACSTRACE(
"container not found: " << str <<
" " << shutdownLevel);
402 while(CORBA::is_nil(trueCont))
409 trueCont=contManager->GiveContainer(myparams);
411 catch(
const SALOME::SALOME_Exception&
ex )
413 std::string msg=
"SalomeContainer::start : Unable to launch container in Salome : ";
415 msg +=
ex.details.text.in();
418 catch(CORBA::COMM_FAILURE&)
421 DEBUG_YACSTRACE(
"SalomeContainer::start :" << str <<
" :CORBA Comm failure detected. Make another try!");
425 std::ostringstream oss; oss <<
"SalomeContainer::start : Unable to launch container " << myparams.container_name <<
" in Salome : CORBA Comm failure detected";
429 catch(CORBA::Exception&)
431 std::ostringstream oss; oss <<
"SalomeContainer::start : Unable to launch container " << myparams.container_name <<
" in Salome : Unexpected CORBA failure detected";
436 if(CORBA::is_nil(trueCont))
438 std::ostringstream oss; oss <<
"SalomeContainer::start : Unable to launch container " << myparams.container_name <<
" in Salome. Check your CatalogResources.xml file";
445 CORBA::String_var containerName(trueCont->name()),hostName(trueCont->getHostName());
447 DEBUG_YACSTRACE(
"SalomeContainer launched : NS entry : " << containerName <<
" PID : " << trueCont->getPID() );
457 cont->
start(askingNode);
460 throw Exception(
"SalomeContainerToolsBase::LoadComponent : no instance of component in the task requesting for a load of its component !");
461 CORBA::Object_ptr objComponent=CORBA::Object::_nil();
465 Engines::Container_var container(launchModeType->
getContainer(askingNode));
468 bool isLoadable(container->load_component_Library(compoName.c_str(), reason));
478 throw Exception(
"SalomeContainerToolsBase::CreateComponentInstance : no instance of component in the task requesting for a load of its component !");
481 CORBA::Object_ptr objComponent=CORBA::Object::_nil();
484 Engines::FieldsDict_var env(
new Engines::FieldsDict);
485 std::map<std::string, std::string> properties(inst->
getProperties());
489 properties.insert(procMap.begin(),procMap.end());
492 std::map<std::string, std::string>::const_iterator itm;
493 env->length(properties.size());
495 for(itm = properties.begin(); itm != properties.end(); ++itm, item++)
498 env[item].key= CORBA::string_dup(itm->first.c_str());
499 env[item].value <<= itm->second.c_str();
502 objComponent=contPtr->create_component_instance_env(compoName.c_str(), env, reason);
503 if(CORBA::is_nil(objComponent))
505 std::string text=
"Error while trying to create a new component: component '"+ compoName;
506 text=text+
"' is not installed or it's a wrong name";
509 CORBA::string_free(reason);
519 Engines::Container_var container(launchModeType->
getContainer(askingNode));
520 const char *what=
"/";
521 CORBA::String_var corbaStr(container->name());
522 std::string ret(corbaStr);
525 std::string::size_type
i=ret.find_first_of(what,0);
526 i=ret.find_first_of(what,
i==std::string::npos ?
i:
i+1);
527 if(
i!=std::string::npos)
528 return ret.substr(
i+1);
532 return "Not placed yet !!!";
539 Engines::Container_var container(launchModeType->
getContainer(askingNode));
542 CORBA::String_var corbaStr(container->name());
543 std::string ret(corbaStr);
548 return "Unknown_placement";
552 return "Not_placed_yet";
558 std::string st(ret.resource_params.hostname);
564 throw YACS::Exception(
"SalomeContainerToolsDecorator::getParameters : Internal error !");
566 ret.resource_params.hostname=CORBA::string_dup(zeMachine.c_str());
#define DEBUG_YACSTRACE(msg)
void init_orb(CORBA::ORB_ptr orb=0) override
CORBA::Object_ptr Resolve(const char *Path) override
Base class for all component instances.
const std::string & getCompoName() const
virtual void start(const Task *askingNode)=0
virtual std::string getDiscreminantStrOfThis(const Task *askingNode) const
virtual bool isAlreadyStarted(const Task *askingNode) const =0
virtual std::string getName() const
std::map< std::string, std::string > getProperties()
int getNumberOfWorkers(int nbCoresPerWorker) const
std::string deduceMachineFrom(int workerId, int nbProcPerNode) const
Base class for all schema objects.
std::map< std::string, std::string > getProperties() const
CORBA::ORB_ptr getOrb() const
virtual Engines::Container_var getContainer(const Task *askingNode) const =0
virtual std::string getDftLaunchMode() const =0
virtual void setContainer(const Task *askingNode, Engines::Container_var cont)=0
std::size_t locateTask(const Task *node) const
virtual ComponentInstance * getComponent()=0
YACSRUNTIMESALOME_EXPORT RuntimeSALOME * getSALOMERuntime()