]> SALOME platform Git repositories - modules/kernel.git/commitdiff
Salome HOME
Fixes in ResourceManager:
authorbarate <barate>
Thu, 24 Jan 2013 10:26:27 +0000 (10:26 +0000)
committerbarate <barate>
Thu, 24 Jan 2013 10:26:27 +0000 (10:26 +0000)
- Replace parameters "mode" and "is_cluster_head" by parameters "type", "can_launch_batch_jobs" and "can_run_containers"
- ContainerManager now only selects resources that can run containers
- Fixes bug #21503

14 files changed:
idl/SALOME_ContainerManager.idl
src/Container/SALOME_ContainerManager.cxx
src/Launcher/Launcher.cxx
src/Launcher/Launcher_Job_SALOME.cxx
src/Launcher/SALOME_Launcher.cxx
src/LifeCycleCORBA/SALOME_LifeCycleCORBA.cxx
src/LifeCycleCORBA/Test/LifeCycleCORBATest.cxx
src/ResourcesManager/ResourcesManager.cxx
src/ResourcesManager/ResourcesManager.hxx
src/ResourcesManager/SALOME_ResourcesCatalog_Handler.cxx
src/ResourcesManager/SALOME_ResourcesCatalog_Handler.hxx
src/ResourcesManager/SALOME_ResourcesCatalog_Parser.cxx
src/ResourcesManager/SALOME_ResourcesCatalog_Parser.hxx
src/ResourcesManager/SALOME_ResourcesManager.cxx

index d209ef71de6fb9a500ffcbbf0b8083ac7bcab564..7b452ee04c23af1f0e7dcf76ec6029ed0470d5f8 100644 (file)
@@ -57,6 +57,10 @@ struct ResourceParameters
   string name;
   //! host name
   string hostname;
+  //! if true select only resources that can launch batch jobs
+  boolean can_launch_batch_jobs;
+  //! if true select only resources that can run containers
+  boolean can_run_containers;
   //! if given required operating system 
   string OS;
   //! if given list of components that could be loaded on a container
@@ -117,6 +121,8 @@ struct ResourceDefinition
   string name;
   //! hostname 
   string hostname;
+  //! Type of the resource ("cluster" or "single_machine")
+  string type;
   //! protocol to connect to the resource
   //! protocol used to start a remote container (ssh or rsh)
   string protocol;
@@ -126,8 +132,6 @@ struct ResourceDefinition
   string applipath;
   //! list of available components 
   CompoList componentList;
-  //! Type of resource: interactive or batch
-  string mode;
 
   //! operating system 
   string OS;
@@ -147,8 +151,10 @@ struct ResourceDefinition
   //! internal protocol to use to start a remote container (ssh or rsh) on the cluster
   string iprotocol;
 
-  //! Specify if the resource is a cluster head;
-  boolean is_cluster_head;
+  //! Specify if the resource can launch batch jobs
+  boolean can_launch_batch_jobs;
+  //! Specify if the resource can run containers
+  boolean can_run_containers;
 
   //! Predefined working directory on the resource
   string working_directory;
index 3a6cebdf786e5d30a2066f21041844c147752644..1eae28218f9215fb297526bda95d796707dbc449 100644 (file)
@@ -297,6 +297,8 @@ SALOME_ContainerManager::GiveContainer(const Engines::ContainerParameters& param
   }
 
   // Step 2: Get all possibleResources from the parameters
+  // Consider only resources that can run containers
+  local_params.resource_params.can_run_containers = true;
   Engines::ResourceList_var possibleResources = _ResManager->GetFittingResources(local_params.resource_params);
   MESSAGE("[GiveContainer] - length of possible resources " << possibleResources->length());
   std::vector<std::string> local_resources;
index 986ec6703b5e537bb6ba8d1e3bc4d445054f3e21..a690b48b59f1d4f55e99a97ff6e7ad709194240b 100644 (file)
@@ -578,6 +578,8 @@ Launcher_cpp::createBatchManagerForJob(Launcher::Job * job)
   // Select a ressource for the job
   std::vector<std::string> ResourceList;
   resourceParams params = job->getResourceRequiredParams();
