Salome HOME
PR: merge from tag V2_2_2
[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::POAManager_var pman = root_poa->the_POAManager();
19   PortableServer::POA_var my_poa;
20   CORBA::PolicyList policies;
21   policies.length(1);
22   PortableServer::ThreadPolicy_var threadPol=root_poa->create_thread_policy(PortableServer::SINGLE_THREAD_MODEL);
23   policies[0]=PortableServer::ThreadPolicy::_duplicate(threadPol);
24   my_poa=root_poa->create_POA("SThreadPOA",pman,policies);
25   threadPol->destroy();
26   PortableServer::ObjectId_var id=my_poa->activate_object(this);
27   CORBA::Object_var obj=my_poa->id_to_reference(id);
28   Engines::ContainerManager_var refContMan = Engines::ContainerManager::_narrow(obj);
29   _NS->Register(refContMan,_ContainerManagerNameInNS);
30 }
31
32 SALOME_ContainerManager::~SALOME_ContainerManager()
33 {
34   delete _NS;
35 }
36
37 void SALOME_ContainerManager::Shutdown()
38 {
39   ShutdownContainers();
40   PortableServer::ObjectId_var oid = _default_POA()->servant_to_id(this);
41   _default_POA()->deactivate_object(oid);
42   _remove_ref();
43   
44 }
45
46 void SALOME_ContainerManager::ShutdownContainers()
47 {
48   _NS->Change_Directory("/Containers");
49   vector<string> vec=_NS->list_directory_recurs();
50   for(vector<string>::iterator iter=vec.begin();iter!=vec.end();iter++)
51     {
52       SCRUTE((*iter));
53       CORBA::Object_var obj=_NS->Resolve((*iter).c_str());
54       Engines::Container_var cont=Engines::Container::_narrow(obj);
55       if(!CORBA::is_nil(cont))
56         cont->Shutdown();
57     }
58 }
59
60 Engines::Container_ptr SALOME_ContainerManager::FindOrStartContainer(const char *containerName, const Engines::MachineList& possibleComputers)
61 {
62   Engines::Container_ptr ret=FindContainer(containerName,possibleComputers);
63   if(!CORBA::is_nil(ret))
64     return ret;
65   // Container doesn't exist try to launch it ...
66   vector<string> vector;
67   string theMachine=_LoadManager.FindBest(possibleComputers);
68   string command;
69   if(theMachine==GetHostname())
70     command=_ResManager.BuildCommandToLaunchLocalContainer(containerName);
71   else
72     command=_ResManager.BuildTempFileToLaunchRemoteContainer(theMachine,containerName);
73   _ResManager.RmTmpFile();
74   int status=system(command.c_str());
75   if (status == -1) {
76     MESSAGE("SALOME_LifeCycleCORBA::StartOrFindContainer rsh failed (system command status -1)");
77     return Engines::Container::_nil();
78   }
79   else if (status == 217) {
80     MESSAGE("SALOME_LifeCycleCORBA::StartOrFindContainer rsh failed (system command status 217)");
81     return Engines::Container::_nil();
82   }
83   else {
84     int count=TIME_OUT_TO_LAUNCH_CONT;
85     while ( CORBA::is_nil(ret) && count ) {
86       sleep( 1 ) ;
87       count-- ;
88       if ( count != 10 )
89         MESSAGE( count << ". Waiting for FactoryServer on " << theMachine);
90       string containerNameInNS=BuildContainerNameInNS(containerName,theMachine.c_str());
91       SCRUTE(containerNameInNS);
92       CORBA::Object_var obj = _NS->Resolve(containerNameInNS.c_str());
93       ret=Engines::Container::_narrow(obj);
94     }
95     if ( CORBA::is_nil(ret) ) {
96       MESSAGE("SALOME_LifeCycleCORBA::StartOrFindContainer rsh failed");
97     }
98     return ret;
99   }
100 }
101
102 Engines::MachineList *SALOME_ContainerManager::GetFittingResources(const Engines::MachineParameters& params, const char *componentName)
103 {
104   vector<string> vec=_ResManager.GetFittingResources(params,componentName);
105   Engines::MachineList *ret=new Engines::MachineList;
106   ret->length(vec.size());
107   for(unsigned int i=0;i<vec.size();i++)
108     {
109       (*ret)[i]=(vec[i]).c_str();
110     }
111   return ret;
112 }
113
114 char* SALOME_ContainerManager::FindBest(const Engines::MachineList& possibleComputers)
115   {
116     string theMachine=_LoadManager.FindBest(possibleComputers);
117     return CORBA::string_dup(theMachine.c_str());
118   }
119
120 Engines::Container_ptr SALOME_ContainerManager::FindContainer(const char *containerName,const char *theMachine)
121 {
122   string containerNameInNS(BuildContainerNameInNS(containerName,theMachine));
123   SCRUTE(containerNameInNS);
124   CORBA::Object_var obj = _NS->Resolve(containerNameInNS.c_str());
125   if( !CORBA::is_nil(obj) )
126     return Engines::Container::_narrow(obj);
127   else
128     return Engines::Container::_nil();
129 }
130
131 Engines::Container_ptr SALOME_ContainerManager::FindContainer(const char *containerName,const Engines::MachineList& possibleComputers)
132 {
133   for(unsigned int i=0;i<possibleComputers.length();i++)
134     {
135       Engines::Container_ptr cont=FindContainer(containerName,possibleComputers[i]);
136       if( !CORBA::is_nil(cont) )
137         return cont;
138     }
139   return Engines::Container::_nil();
140 }
141
142 string SALOME_ContainerManager::BuildContainerNameInNS(const char *containerName,const char *machineName)
143 {
144   string containerNameInNS("/Containers/");
145   containerNameInNS+=machineName;
146   containerNameInNS+="/";
147   containerNameInNS+=containerName;
148   return containerNameInNS;
149 }