Salome HOME
PR: modify makefiles to separate rules for libraries and binaries.
[modules/kernel.git] / src / Container / SALOME_ContainerManager.cxx
1 #include "SALOME_ContainerManager.hxx"
2 #include "SALOME_NamingService.hxx"
3 #include "OpUtil.hxx"
4 #include <sys/types.h>
5 #include <unistd.h>
6 #include <vector>
7
8 #define TIME_OUT_TO_LAUNCH_CONT 21
9
10 using namespace std;
11
12 const char *SALOME_ContainerManager::_ContainerManagerNameInNS="/ContainerManager";
13
14 SALOME_ContainerManager::SALOME_ContainerManager(CORBA::ORB_ptr orb)
15 {
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);
22 }
23
24 SALOME_ContainerManager::~SALOME_ContainerManager()
25 {
26   delete _NS;
27 }
28
29 void SALOME_ContainerManager::Shutdown()
30 {
31   ShutdownContainers();
32   PortableServer::ObjectId_var oid = _default_POA()->servant_to_id(this);
33   _default_POA()->deactivate_object(oid);
34   _remove_ref();
35   
36 }
37
38 void SALOME_ContainerManager::ShutdownContainers()
39 {
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++)
43     {
44       SCRUTE((*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))
48         cont->Shutdown();
49     }
50 }
51
52 Engines::Container_ptr SALOME_ContainerManager::FindOrStartContainer(const char *containerName, const Engines::MachineList& possibleComputers)
53 {
54   Engines::Container_ptr ret=FindContainer(containerName,possibleComputers);
55   if(!CORBA::is_nil(ret))
56     return ret;
57   // Container doesn't exist try to launch it ...
58   vector<string> vector;
59   string theMachine=_LoadManager.FindBest(possibleComputers);
60   string command;
61   if(theMachine==GetHostname())
62     command=_ResManager.BuildCommandToLaunchLocalContainer(containerName);
63   else
64     command=_ResManager.BuildTempFileToLaunchRemoteContainer(theMachine,containerName);
65   _ResManager.RmTmpFile();
66   int status=system(command.c_str());
67   if (status == -1) {
68     MESSAGE("SALOME_LifeCycleCORBA::StartOrFindContainer rsh failed (system command status -1)");
69     return Engines::Container::_nil();
70   }
71   else if (status == 217) {
72     MESSAGE("SALOME_LifeCycleCORBA::StartOrFindContainer rsh failed (system command status 217)");
73     return Engines::Container::_nil();
74   }
75   else {
76     int count=TIME_OUT_TO_LAUNCH_CONT;
77     while ( CORBA::is_nil(ret) && count ) {
78       sleep( 1 ) ;
79       count-- ;
80       if ( count != 10 )
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);
86     }
87     if ( CORBA::is_nil(ret) ) {
88       MESSAGE("SALOME_LifeCycleCORBA::StartOrFindContainer rsh failed");
89     }
90     return ret;
91   }
92 }
93
94 Engines::MachineList *SALOME_ContainerManager::GetFittingResources(const Engines::MachineParameters& params, const char *componentName)
95 {
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++)
100     {
101       (*ret)[i]=(vec[i]).c_str();
102     }
103   return ret;
104 }
105
106 char* SALOME_ContainerManager::FindBest(const Engines::MachineList& possibleComputers)
107   {
108     string theMachine=_LoadManager.FindBest(possibleComputers);
109     return CORBA::string_dup(theMachine.c_str());
110   }
111
112 Engines::Container_ptr SALOME_ContainerManager::FindContainer(const char *containerName,const char *theMachine)
113 {
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);
119   else
120     return Engines::Container::_nil();
121 }
122
123 Engines::Container_ptr SALOME_ContainerManager::FindContainer(const char *containerName,const Engines::MachineList& possibleComputers)
124 {
125   for(unsigned int i=0;i<possibleComputers.length();i++)
126     {
127       Engines::Container_ptr cont=FindContainer(containerName,possibleComputers[i]);
128       if( !CORBA::is_nil(cont) )
129         return cont;
130     }
131   return Engines::Container::_nil();
132 }
133
134 string SALOME_ContainerManager::BuildContainerNameInNS(const char *containerName,const char *machineName)
135 {
136   string containerNameInNS("/Containers/");
137   containerNameInNS+=machineName;
138   containerNameInNS+="/";
139   containerNameInNS+=containerName;
140   return containerNameInNS;
141 }