On Thu, May 23, 2013 at 1:07 PM, Guido Trotter <[email protected]> wrote:

>
>
>
> On Wed, May 22, 2013 at 5:28 PM, Thomas Thrainer <[email protected]>wrote:
>
>> 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
>> +
>>
>
> Is there any way to pass the request and the cluster from different files?
> (or could we make up one, eg. with concatenation?)
> Rationale: we should check with two requests differing only in the
> "network" field, and verify the change. This works, but could fail for an
> independent reason and we may not notice.
>
> Right now there is no such feature, but we could add it if it's required
more often. We could also convert the majority of the shelltests to unit
tests, where it's simple to change the request after having parsed the rest
of the file. (And just leave some shelltest in place which verify the
correct command line parsing, etc.).

For the test you are proposing there exists a rather simple solution though:

diff --git a/test/hs/shelltests/htools-hail.test
b/test/hs/shelltests/htools-hail.test
index dbaba53..6d34b66 100644
--- a/test/hs/shelltests/htools-hail.test
+++ b/test/hs/shelltests/htools-hail.test
@@ -57,6 +57,11 @@ echo '{"request": 0}' | ./test/hs/hail -
 >>> /"success":false,/
 >>>= 0

+# check that hail succeeds with the same test data, but with the network
restrictions removed
+cat $TESTDATA_DIR/hail-alloc-invalid-network.json | grep -v -e
'"network":"uuid-net-1-."' | ./test/hs/hail -
+>>> /"success":true,"info":"Request successful: Selected group: Group 2.*/
+>>>= 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,/



> Thanks,
>
> Guido
>
>


-- 
Thomas Thrainer | Software Engineer | [email protected] |

Google Germany GmbH
Dienerstr. 12
80331 München

Registergericht und -nummer: Hamburg, HRB 86891
Sitz der Gesellschaft: Hamburg
Geschäftsführer: Graham Law, Katherine Stephens

Reply via email to