Revision bf968b7f

b/lib/rapi/connector.py
31 31
from ganeti.rapi import baserlib
32 32
from ganeti.rapi import rlib2
33 33

  
34

  
35
_NAME_PATTERN = r"[\w\._-]+"
36

  
34 37
# the connection map is created at the end of this file
35 38
CONNECTOR = {}
36 39

  
......
144 147
    return baserlib.BuildUriList(_getResources("2"), "/2/%s")
145 148

  
146 149

  
147
CONNECTOR.update({
148
  "/": R_root,
150
def GetHandlers(node_name_pattern, instance_name_pattern, job_id_pattern):
151
  """Returns all supported resources and their handlers.
152

  
153
  """
154
  return {
155
    "/": R_root,
156

  
157
    "/version": rlib2.R_version,
149 158

  
150
  "/version": rlib2.R_version,
159
    "/2": R_2,
151 160

  
152
  "/2": R_2,
153
  "/2/jobs": rlib2.R_2_jobs,
154
  "/2/nodes": rlib2.R_2_nodes,
155
  re.compile(r'^/2/nodes/([\w\._-]+)$'): rlib2.R_2_nodes_name,
156
  re.compile(r'^/2/nodes/([\w\._-]+)/tags$'): rlib2.R_2_nodes_name_tags,
157
  re.compile(r'^/2/nodes/([\w\._-]+)/role$'): rlib2.R_2_nodes_name_role,
158
  re.compile(r'^/2/nodes/([\w\._-]+)/evacuate$'):
161
    "/2/nodes": rlib2.R_2_nodes,
162
    re.compile(r'^/2/nodes/(%s)$' % node_name_pattern):
163
      rlib2.R_2_nodes_name,
164
    re.compile(r'^/2/nodes/(%s)/tags$' % node_name_pattern):
165
      rlib2.R_2_nodes_name_tags,
166
    re.compile(r'^/2/nodes/(%s)/role$' % node_name_pattern):
167
      rlib2.R_2_nodes_name_role,
168
    re.compile(r'^/2/nodes/(%s)/evacuate$' % node_name_pattern):
159 169
      rlib2.R_2_nodes_name_evacuate,
160
  re.compile(r'^/2/nodes/([\w\._-]+)/migrate$'):
170
    re.compile(r'^/2/nodes/(%s)/migrate$' % node_name_pattern):
161 171
      rlib2.R_2_nodes_name_migrate,
162
  re.compile(r'^/2/nodes/([\w\._-]+)/storage$'):
172
    re.compile(r'^/2/nodes/(%s)/storage$' % node_name_pattern):
163 173
      rlib2.R_2_nodes_name_storage,
164
  re.compile(r'^/2/nodes/([\w\._-]+)/storage/modify$'):
174
    re.compile(r'^/2/nodes/(%s)/storage/modify$' % node_name_pattern):
165 175
      rlib2.R_2_nodes_name_storage_modify,
166
  re.compile(r'^/2/nodes/([\w\._-]+)/storage/repair$'):
176
    re.compile(r'^/2/nodes/(%s)/storage/repair$' % node_name_pattern):
167 177
      rlib2.R_2_nodes_name_storage_repair,
168
  "/2/instances": rlib2.R_2_instances,
169
  re.compile(r'^/2/instances/([\w\._-]+)$'): rlib2.R_2_instances_name,
170
  re.compile(r'^/2/instances/([\w\._-]+)/info$'):
178

  
179
    "/2/instances": rlib2.R_2_instances,
180
    re.compile(r'^/2/instances/(%s)$' % instance_name_pattern):
181
      rlib2.R_2_instances_name,
182
    re.compile(r'^/2/instances/(%s)/info$' % instance_name_pattern):
171 183
      rlib2.R_2_instances_name_info,
172
  re.compile(r'^/2/instances/([\w\._-]+)/tags$'): rlib2.R_2_instances_name_tags,
173
  re.compile(r'^/2/instances/([\w\._-]+)/reboot$'):
184
    re.compile(r'^/2/instances/(%s)/tags$' % instance_name_pattern):
185
      rlib2.R_2_instances_name_tags,
186
    re.compile(r'^/2/instances/(%s)/reboot$' % instance_name_pattern):
174 187
      rlib2.R_2_instances_name_reboot,
175
  re.compile(r'^/2/instances/([\w\._-]+)/reinstall$'):
188
    re.compile(r'^/2/instances/(%s)/reinstall$' % instance_name_pattern):
176 189
      rlib2.R_2_instances_name_reinstall,
177
  re.compile(r'^/2/instances/([\w\._-]+)/replace-disks$'):
190
    re.compile(r'^/2/instances/(%s)/replace-disks$' % instance_name_pattern):
178 191
      rlib2.R_2_instances_name_replace_disks,
179
  re.compile(r'^/2/instances/([\w\._-]+)/shutdown$'):
192
    re.compile(r'^/2/instances/(%s)/shutdown$' % instance_name_pattern):
180 193
      rlib2.R_2_instances_name_shutdown,
181
  re.compile(r'^/2/instances/([\w\._-]+)/startup$'):
194
    re.compile(r'^/2/instances/(%s)/startup$' % instance_name_pattern):
182 195
      rlib2.R_2_instances_name_startup,
183
  re.compile(r'/2/jobs/(%s)$' % constants.JOB_ID_TEMPLATE): rlib2.R_2_jobs_id,
184
  "/2/tags": rlib2.R_2_tags,
185
  "/2/info": rlib2.R_2_info,
186
  "/2/os": rlib2.R_2_os,
187
  })
196

  
197
    "/2/jobs": rlib2.R_2_jobs,
198
    re.compile(r'/2/jobs/(%s)$' % job_id_pattern):
199
      rlib2.R_2_jobs_id,
200

  
201
    "/2/tags": rlib2.R_2_tags,
202
    "/2/info": rlib2.R_2_info,
203
    "/2/os": rlib2.R_2_os,
204
    }
205

  
206

  
207
CONNECTOR.update(GetHandlers(_NAME_PATTERN, _NAME_PATTERN,
208
                             constants.JOB_ID_TEMPLATE))
b/test/docs_unittest.py
26 26

  
27 27
from ganeti import utils
28 28
from ganeti import cmdlib
29
from ganeti.rapi import connector
29 30

  
30 31
import testutils
31 32

  
......
66 67
                      (lucls.HTYPE, lucls.HPATH)))
67 68

  
68 69

  
70
  def testRapiDocs(self):
71
    """Check whether all RAPI resources are documented.
72

  
73
    """
74
    rapidoc = self._ReadDocFile("rapi.rst")
75

  
76
    node_name = "[node_name]"
77
    instance_name = "[instance_name]"
78
    job_id = "[job_id]"
79

  
80
    resources = connector.GetHandlers(re.escape(node_name),
81
                                      re.escape(instance_name),
82
                                      re.escape(job_id))
83

  
84
    titles = []
85

  
86
    prevline = None
87
    for line in rapidoc.splitlines():
88
      if re.match(r"^\++$", line):
89
        titles.append(prevline)
90

  
91
      prevline = line
92

  
93
    undocumented = []
94

  
95
    for key, handler in resources.iteritems():
96
      # Regex objects
97
      if hasattr(key, "match"):
98
        found = False
99
        for title in titles:
100
          if (title.startswith("``") and
101
              title.endswith("``") and
102
              key.match(title[2:-2])):
103
            found = True
104
            break
105

  
106
        if not found:
107
          # TODO: Find better way of identifying resource
108
          undocumented.append(str(handler))
109

  
110
      elif ("``%s``" % key) not in titles:
111
        undocumented.append(key)
112

  
113
    self.failIf(undocumented,
114
                msg=("Missing RAPI resource documentation for %s" %
115
                     utils.CommaJoin(undocumented)))
116

  
117

  
69 118
if __name__ == "__main__":
70 119
  unittest.main()

Also available in: Unified diff