Statistics
| Branch: | Tag: | Revision:

root / lib / rapi / connector.py @ 91c17910

History | View | Annotate | Download (7.9 kB)

1 10b207d4 Oleksiy Mishchenko
#
2 10b207d4 Oleksiy Mishchenko
#
3 10b207d4 Oleksiy Mishchenko
4 10b207d4 Oleksiy Mishchenko
# Copyright (C) 2006, 2007, 2008 Google Inc.
5 10b207d4 Oleksiy Mishchenko
#
6 10b207d4 Oleksiy Mishchenko
# This program is free software; you can redistribute it and/or modify
7 10b207d4 Oleksiy Mishchenko
# it under the terms of the GNU General Public License as published by
8 10b207d4 Oleksiy Mishchenko
# the Free Software Foundation; either version 2 of the License, or
9 10b207d4 Oleksiy Mishchenko
# (at your option) any later version.
10 10b207d4 Oleksiy Mishchenko
#
11 10b207d4 Oleksiy Mishchenko
# This program is distributed in the hope that it will be useful, but
12 10b207d4 Oleksiy Mishchenko
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 10b207d4 Oleksiy Mishchenko
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 10b207d4 Oleksiy Mishchenko
# General Public License for more details.
15 10b207d4 Oleksiy Mishchenko
#
16 10b207d4 Oleksiy Mishchenko
# You should have received a copy of the GNU General Public License
17 10b207d4 Oleksiy Mishchenko
# along with this program; if not, write to the Free Software
18 10b207d4 Oleksiy Mishchenko
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 10b207d4 Oleksiy Mishchenko
# 02110-1301, USA.
20 10b207d4 Oleksiy Mishchenko
21 10b207d4 Oleksiy Mishchenko
"""Remote API connection map.
22 10b207d4 Oleksiy Mishchenko

23 10b207d4 Oleksiy Mishchenko
"""
24 10b207d4 Oleksiy Mishchenko
25 b459a848 Andrea Spadaccini
# pylint: disable=C0103
26 fe267188 Iustin Pop
27 fe267188 Iustin Pop
# C0103: Invalid name, since the R_* names are not conforming
28 fe267188 Iustin Pop
29 10b207d4 Oleksiy Mishchenko
import cgi
30 10b207d4 Oleksiy Mishchenko
import re
31 10b207d4 Oleksiy Mishchenko
32 a2f92677 Michael Hanselmann
from ganeti import constants
33 a2f92677 Michael Hanselmann
from ganeti import http
34 691c81b7 Michael Hanselmann
from ganeti import utils
35 10b207d4 Oleksiy Mishchenko
36 10b207d4 Oleksiy Mishchenko
from ganeti.rapi import rlib2
37 10b207d4 Oleksiy Mishchenko
38 bf968b7f Michael Hanselmann
39 bf968b7f Michael Hanselmann
_NAME_PATTERN = r"[\w\._-]+"
40 e23881ed Michael Hanselmann
_DISK_PATTERN = r"\d+"
41 bf968b7f Michael Hanselmann
42 a2f92677 Michael Hanselmann
# the connection map is created at the end of this file
43 10b207d4 Oleksiy Mishchenko
CONNECTOR = {}
44 10b207d4 Oleksiy Mishchenko
45 10b207d4 Oleksiy Mishchenko
46 10b207d4 Oleksiy Mishchenko
class Mapper:
47 10b207d4 Oleksiy Mishchenko
  """Map resource to method.
48 10b207d4 Oleksiy Mishchenko

49 10b207d4 Oleksiy Mishchenko
  """
50 e11ddf13 Iustin Pop
  def __init__(self, connector=None):
51 10b207d4 Oleksiy Mishchenko
    """Resource mapper constructor.
52 10b207d4 Oleksiy Mishchenko

53 c41eea6e Iustin Pop
    @param connector: a dictionary, mapping method name with URL path regexp
54 10b207d4 Oleksiy Mishchenko

55 10b207d4 Oleksiy Mishchenko
    """
