Salome HOME
BugID: IPAL9392, modified methods GetRowUnits.
[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 #ifndef WNT
6 #include <unistd.h>
7 #endif
8 #include <vector>
9
10 #define TIME_OUT_TO_LAUNCH_CONT 21
11
12 using namespace std;
13
14 const char *SALOME_ContainerManager::_ContainerManagerNameInNS="/ContainerManager";
15
16 SALOME_ContainerManager::SALOME_ContainerManager(CORBA::ORB_ptr orb)
17 {
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;
23   policies.length(1);
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);
27   threadPol->destroy();
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);
32 }
33
34 SALOME_ContainerManager::~SALOME_ContainerManager()
35 {
36   delete _NS;
37 }
38
39 void SALOME_ContainerManager::Shutdown()
40 {
41   ShutdownContainers();
42   PortableServer::ObjectId_var oid = _default_POA()->servant_to_id(this);
43   _default_POA()->deactivate_object(oid);
44   _remove_ref();
45   
46 }
47
48 void SALOME_ContainerManager::ShutdownContainers()
49 {
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++)
53     {
54       SCRUTE((*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))
58         cont->Shutdown();
59     }
60 }
61
62 Engines::Container_ptr SALOME_ContainerManager::FindOrStartContainer(const char *containerName, const Engines::MachineList& possibleComputers)
63 {
64   Engines::Container_ptr ret=FindContainer(containerName,possibleComputers);
65   if(!CORBA::is_nil(ret))
66     return ret;
67   // Container doesn't exist try to launch it ...
68   vector<string> vector;
69   string theMachine=_LoadManager.FindBest(possibleComputers);
70   string command;
71   if(theMachine==GetHostname())
72     command=_ResManager.BuildCommandToLaunchLocalContainer(containerName);
73   else
74     command=_ResManager.BuildTempFileToLaunchRemoteContainer(theMachine,containerName);
75   _ResManager.RmTmpFile();
76   int status=system(command.c_str());
77   if (status == -1) {
78     MESSAGE("SALOME_LifeCycleCORBA::StartOrFindContainer rsh failed (system command status -1)");
79     return Engines::Container::_nil();
80   }
81   else if (status == 217) {
82     MESSAGE("SALOME_LifeCycleCORBA::StartOrFindContainer rsh failed (system command status 217)");
83     return Engines::Container::_nil();
84   }
85   else {
86     int count=TIME_OUT_TO_LAUNCH_CONT;
87     while ( CORBA::is_nil(ret) && count ) {
88 #ifndef WNT
89       sleep( 1 ) ;
90 #else
91           Sleep(1000);
92 #endif
93       count-- ;
94       if ( count != 10 )
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);
100     }
101     if ( CORBA::is_nil(ret) ) {
102       MESSAGE("SALOME_LifeCycleCORBA::StartOrFindContainer rsh failed");
103     }
104     return ret;
105   }
106 }
107
108 Engines::MachineList *SALOME_ContainerManager::GetFittingResources(const Engines::MachineParameters& params, const char *componentName)
109 {
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++)
114     {
115       (*ret)[i]=(vec[i]).c_str();
116     }
117   return ret;
118 }
119
120 char* SALOME_ContainerManager::FindBest(const Engines::MachineList& possibleComputers)
121   {
122     string theMachine=_LoadManager.FindBest(possibleComputers);
123     return CORBA::string_dup(theMachine.c_str());
124   }
125
126 Engines::Container_ptr SALOME_ContainerManager::FindContainer(const char *containerName,const char *theMachine)
127 {
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);
133   else
134     return Engines::Container::_nil();
135 }
136
137 Engines::Container_ptr SALOME_ContainerManager::FindContainer(const char *containerName,const Engines::MachineList& possibleComputers)
138 {
139   for(unsigned int i=0;i<possibleComputers.length();i++)
140     {
141       Engines::Container_ptr cont=FindContainer(containerName,possibleComputers[i]);
142       if( !CORBA::is_nil(cont) )
143         return cont;
144     }
145   return Engines::Container::_nil();
146 }
147
148 string SALOME_ContainerManager::BuildContainerNameInNS(const char *containerName,const char *machineName)
149 {
150   string containerNameInNS("/Containers/");
151   containerNameInNS+=machineName;
152   containerNameInNS+="/";
153   containerNameInNS+=containerName;
154   return containerNameInNS;
155 }