4 # Copyright (C) 2006, 2007, 2008 Google Inc.
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 2 of the License, or
9 # (at your option) any later version.
11 # This program is distributed in the hope that it will be useful, but
12 # WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 # General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 """Remote API connection map.
28 from ganeti import constants
29 from ganeti import http
31 from ganeti.rapi import baserlib
32 from ganeti.rapi import rlib2
34 # the connection map is created at the end of this file
39 """Map resource to method.
42 def __init__(self, connector=CONNECTOR):
43 """Resource mapper constructor.
45 @param connector: a dictionary, mapping method name with URL path regexp
48 self._connector = connector
50 def getController(self, uri):
51 """Find method for a given URI.
53 @param uri: string with URI
55 @return: None if no method is found or a tuple containing
57 - method: name of method mapped to URI
58 - items: a list of variable intems in the path
59 - args: a dictionary with additional parameters from URL
63 (path, query) = uri.split('?', 1)
64 args = cgi.parse_qs(query)
72 for key, handler in self._connector.iteritems():
74 if hasattr(key, "match"):
77 result = (handler, list(m.groups()), args)
82 result = (handler, [], args)
88 raise http.HttpNotFound()
91 class R_root(baserlib.R_Generic):
98 """Show the list of mapped resources.
100 @return: a dictionary with 'name' and 'uri' keys for each of them.
103 root_pattern = re.compile('^R_([a-zA-Z0-9]+)$')
106 for handler in CONNECTOR.values():
107 m = root_pattern.match(handler.__name__)
111 rootlist.append(name)
113 return baserlib.BuildUriList(rootlist, "/%s")
116 def _getResources(id):
117 """Return a list of resources underneath given id.
119 This is to generalize querying of version resources lists.
121 @return: a list of resources names.
124 r_pattern = re.compile('^R_%s_([a-zA-Z0-9]+)$' % id)
127 for handler in CONNECTOR.values():
128 m = r_pattern.match(handler.__name__)
136 class R_2(baserlib.R_Generic):
137 """ /2 resource, the root of the version 2 API.
143 """Show the list of mapped resources.
145 @return: a dictionary with 'name' and 'uri' keys for each of them.
148 return baserlib.BuildUriList(_getResources("2"), "/2/%s")
154 "/version": rlib2.R_version,
157 "/2/jobs": rlib2.R_2_jobs,
158 "/2/nodes": rlib2.R_2_nodes,
159 re.compile(r'^/2/nodes/([\w\._-]+)$'): rlib2.R_2_nodes_name,
160 re.compile(r'^/2/nodes/([\w\._-]+)/tags$'): rlib2.R_2_nodes_name_tags,
161 "/2/instances": rlib2.R_2_instances,
162 re.compile(r'^/2/instances/([\w\._-]+)$'): rlib2.R_2_instances_name,
163 re.compile(r'^/2/instances/([\w\._-]+)/tags$'): rlib2.R_2_instances_name_tags,
164 re.compile(r'^/2/instances/([\w\._-]+)/reboot$'):
165 rlib2.R_2_instances_name_reboot,
166 re.compile(r'^/2/instances/([\w\._-]+)/shutdown$'):
167 rlib2.R_2_instances_name_shutdown,
168 re.compile(r'^/2/instances/([\w\._-]+)/startup$'):
169 rlib2.R_2_instances_name_startup,
170 re.compile(r'/2/jobs/(%s)$' % constants.JOB_ID_TEMPLATE): rlib2.R_2_jobs_id,
171 "/2/tags": rlib2.R_2_tags,
172 "/2/info": rlib2.R_2_info,
173 "/2/os": rlib2.R_2_os,