aboutsummaryrefslogtreecommitdiffstats
path: root/moonv4/moon_utilities/moon_utilities/get_os_apis.py
blob: dea2a878b0f7851fe92251dd9778a9b15e795d01 (plain)
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import json
import logging
import requests
import argparse

URLS = {
    "keystone": "https://api.github.com/repos/openstack/keystone/contents/api-ref/source/v3",
    "nova": "https://api.github.com/repos/openstack/nova/contents/api-ref/source",
    "neutron": "https://api.github.com/repos/openstack/neutron-lib/contents/api-ref/source/v2",
    "glance": "https://api.github.com/repos/openstack/glance/contents/api-ref/source/v2",
    "swift": "https://api.github.com/repos/openstack/swift/contents/api-ref/source",
    "cinder": "https://api.github.com/repos/openstack/cinder/contents/api-ref/source/v3",

}

logger = None

USER = ""
PASS = ""


def init():
    global logger, USER, PASS
    parser = argparse.ArgumentParser()
    parser.add_argument("--verbose", "-v", action='store_true', help="verbose mode")
    parser.add_argument("--debug", "-d", action='store_true', help="debug mode")
    parser.add_argument("--format", "-f", help="Output format (txt, json)", default="json")
    parser.add_argument("--output", "-o", help="Output filename")
    parser.add_argument("--credentials", "-c", help="Github credential filename (inside format user:pass)")
    args = parser.parse_args()

    FORMAT = '%(levelname)s %(message)s'

    if args.verbose:
        logging.basicConfig(
            format=FORMAT,
            level=logging.INFO)
    elif args.debug:
        logging.basicConfig(
            format=FORMAT,
            level=logging.DEBUG)
    else:
        logging.basicConfig(
            format=FORMAT,
            level=logging.WARNING)

    if args.credentials:
        cred = open(args.credentials).read()
        USER = cred.split(":")[0]
        PASS = cred.split(":")[1]

    logger = logging.getLogger(__name__)

    return args


def get_api_item(url):
    if USER:
        r = requests.get(url, auth=(USER, PASS))
    else:
        r = requests.get(url)
    items = []
    for line in r.text.splitlines():
        if ".. rest_method::" in line:
            items.append(line.replace(".. rest_method::", "").strip())
    logger.debug("\n\t".join(items))
    return items


def get_content(key, args):
    logger.info("Analysing {}".format(key))
    if USER:
        r = requests.get(URLS[key], auth=(USER, PASS))
    else:
        r = requests.get(URLS[key])
    data = r.json()
    results = {}
    for item in data:
        try:
            logger.debug("{} {}".format(item['name'], item['download_url']))
            if item['type'] == "file" and ".inc" in item['name']:
                results[item['name'].replace(".inc", "")] = get_api_item(item['download_url'])
        except TypeError:
            logger.error("Error with {}".format(item))
        except requests.exceptions.MissingSchema:
            logger.error("MissingSchema error {}".format(item))
    return results


def to_str(results):
    output = ""
    for key in results:
        output += "{}\n".format(key)
        for item in results[key]:
            output += "\t{}\n".format(item)
            for value in results[key][item]:
                output += "\t\t{}\n".format(value)
    return output


def save(results, args):
    if args.output:
        if args.format == 'json':
            json.dump(results, open(args.output, "w"), indent=4)
        elif args.format == 'txt':
            open(args.output, "w").write(to_str(results))
    else:
        if args.format == 'json':
            print(json.dumps(results, indent=4))
        elif args.format in ('txt', 'text'):
            print(to_str(results))


def main():
    args = init()
    results = {}
    for key in URLS:
        results[key] = get_content(key, args)
    save(results, args)

if __name__ == "__main__":
    main()