RAPI client: Wrap /2/redistribute-config resource
[ganeti-local] / test / ganeti.rapi.client_unittest.py
index eaa29e5..fc63d00 100755 (executable)
@@ -131,6 +131,7 @@ class TestConstants(unittest.TestCase):
     self.assertEqual(client.HTTP_APP_JSON, http.HTTP_APP_JSON)
     self.assertEqual(client._REQ_DATA_VERSION_FIELD, rlib2._REQ_DATA_VERSION)
     self.assertEqual(client._INST_CREATE_REQV1, rlib2._INST_CREATE_REQV1)
+    self.assertEqual(client._INST_REINSTALL_REQV1, rlib2._INST_REINSTALL_REQV1)
     self.assertEqual(client._INST_NIC_PARAMS, constants.INIC_PARAMS)
 
 
@@ -350,6 +351,9 @@ class GanetiRapiClientTests(testutils.GanetiTestCase):
   def assertDryRun(self):
     self.assertTrue(self.rapi.GetLastHandler().dryRun())
 
+  def assertUseForce(self):
+    self.assertTrue(self.rapi.GetLastHandler().useForce())
+
   def testEncodeQuery(self):
     query = [
       ("a", None),
@@ -660,6 +664,7 @@ class GanetiRapiClientTests(testutils.GanetiTestCase):
     self.assertDryRun()
 
   def testReinstallInstance(self):
+    self.rapi.AddResponse(serializer.DumpJson([]))
     self.rapi.AddResponse("19119")
     self.assertEqual(19119, self.client.ReinstallInstance("baz-instance",
                                                           os="DOS",
@@ -668,6 +673,44 @@ class GanetiRapiClientTests(testutils.GanetiTestCase):
     self.assertItems(["baz-instance"])
     self.assertQuery("os", ["DOS"])
     self.assertQuery("nostartup", ["1"])
+    self.assertEqual(self.rapi.CountPending(), 0)
+
+  def testReinstallInstanceNew(self):
+    self.rapi.AddResponse(serializer.DumpJson([rlib2._INST_REINSTALL_REQV1]))
+    self.rapi.AddResponse("25689")
+    self.assertEqual(25689, self.client.ReinstallInstance("moo-instance",
+                                                          os="Debian",
+                                                          no_startup=True))
+    self.assertHandler(rlib2.R_2_instances_name_reinstall)
+    self.assertItems(["moo-instance"])
+    data = serializer.LoadJson(self.rapi.GetLastRequestData())
+    self.assertEqual(len(data), 2)
+    self.assertEqual(data["os"], "Debian")
+    self.assertEqual(data["start"], False)
+    self.assertEqual(self.rapi.CountPending(), 0)
+
+  def testReinstallInstanceWithOsparams1(self):
+    self.rapi.AddResponse(serializer.DumpJson([]))
+    self.assertRaises(client.GanetiApiError, self.client.ReinstallInstance,
+                      "doo-instance", osparams={"x": "y"})
+    self.assertEqual(self.rapi.CountPending(), 0)
+
+  def testReinstallInstanceWithOsparams2(self):
+    osparams = {
+      "Hello": "World",
+      "foo": "bar",
+      }
+    self.rapi.AddResponse(serializer.DumpJson([rlib2._INST_REINSTALL_REQV1]))
+    self.rapi.AddResponse("1717")
+    self.assertEqual(1717, self.client.ReinstallInstance("zoo-instance",
+                                                         osparams=osparams))
+    self.assertHandler(rlib2.R_2_instances_name_reinstall)
+    self.assertItems(["zoo-instance"])
+    data = serializer.LoadJson(self.rapi.GetLastRequestData())
+    self.assertEqual(len(data), 2)
+    self.assertEqual(data["osparams"], osparams)
+    self.assertEqual(data["start"], True)
+    self.assertEqual(self.rapi.CountPending(), 0)
 
   def testReplaceInstanceDisks(self):
     self.rapi.AddResponse("999")
@@ -741,6 +784,35 @@ class GanetiRapiClientTests(testutils.GanetiTestCase):
         self.assertEqual(data["mode"], mode)
         self.assertEqual(data["cleanup"], cleanup)
 
+  def testRenameInstanceDefaults(self):
+    new_name = "newnametha7euqu"
+    self.rapi.AddResponse("8791")
+    job_id = self.client.RenameInstance("inst18821", new_name)
+    self.assertEqual(job_id, 8791)
+    self.assertHandler(rlib2.R_2_instances_name_rename)
+    self.assertItems(["inst18821"])
+
+    data = serializer.LoadJson(self.rapi.GetLastRequestData())
+    self.assertEqualValues(data, {"new_name": new_name, })
+
+  def testRenameInstance(self):
+    new_name = "new-name-yiux1iin"
+    for ip_check in [False, True]:
+      for name_check in [False, True]:
+        self.rapi.AddResponse("24776")
+        job_id = self.client.RenameInstance("inst20967", new_name,
+                                             ip_check=ip_check,
+                                             name_check=name_check)
+        self.assertEqual(job_id, 24776)
+        self.assertHandler(rlib2.R_2_instances_name_rename)
+        self.assertItems(["inst20967"])
+
+        data = serializer.LoadJson(self.rapi.GetLastRequestData())
+        self.assertEqual(len(data), 3)
+        self.assertEqual(data["new_name"], new_name)
+        self.assertEqual(data["ip_check"], ip_check)
+        self.assertEqual(data["name_check"], name_check)
+
   def testGetJobs(self):
     self.rapi.AddResponse('[ { "id": "123", "uri": "\\/2\\/jobs\\/123" },'
                           '  { "id": "124", "uri": "\\/2\\/jobs\\/124" } ]')
@@ -907,6 +979,132 @@ class GanetiRapiClientTests(testutils.GanetiTestCase):
     self.assertDryRun()
     self.assertQuery("tag", ["awesome"])
 
+  def testGetGroups(self):
+    groups = [{"name": "group1",
+               "uri": "/2/groups/group1",
+               },
+              {"name": "group2",
+               "uri": "/2/groups/group2",
+               },
+              ]
+    self.rapi.AddResponse(serializer.DumpJson(groups))
+    self.assertEqual(["group1", "group2"], self.client.GetGroups())
+    self.assertHandler(rlib2.R_2_groups)
+
+  def testGetGroupsBulk(self):
+    groups = [{"name": "group1",
+               "uri": "/2/groups/group1",
+               "node_cnt": 2,
+               "node_list": ["gnt1.test",
+                             "gnt2.test",
+                             ],
+               },
+              {"name": "group2",
+               "uri": "/2/groups/group2",
+               "node_cnt": 1,
+               "node_list": ["gnt3.test",
+                             ],
+               },
+              ]
+    self.rapi.AddResponse(serializer.DumpJson(groups))
+
+    self.assertEqual(groups, self.client.GetGroups(bulk=True))
+    self.assertHandler(rlib2.R_2_groups)
+    self.assertBulk()
+
+  def testGetGroup(self):
+    group = {"ctime": None,
+             "name": "default",
+             }
+    self.rapi.AddResponse(serializer.DumpJson(group))
+    self.assertEqual({"ctime": None, "name": "default"},
+                     self.client.GetGroup("default"))
+    self.assertHandler(rlib2.R_2_groups_name)
+    self.assertItems(["default"])
+
+  def testCreateGroup(self):
+    self.rapi.AddResponse("12345")
+    job_id = self.client.CreateGroup("newgroup", dry_run=True)
+    self.assertEqual(job_id, 12345)
+    self.assertHandler(rlib2.R_2_groups)
+    self.assertDryRun()
+
+  def testDeleteGroup(self):
+    self.rapi.AddResponse("12346")
+    job_id = self.client.DeleteGroup("newgroup", dry_run=True)
+    self.assertEqual(job_id, 12346)
+    self.assertHandler(rlib2.R_2_groups_name)
+    self.assertDryRun()
+
+  def testRenameGroup(self):
+    self.rapi.AddResponse("12347")
+    job_id = self.client.RenameGroup("oldname", "newname")
+    self.assertEqual(job_id, 12347)
+    self.assertHandler(rlib2.R_2_groups_name_rename)
+
+  def testModifyGroup(self):
+    self.rapi.AddResponse("12348")
+    job_id = self.client.ModifyGroup("mygroup", alloc_policy="foo")
+    self.assertEqual(job_id, 12348)
+    self.assertHandler(rlib2.R_2_groups_name_modify)
+
+  def testAssignGroupNodes(self):
+    self.rapi.AddResponse("12349")
+    job_id = self.client.AssignGroupNodes("mygroup", ["node1", "node2"],
+                                          force=True, dry_run=True)
+    self.assertEqual(job_id, 12349)
+    self.assertHandler(rlib2.R_2_groups_name_assign_nodes)
+    self.assertDryRun()
+    self.assertUseForce()
+
+  def testModifyInstance(self):
+    self.rapi.AddResponse("23681")
+    job_id = self.client.ModifyInstance("inst7210", os_name="linux")
+    self.assertEqual(job_id, 23681)
+    self.assertItems(["inst7210"])
+    self.assertHandler(rlib2.R_2_instances_name_modify)
+    self.assertEqual(serializer.LoadJson(self.rapi.GetLastRequestData()),
+                     { "os_name": "linux", })
+
+  def testModifyCluster(self):
+    for mnh in [None, False, True]:
+      self.rapi.AddResponse("14470")
+      self.assertEqual(14470,
+        self.client.ModifyCluster(maintain_node_health=mnh))
+      self.assertHandler(rlib2.R_2_cluster_modify)
+      self.assertItems([])
+      data = serializer.LoadJson(self.rapi.GetLastRequestData())
+      self.assertEqual(len(data), 1)
+      self.assertEqual(data["maintain_node_health"], mnh)
+      self.assertEqual(self.rapi.CountPending(), 0)
+
+  def testRedistributeConfig(self):
+    self.rapi.AddResponse("3364")
+    job_id = self.client.RedistributeConfig()
+    self.assertEqual(job_id, 3364)
+    self.assertItems([])
+    self.assertHandler(rlib2.R_2_redist_config)
+
+  def testGrowInstanceDisk(self):
+    for idx, wait_for_sync in enumerate([None, False, True]):
+      amount = 128 + (512 * idx)
+      self.assertEqual(self.rapi.CountPending(), 0)
+      self.rapi.AddResponse("30783")
+      self.assertEqual(30783,
+        self.client.GrowInstanceDisk("eze8ch", idx, amount,
+                                     wait_for_sync=wait_for_sync))
+      self.assertHandler(rlib2.R_2_instances_name_disk_grow)
+      self.assertItems(["eze8ch", str(idx)])
+      data = serializer.LoadJson(self.rapi.GetLastRequestData())
+      if wait_for_sync is None:
+        self.assertEqual(len(data), 1)
+        self.assert_("wait_for_sync" not in data)
+      else:
+        self.assertEqual(len(data), 2)
+        self.assertEqual(data["wait_for_sync"], wait_for_sync)
+      self.assertEqual(data["amount"], amount)
+      self.assertEqual(self.rapi.CountPending(), 0)
+
 
 if __name__ == '__main__':
   client.UsesRapiClient(testutils.GanetiTestProgram)()