56 e11ddf13 Iustin Pop
    if connector is None:
57 e11ddf13 Iustin Pop
      connector = CONNECTOR
58 10b207d4 Oleksiy Mishchenko
    self._connector = connector
59 10b207d4 Oleksiy Mishchenko
60 10b207d4 Oleksiy Mishchenko
  def getController(self, uri):
61 10b207d4 Oleksiy Mishchenko
    """Find method for a given URI.
62 10b207d4 Oleksiy Mishchenko

63 c41eea6e Iustin Pop
    @param uri: string with URI
64 10b207d4 Oleksiy Mishchenko

65 c41eea6e Iustin Pop
    @return: None if no method is found or a tuple containing
66 c41eea6e Iustin Pop
        the following fields:
67 c41eea6e Iustin Pop
            - method: name of method mapped to URI
68 c41eea6e Iustin Pop
            - items: a list of variable intems in the path
69 c41eea6e Iustin Pop
            - args: a dictionary with additional parameters from URL
70 10b207d4 Oleksiy Mishchenko

71 10b207d4 Oleksiy Mishchenko
    """
72 d0c8c01d Iustin Pop
    if "?" in uri:
73 d0c8c01d Iustin Pop
      (path, query) = uri.split("?", 1)
74 10b207d4 Oleksiy Mishchenko
      args = cgi.parse_qs(query)
75 10b207d4 Oleksiy Mishchenko
    else:
76 10b207d4 Oleksiy Mishchenko
      path = uri
77 10b207d4 Oleksiy Mishchenko
      query = None
78 10b207d4 Oleksiy Mishchenko
      args = {}
79 10b207d4 Oleksiy Mishchenko
80 691c81b7 Michael Hanselmann
    # Try to find handler for request path
81 691c81b7 Michael Hanselmann
    result = utils.FindMatch(self._connector, path)
82 10b207d4 Oleksiy Mishchenko
83 691c81b7 Michael Hanselmann
    if result is None:
84 691c81b7 Michael Hanselmann
      raise http.HttpNotFound()
85 10b207d4 Oleksiy Mishchenko
86 691c81b7 Michael Hanselmann
    (handler, groups) = result
87 10b207d4 Oleksiy Mishchenko
88 691c81b7 Michael Hanselmann
    return (handler, groups, args)
89 10b207d4 Oleksiy Mishchenko
90 10b207d4 Oleksiy Mishchenko
91 0897dc97 Adeodato Simo
def GetHandlers(node_name_pattern, instance_name_pattern,
92 4588b4bd Dimitris Aragiorgis
                group_name_pattern, network_name_pattern,
93 4588b4bd Dimitris Aragiorgis
                job_id_pattern, disk_pattern,
94 1c7fd467 Michael Hanselmann
                query_res_pattern):
95 bf968b7f Michael Hanselmann
  """Returns all supported resources and their handlers.
96 bf968b7f Michael Hanselmann

97 bf968b7f Michael Hanselmann
  """
98 2c0be3d0 Michael Hanselmann
  # Important note: New resources should always be added under /2. During a
99 2c0be3d0 Michael Hanselmann
  # discussion in July 2010 it was decided that having per-resource versions
100 2c0be3d0 Michael Hanselmann
  # is more flexible and future-compatible than versioning the whole remote
101 2c0be3d0 Michael Hanselmann
  # API.
