From eb08e09da670bab67dc75802b1010621623cde44 Mon Sep 17 00:00:00 2001 From: Michael Hanselmann <hansmi@google.com> Date: Fri, 9 Sep 2011 11:26:31 +0200 Subject: [PATCH] rlib2: Convert /2/nodes/[node_name]/storage to OpcodeResource MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michael Hanselmann <hansmi@google.com> Reviewed-by: RenΓ© Nussbaumer <rn@google.com> --- lib/rapi/rlib2.py | 22 ++++++------- test/ganeti.rapi.rlib2_unittest.py | 51 ++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 11 deletions(-) diff --git a/lib/rapi/rlib2.py b/lib/rapi/rlib2.py index c7cb21dc1..7650aaf75 100644 --- a/lib/rapi/rlib2.py +++ b/lib/rapi/rlib2.py @@ -492,30 +492,30 @@ class R_2_nodes_name_migrate(baserlib.OpcodeResource): }) -class R_2_nodes_name_storage(baserlib.ResourceBase): +class R_2_nodes_name_storage(baserlib.OpcodeResource): """/2/nodes/[node_name]/storage resource. """ # LUNodeQueryStorage acquires locks, hence restricting access to GET GET_ACCESS = [rapi.RAPI_ACCESS_WRITE] + GET_OPCODE = opcodes.OpNodeQueryStorage - def GET(self): - node_name = self.items[0] + def GetGetOpInput(self): + """List storage available on a node. + """ storage_type = self._checkStringVariable("storage_type", None) - if not storage_type: - raise http.HttpBadRequest("Missing the required 'storage_type'" - " parameter") - output_fields = self._checkStringVariable("output_fields", None) + if not output_fields: raise http.HttpBadRequest("Missing the required 'output_fields'" " parameter") - op = opcodes.OpNodeQueryStorage(nodes=[node_name], - storage_type=storage_type, - output_fields=output_fields.split(",")) - return self.SubmitJob([op]) + return ({}, { + "nodes": [self.items[0]], + "storage_type": storage_type, + "output_fields": output_fields.split(","), + }) class R_2_nodes_name_storage_modify(baserlib.ResourceBase): diff --git a/test/ganeti.rapi.rlib2_unittest.py b/test/ganeti.rapi.rlib2_unittest.py index 4a1912749..0e6b7a73f 100755 --- a/test/ganeti.rapi.rlib2_unittest.py +++ b/test/ganeti.rapi.rlib2_unittest.py @@ -535,6 +535,57 @@ class TestGroupRemove(unittest.TestCase): self.assertRaises(IndexError, cl.GetNextSubmittedJob) +class TestStorageQuery(unittest.TestCase): + def test(self): + clfactory = _FakeClientFactory(_FakeClient) + queryargs = { + "storage_type": constants.ST_LVM_PV, + "output_fields": "name,other", + } + handler = _CreateHandler(rlib2.R_2_nodes_name_storage, + ["node21075"], queryargs, {}, clfactory) + job_id = handler.GET() + + 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.OpNodeQueryStorage)) + self.assertEqual(op.nodes, ["node21075"]) + self.assertEqual(op.storage_type, constants.ST_LVM_PV) + self.assertEqual(op.output_fields, ["name", "other"]) + self.assertFalse(hasattr(op, "dry_run")) + self.assertFalse(hasattr(op, "force")) + + self.assertRaises(IndexError, cl.GetNextSubmittedJob) + + def testErrors(self): + clfactory = _FakeClientFactory(_FakeClient) + + queryargs = { + "output_fields": "name,other", + } + handler = _CreateHandler(rlib2.R_2_nodes_name_storage, + ["node10538"], queryargs, {}, clfactory) + self.assertRaises(http.HttpBadRequest, handler.GET) + + queryargs = { + "storage_type": constants.ST_LVM_VG, + } + handler = _CreateHandler(rlib2.R_2_nodes_name_storage, + ["node21273"], queryargs, {}, clfactory) + self.assertRaises(http.HttpBadRequest, handler.GET) + + queryargs = { + "storage_type": "##unknown_storage##", + "output_fields": "name,other", + } + handler = _CreateHandler(rlib2.R_2_nodes_name_storage, + ["node10315"], queryargs, {}, clfactory) + self.assertRaises(http.HttpBadRequest, handler.GET) + + class TestParseInstanceCreateRequestVersion1(testutils.GanetiTestCase): def setUp(self): testutils.GanetiTestCase.setUp(self) -- GitLab