From 1bf043643f2333fafb4f75a7817b1644226c8211 Mon Sep 17 00:00:00 2001
From: Pierre Neyron <pierre.neyron@imag.fr>
Date: Tue, 17 Mar 2020 15:52:35 +0100
Subject: [PATCH] [spec] add tests for the contiguous-including-threads
 cpu_core_numbering scheme

---
 spec/oar_properties_spec.rb                   | 144 ++++
 ..._contiguous-including-threads_cpusets.json | 769 ++++++++++++++++++
 2 files changed, 913 insertions(+)
 create mode 100644 spec/stub_oar_properties/load_data_hierarchy_stubbed_data_contiguous-including-threads_cpusets.json

diff --git a/spec/oar_properties_spec.rb b/spec/oar_properties_spec.rb
index af276b9a2e..e367948166 100644
--- a/spec/oar_properties_spec.rb
+++ b/spec/oar_properties_spec.rb
@@ -702,6 +702,150 @@ oarnodesetting --sql "host='clustera-2.fakesite.grid5000.fr' and type='default'"
     end
   end
 
+  context 'interracting with an empty OAR server (contiguous_including_threads cpusets)' do
+    before do
+      prepare_stubs("dump_oar_api_empty_server.json", "load_data_hierarchy_stubbed_data_contiguous-including-threads_cpusets.json")
+    end
+
+    it 'should generate correctly a table of nodes' do
+
+      uri = URI(conf["uri"])
+
+      response = Net::HTTP.get(uri)
+
+      expect(response).to be_an_instance_of(String)
+
+      options = {
+        :table => true,
+        :print => false,
+        :update => false,
+        :diff => false,
+        :site => "fakesite",
+        :clusters => ["clustera"]
+      }
+
+      expected_header = <<-TXT
++---------- + -------------------- + ----- + ----- + -------- + ---- + -------------------- + ------------------------------ + ------------------------------+
+|   cluster | host                 | cpu   | core  | cpuset   | gpu  | gpudevice            | cpumodel                       | gpumodel                      |
++---------- + -------------------- + ----- + ----- + -------- + ---- + -------------------- + ------------------------------ + ------------------------------+
+      TXT
+
+      expected_clustera1_begin_desc = <<-TXT
+|  clustera | clustera-1           | 1     | 1     | 0        |      |                      | ThunderX2 99xx                 |                               |
+|  clustera | clustera-1           | 1     | 2     | 1        |      |                      | ThunderX2 99xx                 |                               |
+|  clustera | clustera-1           | 1     | 3     | 2        |      |                      | ThunderX2 99xx                 |                               |
+|  clustera | clustera-1           | 1     | 4     | 3        |      |                      | ThunderX2 99xx                 |                               |
+|  clustera | clustera-1           | 1     | 5     | 4        |      |                      | ThunderX2 99xx                 |                               |
+      TXT
+
+
+      expected_clustera1_middle_desc = <<-TXT
+|  clustera | clustera-1           | 1     | 29    | 28       |      |                      | ThunderX2 99xx                 |                               |
+|  clustera | clustera-1           | 1     | 30    | 29       |      |                      | ThunderX2 99xx                 |                               |
+|  clustera | clustera-1           | 1     | 31    | 30       |      |                      | ThunderX2 99xx                 |                               |
+|  clustera | clustera-1           | 1     | 32    | 31       |      |                      | ThunderX2 99xx                 |                               |
+|  clustera | clustera-1           | 2     | 33    | 128      |      |                      | ThunderX2 99xx                 |                               |
+|  clustera | clustera-1           | 2     | 34    | 129      |      |                      | ThunderX2 99xx                 |                               |
+|  clustera | clustera-1           | 2     | 35    | 130      |      |                      | ThunderX2 99xx                 |                               |
+|  clustera | clustera-1           | 2     | 36    | 131      |      |                      | ThunderX2 99xx                 |                               |
+      TXT
+
+      expected_clustera2_middle_desc = <<-TXT
+|  clustera | clustera-2           | 3     | 93    | 28       |      |                      | ThunderX2 99xx                 |                               |
+|  clustera | clustera-2           | 3     | 94    | 29       |      |                      | ThunderX2 99xx                 |                               |
+|  clustera | clustera-2           | 3     | 95    | 30       |      |                      | ThunderX2 99xx                 |                               |
+|  clustera | clustera-2           | 3     | 96    | 31       |      |                      | ThunderX2 99xx                 |                               |
+|  clustera | clustera-2           | 4     | 97    | 128      |      |                      | ThunderX2 99xx                 |                               |
+|  clustera | clustera-2           | 4     | 98    | 129      |      |                      | ThunderX2 99xx                 |                               |
+|  clustera | clustera-2           | 4     | 99    | 130      |      |                      | ThunderX2 99xx                 |                               |
+|  clustera | clustera-2           | 4     | 100   | 131      |      |                      | ThunderX2 99xx                 |                               |
+      TXT
+
+      expected_clustera2_end_desc = <<-TXT
+|  clustera | clustera-2           | 4     | 125   | 156      |      |                      | ThunderX2 99xx                 |                               |
+|  clustera | clustera-2           | 4     | 126   | 157      |      |                      | ThunderX2 99xx                 |                               |
+|  clustera | clustera-2           | 4     | 127   | 158      |      |                      | ThunderX2 99xx                 |                               |
+|  clustera | clustera-2           | 4     | 128   | 159      |      |                      | ThunderX2 99xx                 |                               |
++---------- + -------------------- + ----- + ----- + -------- + ---- + -------------------- + ------------------------------ + ------------------------------+
+      TXT
+
+      generator_output = capture do
+        generate_oar_properties(options)
+      end
+
+      expect(generator_output[:stdout]).to include(expected_header)
+      expect(generator_output[:stdout]).to include(expected_clustera1_begin_desc)
+      expect(generator_output[:stdout]).to include(expected_clustera1_middle_desc)
+      expect(generator_output[:stdout]).to include(expected_clustera2_middle_desc)
+      expect(generator_output[:stdout]).to include(expected_clustera2_end_desc)
+    end
+
+    it 'should generate correctly all the commands to update OAR' do
+
+      uri = URI(conf["uri"])
+
+      response = Net::HTTP.get(uri)
+
+      expect(response).to be_an_instance_of(String)
+
+      options = {
+        :table => false,
+        :print => true,
+        :update => false,
+        :diff => false,
+        :site => "fakesite",
+        :clusters => ["clustera"]
+      }
+
+      expected_header = <<-TXT
+#############################################
+# Create OAR properties that were created by 'oar_resources_add'
+#############################################
+property_exist 'host' || oarproperty -a host --varchar
+property_exist 'cpu' || oarproperty -a cpu
+property_exist 'core' || oarproperty -a core
+property_exist 'gpudevice' || oarproperty -a gpudevice
+property_exist 'gpu' || oarproperty -a gpu
+property_exist 'gpu_model' || oarproperty -a gpu_model --varchar
+      TXT
+
+      expected_clustera1_cmds = <<-TXT
+oarnodesetting -a -h 'clustera-1.fakesite.grid5000.fr' -p host='clustera-1.fakesite.grid5000.fr' -p cpu=1 -p core=29 -p cpuset=28
+oarnodesetting -a -h 'clustera-1.fakesite.grid5000.fr' -p host='clustera-1.fakesite.grid5000.fr' -p cpu=1 -p core=30 -p cpuset=29
+oarnodesetting -a -h 'clustera-1.fakesite.grid5000.fr' -p host='clustera-1.fakesite.grid5000.fr' -p cpu=1 -p core=31 -p cpuset=30
+oarnodesetting -a -h 'clustera-1.fakesite.grid5000.fr' -p host='clustera-1.fakesite.grid5000.fr' -p cpu=1 -p core=32 -p cpuset=31
+oarnodesetting -a -h 'clustera-1.fakesite.grid5000.fr' -p host='clustera-1.fakesite.grid5000.fr' -p cpu=2 -p core=33 -p cpuset=128
+oarnodesetting -a -h 'clustera-1.fakesite.grid5000.fr' -p host='clustera-1.fakesite.grid5000.fr' -p cpu=2 -p core=34 -p cpuset=129
+oarnodesetting -a -h 'clustera-1.fakesite.grid5000.fr' -p host='clustera-1.fakesite.grid5000.fr' -p cpu=2 -p core=35 -p cpuset=130
+oarnodesetting -a -h 'clustera-1.fakesite.grid5000.fr' -p host='clustera-1.fakesite.grid5000.fr' -p cpu=2 -p core=36 -p cpuset=131
+      TXT
+
+      expected_clustera2_cmds = <<-TXT
+oarnodesetting -a -h 'clustera-2.fakesite.grid5000.fr' -p host='clustera-2.fakesite.grid5000.fr' -p cpu=3 -p core=93 -p cpuset=28
+oarnodesetting -a -h 'clustera-2.fakesite.grid5000.fr' -p host='clustera-2.fakesite.grid5000.fr' -p cpu=3 -p core=94 -p cpuset=29
+oarnodesetting -a -h 'clustera-2.fakesite.grid5000.fr' -p host='clustera-2.fakesite.grid5000.fr' -p cpu=3 -p core=95 -p cpuset=30
+oarnodesetting -a -h 'clustera-2.fakesite.grid5000.fr' -p host='clustera-2.fakesite.grid5000.fr' -p cpu=3 -p core=96 -p cpuset=31
+oarnodesetting -a -h 'clustera-2.fakesite.grid5000.fr' -p host='clustera-2.fakesite.grid5000.fr' -p cpu=4 -p core=97 -p cpuset=128
+oarnodesetting -a -h 'clustera-2.fakesite.grid5000.fr' -p host='clustera-2.fakesite.grid5000.fr' -p cpu=4 -p core=98 -p cpuset=129
+oarnodesetting -a -h 'clustera-2.fakesite.grid5000.fr' -p host='clustera-2.fakesite.grid5000.fr' -p cpu=4 -p core=99 -p cpuset=130
+oarnodesetting -a -h 'clustera-2.fakesite.grid5000.fr' -p host='clustera-2.fakesite.grid5000.fr' -p cpu=4 -p core=100 -p cpuset=131
+      TXT
+
+      expected_clustera3_cmds = <<-TXT
+oarnodesetting --sql "host='clustera-2.fakesite.grid5000.fr' and type='default'" -p ip='172.16.54.2' -p cluster='clustera' -p nodemodel='Dell PowerEdge T640' -p switch='gw' -p besteffort='YES' -p deploy='YES' -p virtual='arm64' -p cpuarch='aarch64' -p cpucore=32 -p cputype='ThunderX2 99xx' -p cpufreq='2.2' -p disktype='SAS' -p eth_count=1 -p eth_rate=10 -p ib_count=0 -p ib_rate=0 -p ib='NO' -p opa_count=0 -p opa_rate=0 -p myri_count=0 -p myri_rate=0 -p myri='NO' -p memcore=4096 -p memcpu=131072 -p memnode=262144 -p gpu_count=0 -p mic='NO' -p wattmeter='NO' -p cluster_priority=201906 -p max_walltime=0 -p production='NO' -p maintenance='YES' -p disk_reservation_count=0
+      TXT
+
+      generator_output = capture do
+        generate_oar_properties(options)
+      end
+
+      expect(generator_output[:stdout]).to include(expected_header)
+      expect(generator_output[:stdout]).to include(expected_clustera1_cmds)
+      expect(generator_output[:stdout]).to include(expected_clustera2_cmds)
+      expect(generator_output[:stdout]).to include(expected_clustera3_cmds)
+    end
+  end
+
   context 'interracting with an empty OAR server (cluster with disk)' do
     before do
       prepare_stubs("dump_oar_api_empty_server.json", "load_data_hierarchy_stubbed_data_with_disk.json")