102 bf968b7f Michael Hanselmann
  return {
103 0f945c65 Michael Hanselmann
    "/": rlib2.R_root,
104 132cdb87 Michael Hanselmann
    "/2": rlib2.R_2,
105 bf968b7f Michael Hanselmann
106 bf968b7f Michael Hanselmann
    "/version": rlib2.R_version,
107 10b207d4 Oleksiy Mishchenko
108 bf968b7f Michael Hanselmann
    "/2/nodes": rlib2.R_2_nodes,
109 d0c8c01d Iustin Pop
    re.compile(r"^/2/nodes/(%s)$" % node_name_pattern):
110 bf968b7f Michael Hanselmann
      rlib2.R_2_nodes_name,
111 42d4d8b9 Michael Hanselmann
    re.compile(r"^/2/nodes/(%s)/powercycle$" % node_name_pattern):
112 42d4d8b9 Michael Hanselmann
      rlib2.R_2_nodes_name_powercycle,
113 d0c8c01d Iustin Pop
    re.compile(r"^/2/nodes/(%s)/tags$" % node_name_pattern):
114 bf968b7f Michael Hanselmann
      rlib2.R_2_nodes_name_tags,
115 d0c8c01d Iustin Pop
    re.compile(r"^/2/nodes/(%s)/role$" % node_name_pattern):
116 bf968b7f Michael Hanselmann
      rlib2.R_2_nodes_name_role,
117 d0c8c01d Iustin Pop
    re.compile(r"^/2/nodes/(%s)/evacuate$" % node_name_pattern):
118 73452f12 Michael Hanselmann
      rlib2.R_2_nodes_name_evacuate,
119 d0c8c01d Iustin Pop
    re.compile(r"^/2/nodes/(%s)/migrate$" % node_name_pattern):
120 1c482bab Michael Hanselmann
      rlib2.R_2_nodes_name_migrate,
121 94497dd1 Michael Hanselmann
    re.compile(r"^/2/nodes/(%s)/modify$" % node_name_pattern):
122 94497dd1 Michael Hanselmann
      rlib2.R_2_nodes_name_modify,
123 d0c8c01d Iustin Pop
    re.compile(r"^/2/nodes/(%s)/storage$" % node_name_pattern):
124 7a95a954 Michael Hanselmann
      rlib2.R_2_nodes_name_storage,
125 d0c8c01d Iustin Pop
    re.compile(r"^/2/nodes/(%s)/storage/modify$" % node_name_pattern):
126 1e82bc80 Michael Hanselmann
      rlib2.R_2_nodes_name_storage_modify,
127 d0c8c01d Iustin Pop
    re.compile(r"^/2/nodes/(%s)/storage/repair$" % node_name_pattern):
128 723f4565 Michael Hanselmann
      rlib2.R_2_nodes_name_storage_repair,
129 bf968b7f Michael Hanselmann
130 bf968b7f Michael Hanselmann
    "/2/instances": rlib2.R_2_instances,
131 d0c8c01d Iustin Pop
    re.compile(r"^/2/instances/(%s)$" % instance_name_pattern):
132 bf968b7f Michael Hanselmann
      rlib2.R_2_instances_name,
133 d0c8c01d Iustin Pop
    re.compile(r"^/2/instances/(%s)/info$" % instance_name_pattern):
134 d8260842 Michael Hanselmann
      rlib2.R_2_instances_name_info,
135 d0c8c01d Iustin Pop
    re.compile(r"^/2/instances/(%s)/tags$" % instance_name_pattern):
136 bf968b7f Michael Hanselmann
      rlib2.R_2_instances_name_tags,
137 d0c8c01d Iustin Pop
    re.compile(r"^/2/instances/(%s)/reboot$" % instance_name_pattern):
138 2276aa29 Oleksiy Mishchenko
      rlib2.R_2_instances_name_reboot,
139 d0c8c01d Iustin Pop
    re.compile(r"^/2/instances/(%s)/reinstall$" % instance_name_pattern):
140 e5b7c4ca Iustin Pop
      rlib2.R_2_instances_name_reinstall,
141 d0c8c01d Iustin Pop
    re.compile(r"^/2/instances/(%s)/replace-disks$" % instance_name_pattern):
142 4c98b915 Michael Hanselmann
      rlib2.R_2_instances_name_replace_disks,
143 d0c8c01d Iustin Pop
    re.compile(r"^/2/instances/(%s)/shutdown$" % instance_name_pattern):
144 0c55c24b Oleksiy Mishchenko
      rlib2.R_2_instances_name_shutdown,
145 d0c8c01d Iustin Pop
    re.compile(r"^/2/instances/(%s)/startup$" % instance_name_pattern):
146 0c55c24b Oleksiy Mishchenko
      rlib2.R_2_instances_name_startup,
147 d0c8c01d Iustin Pop
    re.compile(r"^/2/instances/(%s)/activate-disks$" % instance_name_pattern):
148 2197b66f René Nussbaumer
      rlib2.R_2_instances_name_activate_disks,
149 d0c8c01d Iustin Pop
    re.compile(r"^/2/instances/(%s)/deactivate-disks$" % instance_name_pattern):
150 0a37de5f René Nussbaumer
      rlib2.R_2_instances_name_deactivate_disks,
151 a52978c7 Michael Hanselmann
    re.compile(r"^/2/instances/(%s)/recreate-disks$" % instance_name_pattern):
152 a52978c7 Michael Hanselmann
      rlib2.R_2_instances_name_recreate_disks,
153 d0c8c01d Iustin Pop
    re.compile(r"^/2/instances/(%s)/prepare-export$" % instance_name_pattern):
154 ebeb600f Michael Hanselmann
      rlib2.R_2_instances_name_prepare_export,
155 d0c8c01d Iustin Pop
    re.compile(r"^/2/instances/(%s)/export$" % instance_name_pattern):
156 ebeb600f Michael Hanselmann
      rlib2.R_2_instances_name_export,
157 d0c8c01d Iustin Pop
    re.compile(r"^/2/instances/(%s)/migrate$" % instance_name_pattern):
158 5823e0d2 Michael Hanselmann
      rlib2.R_2_instances_name_migrate,
159 d0c8c01d Iustin Pop
    re.compile(r"^/2/instances/(%s)/failover$" % instance_name_pattern):
160 c0a146a1 Michael Hanselmann
      rlib2.R_2_instances_name_failover,
161 d0c8c01d Iustin Pop
    re.compile(r"^/2/instances/(%s)/rename$" % instance_name_pattern):
162 d56e7dc7 Michael Hanselmann
      rlib2.R_2_instances_name_rename,
163 d0c8c01d Iustin Pop
    re.compile(r"^/2/instances/(%s)/modify$" % instance_name_pattern):
164 3882937a Michael Hanselmann
      rlib2.R_2_instances_name_modify,
165 e23881ed Michael Hanselmann
    re.compile(r"^/2/instances/(%s)/disk/(%s)/grow$" %
166 e23881ed Michael Hanselmann
               (instance_name_pattern, disk_pattern)):
167 e23881ed Michael Hanselmann
      rlib2.R_2_instances_name_disk_grow,
168 d0c8c01d Iustin Pop
    re.compile(r"^/2/instances/(%s)/console$" % instance_name_pattern):
169 b82d4c5e Michael Hanselmann
      rlib2.R_2_instances_name_console,
170 bf968b7f Michael Hanselmann
171 4588b4bd Dimitris Aragiorgis
    "/2/networks": rlib2.R_2_networks,
172 4588b4bd Dimitris Aragiorgis
    re.compile(r"^/2/networks/(%s)$" % network_name_pattern):
173 4588b4bd Dimitris Aragiorgis
      rlib2.R_2_networks_name,
174 4588b4bd Dimitris Aragiorgis
    re.compile(r"^/2/networks/(%s)/connect$" % network_name_pattern):
175 4588b4bd Dimitris Aragiorgis
      rlib2.R_2_networks_name_connect,
176 4588b4bd Dimitris Aragiorgis
    re.compile(r"^/2/networks/(%s)/disconnect$" % network_name_pattern):
177 4588b4bd Dimitris Aragiorgis
      rlib2.R_2_networks_name_disconnect,
178 6e8091f9 Dimitris Aragiorgis
    re.compile(r"^/2/networks/(%s)/modify$" % network_name_pattern):
179 6e8091f9 Dimitris Aragiorgis
      rlib2.R_2_networks_name_modify,
180 6e8091f9 Dimitris Aragiorgis
    re.compile(r"^/2/networks/(%s)/tags$" % network_name_pattern):
181 6e8091f9 Dimitris Aragiorgis
      rlib2.R_2_networks_name_tags,
182 4588b4bd Dimitris Aragiorgis
183 0897dc97 Adeodato Simo
    "/2/groups": rlib2.R_2_groups,
184 d0c8c01d Iustin Pop
    re.compile(r"^/2/groups/(%s)$" % group_name_pattern):
185 0897dc97 Adeodato Simo
      rlib2.R_2_groups_name,
186 d0c8c01d Iustin Pop
    re.compile(r"^/2/groups/(%s)/modify$" % group_name_pattern):
187 f18fab7d Adeodato Simo
      rlib2.R_2_groups_name_modify,
188 d0c8c01d Iustin Pop
    re.compile(r"^/2/groups/(%s)/rename$" % group_name_pattern):
189 0dbaa9ca Adeodato Simo
      rlib2.R_2_groups_name_rename,
190 d0c8c01d Iustin Pop
    re.compile(r"^/2/groups/(%s)/assign-nodes$" % group_name_pattern):
191 4245446f Adeodato Simo
      rlib2.R_2_groups_name_assign_nodes,
192 d0c8c01d Iustin Pop
    re.compile(r"^/2/groups/(%s)/tags$" % group_name_pattern):
193 414ebaf1 Michael Hanselmann
      rlib2.R_2_groups_name_tags,
194 0897dc97 Adeodato Simo
195 bf968b7f Michael Hanselmann
    "/2/jobs": rlib2.R_2_jobs,
196 2c0be3d0 Michael Hanselmann
    re.compile(r"^/2/jobs/(%s)$" % job_id_pattern):
197 bf968b7f Michael Hanselmann
      rlib2.R_2_jobs_id,
198 2c0be3d0 Michael Hanselmann
    re.compile(r"^/2/jobs/(%s)/wait$" % job_id_pattern):
199 793a8f7c Michael Hanselmann
      rlib2.R_2_jobs_id_wait,
200 bf968b7f Michael Hanselmann
201 4ee72287 René Nussbaumer
    "/2/instances-multi-alloc": rlib2.R_2_instances_multi_alloc,
202 bf968b7f Michael Hanselmann
    "/2/tags": rlib2.R_2_tags,
203 bf968b7f Michael Hanselmann
    "/2/info": rlib2.R_2_info,
204 bf968b7f Michael Hanselmann
    "/2/os": rlib2.R_2_os,
205 508e9b20 Michael Hanselmann
    "/2/redistribute-config": rlib2.R_2_redist_config,
206 7eac4a4d Michael Hanselmann
    "/2/features": rlib2.R_2_features,
207 62e999a5 Michael Hanselmann
    "/2/modify": rlib2.R_2_cluster_modify,
208 208a6cff Michael Hanselmann
    re.compile(r"^/2/query/(%s)$" % query_res_pattern): rlib2.R_2_query,
209 208a6cff Michael Hanselmann
    re.compile(r"^/2/query/(%s)/fields$" % query_res_pattern):
210 208a6cff Michael Hanselmann
      rlib2.R_2_query_fields,
211 bf968b7f Michael Hanselmann
    }
212 bf968b7f Michael Hanselmann
213 bf968b7f Michael Hanselmann
214 4588b4bd Dimitris Aragiorgis
CONNECTOR.update(GetHandlers(_NAME_PATTERN, _NAME_PATTERN,
215 4588b4bd Dimitris Aragiorgis
                             _NAME_PATTERN, _NAME_PATTERN,
216 1c7fd467 Michael Hanselmann
                             constants.JOB_ID_TEMPLATE, _DISK_PATTERN,
217 1c7fd467 Michael Hanselmann
                             _NAME_PATTERN))