From c3c4516ec60d39d227211b49baab34a19e54fa31 Mon Sep 17 00:00:00 2001
From: David Loup <david.loup@inria.fr>
Date: Tue, 21 Apr 2020 10:50:27 +0200
Subject: [PATCH] Check new core numbering scheme (pyxis) in
 valid:oar-properties

---
 lib/refrepo/valid/oar-properties.rb | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/lib/refrepo/valid/oar-properties.rb b/lib/refrepo/valid/oar-properties.rb
index c3e40795e38..5a4a3c41340 100644
--- a/lib/refrepo/valid/oar-properties.rb
+++ b/lib/refrepo/valid/oar-properties.rb
@@ -1,5 +1,6 @@
 # coding: utf-8
 
+require 'refrepo/data_loader'
 require 'net/ssh'
 require 'hashdiff'
 
@@ -13,6 +14,7 @@ G5K_PROPERTIES=%w{api_timestamp available_upto besteffort chassis chunks cluster
 module RefRepo::Valid::OarProperties
   def self.check(options)
     ret = true
+    refapi = load_data_hierarchy
     options[:sites].each do |site|
       puts "Checking site #{site}..."
       resources = RefRepo::Utils::get_api("sites/#{site}/internal/oarapi/resources/details.json?limit=1000000")['items']
@@ -77,6 +79,7 @@ module RefRepo::Valid::OarProperties
           raise "Invalid: varying nbcores inside cluster!"
         end
         nbcores = nbcores.first
+        refapi_host = refapi['sites'][site]['clusters'][cluster]['nodes'][host.split('.')[0]]
 
         if host_resources.length != nbcores
           puts "ERROR: invalid number of resources for #{host}. should be nbcores."
@@ -100,10 +103,22 @@ module RefRepo::Valid::OarProperties
           ret = false
         end
         # the last cpuset should be nbcores-1
-        if host_cpusets_max - host_cpusets_min + 1 != nbcores
+        if host_cpusets_max - host_cpusets_min + 1 != nbcores and refapi_host['architecture']['cpu_core_numbering'] != 'contiguous-including-threads'
           puts "ERROR: cpuset values for #{host} are not sequential"
           ret = false
         end
+
+        # Core numbering is different with contiguous-including-threads
+        if refapi_host['architecture']['cpu_core_numbering'] == 'contiguous-including-threads'
+          cpu_num_max = refapi_host['architecture']['nb_procs'] - 1
+          thread_per_cpu = refapi_host['architecture']['nb_threads'] / refapi_host['architecture']['nb_procs']
+          core_per_cpu = nbcores / refapi_host['architecture']['nb_procs']
+          if host_cpusets_max != cpu_num_max * thread_per_cpu + core_per_cpu - 1
+            puts "ERROR: cpuset values for #{host} do not match contiguous-including-threads core numbering"
+            ret = false
+          end
+        end
+
         if options[:verbose] and (host_cpusets_max - host_cpusets_min + 1 != nbcores or host_cores_max - host_cores_min + 1 != nbcores)
           puts "id   cpu   core   cpuset"
           pp(host_resources.map { |e| [e['id'], e['cpu'], e['core'], e['cpuset'] ] })
-- 
GitLab