diff --git a/spec/stub_oar_properties/load_data_hierarchy_stubbed_data_contiguous-including-threads_cpusets.json b/spec/stub_oar_properties/load_data_hierarchy_stubbed_data_contiguous-including-threads_cpusets.json
new file mode 100644
index 0000000000..45b5a87980
--- /dev/null
+++ b/spec/stub_oar_properties/load_data_hierarchy_stubbed_data_contiguous-including-threads_cpusets.json
@@ -0,0 +1,769 @@
+{
+  "sites": {
+    "fakesite": {
+      "clusters": {
+        "clustera": {
+          "nodes": {
+            "clustera-1": {
+              "architecture": {
+                "cpu_core_numbering": "contiguous-including-threads",
+                "nb_cores": 64,
+                "nb_procs": 2,
+                "nb_threads": 256,
+                "platform_type": "aarch64"
+              },
+              "bios": {
+                "release_date": "10/25/2019",
+                "vendor": "GIGABYTE",
+                "version": "F27"
+              },
+              "bmc_version": "1.95",
+              "chassis": {
+                "manufacturer": "GIGABYTE",
+                "name": "R181-T92-00",
+                "serial": "GJG5N9812A0001"
+              },
+              "kavlan": {
+                "eth0": {
+                  "kavlan-1": "192.168.198.1",
+                  "kavlan-11": "10.7.206.1",
+                  "kavlan-12": "10.11.206.1",
+                  "kavlan-13": "10.15.206.1",
+                  "kavlan-14": "10.19.206.1",
+                  "kavlan-16": "10.27.206.1",
+                  "kavlan-18": "10.35.206.1",
+                  "kavlan-2": "192.168.214.1",
+                  "kavlan-20": "10.43.206.1",
+                  "kavlan-21": "10.47.206.1",
+                  "kavlan-3": "192.168.230.1",
+                  "kavlan-4": "10.12.6.1",
+                  "kavlan-5": "10.12.70.1",
+                  "kavlan-6": "10.12.134.1",
+                  "kavlan-7": "10.12.198.1",
+                  "kavlan-8": "10.13.6.1",
+                  "kavlan-9": "10.13.70.1"
+                }
+              },
+              "main_memory": {
+                "ram_size": 274877906944
+              },
+              "monitoring": {
+                "wattmeter": "false"
+              },
+              "network_adapters": [
+                {
+                  "device": "eth0",
+                  "driver": "qede",
+                  "enabled": true,
+                  "firmware_version": "mfw 8.35.24.0 storm 8.37.2.0",
+                  "interface": "Ethernet",
+                  "ip": "172.16.54.1",
+                  "ip6": "2001:660:4406:400:7::1",
+                  "kavlan": true,
+                  "mac": "b4:2e:99:3d:1f:40",
+                  "management": false,
+                  "model": "FastLinQ QL41000 Series 10/25/40/50GbE Controller",
+                  "mountable": true,
+                  "mounted": true,
+                  "name": "eno1",
+                  "network_address": "clustera-1.fakesite.grid5000.fr",
+                  "rate": 10000000000,
+                  "switch": "gw",
+                  "switch_port": "ethernet1/1/3",
+                  "vendor": "QLogic Corp."
+                },
+                {
+                  "device": "eth1",
+                  "driver": "qede",
+                  "enabled": false,
+                  "firmware_version": "mfw 8.35.24.0 storm 8.37.2.0",
+                  "interface": "Ethernet",
+                  "kavlan": false,
+                  "mac": "b4:2e:99:3d:1f:41",
+                  "management": false,
+                  "model": "FastLinQ QL41000 Series 10/25/40/50GbE Controller",
+                  "mountable": false,
+                  "mounted": false,
+                  "name": "eno2",
+                  "vendor": "QLogic Corp."
+                },
+                {
+                  "device": "bmc",
+                  "enabled": true,
+                  "interface": "Ethernet",
+                  "ip": "172.17.54.1",
+                  "kavlan": false,
+                  "mac": "b4:2e:99:3d:1f:42",
+                  "management": true,
+                  "mountable": false,
+                  "mounted": false,
+                  "network_address": "clustera-1-bmc.fakesite.grid5000.fr"
+                }
+              ],
+              "operating_system": {
+                "cstate_driver": "none",
+                "cstate_governor": "menu",
+                "ht_enabled": true,
+                "pstate_driver": "cppc_cpufreq",
+                "pstate_governor": "performance",
+                "turboboost_enabled": false
+              },
+              "performance": {
+                "core_flops": 0,
+                "node_flops": 0
+              },
+              "processor": {
+                "cache_l1": null,
+                "cache_l1d": 32768,
+                "cache_l1i": 32768,
+                "cache_l2": 262144,
+                "cache_l3": 33554432,
+                "clock_speed": 2200000000,
+                "ht_capable": false,
+                "instruction_set": "aarch64",
+                "microarchitecture": "Vulcan",
+                "microcode": "unknown",
+                "model": "ThunderX2",
+                "other_description": "ThunderX2 99xx",
+                "vendor": "Cavium",
+                "version": "99xx"
+              },
+              "sensors": {
+                "power": {
+                  "available": true,
+                  "per_outlets": true,
+                  "via": {
+                    "api": {
+                      "metric": "power"
+                    },
+                    "pdu": [
+                      {
+                        "port": 45,
+                        "uid": "wattmetre1"
+                      }
+                    ],
+                    "www": {
+                      "url": "http://wattmetre.lyon.grid5000.fr/GetWatts-json.php"
+                    }
+                  }
+                }
+              },
+              "software": {
+                "standard-environment": "debian10-arm64-std"
+              },
+              "storage_devices": [
+                {
+                  "by_id": "/dev/disk/by-id/wwn-0x5002538e40c53de0",
+                  "by_path": "/dev/disk/by-path/pci-0000:0f:00.0-sas-phy2-lun-0",
+                  "device": "sda",
+                  "firmware_version": "RVT02B6Q",
+                  "interface": "SAS",
+                  "model": "Samsung SSD 860",
+                  "size": 250059350016,
+                  "storage": "HDD",
+                  "vendor": "Samsung"
+                },
+                {
+                  "by_id": "/dev/disk/by-id/wwn-0x5002538e40c53daa",
+                  "by_path": "/dev/disk/by-path/pci-0000:0f:00.0-sas-phy3-lun-0",
+                  "device": "sdb",
+                  "firmware_version": "RVT02B6Q",
+                  "interface": "SAS",
+                  "model": "Samsung SSD 860",
+                  "size": 250059350016,
+                  "storage": "HDD",
+                  "vendor": "Samsung"
+                }
+              ],
+              "supported_job_types": {
+                "besteffort": true,
+                "deploy": true,
+                "max_walltime": 0,
+                "queues": [
+                  "admin",
+                  "testing"
+                ],
+                "virtual": "arm64"
+              },
+              "type": "node",
+              "uid": "clustera-1"
+            },
+            "clustera-2": {
+              "architecture": {
+                "cpu_core_numbering": "contiguous-including-threads",
+                "nb_cores": 64,
+                "nb_procs": 2,
+                "nb_threads": 256,
+                "platform_type": "aarch64"
+              },
+              "bios": {
+                "release_date": "10/25/2019",
+                "vendor": "GIGABYTE",
+                "version": "F27"
+              },
+              "bmc_version": "1.95",
+              "chassis": {
+                "manufacturer": "GIGABYTE",
+                "name": "R181-T92-00",
+                "serial": "GJG5N9812A0004"
+              },
+              "kavlan": {
+                "eth0": {
+                  "kavlan-1": "192.168.198.2",
+                  "kavlan-11": "10.7.206.2",
+                  "kavlan-12": "10.11.206.2",
+                  "kavlan-13": "10.15.206.2",
+                  "kavlan-14": "10.19.206.2",
+                  "kavlan-16": "10.27.206.2",
+                  "kavlan-18": "10.35.206.2",
+                  "kavlan-2": "192.168.214.2",
+                  "kavlan-20": "10.43.206.2",
+                  "kavlan-21": "10.47.206.2",
+                  "kavlan-3": "192.168.230.2",
+                  "kavlan-4": "10.12.6.2",
+                  "kavlan-5": "10.12.70.2",
+                  "kavlan-6": "10.12.134.2",
+                  "kavlan-7": "10.12.198.2",
+                  "kavlan-8": "10.13.6.2",
+                  "kavlan-9": "10.13.70.2"
+                }
+              },
+              "main_memory": {
+                "ram_size": 274877906944
+              },
+              "monitoring": {
+                "wattmeter": "false"
+              },
+              "network_adapters": [
+                {
+                  "device": "eth0",
+                  "driver": "qede",
+                  "enabled": true,
+                  "firmware_version": "mfw 8.35.24.0 storm 8.37.2.0",
+                  "interface": "Ethernet",
+                  "ip": "172.16.54.2",
+                  "ip6": "2001:660:4406:400:7::2",
+                  "kavlan": true,
+                  "mac": "b4:2e:99:3d:1f:3c",
+                  "management": false,
+                  "model": "FastLinQ QL41000 Series 10/25/40/50GbE Controller",
+                  "mountable": true,
+                  "mounted": true,
+                  "name": "eno1",
+                  "network_address": "clustera-2.fakesite.grid5000.fr",
+                  "rate": 10000000000,
+                  "switch": "gw",
+                  "switch_port": "ethernet1/1/4",
+                  "vendor": "QLogic Corp."
+                },
+                {
+                  "device": "eth1",
+                  "driver": "qede",
+                  "enabled": false,
+                  "firmware_version": "mfw 8.35.24.0 storm 8.37.2.0",
+                  "interface": "Ethernet",
+                  "kavlan": false,
+                  "mac": "b4:2e:99:3d:1f:3d",
+                  "management": false,
+                  "model": "FastLinQ QL41000 Series 10/25/40/50GbE Controller",
+                  "mountable": false,
+                  "mounted": false,
+                  "name": "eno2",
+                  "vendor": "QLogic Corp."
+                },
+                {
+                  "device": "bmc",
+                  "enabled": true,
+                  "interface": "Ethernet",
+                  "ip": "172.17.54.2",
+                  "kavlan": false,
+                  "mac": "b4:2e:99:3d:1f:3e",
+                  "management": true,
+                  "mountable": false,
+                  "mounted": false,
+                  "network_address": "clustera-2-bmc.fakesite.grid5000.fr"
+                }
+              ],
+              "operating_system": {
+                "cstate_driver": "none",
+                "cstate_governor": "menu",
+                "ht_enabled": true,
+                "pstate_driver": "cppc_cpufreq",
+                "pstate_governor": "performance",
+                "turboboost_enabled": false
+              },
+              "performance": {
+                "core_flops": 0,
+                "node_flops": 0
+              },
+              "processor": {
+                "cache_l1": null,
+                "cache_l1d": 32768,
+                "cache_l1i": 32768,
+                "cache_l2": 262144,
+                "cache_l3": 33554432,
+                "clock_speed": 2200000000,
+                "ht_capable": false,
+                "instruction_set": "aarch64",
+                "microarchitecture": "Vulcan",
+                "microcode": "unknown",
+                "model": "ThunderX2",
+                "other_description": "ThunderX2 99xx",
+                "vendor": "Cavium",
+                "version": "99xx"
+              },
+              "sensors": {
+                "power": {
+                  "available": true,
+                  "per_outlets": true,
+                  "via": {
+                    "api": {
+                      "metric": "power"
+                    },
+                    "pdu": [
+                      {
+                        "port": 24,
+                        "uid": "wattmetre1"
+                      }
+                    ],
+                    "www": {
+                      "url": "http://wattmetre.lyon.grid5000.fr/GetWatts-json.php"
+                    }
+                  }
+                }
+              },
+              "software": {
+                "standard-environment": "debian10-arm64-std"
+              },
+              "storage_devices": [
+                {
+                  "by_id": "/dev/disk/by-id/wwn-0x5002538e40c53daf",
+                  "by_path": "/dev/disk/by-path/pci-0000:0f:00.0-sas-phy2-lun-0",
+                  "device": "sda",
+                  "firmware_version": "RVT02B6Q",
+                  "interface": "SAS",
+                  "model": "Samsung SSD 860",
+                  "size": 250059350016,
+                  "storage": "HDD",
+                  "vendor": "Samsung"
+                },
+                {
+                  "by_id": "/dev/disk/by-id/wwn-0x5002538e40c53da8",
+                  "by_path": "/dev/disk/by-path/pci-0000:0f:00.0-sas-phy3-lun-0",
+                  "device": "sdb",
+                  "firmware_version": "RVT02B6Q",
+                  "interface": "SAS",
+                  "model": "Samsung SSD 860",
+                  "size": 250059350016,
+                  "storage": "HDD",
+                  "vendor": "Samsung"
+                }
+              ],
+              "supported_job_types": {
+                "besteffort": true,
+                "deploy": true,
+                "max_walltime": 0,
+                "queues": [
+                  "admin",
+                  "testing"
+                ],
+                "virtual": "arm64"
+              },
+              "type": "node",
+              "uid": "clustera-2"
+            }
+          },
+          "created_at": "Fri, 07 Jun 2019 00:00:00 GMT",
+          "kavlan": false,
+          "model": "Dell PowerEdge T640",
+          "queues": ["admin", "production"],
+          "type": "cluster",
+          "uid": "clustera"
+        }
+      },
+      "network_equipments": {
+        "gw-fakesite": {
+          "backplane_bps": 1280000000000,
+          "kind": "router",
+          "linecards": [{}, {}, {}, {}, {}, {}, {
+            "backplane_bps": 1280000000000,
+            "kavlan_pattern": "Ethernet%LINECARD%/%PORT%",
+            "kind": "node",
+            "model": "N9K-X9464PX",
+            "ports": [{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {
+              "kind": "node",
+              "port": "eth2",
+              "uid": "clustera-1"
+            }, {
+              "kind": "node",
+              "port": "eth2",
+              "uid": "clustera-2"
+            }],
+            "rate": 10000000000,
+            "snmp_pattern": "Ethernet%LINECARD%/%PORT%"
+          }],
+          "model": "Cisco Nexus 9508",
+          "monitoring": {
+            "metric": "power",
+            "wattmeter": "multiple"
+          },
+          "sensors": {
+            "network": {
+              "available": true,
+              "resolution": 10
+            },
+            "power": {
+              "available": true,
+              "resolution": 1,
+              "via": {
+                "pdu": [{
+                  "port": 8,
+                  "uid": "graoully-pdu1"
+                }, {
+                  "port": 8,
+                  "uid": "graoully-pdu2"
+                }, {
+                  "port": 8,
+                  "uid": "grimoire-pdu1"
+                }, {
+                  "port": 8,
+                  "uid": "grimoire-pdu2"
+                }]
+              }
+            }
+          },
+          "site": "fakesite",
+          "snmp_community": "public",
+          "type": "network_equipment",
+          "uid": "gw-fakesite",
+          "vlans": {
+            "vlan100": {
+              "addresses": ["172.16.79.254"],
+              "administrative": true
+            },
+            "vlan101": {
+              "addresses": ["172.17.79.254"]
+            },
+            "vlan500": {
+              "addresses": ["192.168.4.14"]
+            },
+            "vlan701": {
+              "addresses": ["192.168.192.0/20"],
+              "name": "kavlan-1"
+            },
+            "vlan702": {
+              "addresses": ["192.168.208.0/20"],
+              "name": "kavlan-2"
+            },
+            "vlan703": {
+              "addresses": ["192.168.224.0/20"],
+              "name": "kavlan-3"
+            },
+            "vlan704": {
+              "addresses": ["10.16.0.0/18"],
+              "name": "kavlan-4"
+            },
+            "vlan705": {
+              "addresses": ["10.16.64.0/18"],
+              "name": "kavlan-5"
+            },
+            "vlan706": {
+              "addresses": ["10.16.128.0/18"],
+              "name": "kavlan-6"
+            },
+            "vlan707": {
+              "addresses": ["10.16.192.0/18"],
+              "name": "kavlan-7"
+            },
+            "vlan708": {
+              "addresses": ["10.17.0.0/18"],
+              "name": "kavlan-8"
+            },
+            "vlan709": {
+              "addresses": ["10.17.64.0/18"],
+              "name": "kavlan-9"
+            },
+            "vlan714": {
+              "addresses": ["10.19.192.0/18"],
+              "name": "kavlan-14"
+            }
+          },
+          "warranty": "2020-09-01",
+          "weathermap": {}
+        }
+      },
+      "pdus": {
+        "clustera-pdu1": {
+          "ip": "172.17.79.226",
+          "mac": "28:29:86:0B:3B:06",
+          "model": "AP8653",
+          "ports": {
+            "1": "clustera-1",
+            "6": "clustera-2"
+          },
+          "sensors": [{
+            "power": {
+              "per_outlets": true,
+              "resolution": 1,
+              "snmp": {
+                "available": true,
+                "outlet_prefix_oid": "iso.3.6.1.4.1.318.1.1.26.9.4.3.1.7",
+                "total_oids": ["iso.3.6.1.4.1.318.1.1.12.1.16.0"],
+                "unit": "W"
+              }
+            }
+          }],
+          "type": "pdu",
+          "uid": "clustera-pdu1",
+          "vendor": "APC"
+        },
+        "clustera-pdu3": {
+          "ip": "172.17.79.231",
+          "mac": "28:29:86:12:27:FF",
+          "model": "AP8653",
+          "ports": {},
+          "sensors": [{
+            "power": {
+              "per_outlets": true,
+              "resolution": 1,
+              "snmp": {
+                "available": true,
+                "outlet_prefix_oid": "iso.3.6.1.4.1.318.1.1.26.9.4.3.1.7",
+                "total_oids": ["iso.3.6.1.4.1.318.1.1.12.1.16.0"],
+                "unit": "W"
+              }
+            }
+          }],
+          "type": "pdu",
+          "uid": "clustera-pdu3",
+          "vendor": "APC"
+        },
+        "clustera-pdu2": {
+          "ip": "172.17.79.227",
+          "mac": "28:29:86:10:0E:8C",
+          "model": "AP8653",
+          "ports": {
+            "1": "clustera-1",
+            "6": "clustera-2"
+          },
+          "sensors": [{
+            "power": {
+              "per_outlets": true,
+              "resolution": 1,
+              "snmp": {
+                "available": true,
+                "outlet_prefix_oid": "iso.3.6.1.4.1.318.1.1.26.9.4.3.1.7",
+                "total_oids": ["iso.3.6.1.4.1.318.1.1.12.1.16.0"],
+                "unit": "W"
+              }
+            }
+          }],
+          "type": "pdu",
+          "uid": "clustera-pdu2",
+          "vendor": "APC"
+        },
+        "clustera-pdu4": {
+          "ip": "172.17.79.232",
+          "mac": "28:29:86:10:0E:B4",
+          "model": "AP8653",
+          "ports": {},
+          "sensors": [{
+            "power": {
+              "per_outlets": true,
+              "resolution": 1,
+              "snmp": {
+                "available": true,
+                "outlet_prefix_oid": "iso.3.6.1.4.1.318.1.1.26.9.4.3.1.7",
+                "total_oids": ["iso.3.6.1.4.1.318.1.1.12.1.16.0"],
+                "unit": "W"
+              }
+            }
+          }],
+          "type": "pdu",
+          "uid": "clustera-pdu4",
+          "vendor": "APC"
+        }
+      },
+      "compilation_server": false,
+      "description": "Grid5000 Fakesite site",
+      "email_contact": "support-staff@lists.grid5000.fr",
+      "frontend_ip": "172.16.79.101",
+      "g5ksubnet": {
+        "gateway": "10.147.255.254",
+        "network": "10.144.0.0/14"
+      },
+      "latitude": 48.7,
+      "location": "Fakesite, France",
+      "longitude": 6.2,
+      "name": "Fakesite",
+      "production": true,
+      "renater_ip": "192.168.4.14",
+      "security_contact": "support-staff@lists.grid5000.fr",
+      "storage5k": false,
+      "sys_admin_contact": "support-staff@lists.grid5000.fr",
+      "type": "site",
+      "uid": "fakesite",
+      "user_support_contact": "support-staff@lists.grid5000.fr",
+      "virt_ip_range": "10.144.0.0/14",
+      "web": "http://www.grid5000.fr/mediawiki/index.php/Fakesite:Home"
+    }
+  },
+  "network_equipments": {
+    "renater-lyon": {
+      "kind": "virtual",
+      "linecards": [{
+        "ports": [{
+          "uid": "renater-paris"
+        }, {
+          "uid": "renater-sophia"
+        }, {
+          "uid": "renater-grenoble"
+        }, {
+          "uid": "renater-nantes"
+        }, {
+          "kind": "router",
+          "site_uid": "lyon",
+          "uid": "gw-lyon"
+        }],
+        "rate": 10000000000
+      }],
+      "type": "network_equipment",
+      "uid": "renater-lyon",
+      "weathermap": {}
+    },
+    "renater-grenoble": {
+      "kind": "virtual",
+      "linecards": [{
+        "ports": [{
+          "uid": "renater-lyon"
+        }, {
+          "kind": "router",
+          "site_uid": "grenoble",
+          "uid": "gw-grenoble"
+        }],
+        "rate": 10000000000
+      }],
+      "type": "network_equipment",
+      "uid": "renater-grenoble",
+      "weathermap": {}
+    },
+    "renater-nancy": {
+      "kind": "virtual",
+      "linecards": [{
+        "ports": [{
+          "uid": "renater-luxembourg"
+        }, {
+          "uid": "renater-paris"
+        }, {
+          "kind": "router",
+          "site_uid": "nancy",
+          "uid": "gw-nancy"
+        }],
+        "rate": 10000000000
+      }],
+      "type": "network_equipment",
+      "uid": "renater-nancy",
+      "weathermap": {}
+    },
+    "renater-luxembourg": {
+      "kind": "virtual",
+      "linecards": [{
+        "ports": [{
+          "uid": "renater-nancy"
+        }, {
+          "kind": "router",
+          "site_uid": "luxembourg",
+          "uid": "gw-luxembourg"
+        }],
+        "rate": 10000000000
+      }],
+      "type": "network_equipment",
+      "uid": "renater-luxembourg",
+      "weathermap": {}
+    },
+    "renater-sophia": {
+      "kind": "virtual",
+      "linecards": [{
+        "ports": [{
+          "uid": "renater-lyon"
+        }, {
+          "kind": "router",
+          "site_uid": "sophia",
+          "uid": "gw-sophia"
+        }],
+        "rate": 10000000000
+      }],
+      "type": "network_equipment",
+      "uid": "renater-sophia",
+      "weathermap": {}
+    },
+    "renater-paris": {
+      "kind": "virtual",
+      "linecards": [{
+        "ports": [{
+          "uid": "renater-lille"
+        }, {
+          "uid": "renater-lyon"
+        }, {
+          "uid": "renater-nancy"
+        }],
+        "rate": 10000000000
+      }],
+      "type": "network_equipment",
+      "uid": "renater-paris",
+      "weathermap": {}
+    },
+    "renater-rennes": {
+      "kind": "virtual",
+      "linecards": [{
+        "ports": [{
+          "uid": "renater-nantes"
+        }, {
+          "kind": "router",
+          "site_uid": "rennes",
+          "uid": "gw-rennes"
+        }],
+        "rate": 10000000000
+      }],
+      "type": "network_equipment",
+      "uid": "renater-rennes",
+      "weathermap": {}
+    },
+    "renater-nantes": {
+      "kind": "virtual",
+      "linecards": [{
+        "ports": [{
+          "uid": "renater-lyon"
+        }, {
+          "uid": "renater-rennes"
+        }, {
+          "kind": "router",
+          "site_uid": "nantes",
+          "uid": "gw-nantes"
+        }],
+        "rate": 10000000000
+      }],
+      "type": "network_equipment",
+      "uid": "renater-nantes",
+      "weathermap": {}
+    },
+    "renater-lille": {
+      "kind": "virtual",
+      "linecards": [{
+        "ports": [{
+          "uid": "renater-paris"
+        }, {
+          "kind": "router",
+          "site_uid": "lille",
+          "uid": "gw-lille"
+        }],
+        "rate": 10000000000
+      }],
+      "type": "network_equipment",
+      "uid": "renater-lille",
+      "weathermap": {}
+    }
+  },
+  "type": "grid",
+  "uid": "grid5000"
+}
-- 
GitLab