diff --git a/lib/rapi/client.py b/lib/rapi/client.py index b05867aca371e269c4476b6d55bbf59d98585e32..86d78fcdf71385852dece1e152f7f5e2360174f3 100644 --- a/lib/rapi/client.py +++ b/lib/rapi/client.py @@ -45,12 +45,6 @@ REPLACE_DISK_PRI = "replace_on_primary" REPLACE_DISK_SECONDARY = "replace_on_secondary" REPLACE_DISK_CHG = "replace_new_secondary" REPLACE_DISK_AUTO = "replace_auto" -VALID_REPLACEMENT_MODES = frozenset([ - REPLACE_DISK_PRI, - REPLACE_DISK_SECONDARY, - REPLACE_DISK_CHG, - REPLACE_DISK_AUTO, - ]) VALID_NODE_ROLES = frozenset([ "drained", "master", "master-candidate", "offline", "regular", ]) @@ -79,13 +73,6 @@ class GanetiApiError(Error): self.code = code -class InvalidReplacementMode(Error): - """Raised when an invalid disk replacement mode is attempted. - - """ - pass - - class InvalidNodeRole(Error): """Raised when an invalid node role is used. @@ -721,14 +708,14 @@ class GanetiRapiClient(object): ("/%s/instances/%s/reinstall" % (GANETI_RAPI_VERSION, instance)), query, None) - def ReplaceInstanceDisks(self, instance, disks, mode=REPLACE_DISK_AUTO, + def ReplaceInstanceDisks(self, instance, disks=None, mode=REPLACE_DISK_AUTO, remote_node=None, iallocator=None, dry_run=False): """Replaces disks on an instance. @type instance: str @param instance: instance whose disks to replace - @type disks: list of str - @param disks: disks to replace + @type disks: list of ints + @param disks: Indexes of disks to replace @type mode: str @param mode: replacement mode to use (defaults to replace_auto) @type remote_node: str or None @@ -743,27 +730,20 @@ class GanetiRapiClient(object): @rtype: int @return: job id - @raises InvalidReplacementMode: If an invalid disk replacement mode is given - @raises GanetiApiError: If no secondary node is given with a non-auto - replacement mode is requested. - """ - if mode not in VALID_REPLACEMENT_MODES: - raise InvalidReplacementMode("%s is not a valid disk replacement mode" % - mode) - query = [ ("mode", mode), - ("disks", ",".join(disks)), ] - if mode == REPLACE_DISK_AUTO: - query.append(("iallocator", iallocator)) - elif mode == REPLACE_DISK_SECONDARY: - if remote_node is None: - raise GanetiApiError("Missing secondary node") + if disks: + query.append(("disks", ",".join(str(idx) for idx in disks))) + + if remote_node: query.append(("remote_node", remote_node)) + if iallocator: + query.append(("iallocator", iallocator)) + if dry_run: query.append(("dry-run", 1)) diff --git a/test/ganeti.rapi.client_unittest.py b/test/ganeti.rapi.client_unittest.py index 585d58e9a53450e21256ae168e119bfa8b09917f..52346dd358c69a4e91d8de3c1ba0410f94e5b67e 100755 --- a/test/ganeti.rapi.client_unittest.py +++ b/test/ganeti.rapi.client_unittest.py @@ -309,32 +309,30 @@ class GanetiRapiClientTests(testutils.GanetiTestCase): def testReplaceInstanceDisks(self): self.rapi.AddResponse("999") job_id = self.client.ReplaceInstanceDisks("instance-name", - ["hda", "hdc"], dry_run=True, iallocator="hail") + disks=[0, 1], dry_run=True, iallocator="hail") self.assertEqual(999, job_id) self.assertHandler(rlib2.R_2_instances_name_replace_disks) self.assertItems(["instance-name"]) - self.assertQuery("disks", ["hda,hdc"]) + self.assertQuery("disks", ["0,1"]) self.assertQuery("mode", ["replace_auto"]) self.assertQuery("iallocator", ["hail"]) self.assertDryRun() - self.assertRaises(client.InvalidReplacementMode, - self.client.ReplaceInstanceDisks, - "instance_a", ["hda"], mode="invalid_mode") - self.assertRaises(client.GanetiApiError, - self.client.ReplaceInstanceDisks, - "instance-foo", ["hda"], mode="replace_on_secondary") - self.rapi.AddResponse("1000") job_id = self.client.ReplaceInstanceDisks("instance-bar", - ["hda"], mode="replace_on_secondary", remote_node="foo-node", + disks=[1], mode="replace_on_secondary", remote_node="foo-node", dry_run=True) self.assertEqual(1000, job_id) self.assertItems(["instance-bar"]) - self.assertQuery("disks", ["hda"]) + self.assertQuery("disks", ["1"]) self.assertQuery("remote_node", ["foo-node"]) self.assertDryRun() + self.rapi.AddResponse("5175") + self.assertEqual(5175, self.client.ReplaceInstanceDisks("instance-moo")) + self.assertItems(["instance-moo"]) + self.assertQuery("disks", None) + def testGetJobs(self): self.rapi.AddResponse('[ { "id": "123", "uri": "\\/2\\/jobs\\/123" },' ' { "id": "124", "uri": "\\/2\\/jobs\\/124" } ]')