4 #define protected public
5 #include <omniORB4/CORBA.h>
6 #include <omniORB4/internal/typecode.h>
9 #include "RuntimeSALOME.hxx"
10 #include "SalomeContainer.hxx"
11 #include "SalomeComponent.hxx"
13 #include "SALOME_NamingService.hxx"
14 #include "SALOME_LifeCycleCORBA.hxx"
15 #include "SALOME_ContainerManager.hxx"
22 #include "YacsTrace.hxx"
24 using namespace YACS::ENGINE;
27 SalomeContainer::SalomeContainer():_trueCont(Engines::Container::_nil())
29 /* Init MachinesParameters */
30 _params.container_name = "";
31 _params.hostname = "";
34 _params.cpu_clock = 0;
35 _params.nb_proc_per_node = 0;
37 _params.isMPI = false;
38 _params.parallelLib = "";
39 _params.nb_component_nodes = 0;
42 SalomeContainer::SalomeContainer(const SalomeContainer& other):Container(other),_trueCont(Engines::Container::_nil())
44 _params.container_name = CORBA::string_dup(other._params.container_name);
45 _params.hostname = CORBA::string_dup(other._params.hostname);
46 _params.OS = CORBA::string_dup(other._params.OS);
47 _params.mem_mb = other._params.mem_mb;
48 _params.cpu_clock = other._params.cpu_clock;
49 _params.nb_proc_per_node = other._params.nb_proc_per_node;
50 _params.nb_node = other._params.nb_node;
51 _params.isMPI = other._params.isMPI;
52 _params.parallelLib = CORBA::string_dup(other._params.parallelLib);
53 _params.nb_component_nodes = other._params.nb_component_nodes;
54 _params.workingdir= CORBA::string_dup(other._params.workingdir);
57 SalomeContainer::~SalomeContainer()
61 void SalomeContainer::lock()
66 void SalomeContainer::unLock()
71 bool SalomeContainer::isAlreadyStarted() const
73 if(CORBA::is_nil(_trueCont))
79 void SalomeContainer::start() throw (Exception)
81 CORBA::ORB_ptr orb=getSALOMERuntime()->getOrb();
82 SALOME_NamingService ns;
87 catch(SALOME_Exception& e)
89 throw Exception("SalomeContainer::start : Unable to contact the SALOME Naming Service");
91 CORBA::Object_var obj=ns.Resolve(SALOME_ContainerManager::_ContainerManagerNameInNS);
92 Engines::ContainerManager_var contManager=Engines::ContainerManager::_narrow(obj);
94 std::string str(_params.container_name);
95 //If a container_name is given try to find an already existing container in naming service
96 //If not found start a new container with the given parameters
99 std::string machine(_params.hostname);
100 if(machine == "" || machine == "localhost")
101 machine=GetHostname();
102 std::string ContainerNameInNS=ns.BuildContainerNameForNS(_params,machine.c_str());
103 obj=ns.Resolve(ContainerNameInNS.c_str());
104 if(!CORBA::is_nil(obj))
106 std::cerr << "Container already exists: " << ContainerNameInNS << std::endl;
107 _trueCont=Engines::Container::_narrow(obj);
114 std::ostringstream stream;
115 stream << (void *)(this);
116 _params.container_name=CORBA::string_dup(stream.str().c_str());
118 Engines::CompoList compolist;
119 compolist.length(_componentNames.size());
120 std::vector<std::string>::iterator iter;
121 for(CORBA::ULong i=0; i < _componentNames.size();i++)
123 compolist[i]=CORBA::string_dup(_componentNames[i].c_str());
128 // --- GiveContainer is used in batch mode to retreive launched containers,
129 // and is equivalent to StartContainer when not in batch.
130 std::string policy=getProperty("policy");
132 _trueCont=contManager->GiveContainer(_params,Engines::P_BEST,compolist);
133 else if(policy=="first")
134 _trueCont=contManager->GiveContainer(_params,Engines::P_FIRST,compolist);
136 _trueCont=contManager->GiveContainer(_params,Engines::P_CYCL,compolist);
138 catch(CORBA::COMM_FAILURE&)
140 throw Exception("SalomeContainer::start : Unable to launch container in Salome : CORBA Comm failure detected");
142 catch(CORBA::Exception&)
144 throw Exception("SalomeContainer::start : Unable to launch container in Salome : Unexpected CORBA failure detected");
146 if(CORBA::is_nil(_trueCont))
147 throw Exception("SalomeContainer::start : Unable to launch container in Salome. Check your CatalogResources.xml file");
149 CORBA::String_var containerName=_trueCont->name();
150 CORBA::String_var hostName=_trueCont->getHostName();
151 std::cerr << "SalomeContainer launched : " << containerName << " " << hostName << " " << _trueCont->getPID() << std::endl;
154 DEBTRACE(_trueCont->_PR_getobj()->pd_refCount );
158 Container *SalomeContainer::clone() const
160 if(_isAttachedOnCloning)
163 return (Container*) (this);
166 return new SalomeContainer(*this);
169 std::string SalomeContainer::getPlacementId() const
171 if(isAlreadyStarted())
173 const char *what="/";
174 char *corbaStr=_trueCont->name();
175 string ret(corbaStr);
176 CORBA::string_free(corbaStr);
178 std::string::size_type i=ret.find_first_of(what,0);
179 i=ret.find_first_of(what, i==std::string::npos ? i:i+1);
180 if(i!=std::string::npos)
181 return ret.substr(i+1);
185 return "Not placed yet !!!";
188 void SalomeContainer::checkCapabilityToDealWith(const ComponentInstance *inst) const throw (Exception)
190 if(inst->getKind()!=SalomeComponent::KIND)
191 throw Exception("SalomeContainer::checkCapabilityToDealWith : SalomeContainer is not able to deal with this type of ComponentInstance.");
194 void SalomeContainer::setProperty(const std::string& name, const std::string& value)
196 DEBTRACE("SalomeContainer::setProperty : " << name << " ; " << value);
198 if (name == "container_name")
199 _params.container_name = CORBA::string_dup(value.c_str());
200 else if (name == "hostname")
201 _params.hostname = CORBA::string_dup(value.c_str());
202 else if (name == "OS")
203 _params.OS = CORBA::string_dup(value.c_str());
204 else if (name == "parallelLib")
205 _params.parallelLib = CORBA::string_dup(value.c_str());
206 else if (name == "workingdir")
207 _params.workingdir = CORBA::string_dup(value.c_str());
208 else if (name == "isMPI")
211 _params.isMPI = true;
212 else if (value == "false")
213 _params.isMPI = false;
215 throw Exception("SalomeContainer::SetProperty : params.isMPI value not correct : " + value);
217 else if (name == "mem_mb")
219 std::istringstream iss(value);
220 if (!(iss >> _params.mem_mb))
221 throw Exception("salomecontainer::setproperty : params.mem_mb value not correct : " + value);
223 else if (name == "cpu_clock")
225 std::istringstream iss(value);
226 if (!(iss >> _params.cpu_clock))
227 throw Exception("salomecontainer::setproperty : params.cpu_clock value not correct : " + value);
229 else if (name == "nb_proc_per_node")
231 std::istringstream iss(value);
232 if (!(iss >> _params.nb_proc_per_node))
233 throw Exception("salomecontainer::setproperty : params.nb_proc_per_node value not correct : " + value);
235 else if (name == "nb_node")
237 std::istringstream iss(value);
238 if (!(iss >> _params.nb_node))
239 throw Exception("salomecontainer::setproperty : params.nb_node value not correct : " + value);
241 else if (name == "nb_component_nodes")
243 std::istringstream iss(value);
244 if (!(iss >> _params.nb_component_nodes))
245 throw Exception("salomecontainer::setproperty : params.nb_component_nodes value not correct : " + value);
247 Container::setProperty(name, value);
250 bool SalomeContainer::isAPaCOContainer() const
253 string parallelLib(_params.parallelLib);
254 if (parallelLib != "")
259 void SalomeContainer::addComponentName(std::string name)
261 _componentNames.push_back(name);