Statistics
| Branch: | Tag: | Revision:

root / lib / rapi / connector.py @ 5a9c3f46

History | View | Annotate | Download (3.8 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 10b207d4 Oleksiy Mishchenko
import cgi
26 10b207d4 Oleksiy Mishchenko
import re
27 10b207d4 Oleksiy Mishchenko
28 a2f92677 Michael Hanselmann
from ganeti import constants
29 a2f92677 Michael Hanselmann
from ganeti import http
30 10b207d4 Oleksiy Mishchenko
31 a2f92677 Michael Hanselmann
from ganeti.rapi import baserlib
32 10b207d4 Oleksiy Mishchenko
from ganeti.rapi import rlib1
33 10b207d4 Oleksiy Mishchenko
from ganeti.rapi import rlib2
34 10b207d4 Oleksiy Mishchenko
35 a2f92677 Michael Hanselmann
# the connection map is created at the end of this file
36 10b207d4 Oleksiy Mishchenko
CONNECTOR = {}
37 10b207d4 Oleksiy Mishchenko
38 10b207d4 Oleksiy Mishchenko
39 10b207d4 Oleksiy Mishchenko
class Mapper:
40 10b207d4 Oleksiy Mishchenko
  """Map resource to method.
41 10b207d4 Oleksiy Mishchenko

42 10b207d4 Oleksiy Mishchenko
  """
43 10b207d4 Oleksiy Mishchenko
  def __init__(self, connector=CONNECTOR):
44 10b207d4 Oleksiy Mishchenko
    """Resource mapper constructor.
45 10b207d4 Oleksiy Mishchenko

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

48 10b207d4 Oleksiy Mishchenko
    """
49 10b207d4 Oleksiy Mishchenko
    self._connector = connector
50 10b207d4 Oleksiy Mishchenko
51 10b207d4 Oleksiy Mishchenko
  def getController(self, uri):
52 10b207d4 Oleksiy Mishchenko
    """Find method for a given URI.
53 10b207d4 Oleksiy Mishchenko

54 c41eea6e Iustin Pop
    @param uri: string with URI
55 10b207d4 Oleksiy Mishchenko

56 c41eea6e Iustin Pop
    @return: None if no method is found or a tuple containing
57 c41eea6e Iustin Pop
        the following fields:
58 c41eea6e Iustin Pop
            - method: name of method mapped to URI
59 c41eea6e Iustin Pop
            - items: a list of variable intems in the path
60 c41eea6e Iustin Pop
            - args: a dictionary with additional parameters from URL
61 10b207d4 Oleksiy Mishchenko

62 10b207d4 Oleksiy Mishchenko
    """
63 10b207d4 Oleksiy Mishchenko
    if '?' in uri:
64 10b207d4 Oleksiy Mishchenko
      (path, query) = uri.split('?', 1)
65 10b207d4 Oleksiy Mishchenko
      args = cgi.parse_qs(query)
66 10b207d4 Oleksiy Mishchenko
    else:
67 10b207d4 Oleksiy Mishchenko
      path = uri
68 10b207d4 Oleksiy Mishchenko
      query = None
69 10b207d4 Oleksiy Mishchenko
      args = {}
70 10b207d4 Oleksiy Mishchenko
71 10b207d4 Oleksiy Mishchenko
    result = None
72 10b207d4 Oleksiy Mishchenko
73 10b207d4 Oleksiy Mishchenko
    for key, handler in self._connector.iteritems():
74 10b207d4 Oleksiy Mishchenko
      # Regex objects
75 10b207d4 Oleksiy Mishchenko
      if hasattr(key, "match"):
76 10b207d4 Oleksiy Mishchenko
        m = key.match(path)
77 10b207d4 Oleksiy Mishchenko
        if m:
78 10b207d4 Oleksiy Mishchenko
          result = (handler, list(m.groups()), args)
79 10b207d4 Oleksiy Mishchenko
          break
80 10b207d4 Oleksiy Mishchenko
81 10b207d4 Oleksiy Mishchenko
      # String objects
82 10b207d4 Oleksiy Mishchenko
      elif key == path:
83 10b207d4 Oleksiy Mishchenko
        result = (handler, [], args)
84 10b207d4 Oleksiy Mishchenko
        break
85 10b207d4 Oleksiy Mishchenko
86 a0638838 Oleksiy Mishchenko
    if result:
87 10b207d4 Oleksiy Mishchenko
      return result
88 10b207d4 Oleksiy Mishchenko
    else:
89 84f2756e Michael Hanselmann
      raise http.HttpNotFound()
90 10b207d4 Oleksiy Mishchenko
91 10b207d4 Oleksiy Mishchenko
92 10b207d4 Oleksiy Mishchenko
class R_root(baserlib.R_Generic):
93 10b207d4 Oleksiy Mishchenko
  """/ resource.
94 10b207d4 Oleksiy Mishchenko

95 10b207d4 Oleksiy Mishchenko
  """
96 10b207d4 Oleksiy Mishchenko
  DOC_URI = "/"
97 10b207d4 Oleksiy Mishchenko
98 10b207d4 Oleksiy Mishchenko
  def GET(self):
99 10b207d4 Oleksiy Mishchenko
    """Show the list of mapped resources.
100 a2f92677 Michael Hanselmann

101 c41eea6e Iustin Pop
    @return: a dictionary with 'name' and 'uri' keys for each of them.
102 10b207d4 Oleksiy Mishchenko

103 10b207d4 Oleksiy Mishchenko
    """
104 10b207d4 Oleksiy Mishchenko
    root_pattern = re.compile('^R_([a-zA-Z0-9]+)$')
105 10b207d4 Oleksiy Mishchenko
106 10b207d4 Oleksiy Mishchenko
    rootlist = []
107 10b207d4 Oleksiy Mishchenko
    for handler in CONNECTOR.values():
108 10b207d4 Oleksiy Mishchenko
      m = root_pattern.match(handler.__name__)
109 10b207d4 Oleksiy Mishchenko
      if m:
110 10b207d4 Oleksiy Mishchenko
        name = m.group(1)
111 10b207d4 Oleksiy Mishchenko
        if name != 'root':
112 10b207d4 Oleksiy Mishchenko
          rootlist.append(name)
113 10b207d4 Oleksiy Mishchenko
114 10b207d4 Oleksiy Mishchenko
    return baserlib.BuildUriList(rootlist, "/%s")
115 10b207d4 Oleksiy Mishchenko
116 10b207d4 Oleksiy Mishchenko
117 10b207d4 Oleksiy Mishchenko
CONNECTOR.update({
118 10b207d4 Oleksiy Mishchenko
  "/": R_root,
119 10b207d4 Oleksiy Mishchenko
120 10b207d4 Oleksiy Mishchenko
  "/version": rlib1.R_version,
121 10b207d4 Oleksiy Mishchenko
122 10b207d4 Oleksiy Mishchenko
  "/tags": rlib1.R_tags,
123 10b207d4 Oleksiy Mishchenko
  "/info": rlib1.R_info,
124 10b207d4 Oleksiy Mishchenko
125 028c6b76 Oleksiy Mishchenko
  "/nodes": rlib2.R_nodes,
126 10b207d4 Oleksiy Mishchenko
  re.compile(r'^/nodes/([\w\._-]+)$'): rlib1.R_nodes_name,
127 10b207d4 Oleksiy Mishchenko
  re.compile(r'^/nodes/([\w\._-]+)/tags$'): rlib1.R_nodes_name_tags,
128 10b207d4 Oleksiy Mishchenko
129 028c6b76 Oleksiy Mishchenko
  "/instances": rlib2.R_instances,
130 10b207d4 Oleksiy Mishchenko
  re.compile(r'^/instances/([\w\._-]+)$'): rlib1.R_instances_name,
131 10b207d4 Oleksiy Mishchenko
  re.compile(r'^/instances/([\w\._-]+)/tags$'): rlib1.R_instances_name_tags,
132 10b207d4 Oleksiy Mishchenko
133 10b207d4 Oleksiy Mishchenko
  "/os": rlib1.R_os,
134 10b207d4 Oleksiy Mishchenko
135 10b207d4 Oleksiy Mishchenko
  "/2/jobs": rlib2.R_2_jobs,
136 10b207d4 Oleksiy Mishchenko
  "/2/nodes": rlib2.R_2_nodes,
137 441e7cfd Oleksiy Mishchenko
  "/2/instances": rlib2.R_2_instances,
138 441e7cfd Oleksiy Mishchenko
  re.compile(r'^/2/instances/([\w\._-]+)$'): rlib1.R_instances_name,
139 441e7cfd Oleksiy Mishchenko
  re.compile(r'^/2/instances/([\w\._-]+)/tags$'): rlib2.R_2_instances_name_tags,
140 2276aa29 Oleksiy Mishchenko
  re.compile(r'^/2/instances/([\w\._-]+)/reboot$'):
141 2276aa29 Oleksiy Mishchenko
      rlib2.R_2_instances_name_reboot,
142 0c55c24b Oleksiy Mishchenko
  re.compile(r'^/2/instances/([\w\._-]+)/shutdown$'):
143 0c55c24b Oleksiy Mishchenko
      rlib2.R_2_instances_name_shutdown,
144 0c55c24b Oleksiy Mishchenko
  re.compile(r'^/2/instances/([\w\._-]+)/startup$'):
145 0c55c24b Oleksiy Mishchenko
      rlib2.R_2_instances_name_startup,
146 10b207d4 Oleksiy Mishchenko
  re.compile(r'/2/jobs/(%s)$' % constants.JOB_ID_TEMPLATE): rlib2.R_2_jobs_id,
147 10b207d4 Oleksiy Mishchenko
  })