summaryrefslogtreecommitdiff
path: root/placement-api-ref/ext/validator.py
diff options
context:
space:
mode:
Diffstat (limited to 'placement-api-ref/ext/validator.py')
-rw-r--r--placement-api-ref/ext/validator.py68
1 files changed, 68 insertions, 0 deletions
diff --git a/placement-api-ref/ext/validator.py b/placement-api-ref/ext/validator.py
new file mode 100644
index 0000000000..44a4cef36a
--- /dev/null
+++ b/placement-api-ref/ext/validator.py
@@ -0,0 +1,68 @@
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+"""Test to see if docs exists for routes and methods in the placement API."""
+
+import os
+
+from nova.api.openstack.placement import handler
+
+# A humane ordering of HTTP methods for sorted output.
+ORDERED_METHODS = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE']
+DEPRECATED_METHODS = [('POST', '/resource_providers/{uuid}/inventories')]
+
+
+def _header_line(map_entry):
+ method, route = map_entry
+ line = '.. rest_method:: %s %s' % (method, route)
+ return line
+
+
+def inspect_doc(app):
+ """Load up doc_files and see if any routes are missing.
+
+ The routes are defined in handler.ROUTE_DECLARATIONS.
+ """
+ doc_files = [os.path.join(app.srcdir, file)
+ for file in os.listdir(app.srcdir) if file.endswith(".inc")]
+
+ routes = []
+ for route in sorted(handler.ROUTE_DECLARATIONS, key=len):
+ # Skip over the '' route.
+ if route:
+ for method in ORDERED_METHODS:
+ if method in handler.ROUTE_DECLARATIONS[route]:
+ routes.append((method, route))
+
+ header_lines = []
+ for map_entry in routes:
+ if map_entry not in DEPRECATED_METHODS:
+ header_lines.append(_header_line(map_entry))
+
+ content_lines = []
+ for doc_file in doc_files:
+ with open(doc_file) as doc_fh:
+ content_lines.extend(doc_fh.read().splitlines())
+
+ missing_lines = []
+ for line in header_lines:
+ if line not in content_lines:
+ missing_lines.append(line)
+
+ if missing_lines:
+ msg = ['Documentation likely missing for the following routes:', '']
+ for line in missing_lines:
+ msg.append(line)
+ raise ValueError('\n'.join(msg))
+
+
+def setup(app):
+ app.connect('builder-inited', inspect_doc)