1 #include "SALOME_ContainerManager.hxx"
2 #include "SALOME_NamingService.hxx"
10 #define TIME_OUT_TO_LAUNCH_CONT 21
14 const char *SALOME_ContainerManager::_ContainerManagerNameInNS="/ContainerManager";
16 SALOME_ContainerManager::SALOME_ContainerManager(CORBA::ORB_ptr orb)
18 _NS=new SALOME_NamingService(orb);
19 PortableServer::POA_var root_poa=PortableServer::POA::_the_root_poa();
20 PortableServer::POAManager_var pman = root_poa->the_POAManager();
21 PortableServer::POA_var my_poa;
22 CORBA::PolicyList policies;
24 PortableServer::ThreadPolicy_var threadPol=root_poa->create_thread_policy(PortableServer::SINGLE_THREAD_MODEL);
25 policies[0]=PortableServer::ThreadPolicy::_duplicate(threadPol);
26 my_poa=root_poa->create_POA("SThreadPOA",pman,policies);
28 PortableServer::ObjectId_var id=my_poa->activate_object(this);
29 CORBA::Object_var obj=my_poa->id_to_reference(id);
30 Engines::ContainerManager_var refContMan = Engines::ContainerManager::_narrow(obj);
31 _NS->Register(refContMan,_ContainerManagerNameInNS);
34 SALOME_ContainerManager::~SALOME_ContainerManager()
39 void SALOME_ContainerManager::Shutdown()
42 PortableServer::ObjectId_var oid = _default_POA()->servant_to_id(this);
43 _default_POA()->deactivate_object(oid);
48 void SALOME_ContainerManager::ShutdownContainers()
50 _NS->Change_Directory("/Containers");
51 vector<string> vec=_NS->list_directory_recurs();
52 for(vector<string>::iterator iter=vec.begin();iter!=vec.end();iter++)
55 CORBA::Object_var obj=_NS->Resolve((*iter).c_str());
56 Engines::Container_var cont=Engines::Container::_narrow(obj);
57 if(!CORBA::is_nil(cont))
62 Engines::Container_ptr SALOME_ContainerManager::FindOrStartContainer(const char *containerName, const Engines::MachineList& possibleComputers)
64 Engines::Container_ptr ret=FindContainer(containerName,possibleComputers);
65 if(!CORBA::is_nil(ret))
67 // Container doesn't exist try to launch it ...
68 vector<string> vector;
69 string theMachine=_LoadManager.FindBest(possibleComputers);
71 if(theMachine==GetHostname())
72 command=_ResManager.BuildCommandToLaunchLocalContainer(containerName);
74 command=_ResManager.BuildTempFileToLaunchRemoteContainer(theMachine,containerName);
75 _ResManager.RmTmpFile();
76 int status=system(command.c_str());
78 MESSAGE("SALOME_LifeCycleCORBA::StartOrFindContainer rsh failed (system command status -1)");
79 return Engines::Container::_nil();
81 else if (status == 217) {
82 MESSAGE("SALOME_LifeCycleCORBA::StartOrFindContainer rsh failed (system command status 217)");
83 return Engines::Container::_nil();
86 int count=TIME_OUT_TO_LAUNCH_CONT;
87 while ( CORBA::is_nil(ret) && count ) {
95 MESSAGE( count << ". Waiting for FactoryServer on " << theMachine);
96 string containerNameInNS=BuildContainerNameInNS(containerName,theMachine.c_str());
97 SCRUTE(containerNameInNS);
98 CORBA::Object_var obj = _NS->Resolve(containerNameInNS.c_str());
99 ret=Engines::Container::_narrow(obj);
101 if ( CORBA::is_nil(ret) ) {
102 MESSAGE("SALOME_LifeCycleCORBA::StartOrFindContainer rsh failed");
108 Engines::MachineList *SALOME_ContainerManager::GetFittingResources(const Engines::MachineParameters& params, const char *componentName)
110 vector<string> vec=_ResManager.GetFittingResources(params,componentName);
111 Engines::MachineList *ret=new Engines::MachineList;
112 ret->length(vec.size());
113 for(unsigned int i=0;i<vec.size();i++)
115 (*ret)[i]=(vec[i]).c_str();
120 char* SALOME_ContainerManager::FindBest(const Engines::MachineList& possibleComputers)
122 string theMachine=_LoadManager.FindBest(possibleComputers);
123 return CORBA::string_dup(theMachine.c_str());
126 Engines::Container_ptr SALOME_ContainerManager::FindContainer(const char *containerName,const char *theMachine)
128 string containerNameInNS(BuildContainerNameInNS(containerName,theMachine));
129 SCRUTE(containerNameInNS);
130 CORBA::Object_var obj = _NS->Resolve(containerNameInNS.c_str());
131 if( !CORBA::is_nil(obj) )
132 return Engines::Container::_narrow(obj);
134 return Engines::Container::_nil();
137 Engines::Container_ptr SALOME_ContainerManager::FindContainer(const char *containerName,const Engines::MachineList& possibleComputers)
139 for(unsigned int i=0;i<possibleComputers.length();i++)
141 Engines::Container_ptr cont=FindContainer(containerName,possibleComputers[i]);
142 if( !CORBA::is_nil(cont) )
145 return Engines::Container::_nil();
148 string SALOME_ContainerManager::BuildContainerNameInNS(const char *containerName,const char *machineName)
150 string containerNameInNS("/Containers/");
151 containerNameInNS+=machineName;
152 containerNameInNS+="/";
153 containerNameInNS+=containerName;
154 return containerNameInNS;