+  // Consider only resources that can launch batch jobs
+  params.can_launch_batch_jobs = true;
   try
   {
     ResourceList = _ResManager->GetFittingResources(params);
index 29bb6543149d69d8084259e8192805e53a2e9890..655ecd9dc96ef558b94ad75b137021eab01e77ea 100644 (file)
@@ -87,7 +87,7 @@ Launcher::Job_SALOME::buildSalomeScript(Batch::Parametre params)
   launch_script_stream << "export SALOME_TMP_DIR=" << work_directory << "/logs" << std::endl;
 
   // -- Generates Catalog Resources
-  std::string resource_protocol = ParserResourcesType::protocolToString(_resource_definition.ClusterInternalProtocol);
+  std::string resource_protocol = _resource_definition.getClusterInternalProtocolStr();
   launch_script_stream << "if [ \"x$LIBBATCH_NODEFILE\" != \"x\" ]; then " << std::endl;
   launch_script_stream << "CATALOG_FILE=" << "CatalogResources_" << _launch_date << ".xml" << std::endl;
   launch_script_stream << "export USER_CATALOG_RESOURCES_FILE=" << "$CATALOG_FILE" << std::endl;
@@ -99,9 +99,10 @@ Launcher::Job_SALOME::buildSalomeScript(Batch::Parametre params)
   launch_script_stream << "echo '         protocol=\"" << resource_protocol               << "\"' >> $CATALOG_FILE" << std::endl;
   launch_script_stream << "echo '         userName=\"" << _resource_definition.UserName   << "\"' >> $CATALOG_FILE" << std::endl;
   launch_script_stream << "echo '         appliPath=\"" << _resource_definition.AppliPath << "\"' >> $CATALOG_FILE" << std::endl;
-  launch_script_stream << "echo '         mpi=\"" << _resource_definition.PrintMpiImplType() << "\"' >> $CATALOG_FILE" << std::endl;
-  launch_script_stream << "echo '        nbOfNodes='\\\"$nbproc\\\"                              >> $CATALOG_FILE" << std::endl;
-  launch_script_stream << "echo '        nbOfProcPerNode=\"1\"'                                          >> $CATALOG_FILE" << std::endl;
+  launch_script_stream << "echo '         mpi=\"" << _resource_definition.getMpiImplTypeStr() << "\"' >> $CATALOG_FILE" << std::endl;
+  launch_script_stream << "echo '         nbOfNodes='\\\"$nbproc\\\" >> $CATALOG_FILE" << std::endl;
+  launch_script_stream << "echo '         nbOfProcPerNode=\"1\"' >> $CATALOG_FILE" << std::endl;
+  launch_script_stream << "echo '         can_run_containers=\"true\"' >> $CATALOG_FILE" << std::endl;
   launch_script_stream << "echo '/>'                                                              >> $CATALOG_FILE" << std::endl;
   launch_script_stream << "done"                                 << std::endl;
   launch_script_stream << "echo '</resources>' >> $CATALOG_FILE" << std::endl;
index 433c30b1480433bdf8a403a6bcae3a02d43d7334..c710f41879e5de78adb4904bd1fd42d8ef53f928 100644 (file)
@@ -329,8 +329,12 @@ SALOME_Launcher::testBatch(const Engines::ResourceParameters& params)
   CORBA::Boolean rtn = false;
   try
   {
-    // find a cluster matching the structure params
-    Engines::ResourceList *aMachineList = _ResManager->GetFittingResources(params);
+    // Consider only resources that can run batch jobs
+    Engines::ResourceParameters new_params(params);
+    new_params.can_launch_batch_jobs = true;
+
+    // find a resource matching the required parameters
+    Engines::ResourceList *aMachineList = _ResManager->GetFittingResources(new_params);
     if (aMachineList->length() == 0)
       throw SALOME_Exception("No resources have been found with your parameters");
 
index eb35541bc0495a9ebf093d99458212da1628bc34..48987c754180d5d3e90eb6c9f76e3bc81f1b9030 100644 (file)
@@ -142,6 +142,7 @@ SALOME_LifeCycleCORBA::FindComponent(const Engines::MachineParameters& params,
   convert(params, new_params);
   new_params.resource_params.componentList.length(1);
   new_params.resource_params.componentList[0] = componentName;
+  new_params.resource_params.can_run_containers = true;
   Engines::ResourceList_var listOfResources;
   try
     {
@@ -184,6 +185,7 @@ SALOME_LifeCycleCORBA::LoadComponent(const Engines::MachineParameters& params,
   convert(params, new_params);
   new_params.resource_params.componentList.length(1);
   new_params.resource_params.componentList[0] = componentName;
+  new_params.resource_params.can_run_containers = true;
 
   Engines::ResourceList_var listOfResources;
   try
@@ -229,6 +231,7 @@ FindOrLoad_Component(const Engines::MachineParameters& params,
   convert(params, new_params);
   new_params.resource_params.componentList.length(1);
   new_params.resource_params.componentList[0] = componentName;
+  new_params.resource_params.can_run_containers = true;
 
   // For Compatibility -> if hostname == localhost put name == hostname
   if (std::string(new_params.resource_params.hostname.in()) == "localhost")
@@ -277,6 +280,7 @@ FindOrLoad_Component(const Engines::ContainerParameters& params,
   Engines::ContainerParameters new_params(params);
   new_params.resource_params.componentList.length(1);
   new_params.resource_params.componentList[0] = componentName;
+  new_params.resource_params.can_run_containers = true;
 
   Engines::ResourceList_var listOfResources;
   try
@@ -448,6 +452,8 @@ SALOME_LifeCycleCORBA::preSet(Engines::ResourceParameters& params)
   params.nb_node = 0;
   params.nb_proc_per_node = 0;
   params.policy = "";
+  params.can_launch_batch_jobs = false;
+  params.can_run_containers = false;
 }
 
 void SALOME_LifeCycleCORBA::preSet( Engines::ContainerParameters& params)
index 1212c0fb7943793bf1b616cbc8e069c1c1ccc078..6d710184245f13a172cddb7fdcc11c6ba8c0cd78 100644 (file)
@@ -686,6 +686,7 @@ std::string LifeCycleCORBATest::GetRemoteHost()
   _LCC.preSet(params);               // empty params to get all the machines
   params.resource_params.componentList.length(1);
   params.resource_params.componentList[0]="SalomeTestComponent";
+  params.resource_params.can_run_containers = true;
 
   Engines::ResourceList_var hostList = resourcesManager->GetFittingResources(params.resource_params);
   CPPUNIT_ASSERT(hostList->length() > 1);
index 2426cfcc80f6772700bd81ce2cf98f91aad6b2af..44e3f577e48257270e5a1d9bb36315fff53f5ec3 100644 (file)
@@ -283,6 +283,18 @@ ResourcesManager_cpp::GetFittingResources(const resourceParams& params) throw(Re
   if (vec.size() == 0)
     vec = vec_save;
 
+  // Step 7 : Filter on possible usage
+  vector<string> prev_list(vec);
+  vec.clear();
+  for (vector<string>::iterator iter = prev_list.begin() ; iter != prev_list.end() ; iter++)
+  {
+    MapOfParserResourcesType::const_iterator it = _resourcesList.find(*iter);
+    if (it != _resourcesList.end() &&
+        (!params.can_launch_batch_jobs || it->second.can_launch_batch_jobs) &&
+        (!params.can_run_containers || it->second.can_run_containers))
+      vec.push_back(*iter);
+  }
+
   // End
   // Send an exception if return list is empty...
   if (vec.size() == 0)
@@ -562,7 +574,6 @@ ResourcesManager_cpp::GetResourcesDescr(const std::string & name)
 void ResourcesManager_cpp::AddDefaultResourceInCatalog()
 {
   ParserResourcesType resource;
-  resource.Clear();
   resource.Name = DEFAULT_RESOURCE_NAME;
   // We can't use "localhost" for parameter hostname because the containers are registered in the
   // naming service with the real hostname, not "localhost"
@@ -575,5 +586,7 @@ void ResourcesManager_cpp::AddDefaultResourceInCatalog()
     resource.AppliPath = string(getenv("HOME")) + "/" + getenv("APPLI");
   }
   resource.working_directory = "/tmp/salome_localres_workdir";
+  resource.can_launch_batch_jobs = true;
+  resource.can_run_containers = true;
   _resourcesList[resource.Name] = resource;
 }
index 8b55d205b6334fa0dacbb0c657224985704d9ea8..d1400b3c6ff9471b5cdeb51f854ca998c4063f4f 100644 (file)
@@ -53,6 +53,8 @@ struct resourceParams
 {
   std::string name;
   std::string hostname;
+  bool can_launch_batch_jobs;
+  bool can_run_containers;
   std::string OS;
   long nb_proc;
   long nb_node;
index e548b3613c3fe8a0adf378d34eea14f1a22d2269..40b7d943f3397efd4355a4f8331a16079551c535 100755 (executable)
@@ -33,6 +33,8 @@
 #include <sstream>
 #include <map>
 
+using namespace std;
+
 //=============================================================================
 /*!
  *  Constructor
@@ -48,6 +50,7 @@ SALOME_ResourcesCatalog_Handler(MapOfParserResourcesType& resources_list): _reso
   test_cluster = "cluster";
   test_name = "name";
   test_hostname = "hostname";
+  test_type = "type";
   test_protocol = "protocol";
   test_cluster_internal_protocol = "iprotocol";
   test_mode = "mode";
@@ -71,6 +74,8 @@ SALOME_ResourcesCatalog_Handler(MapOfParserResourcesType& resources_list): _reso
   test_members = "members";
   test_is_cluster_head = "isClusterHead";
   test_working_directory = "workingDirectory";
+  test_can_launch_batch_jobs = "canLaunchBatchJobs";
+  test_can_run_containers = "canRunContainers";
 }
 
 //=============================================================================
@@ -115,34 +120,38 @@ void SALOME_ResourcesCatalog_Handler::ProcessXmlDocument(xmlDocPtr theDoc)
   // Processing the document nodes
   while(aCurNode != NULL)
   {
-    // Cas d'une machine ou d'une machine batch
+    // Declaration of a single machine or a frontal node for a cluster managed by a batch manager
     if (!xmlStrcmp(aCurNode->name,(const xmlChar*)test_machine))
     {
-      _resource.Clear();
-      bool Ok = ProcessMachine(aCurNode, _resource);
+      ParserResourcesType resource;
+      bool Ok = ProcessMachine(aCurNode, resource);
       if (Ok)
       {
         // Adding a resource
-        if(_resource.HostName == "localhost")
+        if(resource.HostName == "localhost")
         {
-          _resource.HostName = Kernel_Utils::GetHostname();
+          resource.HostName = Kernel_Utils::GetHostname();
         }
-        std::map<std::string, ParserResourcesType>::const_iterator iter = _resources_list.find(_resource.Name);
+        std::map<std::string, ParserResourcesType>::const_iterator iter = _resources_list.find(resource.Name);
         if (iter != _resources_list.end())
-          RES_INFOS("Warning resource " << _resource.Name << " already added, keep last resource found !");
-        _resources_list[_resource.Name] = _resource;
+          RES_INFOS("Warning resource " << resource.Name << " already added, keep last resource found !");
+        _resources_list[resource.Name] = resource;
       }
     }
-    // Cas de la déclaration d'un cluster
+    // Declaration of a cluster
+    // Here, a cluster is NOT the frontal node of a cluster managed by a batch manager (classical
+    // usage of a cluster). It is a group of machines intended to be used for a parallel container.
+    // The methods ProcessCluster and ProcessMember are only used in the context of parallel
+    // containers. They are not used in classical Salome usage scenarios.
     if (!xmlStrcmp(aCurNode->name,(const xmlChar*)test_cluster))
     {
-      _resource.Clear();
-      if(ProcessCluster(aCurNode, _resource))
+      ParserResourcesType resource;
+      if(ProcessCluster(aCurNode, resource))
       {
-        std::map<std::string, ParserResourcesType>::const_iterator iter = _resources_list.find(_resource.Name);
+        std::map<std::string, ParserResourcesType>::const_iterator iter = _resources_list.find(resource.Name);
         if (iter != _resources_list.end())
-          RES_INFOS("Warning resource " << _resource.Name << " already added, keep last resource found !");
-        _resources_list[_resource.Name] = _resource;
+          RES_INFOS("Warning resource " << resource.Name << " already added, keep last resource found !");
+        _resources_list[resource.Name] = resource;
       }
     }
     aCurNode = aCurNode->next;
@@ -155,16 +164,7 @@ void SALOME_ResourcesCatalog_Handler::ProcessXmlDocument(xmlDocPtr theDoc)
   {
     std::cerr << "************************************************" << std::endl;
     std::cerr << "Resource " << (*iter).first << " found:" << std::endl;
-    std::cerr << " Name: " << (*iter).second.Name << std::endl;
-    std::cerr << " Hostname: " << (*iter).second.HostName << std::endl;
-    std::cerr << " Username: " << (*iter).second.UserName << std::endl;
-    std::cerr << " Appli path: " <<(*iter).second.AppliPath << std::endl;
-    std::cerr << " OS: " << (*iter).second.OS << std::endl;
-    std::cerr << " Protocol: " << (*iter).second.PrintAccessProtocolType() << std::endl;
-    std::cerr << " Internal Protocol: " <<(*iter).second.PrintClusterInternalProtocol() << std::endl;
-    std::cerr << " Mode: " << (*iter).second.PrintAccessModeType() << std::endl;
-    std::cerr << " Batch Type: " << (*iter).second.PrintBatchType() << std::endl;
-    std::cerr << " MPI Impl: " << (*iter).second.PrintMpiImplType() << std::endl;
+    std::cerr << (*iter).second;
     std::cerr << "************************************************" << std::endl;
   }
 #endif
@@ -199,7 +199,7 @@ SALOME_ResourcesCatalog_Handler::ProcessCluster(xmlNodePtr cluster_descr, Parser
   {
     resource.Name = resource.HostName;
     resource.DataForSort._Name = resource.HostName;
-    std::cerr << "SALOME_ResourcesCatalog_Handler::ProcessCluster : !!! Warning !!! No Name found use Hostname for resource: " << _resource.Name << std::endl;
+    std::cerr << "SALOME_ResourcesCatalog_Handler::ProcessCluster : !!! Warning !!! No Name found use Hostname for resource: " << resource.Name << std::endl;
   }
 
   if (xmlHasProp(cluster_descr, (const xmlChar*)test_use))
@@ -233,22 +233,7 @@ SALOME_ResourcesCatalog_Handler::ProcessCluster(xmlNodePtr cluster_descr, Parser
     xmlChar* mpi = xmlGetProp(cluster_descr, (const xmlChar*)test_mpi);
     std::string anMpi = (const char*)mpi;
     xmlFree(mpi);
-    if (anMpi == "lam")
-      resource.mpi = lam;
-    else if (anMpi == "mpich1")
-      resource.mpi = mpich1;
-    else if (anMpi == "mpich2")
-      resource.mpi = mpich2;
-    else if (anMpi == "openmpi")
-      resource.mpi = openmpi;
-    else if (anMpi == "ompi")
-      resource.mpi = ompi;
-    else if  (anMpi == "slurmmpi")
-      resource.mpi = slurmmpi;
-    else if  (anMpi == "prun")
-      resource.mpi = prun;
-    else
-      resource.mpi = nompi;
+    resource.setMpiImplTypeStr(anMpi);
   }
 
   // Parsing des membres du cluster 
@@ -263,7 +248,7 @@ SALOME_ResourcesCatalog_Handler::ProcessCluster(xmlNodePtr cluster_descr, Parser
          // Process members
          if (!xmlStrcmp(members->name, (const xmlChar*)test_machine))
          {
-           ParserResourcesClusterMembersType new_member;
+           ParserResourcesType new_member;
            if (ProcessMember(members, new_member))
              resource.ClusterMembersList.push_back(new_member);
          }
@@ -284,7 +269,7 @@ SALOME_ResourcesCatalog_Handler::ProcessCluster(xmlNodePtr cluster_descr, Parser
 }
 
 bool
-SALOME_ResourcesCatalog_Handler::ProcessMember(xmlNodePtr member_descr, ParserResourcesClusterMembersType & resource)
+SALOME_ResourcesCatalog_Handler::ProcessMember(xmlNodePtr member_descr, ParserResourcesType & resource)
 {
   if (xmlHasProp(member_descr, (const xmlChar*)test_hostname))
   {
@@ -304,9 +289,9 @@ SALOME_ResourcesCatalog_Handler::ProcessMember(xmlNodePtr member_descr, ParserRe
     xmlChar* protocol= xmlGetProp(member_descr, (const xmlChar*)test_protocol);
     try
     {
-      resource.Protocol = ParserResourcesType::stringToProtocol((const char *)protocol);
+      resource.setAccessProtocolTypeStr((const char *)protocol);
     }
-    catch (SALOME_Exception e)
+    catch (const SALOME_Exception & e)
     {
       std::cerr << "SALOME_ResourcesCatalog_Handler::ProcessMember : Warning found a machine with a bad protocol" << std::endl;
       std::cerr << "SALOME_ResourcesCatalog_Handler::ProcessMember : Warning this machine will not be added" << std::endl;
@@ -326,9 +311,9 @@ SALOME_ResourcesCatalog_Handler::ProcessMember(xmlNodePtr member_descr, ParserRe
     xmlChar* iprotocol= xmlGetProp(member_descr, (const xmlChar*)test_cluster_internal_protocol);
     try
     {
-      resource.ClusterInternalProtocol = ParserResourcesType::stringToProtocol((const char *)iprotocol);
+      resource.setClusterInternalProtocolStr((const char *)iprotocol);
     }
-    catch (SALOME_Exception e)
+    catch (const SALOME_Exception & e)
     {
       std::cerr << "SALOME_ResourcesCatalog_Handler::ProcessMember : Warning found a machine with a bad protocol" << std::endl;
       std::cerr << "SALOME_ResourcesCatalog_Handler::ProcessMember : Warning this machine will not be added" << std::endl;
@@ -424,7 +409,72 @@ SALOME_ResourcesCatalog_Handler::ProcessMachine(xmlNodePtr machine_descr, Parser
   {
     resource.Name = resource.HostName;
     resource.DataForSort._Name = resource.HostName;
-    std::cerr << "SALOME_ResourcesCatalog_Handler::ProcessMachine : !!! Warning !!! No Name found use Hostname for resource: " << _resource.Name << std::endl;
+    std::cerr << "SALOME_ResourcesCatalog_Handler::ProcessMachine : !!! Warning !!! No Name found use Hostname for resource: " << resource.Name << std::endl;
+  }
+
+  // This block is for compatibility with files created in Salome 6.
+  // It can safely be removed in Salome 8.
+  if (xmlHasProp(machine_descr, (const xmlChar*)test_mode))
+  {
+    cerr << "Warning: parameter \"" << test_mode << "\" defined for resource \"" <<
+            resource.Name << "\" is deprecated. It will be replaced when your resource " <<
+            "file is saved." << endl;
+    xmlChar* mode=xmlGetProp(machine_descr, (const xmlChar*)test_mode);
+    switch ( mode[0] )
+    {
+      case 'i':
+        resource.can_run_containers = true;
+        break;
+      case 'b':
+        resource.can_launch_batch_jobs = true;
+        break;
+      default:
+        break;
+    }
+    xmlFree(mode);
+  }
+
+  if (xmlHasProp(machine_descr, (const xmlChar*)test_is_cluster_head))
+  {
+    cerr << "Warning: parameter \"" << test_is_cluster_head << "\" defined for resource \"" <<
+            resource.Name << "\" is deprecated. It will be replaced when your resource " <<
+            "file is saved." << endl;
+    xmlChar* is_cluster_head = xmlGetProp(machine_descr, (const xmlChar*)test_is_cluster_head);
+    std::string str_ich = (const char*)is_cluster_head;
+    if (str_ich == "true")
+    {
+      resource.type = cluster;
+      resource.can_launch_batch_jobs = true;
+      resource.can_run_containers = false;
+    }
+    else
+    {
+      resource.type = single_machine;
+      resource.can_run_containers = true;
+    }
+    xmlFree(is_cluster_head);
+  }
+  // End of compatibility block
+
+  if (xmlHasProp(machine_descr, (const xmlChar*)test_type))
+  {
+    xmlChar* type = xmlGetProp(machine_descr, (const xmlChar*)test_type);
+    try
+    {
+      resource.setResourceTypeStr((const char*)type);
+    }
+    catch (const SALOME_Exception & e)
+    {
+      cerr << "Warning, invalid type \"" << (const char*)type << "\" for resource \"" <<
+              resource.Name << "\", using default value \"" << resource.getResourceTypeStr() <<
+              "\"" << endl;
+    }
+    xmlFree(type);
+  }
+  else
+  {
+    cerr << "Warning, no type found for resource \"" << resource.Name <<
+            "\", using default value \"" << resource.getResourceTypeStr() << "\"" << endl;
   }
 
   if (xmlHasProp(machine_descr, (const xmlChar*)test_batch_queue))
@@ -433,8 +483,6 @@ SALOME_ResourcesCatalog_Handler::ProcessMachine(xmlNodePtr machine_descr, Parser
     resource.batchQueue = (const char*)batch_queue;
     xmlFree(batch_queue);
   }
-  else
-    resource.batchQueue = "";
 
   if (xmlHasProp(machine_descr, (const xmlChar*)test_user_commands))
   {
@@ -442,110 +490,71 @@ SALOME_ResourcesCatalog_Handler::ProcessMachine(xmlNodePtr machine_descr, Parser
     resource.userCommands = (const char*)user_commands;
     xmlFree(user_commands);
   }
-  else
-    resource.userCommands = "";
 
   if (xmlHasProp(machine_descr, (const xmlChar*)test_protocol))
   {
     xmlChar* protocol= xmlGetProp(machine_descr, (const xmlChar*)test_protocol);
     try
     {
-      resource.Protocol = ParserResourcesType::stringToProtocol((const char *)protocol);
+      resource.setAccessProtocolTypeStr((const char *)protocol);
     }
-    catch (SALOME_Exception e)
+    catch (const SALOME_Exception & e)
     {
-      // If it'not in all theses cases, the protocol is affected to rsh
-      resource.Protocol = rsh;
+      cerr << "Warning, invalid protocol \"" << (const char*)protocol << "\" for resource \"" <<
+              resource.Name << "\", using default value \"" <<
+              resource.getAccessProtocolTypeStr() << "\"" << endl;
     }
     xmlFree(protocol);
   }
-  else
-    resource.Protocol = rsh;
 
   if (xmlHasProp(machine_descr, (const xmlChar*)test_cluster_internal_protocol))
   {
     xmlChar* iprotocol= xmlGetProp(machine_descr, (const xmlChar*)test_cluster_internal_protocol);
     try
     {
-      resource.ClusterInternalProtocol = ParserResourcesType::stringToProtocol((const char *)iprotocol);
+      resource.setClusterInternalProtocolStr((const char *)iprotocol);
     }
-    catch (SALOME_Exception e)
+    catch (const SALOME_Exception & e)
     {
-      // If it'not in all theses cases, the protocol is affected to rsh
-      resource.ClusterInternalProtocol = rsh;
+      cerr << "Warning, invalid internal protocol \"" << (const char*)iprotocol <<
+              "\" for resource \"" << resource.Name << "\", using default value \"" <<
+              resource.getClusterInternalProtocolStr() << "\"" << endl;
     }
     xmlFree(iprotocol);
   }
   else
     resource.ClusterInternalProtocol = resource.Protocol;
 
-  if (xmlHasProp(machine_descr, (const xmlChar*)test_mode))
-  {
-    xmlChar* mode=xmlGetProp(machine_descr, (const xmlChar*)test_mode);
-    switch ( mode[0] )
-    {
-      case 'i':
-        resource.Mode = interactive;
-        break;
-      case 'b':
-        resource.Mode = batch;
-        break;
-      default:
-        // If it'not in all theses cases, the mode is affected to interactive
-        resource.Mode = interactive;
-        break;
-    }
-    xmlFree(mode);
-  }
-  else
-    resource.Mode = interactive;
-
   if (xmlHasProp(machine_descr, (const xmlChar*)test_batch))
   {
     xmlChar* batch = xmlGetProp(machine_descr, (const xmlChar*)test_batch);
-    std::string aBatch = (const char*)batch;
+    try
+    {
+      resource.setBatchTypeStr((const char *)batch);
+    }
+    catch (const SALOME_Exception & e)
+    {
+      cerr << "Warning, invalid batch manager \"" << (const char*)batch <<
+              "\" for resource \"" << resource.Name << "\", using default value \"" <<
+              resource.getBatchTypeStr() << "\"" << endl;
+    }
     xmlFree(batch);
-    if (aBatch == "pbs")
-      resource.Batch = pbs;
-    else if  (aBatch == "lsf")
-      resource.Batch = lsf;
-    else if  (aBatch == "sge")
-      resource.Batch = sge;
-    else if  (aBatch == "ssh_batch")
-      resource.Batch = ssh_batch;
-    else if  (aBatch == "ccc")
-      resource.Batch = ccc;
-    else if  (aBatch == "slurm")
-      resource.Batch = slurm;
-    else if  (aBatch == "ll")
-      resource.Batch = ll;
-    else if  (aBatch == "vishnu")
-      resource.Batch = vishnu;
-    else
-      resource.Batch = none;
   }
 
   if (xmlHasProp(machine_descr, (const xmlChar*)test_mpi))
   {
     xmlChar* mpi = xmlGetProp(machine_descr, (const xmlChar*)test_mpi);
-    std::string anMpi = (const char*)mpi;
+    try
+    {
+      resource.setMpiImplTypeStr((const char *)mpi);
+    }
+    catch (const SALOME_Exception & e)
+    {
+      cerr << "Warning, invalid MPI implementation \"" << (const char*)mpi <<
+              "\" for resource \"" << resource.Name << "\", using default value \"" <<
+              resource.getMpiImplTypeStr() << "\"" << endl;
+    }
     xmlFree(mpi);
-    if (anMpi == "lam")
-      resource.mpi = lam;
-    else if (anMpi == "mpich1")
-      resource.mpi = mpich1;
-    else if (anMpi == "mpich2")
-      resource.mpi = mpich2;
-    else if (anMpi == "openmpi")
-      resource.mpi = openmpi;
-    else if (anMpi == "ompi")
-      resource.mpi = ompi;
-    else if  (anMpi == "slurmmpi")
-      resource.mpi = slurmmpi;
-    else if  (anMpi == "prun")
-      resource.mpi = prun;
-    else
-      resource.mpi = nompi;
   }
 
   if (xmlHasProp(machine_descr, (const xmlChar*)test_user_name))
@@ -597,23 +606,36 @@ SALOME_ResourcesCatalog_Handler::ProcessMachine(xmlNodePtr machine_descr, Parser
     xmlFree(nb_of_proc_per_node);
   }
 
-  if (xmlHasProp(machine_descr, (const xmlChar*)test_is_cluster_head))
+  if (xmlHasProp(machine_descr, (const xmlChar*)test_can_launch_batch_jobs))
   {
-    xmlChar* is_cluster_head = xmlGetProp(machine_descr, (const xmlChar*)test_is_cluster_head);
-    std::string str_ich = (const char*)is_cluster_head;
-    if (str_ich == "true")
+    xmlChar* can_launch_batch_jobs = xmlGetProp(machine_descr, (const xmlChar*)test_can_launch_batch_jobs);
+    try
     {
-      resource.is_cluster_head = true;
+      resource.setCanLaunchBatchJobsStr((const char *)can_launch_batch_jobs);
     }
-    else
+    catch (const SALOME_Exception & e)
     {
-      resource.is_cluster_head = false;
+      cerr << "Warning, invalid can_launch_batch_jobs parameter value \"" <<
+              (const char*)can_launch_batch_jobs << "\" for resource \"" << resource.Name <<
+              "\", using default value \"" << resource.getCanLaunchBatchJobsStr() << "\"" << endl;
     }
-    xmlFree(is_cluster_head);
+    xmlFree(can_launch_batch_jobs);
   }
-  else
+
+  if (xmlHasProp(machine_descr, (const xmlChar*)test_can_run_containers))
   {
-    resource.is_cluster_head = false;
+    xmlChar* can_run_containers = xmlGetProp(machine_descr, (const xmlChar*)test_can_run_containers);
+    try
+    {
+      resource.setCanRunContainersStr((const char *)can_run_containers);
+    }
+    catch (const SALOME_Exception & e)
+    {
+      cerr << "Warning, invalid can_run_containers parameter value \"" <<
+              (const char*)can_run_containers << "\" for resource \"" << resource.Name <<
+              "\", using default value \"" << resource.getCanRunContainersStr() << "\"" << endl;
+    }
+    xmlFree(can_run_containers);
   }
 
   if (xmlHasProp(machine_descr, (const xmlChar*)test_working_directory))
@@ -622,10 +644,6 @@ SALOME_ResourcesCatalog_Handler::ProcessMachine(xmlNodePtr machine_descr, Parser
     resource.working_directory = (const char*)working_directory;
     xmlFree(working_directory);
   }
-  else
-  {
-    resource.working_directory = "";
-  }
 
   // Process children nodes
   xmlNodePtr aCurSubNode = machine_descr->xmlChildrenNode;
@@ -640,16 +658,16 @@ SALOME_ResourcesCatalog_Handler::ProcessMachine(xmlNodePtr machine_descr, Parser
       {
         xmlChar* component_name = xmlGetProp(aCurSubNode, (const xmlChar*)test_component_name);
         std::string aComponentName = (const char*)component_name;
-        _resource.ComponentsList.push_back(aComponentName);
+        resource.ComponentsList.push_back(aComponentName);
         if (xmlHasProp(aCurSubNode, (const xmlChar*)test_module_name)) 
         {
           xmlChar* module_name = xmlGetProp(aCurSubNode, (const xmlChar*)test_module_name);
           std::string aModuleName = (const char*)module_name;
-          _resource.ModulesList.push_back(aModuleName);
+          resource.ModulesList.push_back(aModuleName);
           xmlFree(module_name);
         }
         else
-          _resource.ModulesList.push_back(aComponentName);
+          resource.ModulesList.push_back(aComponentName);
         xmlFree(component_name);
       }
     }
@@ -662,8 +680,8 @@ SALOME_ResourcesCatalog_Handler::ProcessMachine(xmlNodePtr machine_descr, Parser
       {
         xmlChar* component_name = xmlGetProp(aCurSubNode, (const xmlChar*)test_module_name);
         std::string aComponentName = (const char*)component_name;
-        _resource.ComponentsList.push_back(aComponentName);
-        _resource.ModulesList.push_back(aComponentName);
+        resource.ComponentsList.push_back(aComponentName);
+        resource.ModulesList.push_back(aComponentName);
         xmlFree(component_name);
       }
     }
@@ -694,90 +712,20 @@ void SALOME_ResourcesCatalog_Handler::PrepareDocToXmlFile(xmlDocPtr theDoc)
     RES_MESSAGE("Add resource name = " << (*iter).second.Name.c_str());
     xmlNewProp(node, BAD_CAST test_name, BAD_CAST (*iter).second.Name.c_str());
     xmlNewProp(node, BAD_CAST test_hostname, BAD_CAST (*iter).second.HostName.c_str());
+    xmlNewProp(node, BAD_CAST test_type, BAD_CAST (*iter).second.getResourceTypeStr().c_str());
     xmlNewProp(node, BAD_CAST test_appli_path, BAD_CAST (*iter).second.AppliPath.c_str());
     xmlNewProp(node, BAD_CAST test_batch_queue, BAD_CAST (*iter).second.batchQueue.c_str());
     xmlNewProp(node, BAD_CAST test_user_commands, BAD_CAST (*iter).second.userCommands.c_str());
-    xmlNewProp(node,
-               BAD_CAST test_protocol,
-               BAD_CAST ParserResourcesType::protocolToString((*iter).second.Protocol).c_str());
-    xmlNewProp(node,
-               BAD_CAST test_cluster_internal_protocol,
-               BAD_CAST ParserResourcesType::protocolToString((*iter).second.ClusterInternalProtocol).c_str());
+    xmlNewProp(node, BAD_CAST test_protocol, BAD_CAST (*iter).second.getAccessProtocolTypeStr().c_str());
+    xmlNewProp(node, BAD_CAST test_cluster_internal_protocol,
+               BAD_CAST (*iter).second.getClusterInternalProtocolStr().c_str());
     xmlNewProp(node, BAD_CAST test_working_directory, BAD_CAST (*iter).second.working_directory.c_str());
-    if ((*iter).second.is_cluster_head)
-      xmlNewProp(node, BAD_CAST test_is_cluster_head, BAD_CAST "true");
-    else
-      xmlNewProp(node, BAD_CAST test_is_cluster_head, BAD_CAST "false");
-
-    switch ((*iter).second.Mode)
-    {
-      case interactive:
-        xmlNewProp(node, BAD_CAST test_mode, BAD_CAST "interactive");
-        break;
-      case batch:
-        xmlNewProp(node, BAD_CAST test_mode, BAD_CAST "batch");
-        break;
-      default:
-        xmlNewProp(node, BAD_CAST test_mode, BAD_CAST "interactive");
-    }
-
-    switch ((*iter).second.Batch)
-    {
-      case pbs:
-        xmlNewProp(node, BAD_CAST test_batch, BAD_CAST "pbs");
-        break;
-      case lsf:
-        xmlNewProp(node, BAD_CAST test_batch, BAD_CAST "lsf");
-        break;
-      case sge:
-        xmlNewProp(node, BAD_CAST test_batch, BAD_CAST "sge");
-        break;
-      case ccc:
-        xmlNewProp(node, BAD_CAST test_batch, BAD_CAST "ccc");
-        break;
-      case slurm:
-        xmlNewProp(node, BAD_CAST test_batch, BAD_CAST "slurm");
-        break;
-      case ssh_batch:
-        xmlNewProp(node, BAD_CAST test_batch, BAD_CAST "ssh_batch");
-        break;
-      case ll:
-        xmlNewProp(node, BAD_CAST test_batch, BAD_CAST "ll");
-        break;
-      case vishnu:
-        xmlNewProp(node, BAD_CAST test_batch, BAD_CAST "vishnu");
-        break;
-      default:
-        xmlNewProp(node, BAD_CAST test_batch, BAD_CAST "");
-    }
-
-    switch ((*iter).second.mpi)
-    {
-      case lam:
-        xmlNewProp(node, BAD_CAST test_mpi, BAD_CAST "lam");
-        break;
-      case mpich1:
-        xmlNewProp(node, BAD_CAST test_mpi, BAD_CAST "mpich1");
-        break;
-      case mpich2:
-        xmlNewProp(node, BAD_CAST test_mpi, BAD_CAST "mpich2");
-        break;
-      case openmpi:
-        xmlNewProp(node, BAD_CAST test_mpi, BAD_CAST "openmpi");
-        break;
-      case ompi:
-        xmlNewProp(node, BAD_CAST test_mpi, BAD_CAST "ompi");
-        break;
-      case slurmmpi:
-        xmlNewProp(node, BAD_CAST test_mpi, BAD_CAST "slurmmpi");
-        break;
-      case prun:
-        xmlNewProp(node, BAD_CAST test_mpi, BAD_CAST "prun");
-        break;
-      default:
-        xmlNewProp(node, BAD_CAST test_mpi, BAD_CAST "");
-    }
-
+    xmlNewProp(node, BAD_CAST test_can_launch_batch_jobs,
+               BAD_CAST (*iter).second.getCanLaunchBatchJobsStr().c_str());
+    xmlNewProp(node, BAD_CAST test_can_run_containers,
+               BAD_CAST (*iter).second.getCanRunContainersStr().c_str());
+    xmlNewProp(node, BAD_CAST test_batch, BAD_CAST (*iter).second.getBatchTypeStr().c_str());
+    xmlNewProp(node, BAD_CAST test_mpi, BAD_CAST (*iter).second.getMpiImplTypeStr().c_str());
     xmlNewProp(node, BAD_CAST test_user_name, BAD_CAST (*iter).second.UserName.c_str());
 
     std::vector<std::string>::const_iterator iter2 = (*iter).second.ComponentsList.begin();
index 8d94c3d82c30207a3c4e33e6f969a12a2f37ba04..7705c222e7ca30f7028b170b2080927e7f1ed15c 100755 (executable)
@@ -53,27 +53,28 @@ class RESOURCESMANAGER_EXPORT SALOME_ResourcesCatalog_Handler
 
     bool ProcessMachine(xmlNodePtr machine_descr, ParserResourcesType & resource);
     bool ProcessCluster(xmlNodePtr cluster_descr, ParserResourcesType & resource);
-    bool ProcessMember(xmlNodePtr member_descr, ParserResourcesClusterMembersType & resource);
+    bool ProcessMember(xmlNodePtr member_descr, ParserResourcesType & resource);
   
     void PrepareDocToXmlFile(xmlDocPtr theDoc);
 
   private :
     std::string previous_component_name;
 
-    ParserResourcesType _resource;
     MapOfParserResourcesType& _resources_list;
 
     const char *test_machine;
     const char *test_cluster;
     const char *test_name;
     const char *test_hostname;
+    const char *test_type;
     const char *test_protocol;
     const char *test_cluster_internal_protocol;
-    const char *test_mode;
     const char *test_batch;
     const char *test_mpi;
     const char *test_user_name;
     const char *test_appli_path;
+    const char *test_can_launch_batch_jobs;
+    const char *test_can_run_containers;
     // for compatibility
     const char *test_modules;
     const char *test_module_name;
@@ -89,9 +90,11 @@ class RESOURCESMANAGER_EXPORT SALOME_ResourcesCatalog_Handler
     const char *test_user_commands;
     const char *test_use;
     const char *test_members;
-    const char *test_is_cluster_head;
     const char *test_working_directory;
 
+    const char *test_mode; // To be removed in SALOME 8
+    const char *test_is_cluster_head; // To be removed in SALOME 8
+
   };
 
 #endif // SALOME_RESOURCES_CATALOG_HANDLER
index 5412c670d718f6760edb1beaa008348ac677fddc..a937d0fe40bbc6afd55c4085d5140152c76edd6f 100644 (file)
@@ -25,6 +25,8 @@
 #include <iostream>
 #include <sstream>
 
+using namespace std;
+
 #define NULL_VALUE 0
 
 unsigned int ResourceDataToSort::_nbOfProcWanted = NULL_VALUE;
@@ -130,6 +132,27 @@ void ResourceDataToSort::Print() const
   }
 
 
+ParserResourcesType::ParserResourcesType()
+: type(single_machine),
+  Protocol(ssh),
+  ClusterInternalProtocol(ssh),
+  Batch(none),
+  mpi(nompi),
+  nbOfProc(1),
+  can_launch_batch_jobs(false),
+  can_run_containers(false)
+{
+  DataForSort._Name = "";
+  DataForSort._nbOfNodes = 1;
+  DataForSort._nbOfProcPerNode = 1;
+  DataForSort._CPUFreqMHz = 0;
+  DataForSort._memInMB = 0;
+}
+
+ParserResourcesType::~ParserResourcesType()
+{
+}
+
 std::string ParserResourcesType::protocolToString(AccessProtocolType protocol)
 {
   switch (protocol)
@@ -166,139 +189,218 @@ AccessProtocolType ParserResourcesType::stringToProtocol(const std::string & pro
   else if (protocolStr == "blaunch")
     return blaunch;
   else
-    throw SALOME_Exception("Unknown protocol");
+    throw SALOME_Exception((string("Unknown protocol ") + protocolStr).c_str());
 }
 
-void ParserResourcesType::Print()
+ostream & operator<<(ostream &os, const ParserResourcesType &prt)
 {
-  std::ostringstream oss;
-  oss << std::endl <<
-    "Name : " << Name << std::endl <<
-    "HostName : " << HostName << std::endl << 
-    "NbOfNodes : " << DataForSort._nbOfNodes << std::endl <<
-    "NbOfProcPerNode : " << DataForSort._nbOfProcPerNode << std::endl <<
-    "CPUFreqMHz : " << DataForSort._CPUFreqMHz << std::endl <<
-    "MemInMB : " << DataForSort._memInMB << std::endl <<
-    "Protocol : " << protocolToString(Protocol) << std::endl <<
-    "ClusterInternalProtocol : " << protocolToString(ClusterInternalProtocol) << std::endl <<
-    "Mode : " << Mode << std::endl <<
-    "Batch : " << Batch << std::endl <<
-    "mpi : " << mpi << std::endl <<
-    "UserName : " << UserName << std::endl <<
-    "AppliPath : " << AppliPath << std::endl <<
-    "OS : " << OS << std::endl <<
-    "batchQueue : " << batchQueue << std::endl <<
-    "userCommands : " << userCommands << std::endl <<
-    "use : " << use << std::endl <<
-    "NbOfProc : " << nbOfProc << std::endl <<
-    "Modules : " << std::endl <<
-    "Components : " << std::endl <<
-    "Is Cluster Head: " << is_cluster_head << std::endl <<
-    "Working Directory: " << working_directory << std::endl;
-
-  for(unsigned int i=0;i<ComponentsList.size();i++)
-    oss << "Component " << i+1 << " called : " << ComponentsList[i] << std::endl;
-
-  
-  std::list<ParserResourcesClusterMembersType>::iterator it;
-  for(it = ClusterMembersList.begin(); 
-      it != ClusterMembersList.end();
-      it++)
+  os << "Name: " << prt.Name << endl <<
+        "HostName: " << prt.HostName << endl <<
+        "Type: " << prt.getResourceTypeStr() << endl <<
+        "NbOfNodes: " << prt.DataForSort._nbOfNodes << endl <<
+        "NbOfProcPerNode: " << prt.DataForSort._nbOfProcPerNode << endl <<
+        "CPUFreqMHz: " << prt.DataForSort._CPUFreqMHz << endl <<
+        "MemInMB: " << prt.DataForSort._memInMB << endl <<
+        "Protocol: " << prt.getAccessProtocolTypeStr() << endl <<
+        "ClusterInternalProtocol: " << prt.getClusterInternalProtocolStr() << endl <<
+        "Batch: " << prt.getBatchTypeStr() << endl <<
+        "mpi: " << prt.getMpiImplTypeStr() << endl <<
+        "UserName: " << prt.UserName << endl <<
+        "AppliPath: " << prt.AppliPath << endl <<
+        "OS: " << prt.OS << endl <<
+        "batchQueue: " << prt.batchQueue << endl <<
+        "userCommands: " << prt.userCommands << endl <<
+        "use: " << prt.use << endl <<
+        "NbOfProc: " << prt.nbOfProc << endl <<
+        "Can Launch Batch Jobs: " << prt.can_launch_batch_jobs << endl <<
+        "Can Run Containers: " << prt.can_run_containers << endl <<
+        "Working Directory: " << prt.working_directory << endl;
+
+  for(unsigned int i=0 ; i<prt.ComponentsList.size() ; i++)
+    os << "Component " << i+1 << " called: " << prt.ComponentsList[i] << endl;
+
+  list<ParserResourcesType>::const_iterator it;
+  for(it = prt.ClusterMembersList.begin() ; it != prt.ClusterMembersList.end() ; it++)
   {
-    oss << "Cluster member  called : " << (*it).HostName << std::endl;
+    os << "Cluster member called: " << (*it).HostName << endl;
   }
-  std::cout << oss.str() << std::endl;
+  return os;
 }
 
 std::string
-ParserResourcesType::PrintAccessProtocolType() const
+ParserResourcesType::getAccessProtocolTypeStr() const
 {
   return protocolToString(Protocol);
 }
 
 std::string
-ParserResourcesType::PrintClusterInternalProtocol() const
+ParserResourcesType::getClusterInternalProtocolStr() const
 {
   return protocolToString(ClusterInternalProtocol);
 }
 
 std::string 
-ParserResourcesType::PrintAccessModeType() const
+ParserResourcesType::getResourceTypeStr() const
 {
-  if (Mode == interactive)
-    return "interactive";
-  else
-    return "batch";
+  switch (type)
+  {
+  case cluster:
+    return "cluster";
+  case single_machine:
+    return "single_machine";
+  default:
+    throw SALOME_Exception("Unknown resource type");
+  }
 }
 
 std::string 
-ParserResourcesType::PrintBatchType() const
+ParserResourcesType::getBatchTypeStr() const
 {
-  if (Batch == none)
+  switch (Batch)
+  {
+  case none:
     return "none";
-  else if (Batch == pbs)
+  case pbs:
     return "pbs";
-  else if (Batch == lsf)
+  case lsf:
     return "lsf";
-  else if (Batch == sge)
+  case sge:
     return "sge";
-  else if (Batch == ccc)
+  case ccc:
     return "ccc";
-  else if (Batch == slurm)
+  case slurm:
     return "slurm";
-  else if (Batch == ll)
+  case ll:
     return "ll";
-  else if (Batch == vishnu)
+  case vishnu:
     return "vishnu";
-  else 
-    return "ssh";
+  case ssh_batch:
+    return "ssh_batch";
+  default:
+    throw SALOME_Exception("Unknown batch type");
+  }
 }
 
 std::string 
-ParserResourcesType::PrintMpiImplType() const
+ParserResourcesType::getMpiImplTypeStr() const
 {
-  if (mpi == nompi)
+  switch (mpi)
+  {
+  case nompi:
     return "no mpi";
-  else if (mpi == lam)
+  case lam:
     return "lam";
-  else if (mpi == mpich1)
+  case mpich1:
     return "mpich1";
-  else if (mpi == mpich2)
+  case mpich2:
     return "mpich2";
-  else if (mpi == openmpi)
+  case openmpi:
     return "openmpi";
-  else if (mpi == ompi)
+  case ompi:
     return "ompi";
-  else if (mpi == slurmmpi)
+  case slurmmpi:
     return "slurmmpi";
-  else
+  case prun:
     return "prun";
+  default:
+    throw SALOME_Exception("Unknown MPI implementation type");
+  }
 }
 
-void ParserResourcesType::Clear()
+string ParserResourcesType::getCanLaunchBatchJobsStr() const
 {
-  Name = "";
-  HostName = "";
-  Protocol = rsh;
-  ClusterInternalProtocol = rsh;
-  Mode = interactive;
-  Batch = none;
-  mpi = nompi;
-  UserName = "";
-  AppliPath = "";
-  batchQueue = "";
-  userCommands = "";
-  ComponentsList.clear();
-  OS = "";
-  use = "";
-  ClusterMembersList.clear();
-  nbOfProc = 1;
-  is_cluster_head = false;
-  working_directory = "";
+  return can_launch_batch_jobs ? "true" : "false";
+}
 
-  DataForSort._Name = "";
-  DataForSort._nbOfNodes = 1;
-  DataForSort._nbOfProcPerNode = 1;
-  DataForSort._CPUFreqMHz = 0;
-  DataForSort._memInMB = 0;
+string ParserResourcesType::getCanRunContainersStr() const
+{
+  return can_run_containers ? "true" : "false";
+}
+
+void ParserResourcesType::setAccessProtocolTypeStr(const string & protocolTypeStr)
+{
+  Protocol = stringToProtocol(protocolTypeStr);
+}
+
+void ParserResourcesType::setResourceTypeStr(const string & resourceTypeStr)
+{
+  if (resourceTypeStr == "cluster")
+    type = cluster;
+  else if (resourceTypeStr == "single_machine")
+    type = single_machine;
+  else
+    throw SALOME_Exception((string("Unknown resource type ") + resourceTypeStr).c_str());
+}
+
+void ParserResourcesType::setBatchTypeStr(const string & batchTypeStr)
+{
+  if (batchTypeStr == "pbs")
+    Batch = pbs;
+  else if (batchTypeStr == "lsf")
+    Batch = lsf;
+  else if (batchTypeStr == "sge")
+    Batch = sge;
+  else if (batchTypeStr == "slurm")
+    Batch = slurm;
+  else if (batchTypeStr == "ccc")
+    Batch = ccc;
+  else if (batchTypeStr == "ssh_batch")
+    Batch = ssh_batch;
+  else if (batchTypeStr == "ll")
+    Batch = ll;
+  else if (batchTypeStr == "vishnu")
+    Batch = vishnu;
+  else if (batchTypeStr == "")
+    Batch = none;
+  else
+    throw SALOME_Exception((string("Unknown batch type ") + batchTypeStr).c_str());
+}
+
+void ParserResourcesType::setMpiImplTypeStr(const string & mpiImplTypeStr)
+{
+  if (mpiImplTypeStr == "lam")
+    mpi = lam;
+  else if (mpiImplTypeStr == "mpich1")
+    mpi = mpich1;
+  else if (mpiImplTypeStr == "mpich2")
+    mpi = mpich2;
+  else if (mpiImplTypeStr == "openmpi")
+    mpi = openmpi;
+  else if (mpiImplTypeStr == "ompi")
+    mpi = ompi;
+  else if (mpiImplTypeStr == "slurmmpi")
+    mpi = slurmmpi;
+  else if (mpiImplTypeStr == "prun")
+    mpi = prun;
+  else if (mpiImplTypeStr == "" || mpiImplTypeStr == "no mpi")
+    mpi = nompi;
+  else
+    throw SALOME_Exception((string("Unknown MPI implementation type ") + mpiImplTypeStr).c_str());
+}
+
+void ParserResourcesType::setClusterInternalProtocolStr(const string & internalProtocolTypeStr)
+{
+  ClusterInternalProtocol = stringToProtocol(internalProtocolTypeStr);
+}
+
+void ParserResourcesType::setCanLaunchBatchJobsStr(const string & canLaunchBatchJobsStr)
+{
+  if (canLaunchBatchJobsStr == "true")
+    can_launch_batch_jobs = true;
+  else if (canLaunchBatchJobsStr == "false")
+    can_launch_batch_jobs = false;
+  else
+    throw SALOME_Exception((string("Invalid boolean value for can_launch_batch_jobs: ") +
+                            canLaunchBatchJobsStr).c_str());
+}
+
+void ParserResourcesType::setCanRunContainersStr(const string & canRunContainersStr)
+{
+  if (canRunContainersStr == "true")
+    can_run_containers = true;
+  else if (canRunContainersStr == "false")
+    can_run_containers = false;
+  else
+    throw SALOME_Exception((string("Invalid boolean value for can_run_containers: ") +
+                            canRunContainersStr).c_str());
 }
index a0d437318dc90642912e4e68c01732e25c49845d..5b659c9e0e2cb349d6a28e02d91f7550fab94734 100755 (executable)
@@ -43,7 +43,7 @@
 
 enum AccessProtocolType {sh, rsh, ssh, srun, pbsdsh, blaunch};
 
-enum AccessModeType {interactive, batch};
+enum ResourceType {cluster, single_machine};
 
 enum BatchType {none, pbs, lsf, sge, ssh_batch, ccc, ll, slurm, vishnu};
 
@@ -78,24 +78,34 @@ class RESOURCESMANAGER_EXPORT ResourceDataToSort
     unsigned int GetNumberOfPoints() const;
   };
 
-struct RESOURCESMANAGER_EXPORT ParserResourcesClusterMembersType
+class RESOURCESMANAGER_EXPORT ParserResourcesType
 {
-  std::string HostName;
-  AccessProtocolType Protocol;
-  AccessProtocolType ClusterInternalProtocol;
-  std::string UserName;
-  std::string AppliPath;
-  ResourceDataToSort DataForSort;
-};
+public:
+  ParserResourcesType();
+  virtual ~ParserResourcesType();
+
+  std::string getAccessProtocolTypeStr() const;
+  std::string getResourceTypeStr() const;
+  std::string getBatchTypeStr() const;
+  std::string getMpiImplTypeStr() const;
+  std::string getClusterInternalProtocolStr() const;
+  std::string getCanLaunchBatchJobsStr() const;
+  std::string getCanRunContainersStr() const;
+
+  void setAccessProtocolTypeStr(const std::string & protocolTypeStr);
+  void setResourceTypeStr(const std::string & resourceTypeStr);
+  void setBatchTypeStr(const std::string & batchTypeStr);
+  void setMpiImplTypeStr(const std::string & mpiImplTypeStr);
+  void setClusterInternalProtocolStr(const std::string & internalProtocolTypeStr);
+  void setCanLaunchBatchJobsStr(const std::string & canLaunchBatchJobsStr);
+  void setCanRunContainersStr(const std::string & canRunContainersStr);
 
-struct RESOURCESMANAGER_EXPORT ParserResourcesType
-{
   ResourceDataToSort DataForSort;
   std::string Name;
   std::string HostName;
   AccessProtocolType Protocol;
   AccessProtocolType ClusterInternalProtocol;
-  AccessModeType Mode;
+  ResourceType type;
   BatchType Batch;
   MpiImplType mpi;
   std::string UserName;
@@ -106,22 +116,20 @@ struct RESOURCESMANAGER_EXPORT ParserResourcesType
   std::string batchQueue;
   std::string userCommands;
   std::string use;
-  std::list<ParserResourcesClusterMembersType> ClusterMembersList;
+  std::list<ParserResourcesType> ClusterMembersList;
   unsigned int nbOfProc;
-  bool is_cluster_head;
+  bool can_launch_batch_jobs;
+  bool can_run_containers;
   std::string working_directory;
 
-  void Print();
-  void Clear();
+protected:
 
   static std::string protocolToString(AccessProtocolType protocol);
   static AccessProtocolType stringToProtocol(const std::string & protocolStr);
 
-  std::string PrintAccessProtocolType() const;
-  std::string PrintAccessModeType() const;
-  std::string PrintBatchType() const;
-  std::string PrintMpiImplType() const;
-  std::string PrintClusterInternalProtocol() const;
+  RESOURCESMANAGER_EXPORT friend std::ostream & operator<<(std::ostream &os,
+                                                           const ParserResourcesType &rt);
+
 };
 
 typedef std::map<std::string, ParserResourcesType> MapOfParserResourcesType;
index a96731b02bf5299609887c75ff7409d9b952dc7d..e1e9ec187a4e8281a6b86a6ea0d9396b833dafea 100644 (file)
@@ -150,6 +150,8 @@ SALOME_ResourcesManager::GetFittingResources(const Engines::ResourceParameters&
   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;
@@ -218,8 +220,9 @@ SALOME_ResourcesManager::GetResourceDefinition(const char * name)
 
     p_ptr->name = CORBA::string_dup(resource.Name.c_str());
     p_ptr->hostname = CORBA::string_dup(resource.HostName.c_str());
-    p_ptr->protocol = ParserResourcesType::protocolToString(resource.Protocol).c_str();
-    p_ptr->iprotocol = ParserResourcesType::protocolToString(resource.ClusterInternalProtocol).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());
@@ -230,40 +233,11 @@ SALOME_ResourcesManager::GetResourceDefinition(const char * name)
     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->is_cluster_head = resource.is_cluster_head;
+    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());
-
-    if( resource.mpi == lam )
-      p_ptr->mpiImpl = "lam";
-    else if( resource.mpi == mpich1 )
-      p_ptr->mpiImpl = "mpich1";
-    else if( resource.mpi == mpich2 )
-      p_ptr->mpiImpl = "mpich2";
-    else if( resource.mpi == openmpi )
-      p_ptr->mpiImpl = "openmpi";
-    else if( resource.mpi == ompi )
-      p_ptr->mpiImpl = "ompi";
-    else if( resource.mpi == slurmmpi )
-      p_ptr->mpiImpl = "slurmmpi";
-    else if( resource.mpi == prun )
-      p_ptr->mpiImpl = "prun";
-
-    if( resource.Batch == pbs )
-      p_ptr->batch = "pbs";
-    else if( resource.Batch == lsf )
-      p_ptr->batch = "lsf";
-    else if( resource.Batch == sge )
-      p_ptr->batch = "sge";
-    else if( resource.Batch == ccc )
-      p_ptr->batch = "ccc";
-    else if( resource.Batch == slurm )
-      p_ptr->batch = "slurm";
-    else if( resource.Batch == ssh_batch )
-      p_ptr->batch = "ssh";
-    else if( resource.Batch == ll )
-      p_ptr->batch = "ll";
-    else if( resource.Batch == vishnu )
-      p_ptr->batch = "vishnu";
+    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);
@@ -277,127 +251,42 @@ SALOME_ResourcesManager::AddResource(const Engines::ResourceDefinition& new_reso
                                      CORBA::Boolean write,
                                      const char * xml_file)
 {
-  ParserResourcesType resource;
-  resource.Name = new_resource.name.in();
-  resource.HostName = new_resource.hostname.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.is_cluster_head = new_resource.is_cluster_head;
-  resource.working_directory = new_resource.working_directory.in();
-
-  std::string aBatch = new_resource.batch.in();
-  if (aBatch == "pbs")
-    resource.Batch = pbs;
-  else if  (aBatch == "lsf")
-    resource.Batch = lsf;
-  else if  (aBatch == "sge")
-    resource.Batch = sge;
-  else if  (aBatch == "slurm")
-    resource.Batch = slurm;
-  else if  (aBatch == "ccc")
-    resource.Batch = ccc;
-  else if  (aBatch == "ssh_batch")
-    resource.Batch = ssh_batch;
-  else if  (aBatch == "ll")
-    resource.Batch = ll;
-  else if  (aBatch == "vishnu")
-    resource.Batch = vishnu;
-  else if (aBatch == "")
-    resource.Batch = none;
-  else {
-    INFOS("Bad Batch definition in AddResource: " << aBatch);
-    std::string message("Bad Batch definition in AddResource: ");
-    message += aBatch;
-    THROW_SALOME_CORBA_EXCEPTION(message.c_str(),SALOME::BAD_PARAM);
-  }
-
-  std::string anMpi = new_resource.mpiImpl.in();
-  if (anMpi == "lam")
-    resource.mpi = lam;
-  else if (anMpi == "mpich1")
-    resource.mpi = mpich1;
-  else if (anMpi == "mpich2")
-    resource.mpi = mpich2;
-  else if (anMpi == "openmpi")
-    resource.mpi = openmpi;
-  else if (anMpi == "ompi")
-    resource.mpi = ompi;
-  else if  (anMpi == "slurmmpi")
-    resource.mpi = slurmmpi;
-  else if  (anMpi == "prun")
-    resource.mpi = prun;
-  else if (anMpi == "")
-    resource.mpi = nompi;
-  else {
-    INFOS("Bad MPI definition in AddResource: " << anMpi);
-    std::string message("Bad MPI definition in AddResource: ");
-    message += anMpi;
-    THROW_SALOME_CORBA_EXCEPTION(message.c_str(),SALOME::BAD_PARAM);
-  }
-
-  std::string mode_str = new_resource.mode.in();
-  if (mode_str == "interactive")
-    resource.Mode = interactive;
-  else if (mode_str == "batch")
-    resource.Mode = batch;
-  else if (mode_str == "")
-    resource.Mode = interactive;
-  else {
-    INFOS("Bad mode definition in AddResource: " << mode_str);
-    std::string message("Bad mode definition in AddResource: ");
-    message += mode_str;
-    THROW_SALOME_CORBA_EXCEPTION(message.c_str(),SALOME::BAD_PARAM);
-  }
-  
-  std::string protocol = new_resource.protocol.in();
   try
   {
-    resource.Protocol = ParserResourcesType::stringToProtocol(protocol);
-  }
-  catch (SALOME_Exception e)
-  {
-    INFOS("Bad protocol definition in AddResource: " << protocol);
-    std::string message("Bad protocol definition in AddResource: ");
-    message += protocol;
-    THROW_SALOME_CORBA_EXCEPTION(message.c_str(),SALOME::BAD_PARAM);
-  }
-
-  std::string iprotocol = new_resource.iprotocol.in();
-  try
-  {
-    resource.ClusterInternalProtocol = ParserResourcesType::stringToProtocol(iprotocol);
-  }
-  catch (SALOME_Exception e)
-  {
-    INFOS("Bad iprotocol definition in AddResource: " << iprotocol);
-    std::string message("Bad iprotocol definition in AddResource: ");
-    message += iprotocol;
-    THROW_SALOME_CORBA_EXCEPTION(message.c_str(),SALOME::BAD_PARAM);
-  }
+    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());
 
-  for (CORBA::ULong i = 0; i < new_resource.componentList.length(); i++)
-    resource.ComponentsList.push_back(new_resource.componentList[i].in());
-
-  try
-  {
     _rm.AddResourceInCatalog(resource);
+
+    if (write)
+    {
+      _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);
   }
-
-  if (write)
-  {
-    _rm.WriteInXmlFile(std::string(xml_file));
-    _rm.ParseXmlFiles();
-  }
 }
 
 void
@@ -441,7 +330,7 @@ SALOME_ResourcesManager::getMachineFile(std::string resource_name,
       if (resource.ClusterMembersList.empty())
       {
         //It is not a cluster so we create a cluster with one machine
-        ParserResourcesClusterMembersType fake_node;
+        ParserResourcesType fake_node;
         fake_node.HostName = resource.HostName;
         fake_node.Protocol = resource.Protocol;
         fake_node.ClusterInternalProtocol = resource.ClusterInternalProtocol;
@@ -454,7 +343,7 @@ SALOME_ResourcesManager::getMachineFile(std::string resource_name,
 
       // Creating list of machines for creating the machine file
       std::list<std::string> list_of_machines;
-      std::list<ParserResourcesClusterMembersType>::iterator cluster_it = 
+      std::list<ParserResourcesType>::iterator cluster_it =
         resource.ClusterMembersList.begin();
       while (cluster_it != resource.ClusterMembersList.end())
       {
@@ -499,7 +388,7 @@ SALOME_ResourcesManager::getMachineFile(std::string resource_name,
       if (resource.ClusterMembersList.empty())
       {
         //It is not a cluster so we create a cluster with one machine
-        ParserResourcesClusterMembersType fake_node;
+        ParserResourcesType fake_node;
         fake_node.HostName = resource.HostName;
         fake_node.Protocol = resource.Protocol;
         fake_node.ClusterInternalProtocol = resource.ClusterInternalProtocol;
@@ -518,7 +407,7 @@ SALOME_ResourcesManager::getMachineFile(std::string resource_name,
         std::ofstream machine_file(machine_file_name.c_str(), std::ios_base::out);
 
         // We add all cluster machines to the file
-        std::list<ParserResourcesClusterMembersType>::iterator cluster_it = 
+        std::list<ParserResourcesType>::iterator cluster_it =
           resource.ClusterMembersList.begin();
         while (cluster_it != resource.ClusterMembersList.end())
         {
@@ -535,7 +424,7 @@ SALOME_ResourcesManager::getMachineFile(std::string resource_name,
         std::ofstream machine_file(machine_file_name.c_str(), std::ios_base::out);
 
         // We add all cluster machines to the file
-        std::list<ParserResourcesClusterMembersType>::iterator cluster_it =
+        std::list<ParserResourcesType>::iterator cluster_it =
           resource.ClusterMembersList.begin();
         while (cluster_it != resource.ClusterMembersList.end())
         {