X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FResourcesManager%2FSALOME_ResourcesManager.cxx;h=0f160f66382869c6a0dd64ef0be6d917ab611a9a;hb=c5da2366ab176a728bb91382838835499b60a513;hp=e20832edffdc420151f41fbaee5f7878da25f7cf;hpb=35960e77d7f9f2a5cac7d6550c23f12943bc4378;p=modules%2Fkernel.git diff --git a/src/ResourcesManager/SALOME_ResourcesManager.cxx b/src/ResourcesManager/SALOME_ResourcesManager.cxx index e20832edf..0f160f663 100644 --- a/src/ResourcesManager/SALOME_ResourcesManager.cxx +++ b/src/ResourcesManager/SALOME_ResourcesManager.cxx @@ -1,31 +1,33 @@ -// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// +// // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either +// License as published by the Free Software Foundation; either // version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // + #include "SALOME_ResourcesManager.hxx" -//#include "SALOME_Container_i.hxx" #include "Utils_ExceptHandlers.hxx" +#include "Utils_CorbaException.hxx" #include "OpUtil.hxx" -#include - #include -#ifndef WNT +#include +#ifndef WIN32 #include #else #include @@ -46,6 +48,8 @@ using namespace std; +const char *SALOME_ResourcesManager::_ResourcesManagerNameInNS = "/ResourcesManager"; + //============================================================================= /*! * just for test @@ -53,44 +57,47 @@ using namespace std; //============================================================================= SALOME_ResourcesManager:: -SALOME_ResourcesManager(CORBA::ORB_ptr orb, - const char *xmlFilePath) : - _path_resources(xmlFilePath) +SALOME_ResourcesManager(CORBA::ORB_ptr orb, + PortableServer::POA_var poa, + SALOME_NamingService *ns, + const char *xmlFilePath) : _rm(xmlFilePath) { - _NS = new SALOME_NamingService(orb); + MESSAGE("SALOME_ResourcesManager constructor"); + _NS = ns; + _orb = CORBA::ORB::_duplicate(orb) ; + _poa = PortableServer::POA::_duplicate(poa) ; + PortableServer::ObjectId_var id = _poa->activate_object(this); + CORBA::Object_var obj = _poa->id_to_reference(id); + Engines::ResourcesManager_var refContMan = Engines::ResourcesManager::_narrow(obj); + _NS->Register(refContMan,_ResourcesManagerNameInNS); + MESSAGE("SALOME_ResourcesManager constructor end"); } //============================================================================= /*! * Standard constructor, parse resource file. * - if ${APPLI} exists in environment, - * look for ${HOME}/*{APPLI}/CatalogResources.xml + * look for ${HOME}/${APPLI}/CatalogResources.xml * - else look for default: - * ${KERNEL_ROOT_DIR}/share/salome/resources/CatalogResources.xml + * ${KERNEL_ROOT_DIR}/share/salome/resources/kernel/CatalogResources.xml * - parse XML resource file. */ //============================================================================= -SALOME_ResourcesManager::SALOME_ResourcesManager(CORBA::ORB_ptr orb) +SALOME_ResourcesManager::SALOME_ResourcesManager(CORBA::ORB_ptr orb, + PortableServer::POA_var poa, + SALOME_NamingService *ns) : _rm() { - _NS = new SALOME_NamingService(orb); - _isAppliSalomeDefined = (getenv("APPLI") != 0); - - if (_isAppliSalomeDefined) - { - _path_resources = getenv("HOME"); - _path_resources += "/"; - _path_resources += getenv("APPLI"); - _path_resources += "/CatalogResources.xml"; - } - - else - { - _path_resources = getenv("KERNEL_ROOT_DIR"); - _path_resources += "/share/salome/resources/CatalogResources.xml"; - } - - ParseXmlFile(); + MESSAGE("SALOME_ResourcesManager constructor"); + _NS = ns; + _orb = CORBA::ORB::_duplicate(orb) ; + _poa = PortableServer::POA::_duplicate(poa) ; + PortableServer::ObjectId_var id = _poa->activate_object(this); + CORBA::Object_var obj = _poa->id_to_reference(id); + Engines::ResourcesManager_var refContMan = Engines::ResourcesManager::_narrow(obj); + _NS->Register(refContMan,_ResourcesManagerNameInNS); + + MESSAGE("SALOME_ResourcesManager constructor end"); } //============================================================================= @@ -101,793 +108,344 @@ SALOME_ResourcesManager::SALOME_ResourcesManager(CORBA::ORB_ptr orb) SALOME_ResourcesManager::~SALOME_ResourcesManager() { - delete _NS; + MESSAGE("SALOME_ResourcesManager destructor"); } -//============================================================================= -/*! - * get the list of name of ressources fitting for the specified module. - * If hostname specified, check it is local or known in resources catalog. - * - * Else - * - select first machines with corresponding OS (all machines if - * parameter OS empty), - * - then select the sublist of machines on witch the module is known - * (if the result is empty, that probably means that the inventory of - * modules is probably not done, so give complete list from previous step) - */ -//============================================================================= - -vector -SALOME_ResourcesManager:: -GetFittingResources(const Engines::MachineParameters& params, - const char *moduleName) -throw(SALOME_Exception) -{ - MESSAGE("ResourcesManager::GetFittingResources"); - vector ret; - - // --- To be sure that we search in a correct list. - ParseXmlFile(); - - const char *hostname = (const char *)params.hostname; - MESSAGE("GetFittingResources " << hostname << " " << GetHostname().c_str()); - - if (hostname[0] != '\0') - { - MESSAGE("ResourcesManager::GetFittingResources : hostname specified" ); - - if ( strcmp(hostname, "localhost") == 0 || - strcmp(hostname, GetHostname().c_str()) == 0 ) - { - MESSAGE("ResourcesManager::GetFittingResources : localhost" ); - ret.push_back(GetHostname().c_str()); - MESSAGE("ResourcesManager::GetFittingResources : " << ret.size()); - } - - else if (_resourcesList.find(hostname) != _resourcesList.end()) - { - // --- params.hostname is in the list of resources so return it. - ret.push_back(hostname); - } - - else - { - // --- user specified an unknown hostame so notify him. - MESSAGE("ResourcesManager::GetFittingResources : SALOME_Exception"); - throw SALOME_Exception("unknown host"); - } - } - - else - // --- Search for available resources sorted by priority - { - SelectOnlyResourcesWithOS(ret, params.OS); - - KeepOnlyResourcesWithModule(ret, moduleName); - - if (ret.size() == 0) - SelectOnlyResourcesWithOS(ret, params.OS); - - // --- set wanted parameters - ResourceDataToSort::_nbOfNodesWanted = params.nb_node; - - ResourceDataToSort::_nbOfProcPerNodeWanted = params.nb_proc_per_node; - - ResourceDataToSort::_CPUFreqMHzWanted = params.cpu_clock; - - ResourceDataToSort::_memInMBWanted = params.mem_mb; - - // --- end of set - - list li; - - for (vector::iterator iter = ret.begin(); - iter != ret.end(); - iter++) - li.push_back(_resourcesList[(*iter)].DataForSort); - - li.sort(); - - unsigned int i = 0; - - for (list::iterator iter2 = li.begin(); - iter2 != li.end(); - iter2++) - ret[i++] = (*iter2)._hostName; - } - - MESSAGE("ResourcesManager::GetFittingResources : return" << ret.size()); - return ret; -} //============================================================================= -/*! - * add an entry in the ressources catalog xml file. - * Return 0 if OK (KERNEL found in new resources modules) else throw exception - */ +/*! CORBA method: + * shutdown all the containers, then the ContainerManager servant + */ //============================================================================= -int -SALOME_ResourcesManager:: -AddResourceInCatalog(const Engines::MachineParameters& paramsOfNewResources, - const map& modulesOnNewResources, - const char *environPathOfPrerequired, - const char *alias, - const char *userName, - AccessModeType mode, - AccessProtocolType prot) -throw(SALOME_Exception) +void SALOME_ResourcesManager::Shutdown() { - map::const_iterator iter = - modulesOnNewResources.find("KERNEL"); - - if (iter != modulesOnNewResources.end()) - { - ParserResourcesType newElt; - newElt.DataForSort._hostName = paramsOfNewResources.hostname; - newElt.Alias = alias; - newElt.Protocol = prot; - newElt.Mode = mode; - newElt.UserName = userName; - newElt.ModulesPath = modulesOnNewResources; - newElt.PreReqFilePath = environPathOfPrerequired; - newElt.OS = paramsOfNewResources.OS; - newElt.DataForSort._memInMB = paramsOfNewResources.mem_mb; - newElt.DataForSort._CPUFreqMHz = paramsOfNewResources.cpu_clock; - newElt.DataForSort._nbOfNodes = paramsOfNewResources.nb_node; - newElt.DataForSort._nbOfProcPerNode = - paramsOfNewResources.nb_proc_per_node; - _resourcesList[newElt.DataForSort._hostName] = newElt; - return 0; - } - - else - throw SALOME_Exception("KERNEL is not present in this resource"); + MESSAGE("Shutdown"); + _NS->Destroy_Name(_ResourcesManagerNameInNS); + PortableServer::ObjectId_var oid = _poa->servant_to_id(this); + _poa->deactivate_object(oid); } //============================================================================= +//! get the name of resources fitting the specified constraints (params) /*! - * Deletes a resource from the catalog - */ -//============================================================================= - -void SALOME_ResourcesManager::DeleteResourceInCatalog(const char *hostname) -{ - _resourcesList.erase(hostname); -} - -//============================================================================= -/*! - * write the current data in memory in file. - */ -//============================================================================= - -void SALOME_ResourcesManager::WriteInXmlFile() -{ - QDomDocument doc("ResourcesCatalog"); - SALOME_ResourcesCatalog_Handler* handler = - new SALOME_ResourcesCatalog_Handler(_resourcesList); - handler->PrepareDocToXmlFile(doc); - delete handler; - - QFile file( _path_resources ); - - if ( !file.open( IO_WriteOnly ) ) - INFOS("WRITING ERROR !"); - - QTextStream ts( &file ); - - ts << doc.toString(); - - file.close(); - - MESSAGE("WRITING DONE!"); -} - -//============================================================================= -/*! - * parse the data type catalog + * If hostname specified, check it is local or known in resources catalog. + * + * Else + * - select first machines with corresponding OS (all machines if + * parameter OS empty), + * - then select the sublist of machines on which the component is known + * (if the result is empty, that probably means that the inventory of + * components is probably not done, so give complete list from previous step) */ //============================================================================= -const MapOfParserResourcesType& SALOME_ResourcesManager::ParseXmlFile() +Engines::ResourceList * +SALOME_ResourcesManager::GetFittingResources(const Engines::ResourceParameters& params) { - SALOME_ResourcesCatalog_Handler* handler = - new SALOME_ResourcesCatalog_Handler(_resourcesList); - QFile xmlFile(_path_resources); - - QXmlInputSource source(xmlFile); - - QXmlSimpleReader reader; - reader.setContentHandler( handler ); - reader.setErrorHandler( handler ); - reader.parse( source ); - xmlFile.close(); - delete handler; - return _resourcesList; -} - -//============================================================================= -/*! - * consult the content of the list - */ -//============================================================================= - -const MapOfParserResourcesType& SALOME_ResourcesManager::GetList() const + MESSAGE("ResourcesManager::GetFittingResources"); + Engines::ResourceList * ret = new Engines::ResourceList; + + // CORBA -> C++ + resourceParams p; + p.name = params.name; + p.hostname = params.hostname; + p.can_launch_batch_jobs = params.can_launch_batch_jobs; + p.can_run_containers = params.can_run_containers; + p.OS = params.OS; + p.nb_proc = params.nb_proc; + p.nb_node = params.nb_node; + p.nb_proc_per_node = params.nb_proc_per_node; + p.cpu_clock = params.cpu_clock; + p.mem_mb = params.mem_mb; + for(unsigned int i=0; i vec = _rm.GetFittingResources(p); -bool isPythonContainer(const char* ContainerName) -{ - bool ret = false; - int len = strlen(ContainerName); - - if (len >= 2) - if (strcmp(ContainerName + len - 2, "Py") == 0) - ret = true; + // C++ -> CORBA + ret->length(vec.size()); + for(unsigned int i=0;i C++ + std::vector rl; + for(unsigned int i=0; iContainerName(params); - command += " -id "; - sprintf(idc,"%ld",id); - command += idc; - command += " -"; - AddOmninamesParams(command); - command += " > /tmp/"; - command += _NS->ContainerName(params); - command += "_"; - command += GetHostname(); - command += "_"; - command += getenv( "USER" ) ; - command += ".log 2>&1 &" ; - - MESSAGE("command =" << command); - } - - return command; + return CORBA::string_dup(_rm.Find("first", rl).c_str()); } - -//============================================================================= -/*! - * builds the command to be launched. - */ -//============================================================================= - -string -SALOME_ResourcesManager::BuildCommandToLaunchLocalContainer -(const Engines::MachineParameters& params, const long id) +char * +SALOME_ResourcesManager::Find(const char* policy, const Engines::ResourceList& listOfResources) { - _TmpFileName = ""; - string command; - int nbproc = 0; - char idc[3*sizeof(long)]; - - if (params.isMPI) - { - command = "mpirun -np "; - - if ( (params.nb_node <= 0) && (params.nb_proc_per_node <= 0) ) - nbproc = 1; - else if ( params.nb_node == 0 ) - nbproc = params.nb_proc_per_node; - else if ( params.nb_proc_per_node == 0 ) - nbproc = params.nb_node; - else - nbproc = params.nb_node * params.nb_proc_per_node; - - std::ostringstream o; - - o << nbproc << " "; - - command += o.str(); -#ifdef WITHLAM - command += "-x PATH,LD_LIBRARY_PATH,OMNIORB_CONFIG,SALOME_trace "; -#endif - - if (isPythonContainer(params.container_name)) - command += "pyMPI SALOME_ContainerPy.py "; - else - command += "SALOME_MPIContainer "; - } - - else - { - if (isPythonContainer(params.container_name)) - command = "SALOME_ContainerPy.py "; - else - command = "SALOME_Container "; - } - - command += _NS->ContainerName(params); - command += " -id "; - sprintf(idc,"%ld",id); - command += idc; - command += " -"; - AddOmninamesParams(command); - command += " > /tmp/"; - command += _NS->ContainerName(params); - command += "_"; - command += GetHostname(); - command += "_"; - command += getenv( "USER" ) ; - command += ".log 2>&1 &" ; - MESSAGE("Command is ... " << command); - return command; -} - - -//============================================================================= -/*! - * removes the generated temporary file in case of a remote launch. - */ -//============================================================================= + // CORBA -> C++ + std::vector rl; + for(unsigned int i=0; iname = CORBA::string_dup(resource.Name.c_str()); + p_ptr->hostname = CORBA::string_dup(resource.HostName.c_str()); + p_ptr->type = CORBA::string_dup(resource.getResourceTypeStr().c_str()); + p_ptr->protocol = CORBA::string_dup(resource.getAccessProtocolTypeStr().c_str()); + p_ptr->iprotocol = CORBA::string_dup(resource.getClusterInternalProtocolStr().c_str()); + p_ptr->username = CORBA::string_dup(resource.UserName.c_str()); + p_ptr->applipath = CORBA::string_dup(resource.AppliPath.c_str()); + p_ptr->componentList.length(resource.ComponentsList.size()); + for(unsigned int i=0;icomponentList[i] = CORBA::string_dup(resource.ComponentsList[i].c_str()); + p_ptr->OS = CORBA::string_dup(resource.OS.c_str()); + p_ptr->mem_mb = resource.DataForSort._memInMB; + p_ptr->cpu_clock = resource.DataForSort._CPUFreqMHz; + p_ptr->nb_proc_per_node = resource.DataForSort._nbOfProcPerNode; + p_ptr->nb_node = resource.DataForSort._nbOfNodes; + p_ptr->can_launch_batch_jobs = resource.can_launch_batch_jobs; + p_ptr->can_run_containers = resource.can_run_containers; + p_ptr->working_directory = CORBA::string_dup(resource.working_directory.c_str()); + p_ptr->mpiImpl = CORBA::string_dup(resource.getMpiImplTypeStr().c_str()); + p_ptr->batch = CORBA::string_dup(resource.getBatchTypeStr().c_str()); + } catch (const exception & ex) { + INFOS("Caught exception in GetResourceDefinition: " << ex.what()); + THROW_SALOME_CORBA_EXCEPTION(ex.what(), SALOME::BAD_PARAM); + } - if ( pyCont ) - command += "SALOME_ContainerPy.py "; - else - command += "SALOME_Container "; - - command += containerName; - command += " -"; - AddOmninamesParams(command); - command += " > /tmp/"; - command += containerName; - command += "_"; - command += machine; - command += ".log 2>&1 &" ; - - SCRUTE( command ); - return command; + return p_ptr; } -//============================================================================= -/*! - * Gives a sublist of machines with matching OS. - * If parameter OS is empty, gives the complete list of machines - */ -//============================================================================= - -// Warning need an updated parsed list : _resourcesList -void -SALOME_ResourcesManager::SelectOnlyResourcesWithOS -( vector& hosts, - const char *OS) const -throw(SALOME_Exception) +void +SALOME_ResourcesManager::AddResource(const Engines::ResourceDefinition& new_resource, + CORBA::Boolean write, + const char * xml_file) { - string base(OS); - - for (map::const_iterator iter = - _resourcesList.begin(); - iter != _resourcesList.end(); - iter++) + try + { + ParserResourcesType resource; + resource.Name = new_resource.name.in(); + resource.HostName = new_resource.hostname.in(); + resource.setResourceTypeStr(new_resource.type.in()); + resource.OS = new_resource.OS.in(); + resource.AppliPath = new_resource.applipath.in(); + resource.DataForSort._memInMB = new_resource.mem_mb; + resource.DataForSort._CPUFreqMHz = new_resource.cpu_clock; + resource.DataForSort._nbOfNodes = new_resource.nb_node; + resource.DataForSort._nbOfProcPerNode = new_resource.nb_proc_per_node; + resource.UserName = new_resource.username.in(); + resource.can_launch_batch_jobs = new_resource.can_launch_batch_jobs; + resource.can_run_containers = new_resource.can_run_containers; + resource.working_directory = new_resource.working_directory.in(); + resource.setBatchTypeStr(new_resource.batch.in()); + resource.setMpiImplTypeStr(new_resource.mpiImpl.in()); + resource.setAccessProtocolTypeStr(new_resource.protocol.in()); + resource.setClusterInternalProtocolStr(new_resource.iprotocol.in()); + for (CORBA::ULong i = 0; i < new_resource.componentList.length(); i++) + resource.ComponentsList.push_back(new_resource.componentList[i].in()); + + _rm.AddResourceInCatalog(resource); + + if (write) { - if ( (*iter).second.OS == base || base.size() == 0) - hosts.push_back((*iter).first); + _rm.WriteInXmlFile(std::string(xml_file)); + _rm.ParseXmlFiles(); } + } + catch (const SALOME_Exception & e) + { + INFOS("Error in AddResourceInCatalog: " << e); + THROW_SALOME_CORBA_EXCEPTION(e.what(), SALOME::BAD_PARAM); + } } - -//============================================================================= -/*! - * Gives a sublist of machines on which the module is known. - */ -//============================================================================= - -//Warning need an updated parsed list : _resourcesList void -SALOME_ResourcesManager::KeepOnlyResourcesWithModule -( vector& hosts, - const char *moduleName) const -throw(SALOME_Exception) +SALOME_ResourcesManager::RemoveResource(const char * resource_name, + CORBA::Boolean write, + const char * xml_file) { - for (vector::iterator iter = hosts.begin(); iter != hosts.end();) - { - MapOfParserResourcesType::const_iterator it = _resourcesList.find(*iter); - const map& mapOfModulesOfCurrentHost = - (((*it).second).ModulesPath); - - if (mapOfModulesOfCurrentHost.find(moduleName) == - mapOfModulesOfCurrentHost.end()) - hosts.erase(iter); - else - iter++; - } -} - - -//============================================================================= -/*! - * add to command all options relative to naming service. - */ -//============================================================================= - -void SALOME_ResourcesManager::AddOmninamesParams(string& command) const + try { - // If env variable OMNIORB_CONFIG is not defined or the file is more complex than one line - // does not work - // Even if we use it we have to check if env variable exists - //string omniORBcfg( getenv( "OMNIORB_CONFIG" ) ) ; - //ifstream omniORBfile( omniORBcfg.c_str() ) ; - //char ORBInitRef[11] ; - //char egal[3] ; - //char nameservice[132] ; - //omniORBfile >> ORBInitRef ; - //command += "ORBInitRef " ; - //omniORBfile >> egal ; - //omniORBfile >> nameservice ; - //omniORBfile.close() ; - //char * bsn = strchr( nameservice , '\n' ) ; - //if ( bsn ) { - //bsn[ 0 ] = '\0' ; - //} - //command += nameservice ; - - char *iorstr = _NS->getIORaddr(); - command += "ORBInitRef NameService="; - command += iorstr; + _rm.DeleteResourceInCatalog(resource_name); } - - -//============================================================================= -/*! - * add to command all options relative to naming service. - */ -//============================================================================= - -void SALOME_ResourcesManager::AddOmninamesParams(ofstream& fileStream) const + catch (const SALOME_Exception & e) { - string omniORBcfg( getenv( "OMNIORB_CONFIG" ) ) ; - ifstream omniORBfile( omniORBcfg.c_str() ) ; - char ORBInitRef[11] ; - char egal[3] ; - char nameservice[132] ; - omniORBfile >> ORBInitRef ; - fileStream << "ORBInitRef "; - omniORBfile >> egal ; - omniORBfile >> nameservice ; - omniORBfile.close() ; - char * bsn = strchr( nameservice , '\n' ) ; - - if ( bsn ) - { - bsn[ 0 ] = '\0' ; - } - - fileStream << nameservice; + INFOS("Error in DeleteResourceInCatalog: " << e); + THROW_SALOME_CORBA_EXCEPTION(e.what(), SALOME::BAD_PARAM); } - -//============================================================================= -/*! - * generate a file name in /tmp directory - */ -//============================================================================= - -string SALOME_ResourcesManager::BuildTemporaryFileName() const + if (write) { - //build more complex file name to support multiple salome session - char *temp = new char[19]; - strcpy(temp, "/tmp/command"); - strcat(temp, "XXXXXX"); -#ifndef WNT - - mkstemp(temp); -#else - - char aPID[80]; - itoa(getpid(), aPID, 10); - strcat(temp, aPID); -#endif - - string command(temp); - delete [] temp; - command += ".sh"; - return command; + _rm.WriteInXmlFile(std::string(xml_file)); + _rm.ParseXmlFiles(); } +} - -//============================================================================= -/*! - * Builds in a temporary file the script to be launched. - * - * Used if SALOME Application ($APPLI) is not defined. - * The command is build with data from CatalogResources, in which every path - * used on remote computer must be defined. - */ -//============================================================================= - -string -SALOME_ResourcesManager::BuildTempFileToLaunchRemoteContainer -(const string& machine, - const Engines::MachineParameters& params) +std::string +SALOME_ResourcesManager::getMachineFile(std::string resource_name, + CORBA::Long nb_procs, + std::string parallelLib) { - _TmpFileName = BuildTemporaryFileName(); - ofstream tempOutputFile; - tempOutputFile.open(_TmpFileName.c_str(), ofstream::out ); - const ParserResourcesType& resInfo = _resourcesList[machine]; - tempOutputFile << "#! /bin/sh" << endl; - - // --- set env vars + std::string machine_file_name(""); - for (map::const_iterator iter = resInfo.ModulesPath.begin(); - iter != resInfo.ModulesPath.end(); - iter++) + if (parallelLib == "Dummy") + { + MESSAGE("[getMachineFile] parallelLib is Dummy"); + MapOfParserResourcesType resourcesList = _rm.GetList(); + if (resourcesList.find(resource_name) != resourcesList.end()) { - string curModulePath((*iter).second); - tempOutputFile << (*iter).first << "_ROOT_DIR=" << curModulePath << endl; - tempOutputFile << "export " << (*iter).first << "_ROOT_DIR" << endl; - tempOutputFile << "LD_LIBRARY_PATH=" << curModulePath - << "/lib/salome" << ":${LD_LIBRARY_PATH}" << endl; - tempOutputFile << "PYTHONPATH=" << curModulePath << "/bin/salome:" - << curModulePath << "/lib/salome:" << curModulePath - << "/lib/python2.2/site-packages/salome:"; - tempOutputFile << curModulePath - << "/lib/python2.2/site-packages/salome/shared_modules:${PYTHONPATH}" - << endl; - } - - tempOutputFile << "export LD_LIBRARY_PATH" << endl; - tempOutputFile << "export PYTHONPATH" << endl; - tempOutputFile << "source " << resInfo.PreReqFilePath << endl; + ParserResourcesType resource = resourcesList[resource_name]; - // ! env vars + // Check if resource is cluster or not + if (resource.ClusterMembersList.empty()) + { + //It is not a cluster so we create a cluster with one machine + ParserResourcesType fake_node; + fake_node.HostName = resource.HostName; + fake_node.Protocol = resource.Protocol; + fake_node.ClusterInternalProtocol = resource.ClusterInternalProtocol; + fake_node.UserName = resource.UserName; + fake_node.AppliPath = resource.AppliPath; + fake_node.DataForSort = resource.DataForSort; + + resource.ClusterMembersList.push_front(fake_node); + } - if (params.isMPI) - { - tempOutputFile << "mpirun -np "; - int nbproc; - - if ( (params.nb_node <= 0) && (params.nb_proc_per_node <= 0) ) - nbproc = 1; - else if ( params.nb_node == 0 ) - nbproc = params.nb_proc_per_node; - else if ( params.nb_proc_per_node == 0 ) - nbproc = params.nb_node; - else - nbproc = params.nb_node * params.nb_proc_per_node; + // Creating list of machines for creating the machine file + std::list list_of_machines; + std::list::iterator cluster_it = + resource.ClusterMembersList.begin(); + while (cluster_it != resource.ClusterMembersList.end()) + { + // For each member of the cluster we add a nbOfNodes * nbOfProcPerNode in the list + unsigned int number_of_proc = (*cluster_it).DataForSort._nbOfNodes * + (*cluster_it).DataForSort._nbOfProcPerNode; + for (unsigned int i = 0; i < number_of_proc; i++) + list_of_machines.push_back((*cluster_it).HostName); + cluster_it++; + } - std::ostringstream o; + // Creating machine file + machine_file_name = tmpnam(NULL); + std::ofstream machine_file(machine_file_name.c_str(), std::ios_base::out); - tempOutputFile << nbproc << " "; -#ifdef WITHLAM - tempOutputFile << "-x PATH,LD_LIBRARY_PATH,OMNIORB_CONFIG,SALOME_trace "; -#endif + CORBA::Long machine_number = 0; + std::list::iterator it = list_of_machines.begin(); + while (machine_number != nb_procs) + { + // Adding a new node to the machine file + machine_file << *it << std::endl; + + // counting... + it++; + if (it == list_of_machines.end()) + it = list_of_machines.begin(); + machine_number++; + } } + else + INFOS("[getMachineFile] Error resource_name not found in resourcesList -> " << resource_name); + } + else if (parallelLib == "Mpi") + { + MESSAGE("[getMachineFile] parallelLib is Mpi"); - tempOutputFile << (*(resInfo.ModulesPath.find("KERNEL"))).second - << "/bin/salome/"; - - if (params.isMPI) + MapOfParserResourcesType resourcesList = _rm.GetList(); + if (resourcesList.find(resource_name) != resourcesList.end()) { - if (isPythonContainer(params.container_name)) - tempOutputFile << "pyMPI SALOME_ContainerPy.py "; - else - tempOutputFile << "SALOME_MPIContainer "; - } + ParserResourcesType resource = resourcesList[resource_name]; + // Check if resource is cluster or not + if (resource.ClusterMembersList.empty()) + { + //It is not a cluster so we create a cluster with one machine + ParserResourcesType fake_node; + fake_node.HostName = resource.HostName; + fake_node.Protocol = resource.Protocol; + fake_node.ClusterInternalProtocol = resource.ClusterInternalProtocol; + fake_node.UserName = resource.UserName; + fake_node.AppliPath = resource.AppliPath; + fake_node.DataForSort = resource.DataForSort; + + resource.ClusterMembersList.push_front(fake_node); + } - else - { - if (isPythonContainer(params.container_name)) - tempOutputFile << "SALOME_ContainerPy.py "; + // Choose mpi implementation -> each MPI implementation has is own machinefile... + if (resource.mpi == lam) + { + // Creating machine file + machine_file_name = tmpnam(NULL); + std::ofstream machine_file(machine_file_name.c_str(), std::ios_base::out); + + // We add all cluster machines to the file + std::list::iterator cluster_it = + resource.ClusterMembersList.begin(); + while (cluster_it != resource.ClusterMembersList.end()) + { + unsigned int number_of_proc = (*cluster_it).DataForSort._nbOfNodes * + (*cluster_it).DataForSort._nbOfProcPerNode; + machine_file << (*cluster_it).HostName << " cpu=" << number_of_proc << std::endl; + cluster_it++; + } + } + else if ((resource.mpi == openmpi) || (resource.mpi == ompi)) + { + // Creating machine file + machine_file_name = tmpnam(NULL); + std::ofstream machine_file(machine_file_name.c_str(), std::ios_base::out); + + // We add all cluster machines to the file + std::list::iterator cluster_it = + resource.ClusterMembersList.begin(); + while (cluster_it != resource.ClusterMembersList.end()) + { + unsigned int number_of_proc = (*cluster_it).DataForSort._nbOfNodes * + (*cluster_it).DataForSort._nbOfProcPerNode; + machine_file << (*cluster_it).HostName << " slots=" << number_of_proc << std::endl; + cluster_it++; + } + } + else if (resource.mpi == nompi) + { + INFOS("[getMachineFile] Error resource_name MPI implementation was defined for " << resource_name); + } else - tempOutputFile << "SALOME_Container "; - } - - tempOutputFile << _NS->ContainerName(params) << " -"; - AddOmninamesParams(tempOutputFile); - tempOutputFile << " &" << endl; - tempOutputFile.flush(); - tempOutputFile.close(); - chmod(_TmpFileName.c_str(), 0x1ED); - - // --- Build command - - string command; - - if (resInfo.Protocol == rsh) - { - command = "rsh "; - string commandRcp = "rcp "; - commandRcp += _TmpFileName; - commandRcp += " "; - commandRcp += machine; - commandRcp += ":"; - commandRcp += _TmpFileName; - system(commandRcp.c_str()); + INFOS("[getMachineFile] Error resource_name MPI implementation not currenly handled for " << resource_name); } - - else if (resInfo.Protocol == ssh) - command = "ssh "; + else + INFOS("[getMachineFile] Error resource_name not found in resourcesList -> " << resource_name); + } else - throw SALOME_Exception("Unknown protocol"); - - command += machine; - _CommandForRemAccess = command; - command += " "; - command += _TmpFileName; - command += " > "; - command += "/tmp/"; - command += _NS->ContainerName(params); - command += "_"; - command += machine; - command += ".log 2>&1 &"; - SCRUTE(command); - - return command; + INFOS("[getMachineFile] Error parallelLib is not handled -> " << parallelLib); + return machine_file_name; } - - - -