1 #include "SALOME_ContainerManager.hxx"
2 #include "SALOME_NamingService.hxx"
9 #include "Utils_CorbaException.hxx"
11 #define TIME_OUT_TO_LAUNCH_CONT 21
15 const char *SALOME_ContainerManager::_ContainerManagerNameInNS =
18 //=============================================================================
22 * Define a CORBA single thread policy for the server, which avoid to deal
23 * with non thread-safe usage like Change_Directory in SALOME naming service
25 //=============================================================================
27 SALOME_ContainerManager::SALOME_ContainerManager(CORBA::ORB_ptr orb)
29 MESSAGE("constructor");
30 _NS = new SALOME_NamingService(orb);
31 _ResManager = new SALOME_ResourcesManager(orb);
32 PortableServer::POA_var root_poa = PortableServer::POA::_the_root_poa();
33 PortableServer::POAManager_var pman = root_poa->the_POAManager();
34 PortableServer::POA_var my_poa;
36 CORBA::PolicyList policies;
38 PortableServer::ThreadPolicy_var threadPol =
39 root_poa->create_thread_policy(PortableServer::SINGLE_THREAD_MODEL);
40 policies[0] = PortableServer::ThreadPolicy::_duplicate(threadPol);
43 root_poa->create_POA("SThreadPOA",pman,policies);
45 PortableServer::ObjectId_var id = my_poa->activate_object(this);
46 CORBA::Object_var obj = my_poa->id_to_reference(id);
47 Engines::ContainerManager_var refContMan =
48 Engines::ContainerManager::_narrow(obj);
50 _NS->Register(refContMan,_ContainerManagerNameInNS);
51 MESSAGE("constructor end");
54 //=============================================================================
58 //=============================================================================
60 SALOME_ContainerManager::~SALOME_ContainerManager()
62 MESSAGE("destructor");
67 //=============================================================================
69 * shutdown all the containers, then the ContainerManager servant
71 //=============================================================================
73 void SALOME_ContainerManager::Shutdown()
77 PortableServer::ObjectId_var oid = _default_POA()->servant_to_id(this);
78 _default_POA()->deactivate_object(oid);
83 //=============================================================================
85 * Loop on all the containers listed in naming service, ask shutdown on each
87 //=============================================================================
89 void SALOME_ContainerManager::ShutdownContainers()
91 MESSAGE("ShutdownContainers");
92 _NS->Change_Directory("/Containers");
93 vector<string> vec = _NS->list_directory_recurs();
94 for(vector<string>::iterator iter = vec.begin();iter!=vec.end();iter++)
97 CORBA::Object_var obj=_NS->Resolve((*iter).c_str());
98 Engines::Container_var cont=Engines::Container::_narrow(obj);
99 if(!CORBA::is_nil(cont))
101 MESSAGE("ShutdownContainers: " << (*iter));
104 else MESSAGE("ShutdownContainers: no container ref for " << (*iter));
108 //=============================================================================
110 * Find a suitable Container in a list of machines, or start one
111 * \param params Machine Parameters required for the container
112 * \param possibleComputers list of machines usable for find or start
114 //=============================================================================
116 Engines::Container_ptr
117 SALOME_ContainerManager::
118 FindOrStartContainer(const Engines::MachineParameters& params,
119 const Engines::MachineList& possibleComputers)
121 Engines::Container_ptr ret = FindContainer(params,possibleComputers);
122 if(!CORBA::is_nil(ret))
124 MESSAGE("Container doesn't exist try to launch it ...");
125 MESSAGE("SALOME_ContainerManager::FindOrStartContainer " <<
126 possibleComputers.length());
127 //vector<string> vector;
128 string theMachine=_ResManager->FindBest(possibleComputers);
129 MESSAGE("try to launch it on " << theMachine);
134 MESSAGE("SALOME_ContainerManager::FindOrStartContainer : " <<
135 "no possible computer");
136 return Engines::Container::_nil();
138 else if(theMachine==GetHostname())
140 command=_ResManager->BuildCommandToLaunchLocalContainer(params);
144 _ResManager->BuildCommandToLaunchRemoteContainer(theMachine,params);
146 _ResManager->RmTmpFile();
147 int status=system(command.c_str());
150 MESSAGE("SALOME_LifeCycleCORBA::StartOrFindContainer rsh failed " <<
151 "(system command status -1)");
152 return Engines::Container::_nil();
154 else if (status == 217)
156 MESSAGE("SALOME_LifeCycleCORBA::StartOrFindContainer rsh failed " <<
157 "(system command status 217)");
158 return Engines::Container::_nil();
162 int count=TIME_OUT_TO_LAUNCH_CONT;
163 while ( CORBA::is_nil(ret) && count )
172 MESSAGE( count << ". Waiting for FactoryServer on " << theMachine);
173 string containerNameInNS =
174 _NS->BuildContainerNameForNS(params,theMachine.c_str());
175 SCRUTE(containerNameInNS);
176 CORBA::Object_var obj = _NS->Resolve(containerNameInNS.c_str());
177 ret=Engines::Container::_narrow(obj);
179 if ( CORBA::is_nil(ret) )
181 MESSAGE("SALOME_LifeCycleCORBA::StartOrFindContainer rsh failed");
187 //=============================================================================
191 //=============================================================================
193 Engines::MachineList *
194 SALOME_ContainerManager::
195 GetFittingResources(const Engines::MachineParameters& params,
196 const char *componentName)
198 MESSAGE("SALOME_ContainerManager::GetFittingResources");
199 Engines::MachineList *ret=new Engines::MachineList;
203 vec = _ResManager->GetFittingResources(params,componentName);
205 catch(const SALOME_Exception &ex)
207 INFOS("Caught exception.");
208 THROW_SALOME_CORBA_EXCEPTION(ex.what(),SALOME::BAD_PARAM);
212 MESSAGE("Machine list length "<<vec.size());
213 ret->length(vec.size());
214 for(unsigned int i=0;i<vec.size();i++)
216 (*ret)[i]=(vec[i]).c_str();
221 //=============================================================================
225 //=============================================================================
228 SALOME_ContainerManager::
229 FindBest(const Engines::MachineList& possibleComputers)
231 string theMachine=_ResManager->FindBest(possibleComputers);
232 return CORBA::string_dup(theMachine.c_str());
235 //=============================================================================
239 //=============================================================================
241 Engines::Container_ptr
242 SALOME_ContainerManager::
243 FindContainer(const Engines::MachineParameters& params,
244 const char *theMachine)
246 string containerNameInNS(_NS->BuildContainerNameForNS(params,theMachine));
247 CORBA::Object_var obj = _NS->Resolve(containerNameInNS.c_str());
248 if( !CORBA::is_nil(obj) )
249 return Engines::Container::_narrow(obj);
251 return Engines::Container::_nil();
254 //=============================================================================
258 //=============================================================================
260 Engines::Container_ptr
261 SALOME_ContainerManager::
262 FindContainer(const Engines::MachineParameters& params,
263 const Engines::MachineList& possibleComputers)
265 MESSAGE("FindContainer "<<possibleComputers.length());
266 for(unsigned int i=0;i<possibleComputers.length();i++)
268 MESSAGE("FindContainer possible " << possibleComputers[i]);
269 Engines::Container_ptr cont = FindContainer(params,possibleComputers[i]);
270 if( !CORBA::is_nil(cont) )
273 MESSAGE("FindContainer: not found");
274 return Engines::Container::_nil();