hail-alloc-invalid-network defines a cluster with two nodegroups and an allocation request which does not fit on any of the groups. Group 1 has invalid disk-templates while Group 2 is not connected to the right networks.
hail-alloc-restricted-network defines a cluster wih two nodegroups. Nodegroup Group 1 is only used as last_resort group, but is chosen by hail as only this group is connected to the right networks. Signed-off-by: Thomas Thrainer <[email protected]> --- Makefile.am | 2 + src/Ganeti/HTools/Cluster.hs | 2 +- test/data/htools/hail-alloc-invalid-network.json | 155 ++++++++++++ .../data/htools/hail-alloc-restricted-network.json | 277 +++++++++++++++++++++ test/hs/shelltests/htools-hail.test | 10 + 5 files changed, 445 insertions(+), 1 deletion(-) create mode 100644 test/data/htools/hail-alloc-invalid-network.json create mode 100644 test/data/htools/hail-alloc-restricted-network.json diff --git a/Makefile.am b/Makefile.am index 507ffbe..a3295de 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1023,7 +1023,9 @@ TEST_FILES = \ test/data/htools/common-suffix.data \ test/data/htools/empty-cluster.data \ test/data/htools/hail-alloc-drbd.json \ + test/data/htools/hail-alloc-invalid-network.json \ test/data/htools/hail-alloc-invalid-twodisks.json \ + test/data/htools/hail-alloc-restricted-network.json \ test/data/htools/hail-alloc-twodisks.json \ test/data/htools/hail-change-group.json \ test/data/htools/hail-invalid-reloc.json \ diff --git a/src/Ganeti/HTools/Cluster.hs b/src/Ganeti/HTools/Cluster.hs index de7f1fb..7b4a67c 100644 --- a/src/Ganeti/HTools/Cluster.hs +++ b/src/Ganeti/HTools/Cluster.hs @@ -847,7 +847,7 @@ findBestAllocGroup mggl mgnl mgil allowed_gdxs inst cnt = (gr, genAllocNodes mggl nl cnt False >>= tryAlloc nl il inst)) groups''::[(Group.Group, Result AllocSolution)] - all_msgs = filter_group_msgs ++ (concatMap solutionDescription sols) + all_msgs = filter_group_msgs ++ concatMap solutionDescription sols goodSols = filterMGResults sols sortedSols = sortMGResults goodSols in case sortedSols of diff --git a/test/data/htools/hail-alloc-invalid-network.json b/test/data/htools/hail-alloc-invalid-network.json new file mode 100644 index 0000000..72d5cbb --- /dev/null +++ b/test/data/htools/hail-alloc-invalid-network.json @@ -0,0 +1,155 @@ +{ + "cluster_tags": [], + "instances": {}, + "ipolicy": { + "max": { + "disk-size": 2048 + }, + "min": { + "disk-size": 1024 + } + }, + "nodegroups": { + "uuid-group-1": { + "alloc_policy": "preferred", + "ipolicy": { + "disk-templates": [ + "drbd" + ], + "minmax": [ + { + "max": { + "cpu-count": 2, + "disk-count": 8, + "disk-size": 2048, + "memory-size": 12800, + "nic-count": 8, + "spindle-use": 8 + }, + "min": { + "cpu-count": 1, + "disk-count": 1, + "disk-size": 1024, + "memory-size": 128, + "nic-count": 1, + "spindle-use": 1 + } + } + ], + "spindle-ratio": 32.0, + "std": { + "cpu-count": 1, + "disk-count": 1, + "disk-size": 1024, + "memory-size": 128, + "nic-count": 1, + "spindle-use": 1 + }, + "vcpu-ratio": 4.0 + }, + "name": "Group 1", + "networks": ["uuid-net-1-1", "uuid-net-1-2"], + "tags": [] + }, + "uuid-group-2": { + "alloc_policy": "preferred", + "ipolicy": { + "disk-templates": [ + "file" + ], + "minmax": [ + { + "max": { + "cpu-count": 2, + "disk-count": 8, + "disk-size": 2048, + "memory-size": 12800, + "nic-count": 8, + "spindle-use": 8 + }, + "min": { + "cpu-count": 1, + "disk-count": 1, + "disk-size": 1024, + "memory-size": 128, + "nic-count": 1, + "spindle-use": 1 + } + } + ], + "spindle-ratio": 32.0, + "std": { + "cpu-count": 1, + "disk-count": 1, + "disk-size": 1024, + "memory-size": 128, + "nic-count": 1, + "spindle-use": 1 + }, + "vcpu-ratio": 4.0 + }, + "name": "Group 2", + "networks": ["uuid-net-2-1", "uuid-net-2-2", "uuid-net-2-3"], + "tags": [] + } + }, + "nodes": { + "node1_1": { + "drained": false, + "free_disk": 7168, + "free_memory": 4096, + "group": "uuid-group-1", + "ndparams": { + "spindle_count": 1 + }, + "offline": false, + "reserved_memory": 1017, + "total_cpus": 4, + "total_disk": 7168, + "total_memory": 4096 + }, + "node2_1": { + "drained": false, + "free_disk": 7168, + "free_memory": 4096, + "group": "uuid-group-2", + "ndparams": { + "spindle_count": 1 + }, + "offline": false, + "reserved_memory": 1017, + "total_cpus": 4, + "total_disk": 7168, + "total_memory": 4096 + } + }, + "request": { + "disk_space_total": 1536, + "disk_template": "file", + "disks": [ + { + "size": 1536 + } + ], + "memory": 1024, + "name": "instance1", + "required_nodes": 1, + "spindle_use": 2, + "nics":[ + { + "mac":"aa:00:00:85:f3:a7", + "network":"uuid-net-1-1", + "nicparams":{} + }, + { + "mac":"aa:00:00:85:f3:a8", + "network":"uuid-net-1-2", + "nicparams":{} + } + ], + "tags": [], + "type": "allocate", + "vcpus": 1 + }, + "version": 2 +} diff --git a/test/data/htools/hail-alloc-restricted-network.json b/test/data/htools/hail-alloc-restricted-network.json new file mode 100644 index 0000000..988d0fc --- /dev/null +++ b/test/data/htools/hail-alloc-restricted-network.json @@ -0,0 +1,277 @@ +{ + "cluster_tags": [], + "instances": { + "instance1": { + "disks": [ + { + "mode": "rw", + "size": 1024 + } + ], + "disk_space_total": 1024, + "hypervisor": "xen-pvm", + "tags": [], + "nics": [ + { + "ip": null, + "mac": "aa:00:00:eb:0b:a5", + "link": "xen-br0", + "mode": "bridged", + "bridge": "xen-br0" + } + ], + "vcpus": 1, + "spindle_use": 1, + "admin_state": "down", + "disk_template": "drbd", + "memory": 128, + "nodes": [ + "node1_1", + "node1_2" + ], + "os": "debian-image" + }, + "instance2": { + "disks": [ + { + "mode": "rw", + "size": 1024 + } + ], + "disk_space_total": 1024, + "hypervisor": "xen-pvm", + "tags": [], + "nics": [ + { + "ip": null, + "mac": "aa:00:00:eb:0b:a5", + "link": "xen-br0", + "mode": "bridged", + "bridge": "xen-br0" + } + ], + "vcpus": 1, + "spindle_use": 1, + "admin_state": "down", + "disk_template": "drbd", + "memory": 128, + "nodes": [ + "node1_2", + "node1_1" + ], + "os": "debian-image" + }, + "instance2": { + "disks": [ + { + "mode": "rw", + "size": 1024 + } + ], + "disk_space_total": 1024, + "hypervisor": "xen-pvm", + "tags": [], + "nics": [ + { + "ip": null, + "mac": "aa:00:00:eb:0b:a5", + "link": "xen-br0", + "mode": "bridged", + "bridge": "xen-br0" + } + ], + "vcpus": 1, + "spindle_use": 1, + "admin_state": "down", + "disk_template": "drbd", + "memory": 128, + "nodes": [ + "node1_1", + "node1_2" + ], + "os": "debian-image" + } + }, + "ipolicy": { + "max": { + "disk-size": 2048 + }, + "min": { + "disk-size": 1024 + } + }, + "nodegroups": { + "uuid-group-1": { + "alloc_policy": "last_resort", + "ipolicy": { + "disk-templates": [ + "drbd" + ], + "minmax": [ + { + "max": { + "cpu-count": 2, + "disk-count": 8, + "disk-size": 2048, + "memory-size": 12800, + "nic-count": 8, + "spindle-use": 8 + }, + "min": { + "cpu-count": 1, + "disk-count": 1, + "disk-size": 1024, + "memory-size": 128, + "nic-count": 1, + "spindle-use": 1 + } + } + ], + "spindle-ratio": 32.0, + "std": { + "cpu-count": 1, + "disk-count": 1, + "disk-size": 1024, + "memory-size": 128, + "nic-count": 1, + "spindle-use": 1 + }, + "vcpu-ratio": 4.0 + }, + "name": "Group 1", + "networks": ["uuid-net-1-1", "uuid-net-1-2"], + "tags": [] + }, + "uuid-group-2": { + "alloc_policy": "preferred", + "ipolicy": { + "disk-templates": [ + "drbd" + ], + "minmax": [ + { + "max": { + "cpu-count": 2, + "disk-count": 8, + "disk-size": 2048, + "memory-size": 12800, + "nic-count": 8, + "spindle-use": 8 + }, + "min": { + "cpu-count": 1, + "disk-count": 1, + "disk-size": 1024, + "memory-size": 128, + "nic-count": 1, + "spindle-use": 1 + } + } + ], + "spindle-ratio": 32.0, + "std": { + "cpu-count": 1, + "disk-count": 1, + "disk-size": 1024, + "memory-size": 128, + "nic-count": 1, + "spindle-use": 1 + }, + "vcpu-ratio": 4.0 + }, + "name": "Group 2", + "networks": ["uuid-net-2-1", "uuid-net-2-2", "uuid-net-2-3"], + "tags": [] + } + }, + "nodes": { + "node1_1": { + "drained": false, + "free_disk": 4096, + "free_memory": 3840, + "group": "uuid-group-1", + "ndparams": { + "spindle_count": 1 + }, + "offline": false, + "reserved_memory": 1017, + "total_cpus": 4, + "total_disk": 7168, + "total_memory": 4096 + }, + "node1_2": { + "drained": false, + "free_disk": 4096, + "free_memory": 3968, + "group": "uuid-group-1", + "ndparams": { + "spindle_count": 1 + }, + "offline": false, + "reserved_memory": 1017, + "total_cpus": 4, + "total_disk": 7168, + "total_memory": 32763 + }, + "node2_1": { + "drained": false, + "free_disk": 7168, + "free_memory": 4096, + "group": "uuid-group-2", + "ndparams": { + "spindle_count": 1 + }, + "offline": false, + "reserved_memory": 1017, + "total_cpus": 4, + "total_disk": 7168, + "total_memory": 4096 + }, + "node2_2": { + "drained": false, + "free_disk": 7168, + "free_memory": 4096, + "group": "uuid-group-2", + "ndparams": { + "spindle_count": 1 + }, + "offline": false, + "reserved_memory": 1017, + "total_cpus": 4, + "total_disk": 7168, + "total_memory": 4096 + } + }, + "request": { + "disk_space_total": 3072, + "disk_template": "drbd", + "disks": [ + { + "size": 1536 + }, + { + "size": 1536 + } + ], + "memory": 1024, + "name": "instance1", + "required_nodes": 2, + "spindle_use": 2, + "nics":[ + { + "mac":"aa:00:00:85:f3:a7", + "network":"uuid-net-1-1", + "nicparams":{} + }, + { + "mac":"aa:00:00:85:f3:a8", + "network":"uuid-net-1-2", + "nicparams":{} + } + ], + "tags": [], + "type": "allocate", + "vcpus": 1 + }, + "version": 2 +} diff --git a/test/hs/shelltests/htools-hail.test b/test/hs/shelltests/htools-hail.test index 4da03d8..dbaba53 100644 --- a/test/hs/shelltests/htools-hail.test +++ b/test/hs/shelltests/htools-hail.test @@ -47,6 +47,16 @@ echo '{"request": 0}' | ./test/hs/hail - >>> /"success":false,.*FailDisk: 1/ >>>= 0 +# check that hail honors network requirements +./test/hs/hail $TESTDATA_DIR/hail-alloc-restricted-network.json +>>> /"success":true,"info":"Request successful: Selected group: Group 1.*/ +>>>= 0 + +# check that hail fails if no nodegroup can meet network and disk template requirements +./test/hs/hail $TESTDATA_DIR/hail-alloc-invalid-network.json +>>> /"success":false,/ +>>>= 0 + # check that hail can use the simu backend ./test/hs/hail --simu p,8,8T,16g,16 $TESTDATA_DIR/hail-alloc-drbd.json >>> /"success":true,/ -- 1.8.2.1
