diff --git a/lib/rapi/rlib2.py b/lib/rapi/rlib2.py index 373754b24b8036fa9f5879aa90125865e5d94ad4..2123a9983f1d5dc745667670b85c4f89b2cbe24a 100644 --- a/lib/rapi/rlib2.py +++ b/lib/rapi/rlib2.py @@ -1002,40 +1002,22 @@ class R_2_instances_name_prepare_export(baserlib.OpcodeResource): }) -def _ParseExportInstanceRequest(name, data): - """Parses a request for an instance export. - - @rtype: L{opcodes.OpBackupExport} - @return: Instance export opcode - - """ - # Rename "destination" to "target_node" - try: - data["target_node"] = data.pop("destination") - except KeyError: - pass - - return baserlib.FillOpcode(opcodes.OpBackupExport, data, { - "instance_name": name, - }) - - -class R_2_instances_name_export(baserlib.ResourceBase): +class R_2_instances_name_export(baserlib.OpcodeResource): """/2/instances/[instance_name]/export resource. """ - def PUT(self): - """Exports an instance. + PUT_OPCODE = opcodes.OpBackupExport + PUT_RENAME = { + "destination": "target_node", + } - @return: a job id + def GetPutOpInput(self): + """Exports an instance. """ - if not isinstance(self.request_body, dict): - raise http.HttpBadRequest("Invalid body contents, not a dictionary") - - op = _ParseExportInstanceRequest(self.items[0], self.request_body) - - return self.SubmitJob([op]) + return (self.request_body, { + "instance_name": self.items[0], + }) def _ParseMigrateInstanceRequest(name, data): diff --git a/test/ganeti.rapi.rlib2_unittest.py b/test/ganeti.rapi.rlib2_unittest.py index 9801bb34a2dc0c28da56875fc5a8df819418c5ed..034efe200d624f74c783f6ea4e0fcaf2a2c32337 100755 --- a/test/ganeti.rapi.rlib2_unittest.py +++ b/test/ganeti.rapi.rlib2_unittest.py @@ -653,13 +653,10 @@ class TestParseInstanceCreateRequestVersion1(testutils.GanetiTestCase): self.assertRaises(http.HttpBadRequest, self.Parse, data, False) -class TestParseExportInstanceRequest(testutils.GanetiTestCase): - def setUp(self): - testutils.GanetiTestCase.setUp(self) - - self.Parse = rlib2._ParseExportInstanceRequest - +class TestBackupExport(unittest.TestCase): def test(self): + clfactory = _FakeClientFactory(_FakeClient) + name = "instmoo" data = { "mode": constants.EXPORT_MODE_REMOTE, @@ -669,34 +666,66 @@ class TestParseExportInstanceRequest(testutils.GanetiTestCase): "x509_key_name": ["name", "hash"], "destination_x509_ca": "---cert---" } - op = self.Parse(name, data) - self.assert_(isinstance(op, opcodes.OpBackupExport)) + + handler = _CreateHandler(rlib2.R_2_instances_name_export, [name], {}, + data, clfactory) + job_id = handler.PUT() + + cl = clfactory.GetNextClient() + self.assertRaises(IndexError, clfactory.GetNextClient) + + (exp_job_id, (op, )) = cl.GetNextSubmittedJob() + self.assertEqual(job_id, exp_job_id) + self.assertTrue(isinstance(op, opcodes.OpBackupExport)) self.assertEqual(op.instance_name, name) self.assertEqual(op.mode, constants.EXPORT_MODE_REMOTE) + self.assertEqual(op.target_node, [(1, 2, 3), (99, 99, 99)]) self.assertEqual(op.shutdown, True) self.assertEqual(op.remove_instance, True) - self.assertEqualValues(op.x509_key_name, ("name", "hash")) + self.assertEqual(op.x509_key_name, ["name", "hash"]) self.assertEqual(op.destination_x509_ca, "---cert---") + self.assertFalse(hasattr(op, "dry_run")) + self.assertFalse(hasattr(op, "force")) + + self.assertRaises(IndexError, cl.GetNextSubmittedJob) def testDefaults(self): + clfactory = _FakeClientFactory(_FakeClient) + name = "inst1" data = { "destination": "node2", "shutdown": False, } - op = self.Parse(name, data) - self.assert_(isinstance(op, opcodes.OpBackupExport)) + + handler = _CreateHandler(rlib2.R_2_instances_name_export, [name], {}, + data, clfactory) + job_id = handler.PUT() + + cl = clfactory.GetNextClient() + self.assertRaises(IndexError, clfactory.GetNextClient) + + (exp_job_id, (op, )) = cl.GetNextSubmittedJob() + self.assertEqual(job_id, exp_job_id) + self.assertTrue(isinstance(op, opcodes.OpBackupExport)) self.assertEqual(op.instance_name, name) self.assertEqual(op.target_node, "node2") self.assertFalse(hasattr(op, "mode")) self.assertFalse(hasattr(op, "remove_instance")) self.assertFalse(hasattr(op, "destination")) + self.assertFalse(hasattr(op, "dry_run")) + self.assertFalse(hasattr(op, "force")) + + self.assertRaises(IndexError, cl.GetNextSubmittedJob) def testErrors(self): - self.assertRaises(http.HttpBadRequest, self.Parse, "err1", - { "remove_instance": "True", }) - self.assertRaises(http.HttpBadRequest, self.Parse, "err1", - { "remove_instance": "False", }) + clfactory = _FakeClientFactory(_FakeClient) + + for value in ["True", "False"]: + handler = _CreateHandler(rlib2.R_2_instances_name_export, ["err1"], {}, { + "remove_instance": value, + }, clfactory) + self.assertRaises(http.HttpBadRequest, handler.PUT) class TestParseMigrateInstanceRequest(testutils.GanetiTestCase):