Commit 3af47e13 authored by Michael Hanselmann's avatar Michael Hanselmann
Browse files

Validate RAPI resource paths

To stay consistent, RAPI resources should only use a restricted set of
characters. No uppercase, no “_”, etc. This is enforced by this patch.
Signed-off-by: default avatarMichael Hanselmann <>
Reviewed-by: default avatarIustin Pop <>
parent 4d130f34
......@@ -28,11 +28,15 @@ from ganeti import _autoconf
from ganeti import utils
from ganeti import cmdlib
from ganeti import build
from ganeti import compat
from ganeti.rapi import connector
import testutils
VALID_URI_RE = re.compile(r"^[-/a-z0-9]*$")
class TestDocs(unittest.TestCase):
"""Documentation tests"""
......@@ -68,6 +72,12 @@ class TestDocs(unittest.TestCase):
msg=("Missing documentation for hook %s/%s" %
(lucls.HTYPE, lucls.HPATH)))
def _CheckRapiResource(self, uri, fixup):
# Apply fixes before testing
for (rx, value) in fixup.items():
uri = rx.sub(value, uri)
self.assertTrue(VALID_URI_RE.match(uri), msg="Invalid URI %r" % uri)
def testRapiDocs(self):
"""Check whether all RAPI resources are documented.
......@@ -75,17 +85,26 @@ class TestDocs(unittest.TestCase):
rapidoc = self._ReadDocFile("rapi.rst")
node_name = "[node_name]"
instance_name = "[instance_name]"
group_name = "[group_name]"
job_id = "[job_id]"
disk_index = "[disk_index]"
node_name = re.escape("[node_name]")
instance_name = re.escape("[instance_name]")
group_name = re.escape("[group_name]")
job_id = re.escape("[job_id]")
disk_index = re.escape("[disk_index]")
resources = connector.GetHandlers(node_name, instance_name, group_name,
job_id, disk_index)
uri_check_fixup = {
re.compile(node_name): "node1examplecom",
re.compile(instance_name): "inst1examplecom",
re.compile(group_name): "group4440",
re.compile(job_id): "9409",
re.compile(disk_index): "123",
resources = connector.GetHandlers(re.escape(node_name),
assert compat.all(VALID_URI_RE.match(value)
for value in uri_check_fixup.values()), \
"Fixup values must be valid URIs, too"
titles = []
......@@ -105,14 +124,16 @@ class TestDocs(unittest.TestCase):
if hasattr(key, "match"):
msg="Pattern %r does not start with '^/2/'" % key.pattern)
self.assertEqual(key.pattern[-1], "$")
found = False
for title in titles:
if (title.startswith("``") and
title.endswith("``") and
found = True
if title.startswith("``") and title.endswith("``"):
uri = title[2:-2]
if key.match(uri):
self._CheckRapiResource(uri, uri_check_fixup)
found = True
if not found:
# TODO: Find better way of identifying resource
......@@ -122,7 +143,9 @@ class TestDocs(unittest.TestCase):
self.assert_(key.startswith("/2/") or key in prefix_exception,
msg="Path %r does not start with '/2/'" % key)
if ("``%s``" % key) not in titles:
if ("``%s``" % key) in titles:
self._CheckRapiResource(key, {})
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment