1 #include "SALOME_ContainerManager.hxx"
2 #include "SALOME_NamingService.hxx"
8 #define TIME_OUT_TO_LAUNCH_CONT 21
12 const char *SALOME_ContainerManager::_ContainerManagerNameInNS="/ContainerManager";
14 SALOME_ContainerManager::SALOME_ContainerManager(CORBA::ORB_ptr orb)
16 _NS=new SALOME_NamingService(orb);
17 PortableServer::POA_var root_poa=PortableServer::POA::_the_root_poa();
18 PortableServer::ObjectId_var id=root_poa->activate_object(this);
19 CORBA::Object_var obj=root_poa->id_to_reference(id);
20 Engines::ContainerManager_var refContMan = Engines::ContainerManager::_narrow(obj);
21 _NS->Register(refContMan,_ContainerManagerNameInNS);
24 SALOME_ContainerManager::~SALOME_ContainerManager()
29 void SALOME_ContainerManager::Shutdown()
32 PortableServer::ObjectId_var oid = _default_POA()->servant_to_id(this);
33 _default_POA()->deactivate_object(oid);
38 void SALOME_ContainerManager::ShutdownContainers()
40 _NS->Change_Directory("/Containers");
41 vector<string> vec=_NS->list_directory_recurs();
42 for(vector<string>::iterator iter=vec.begin();iter!=vec.end();iter++)
45 CORBA::Object_var obj=_NS->Resolve((*iter).c_str());
46 Engines::Container_var cont=Engines::Container::_narrow(obj);
47 if(!CORBA::is_nil(cont))
52 Engines::Container_ptr SALOME_ContainerManager::FindOrStartContainer(const char *containerName, const Engines::MachineList& possibleComputers)
54 Engines::Container_ptr ret=FindContainer(containerName,possibleComputers);
55 if(!CORBA::is_nil(ret))
57 // Container doesn't exist try to launch it ...
58 vector<string> vector;
59 string theMachine=_LoadManager.FindBest(possibleComputers);
61 if(theMachine==GetHostname())
62 command=_ResManager.BuildCommandToLaunchLocalContainer(containerName);
64 command=_ResManager.BuildTempFileToLaunchRemoteContainer(theMachine,containerName);
65 _ResManager.RmTmpFile();
66 int status=system(command.c_str());
68 MESSAGE("SALOME_LifeCycleCORBA::StartOrFindContainer rsh failed (system command status -1)");
69 return Engines::Container::_nil();
71 else if (status == 217) {
72 MESSAGE("SALOME_LifeCycleCORBA::StartOrFindContainer rsh failed (system command status 217)");
73 return Engines::Container::_nil();
76 int count=TIME_OUT_TO_LAUNCH_CONT;
77 while ( CORBA::is_nil(ret) && count ) {
81 MESSAGE( count << ". Waiting for FactoryServer on " << theMachine);
82 string containerNameInNS=BuildContainerNameInNS(containerName,theMachine.c_str());
83 SCRUTE(containerNameInNS);
84 CORBA::Object_var obj = _NS->Resolve(containerNameInNS.c_str());
85 ret=Engines::Container::_narrow(obj);
87 if ( CORBA::is_nil(ret) ) {
88 MESSAGE("SALOME_LifeCycleCORBA::StartOrFindContainer rsh failed");
94 Engines::MachineList *SALOME_ContainerManager::GetFittingResources(const Engines::MachineParameters& params, const char *componentName)
96 vector<string> vec=_ResManager.GetFittingResources(params,componentName);
97 Engines::MachineList *ret=new Engines::MachineList;
98 ret->length(vec.size());
99 for(unsigned int i=0;i<vec.size();i++)
101 (*ret)[i]=(vec[i]).c_str();
106 char* SALOME_ContainerManager::FindBest(const Engines::MachineList& possibleComputers)
108 string theMachine=_LoadManager.FindBest(possibleComputers);
109 return CORBA::string_dup(theMachine.c_str());
112 Engines::Container_ptr SALOME_ContainerManager::FindContainer(const char *containerName,const char *theMachine)
114 string containerNameInNS(BuildContainerNameInNS(containerName,theMachine));
115 SCRUTE(containerNameInNS);
116 CORBA::Object_var obj = _NS->Resolve(containerNameInNS.c_str());
117 if( !CORBA::is_nil(obj) )
118 return Engines::Container::_narrow(obj);
120 return Engines::Container::_nil();
123 Engines::Container_ptr SALOME_ContainerManager::FindContainer(const char *containerName,const Engines::MachineList& possibleComputers)
125 for(unsigned int i=0;i<possibleComputers.length();i++)
127 Engines::Container_ptr cont=FindContainer(containerName,possibleComputers[i]);
128 if( !CORBA::is_nil(cont) )
131 return Engines::Container::_nil();
134 string SALOME_ContainerManager::BuildContainerNameInNS(const char *containerName,const char *machineName)
136 string containerNameInNS("/Containers/");
137 containerNameInNS+=machineName;
138 containerNameInNS+="/";
139 containerNameInNS+=containerName;
140 return containerNameInNS;