1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<# Copyright 2015 Open Platform for NFV Project, Inc. and its contributors
# This software is distributed under the terms and conditions of the 'Apache-2.0'
# license which can be found in the file 'LICENSE' in this package distribution
# or at 'http://www.apache.org/licenses/LICENSE-2.0'.
import os
import sys
import requests
import logging
import time
import json
os.unsetenv("http_proxy")
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
HOST = "172.18.0.11"
PORT = 38001
COMPONENT = sys.argv[2] if len(sys.argv) > 1 else "Interface"
FILENAME = sys.argv[2] if len(sys.argv) > 2 else "api.rst"
CURRENT_TIME = time.strftime("%Y/%m/%d %H:%M:%S %Z")
REVISION = time.strftime("%Y%m%d_%H%M%S_%Z")
AUTHOR = "Thomas Duval <thomas.duval@orange.com>"
logger.info("Writing to {}".format(FILENAME))
toc = (
"generic",
"models",
"policies",
"pdp",
"meta_rules",
"meta_data",
"perimeter",
"data",
"assignments",
"rules",
"authz",
)
def get_api_list():
url = "http://{}:{}/api".format(HOST, PORT)
cnx = requests.get(url)
try:
return cnx.json()
except json.decoder.JSONDecodeError:
logger.error("Error decoding JSON on {}\n{}".format(url, cnx.content))
sys.exit(1)
def analyse_description(desc):
result = ""
if not desc:
return "No description"
for line in desc.splitlines():
if line.strip().startswith(":"):
if ":request body:" in line:
result += ":request body:\n\n.. code-block:: json\n\n"
result += line.replace(":request body: ", "") + "\n\n"
elif ":return:" in line:
result += ":return:\n\n.. code-block:: json\n\n"
result += line.replace(":return: ", "") + "\n"
else:
result += line.strip() + "\n\n"
else:
result += line + "\n"
return result
def filter_and_sort(list_group_api):
results = list()
keys = list_group_api.keys()
for element in toc:
if element in keys:
results.append(element)
for element in keys:
if element not in results:
results.append(element)
return results
def main():
list_group_api = get_api_list()
_toc = filter_and_sort(list_group_api)
file_desc = open(FILENAME, "w")
length_of_title = len("Moon {component} API".format(component=COMPONENT))
file_desc.write(HEADERS.format(
component=COMPONENT,
date=CURRENT_TIME,
revision=REVISION,
title_headers="="*length_of_title,
author=AUTHOR
))
for key in _toc:
logger.info(key)
file_desc.write("{}\n".format(key))
file_desc.write("{}\n\n".format("="*len(key)))
if "description" in list_group_api[key]:
file_desc.write("{}\n\n".format(list_group_api[key]["description"]))
version = "unknown"
logger.debug(list_group_api.keys())
if "version" in list_group_api[key]:
version = list_group_api[key]["version"]
file_desc.write("Version: {}\n\n".format(version))
for api in list_group_api[key]:
logger.info("\t{}".format(api))
if api in ("description", "version"):
continue
file_desc.write("{}\n".format(api))
file_desc.write("{}\n\n".format("-" * len(api)))
file_desc.write("{}\n\n".format(list_group_api[key][api]["description"]))
file_desc.write("URLs are:\n\n")
for _url in list_group_api[key][api]["urls"]:
file_desc.write("* {}\n".format(_url))
file_desc.write("\nMethods are:\n\n")
for _method in list_group_api[key][api]["methods"]:
file_desc.write("→ {}\n".format(_method))
file_desc.write("{}\n\n".format("~"*(len(_method) + 2)))
file_desc.write("{}\n\n".format(analyse_description(list_group_api[key][api]["methods"][_method])))
HEADERS = """{title_headers}
Moon {component} API
{title_headers}
:Info: See <https://git.opnfv.org/cgit/moon/> for code.
:Author: {author}
:Date: {date}
:Revision: $Revision: {revision} $
:Description: List of the API served by the Moon {component} component
This document list all of the API connectors served by the Moon {component} component
Here are Moon API with some examples of posted data and returned data.
All requests must be prefixed with the host and port, for example: http://localhost:38001/authz/123456789/123456789/servers/list
"""
if __name__ == "__main__":
main()
|