diff --git a/Makefile.am b/Makefile.am index a08dc348e668b8f3e848537d34394fbbbb2bc445..2872e7a2a497bb5eaffe0b4685100010f8551e9b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -97,7 +97,6 @@ rapi_PYTHON = \ lib/rapi/__init__.py \ lib/rapi/baserlib.py \ lib/rapi/connector.py \ - lib/rapi/rlib1.py \ lib/rapi/rlib2.py http_PYTHON = \ diff --git a/doc/build-rapi-resources-doc b/doc/build-rapi-resources-doc index 4d6a77551d50dbeaba168fc143d212cce5dc349b..e60848da46c237f76cec3059bcb9fa42a3ddc470 100755 --- a/doc/build-rapi-resources-doc +++ b/doc/build-rapi-resources-doc @@ -26,7 +26,6 @@ import re import cgi import inspect -from ganeti.rapi import rlib1 from ganeti.rapi import rlib2 from ganeti.rapi import connector @@ -38,7 +37,7 @@ def main(): # Get list of all resources all = list(connector.CONNECTOR.itervalues()) - # Sort rlib1 by URI + # Sort rlib by URI all.sort(cmp=lambda a, b: cmp(a.DOC_URI, b.DOC_URI)) print "<!-- Automatically generated, do not edit -->" diff --git a/lib/rapi/connector.py b/lib/rapi/connector.py index cb843b8944ee71aa4943d6511e93620f9a35514e..2528c1550f39312f54a25f59d00914c915090f3b 100644 --- a/lib/rapi/connector.py +++ b/lib/rapi/connector.py @@ -29,7 +29,6 @@ from ganeti import constants from ganeti import http from ganeti.rapi import baserlib -from ganeti.rapi import rlib1 from ganeti.rapi import rlib2 # the connection map is created at the end of this file @@ -152,13 +151,14 @@ class R_2(baserlib.R_Generic): CONNECTOR.update({ "/": R_root, - "/version": rlib1.R_version, + "/version": rlib2.R_version, "/2": R_2, "/2/jobs": rlib2.R_2_jobs, "/2/nodes": rlib2.R_2_nodes, + re.compile(r'^/2/nodes/([\w\._-]+)$'): rlib2.R_2_nodes_name, "/2/instances": rlib2.R_2_instances, - re.compile(r'^/2/instances/([\w\._-]+)$'): rlib1.R_instances_name, + re.compile(r'^/2/instances/([\w\._-]+)$'): rlib2.R_2_instances_name, re.compile(r'^/2/instances/([\w\._-]+)/tags$'): rlib2.R_2_instances_name_tags, re.compile(r'^/2/instances/([\w\._-]+)/reboot$'): rlib2.R_2_instances_name_reboot, @@ -167,4 +167,7 @@ CONNECTOR.update({ re.compile(r'^/2/instances/([\w\._-]+)/startup$'): rlib2.R_2_instances_name_startup, re.compile(r'/2/jobs/(%s)$' % constants.JOB_ID_TEMPLATE): rlib2.R_2_jobs_id, + "/2/tags": rlib2.R_2_tags, + "/2/info": rlib2.R_2_info, + "/2/os": rlib2.R_2_os, }) diff --git a/lib/rapi/rlib1.py b/lib/rapi/rlib1.py deleted file mode 100644 index afc0e6a523e693e474a6490e879cbbd2ad67854c..0000000000000000000000000000000000000000 --- a/lib/rapi/rlib1.py +++ /dev/null @@ -1,237 +0,0 @@ -# -# - -# Copyright (C) 2006, 2007, 2008 Google Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301, USA. - - -"""Remote API version 1 resources library. - -""" - -import ganeti.cli -import ganeti.errors -import ganeti.opcodes - -from ganeti import constants -from ganeti import http - -from ganeti.rapi import baserlib - - -I_FIELDS = ["name", "os", "pnode", "snodes", "admin_state", "disk_template", - "ip", "mac", "bridge", "sda_size", "sdb_size", "beparams", - "oper_state", "status", "tags"] - -N_FIELDS = ["name", "dtotal", "dfree", - "mtotal", "mnode", "mfree", - "pinst_cnt", "sinst_cnt", "tags"] - - -class R_version(baserlib.R_Generic): - """/version resource. - - This resource should be used to determine the remote API version and - to adapt clients accordingly. - - """ - DOC_URI = "/version" - - def GET(self): - """Returns the remote API version. - - """ - return constants.RAPI_VERSION - - -class R_tags(baserlib.R_Generic): - """/tags resource. - - Manages cluster tags. - - """ - DOC_URI = "/tags" - - def GET(self): - """Returns a list of all cluster tags. - - Example: ["tag1", "tag2", "tag3"] - - """ - return baserlib._Tags_GET(constants.TAG_CLUSTER) - - -class R_info(baserlib.R_Generic): - """Cluster info. - - """ - DOC_URI = "/info" - - def GET(self): - """Returns cluster information. - - Example:: - - { - "config_version": 3, - "name": "cluster1.example.com", - "software_version": "1.2.4", - "os_api_version": 5, - "export_version": 0, - "master": "node1.example.com", - "architecture": [ - "64bit", - "x86_64" - ], - "hypervisor_type": "xen-pvm", - "protocol_version": 12 - } - - """ - op = ganeti.opcodes.OpQueryClusterInfo() - return ganeti.cli.SubmitOpCode(op) - - -class R_nodes_name(baserlib.R_Generic): - """/nodes/[node_name] resources. - - """ - DOC_URI = "/nodes/[node_name]" - - def GET(self): - """Send information about a node. - - """ - node_name = self.items[0] - op = ganeti.opcodes.OpQueryNodes(output_fields=N_FIELDS, - names=[node_name]) - result = ganeti.cli.SubmitOpCode(op) - - return baserlib.MapFields(N_FIELDS, result[0]) - - -class R_nodes_name_tags(baserlib.R_Generic): - """/nodes/[node_name]/tags resource. - - Manages per-node tags. - - """ - DOC_URI = "/nodes/[node_name]/tags" - - def GET(self): - """Returns a list of node tags. - - Example: ["tag1", "tag2", "tag3"] - - """ - return baserlib._Tags_GET(constants.TAG_NODE, name=self.items[0]) - - -class R_instances_name(baserlib.R_Generic): - """/instances/[instance_name] resources. - - """ - DOC_URI = "/instances/[instance_name]" - - def GET(self): - """Send information about an instance. - - """ - instance_name = self.items[0] - op = ganeti.opcodes.OpQueryInstances(output_fields=I_FIELDS, - names=[instance_name]) - result = ganeti.cli.SubmitOpCode(op) - - return baserlib.MapFields(I_FIELDS, result[0]) - - def DELETE(self): - """Removes an instance. - - """ - instance_name = self.items[0] - op = ganeti.opcodes.OpRemoveInstance(instance_name=instance_name, - ignore_failures=True) - job_id = ganeti.cli.SendJob([op]) - - return job_id - - def PUT(self): - """Modify an instance. - - """ - instance_name = self.items[0] - opts = {} - - for key in self.queryargs: - opts[key] = self.queryargs[key][0] - - beparams = baserlib.MakeParamsDict(opts, constants.BES_PARAMETERS) - hvparams = baserlib.MakeParamsDict(opts, constants.HVS_PARAMETERS) - - op = ganeti.opcodes.OpSetInstanceParams( - instance_name=instance_name, - ip=opts.get('ip', None), - bridge=opts.get('bridge', None), - mac=opts.get('mac', None), - hvparams=hvparams, - beparams=beparams, - force=opts.get('force', None)) - - job_id = ganeti.cli.SendJob([op]) - - return job_id - - -class R_instances_name_tags(baserlib.R_Generic): - """/instances/[instance_name]/tags resource. - - Manages per-instance tags. - - """ - DOC_URI = "/instances/[instance_name]/tags" - - def GET(self): - """Returns a list of instance tags. - - Example: ["tag1", "tag2", "tag3"] - - """ - return baserlib._Tags_GET(constants.TAG_INSTANCE, name=self.items[0]) - - -class R_os(baserlib.R_Generic): - """/os resource. - - """ - DOC_URI = "/os" - - def GET(self): - """Return a list of all OSes. - - Can return error 500 in case of a problem. - - Example: ["debian-etch"] - - """ - op = ganeti.opcodes.OpDiagnoseOS(output_fields=["name", "valid"], - names=[]) - diagnose_data = ganeti.cli.SubmitOpCode(op) - - if not isinstance(diagnose_data, list): - raise http.HttpInternalServerError(message="Can't get OS list") - - return [row[0] for row in diagnose_data if row[1]] diff --git a/lib/rapi/rlib2.py b/lib/rapi/rlib2.py index dc28a863cf0e20890c5f897eb56d082850004b9a..b04063eea314ca6275c05484238679ed497afa3d 100644 --- a/lib/rapi/rlib2.py +++ b/lib/rapi/rlib2.py @@ -29,7 +29,102 @@ from ganeti import luxi from ganeti import constants from ganeti.rapi import baserlib -from ganeti.rapi.rlib1 import I_FIELDS, N_FIELDS + +I_FIELDS = ["name", "os", "pnode", "snodes", "admin_state", "disk_template", + "ip", "mac", "bridge", "sda_size", "sdb_size", "beparams", + "oper_state", "status", "tags"] + +N_FIELDS = ["name", "dtotal", "dfree", + "mtotal", "mnode", "mfree", + "pinst_cnt", "sinst_cnt", "tags"] + + +class R_version(baserlib.R_Generic): + """/version resource. + + This resource should be used to determine the remote API version and + to adapt clients accordingly. + + """ + DOC_URI = "/version" + + def GET(self): + """Returns the remote API version. + + """ + return constants.RAPI_VERSION + + +class R_2_info(baserlib.R_Generic): + """Cluster info. + + """ + DOC_URI = "/2/info" + + def GET(self): + """Returns cluster information. + + Example:: + + { + "config_version": 3, + "name": "cluster1.example.com", + "software_version": "1.2.4", + "os_api_version": 5, + "export_version": 0, + "master": "node1.example.com", + "architecture": [ + "64bit", + "x86_64" + ], + "hypervisor_type": "xen-pvm", + "protocol_version": 12 + } + + """ + op = ganeti.opcodes.OpQueryClusterInfo() + return ganeti.cli.SubmitOpCode(op) + + +class R_2_tags(baserlib.R_Generic): + """/2/tags resource. + + Manages cluster tags. + + """ + DOC_URI = "/2/tags" + + def GET(self): + """Returns a list of all cluster tags. + + Example: ["tag1", "tag2", "tag3"] + + """ + return baserlib._Tags_GET(constants.TAG_CLUSTER) + + +class R_2_os(baserlib.R_Generic): + """/2/os resource. + + """ + DOC_URI = "/2/os" + + def GET(self): + """Return a list of all OSes. + + Can return error 500 in case of a problem. + + Example: ["debian-etch"] + + """ + op = ganeti.opcodes.OpDiagnoseOS(output_fields=["name", "valid"], + names=[]) + diagnose_data = ganeti.cli.SubmitOpCode(op) + + if not isinstance(diagnose_data, list): + raise http.HttpInternalServerError(message="Can't get OS list") + + return [row[0] for row in diagnose_data if row[1]] class R_2_jobs(baserlib.R_Generic): @@ -141,12 +236,22 @@ class R_2_nodes(baserlib.R_Generic): uri_fields=("id", "uri")) -class R_nodes(R_2_nodes): - """/nodes resource +class R_2_nodes_name(baserlib.R_Generic): + """/2/nodes/[node_name] resources. """ - # TODO: Temporary resource will be deprecated - DOC_URI = "/nodes" + DOC_URI = "/nodes/[node_name]" + + def GET(self): + """Send information about a node. + + """ + node_name = self.items[0] + op = ganeti.opcodes.OpQueryNodes(output_fields=N_FIELDS, + names=[node_name]) + result = ganeti.cli.SubmitOpCode(op) + + return baserlib.MapFields(N_FIELDS, result[0]) class R_2_instances(baserlib.R_Generic): @@ -254,12 +359,22 @@ class R_2_instances(baserlib.R_Generic): return job_id -class R_instances(R_2_instances): - """/instances resource. +class R_2_instances_name(baserlib.R_Generic): + """/2/instances/[instance_name] resources. """ - # TODO: Temporary resource will be deprecated - DOC_URI = "/instances" + DOC_URI = "/2/instances/[instance_name]" + + def GET(self): + """Send information about an instance. + + """ + instance_name = self.items[0] + op = ganeti.opcodes.OpQueryInstances(output_fields=I_FIELDS, + names=[instance_name]) + result = ganeti.cli.SubmitOpCode(op) + + return baserlib.MapFields(I_FIELDS, result[0]) class R_2_instances_name_reboot(baserlib.R_Generic): diff --git a/test/ganeti.rapi.resources_unittest.py b/test/ganeti.rapi.resources_unittest.py index b40e0da492623eec3cb121d35fc59d48b075636e..11d34500f684c4e667778178344d171020a8d0cf 100755 --- a/test/ganeti.rapi.resources_unittest.py +++ b/test/ganeti.rapi.resources_unittest.py @@ -29,7 +29,6 @@ from ganeti import errors from ganeti import http from ganeti.rapi import connector -from ganeti.rapi import rlib1 from ganeti.rapi import rlib2 @@ -50,10 +49,10 @@ class MapperTests(unittest.TestCase): self._TestFailingUri("/tags") self._TestFailingUri("/instances") - self._TestUri("/version", (rlib1.R_version, [], {})) + self._TestUri("/version", (rlib2.R_version, [], {})) self._TestUri('/2/instances/www.test.com', - (rlib1.R_instances_name, + (rlib2.R_2_instances_name, ['www.test.com'], {}))