Salome HOME
16988 [CEA] Use of SALOME_Launcher with sat launcher files
[modules/kernel.git] / src / ResourcesManager / ResourcesManager.cxx
index 968d2ced27f90745002d1889ac1fe0b75445c33a..6ff79f3fdfc6c659e2debf41ad28b948aa42f733 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2019  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
@@ -53,7 +53,7 @@ resourceParams::resourceParams()
 : can_launch_batch_jobs(false),
   can_run_containers(false),
   nb_proc(-1),
-  nb_node(-1),
+  nb_node(0),
   nb_proc_per_node(-1),
   cpu_clock(-1),
   mem_mb(-1)
@@ -148,19 +148,23 @@ ResourcesManager_cpp::ResourcesManager_cpp() throw(ResourcesException)
       default_file += "/";
       default_file += getenv("APPLI");
       default_file += "/CatalogResources.xml";
-      _path_resources.push_back(default_file);
-    }
-    else
-    {
-      if(!getenv("KERNEL_ROOT_DIR"))
-        throw ResourcesException("you must define KERNEL_ROOT_DIR environment variable!! -> cannot load a CatalogResources.xml");
-      default_file = getenv("KERNEL_ROOT_DIR");
-      default_file += "/share/salome/resources/kernel/CatalogResources.xml";
-      _path_resources.push_back(default_file);
+      std::ifstream ifile(default_file.c_str(), std::ifstream::in );
+      if (ifile) {
+        // The file exists, and is open for input
+        _path_resources.push_back(default_file);
+        default_catalog_resource=false;
+      }
     }
   }
-
-  _lasttime=0;
+  if (default_catalog_resource)
+  {
+    std::string default_file("");
+    if(!getenv("KERNEL_ROOT_DIR"))
+      throw ResourcesException("you must define KERNEL_ROOT_DIR environment variable!! -> cannot load a CatalogResources.xml");
+    default_file = getenv("KERNEL_ROOT_DIR");
+    default_file += "/share/salome/resources/kernel/CatalogResources.xml";
+    _path_resources.push_back(default_file);
+  }
 
   ParseXmlFiles();
   RES_MESSAGE("ResourcesManager_cpp constructor end");
@@ -327,8 +331,21 @@ void
 ResourcesManager_cpp::AddResourceInCatalog(const ParserResourcesType & new_resource)
 {
   if (new_resource.Name == DEFAULT_RESOURCE_NAME){
-    std::string error("Cannot modify default local resource \"" + DEFAULT_RESOURCE_NAME + "\"");
-    throw ResourcesException(error);
+    ParserResourcesType default_resource = _resourcesList[DEFAULT_RESOURCE_NAME];
+    // some of the properties of the default resource shouldn't be modified
+    std::string check;
+    if( default_resource.HostName != new_resource.HostName)
+      check += "The Hostname property of the default resource can not be modified.\n";
+    if( default_resource.AppliPath != new_resource.AppliPath)
+      check += "The Applipath property of the default resource can not be modified.\n";
+    if( !new_resource.can_run_containers)
+      check += "The default resource should be able to run containers.\n";
+    if( !new_resource.can_launch_batch_jobs)
+      check += "The default resource should be able to launch batch jobs.\n";
+    if( default_resource.Protocol != new_resource.Protocol)
+      check += "The Protocol property of the default resource can not be modified.\n";
+    if(!check.empty())
+      throw ResourcesException(check);
   }
   // TODO - Add minimal check
   _resourcesList[new_resource.Name] = new_resource;
@@ -364,12 +381,9 @@ void ResourcesManager_cpp::WriteInXmlFile(std::string xml_file)
   RES_MESSAGE("WriteInXmlFile : start");
 
   MapOfParserResourcesType resourceListToSave(_resourcesList);
-  // We do not save default local resource because it is automatically created at startup
-  resourceListToSave.erase(DEFAULT_RESOURCE_NAME);
   if (resourceListToSave.empty())
   {
-    RES_MESSAGE("WriteInXmlFile: nothing to do, no resource except default \"" <<
-                DEFAULT_RESOURCE_NAME << "\"");
+    RES_MESSAGE("WriteInXmlFile: nothing to do, no resource to save!");
     return;
   }
 
@@ -426,7 +440,7 @@ const MapOfParserResourcesType& ResourcesManager_cpp::ParseXmlFiles()
       return _resourcesList;
     }
 
-    if(statinfo.st_mtime > _lasttime)
+    if(_lasttime == 0 || statinfo.st_mtime > _lasttime)
     {
       to_parse = true;
       _lasttime = statinfo.st_mtime;
@@ -607,9 +621,19 @@ void ResourcesManager_cpp::AddDefaultResourceInCatalog()
   resource.DataForSort._Name = DEFAULT_RESOURCE_NAME;
   resource.Protocol = sh;
   resource.Batch = none;
+#ifndef WIN32
+  struct stat statbuf;
   if (getenv("HOME") != NULL && getenv("APPLI") != NULL)
   {
-    resource.AppliPath = string(getenv("HOME")) + "/" + getenv("APPLI");
+    if (stat(getenv("APPLI"), &statbuf) ==0 &&  S_ISREG(statbuf.st_mode))
+    {
+        // if $APPLI is a regular file, we asume it's a salome Launcher file
+        resource.AppliPath = string(getenv("APPLI"));
+    }
+    else
+    {
+        resource.AppliPath = string(getenv("HOME")) + "/" + getenv("APPLI");
+    }
   }
   string tmpdir = "/tmp";
   if (getenv("TMPDIR") != NULL)
@@ -617,6 +641,18 @@ void ResourcesManager_cpp::AddDefaultResourceInCatalog()
   resource.working_directory = tmpdir + "/salome_localres_workdir";
   if (getenv("USER") != NULL)
     resource.working_directory += string("_") + getenv("USER");
+#else
+  if (getenv("USERPROFILE") != NULL && getenv("APPLI") != NULL)
+  {
+    resource.AppliPath = string(getenv("USERPROFILE")) + "\\" + getenv("APPLI");
+  }
+  string tmpdir = "C:\\tmp";
+  if (getenv("TEMP") != NULL)
+    tmpdir = getenv("TEMP");
+  resource.working_directory = tmpdir + "\\salome_localres_workdir";
+  if (getenv("USERNAME") != NULL)
+    resource.working_directory += string("_") + getenv("USERNAME");
+#endif
   resource.can_launch_batch_jobs = true;
   resource.can_run_containers = true;
   _resourcesList[resource.Name] = resource;