aboutsummaryrefslogtreecommitdiffstats
path: root/bootstrap/codesearch/create_config.py
blob: b881476e70eacbb7eebb342d9f65e377038ff938 (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
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""Create configuration for code search."""

import argparse
import json
import urllib.request
import sys

DEFAULT_GERRIT = "gerrit.onap.org"
API_PREFIX = "/r"
API_PROJECTS = "/projects/"

MAGIC_PREFIX = ")]}'"

CODE_LOCATION = "{path}{anchor}"
GITWEB_ANCHOR = "#l{line}"
GIT_ANCHOR = "#n{line}"

DEFAULT_POLL = 3600

def get_projects_list(gerrit):
    """Request list of all available projects from ONAP Gerrit."""
    resp = urllib.request.urlopen("https://{}{}{}".format(gerrit, API_PREFIX, API_PROJECTS))
    resp_body = resp.read()

    no_magic = resp_body[len(MAGIC_PREFIX):]
    decoded = no_magic.decode("utf-8")
    projects = json.loads(decoded)

    return projects.keys()


def create_repos_list(projects, gerrit, ssh, git, poll):
    """Create a map of all projects to their repositories' URLs."""
    gerrit_url = "https://{}{}".format(gerrit, API_PREFIX)
    git_url = "git://{}".format(git)
    gerrit_project_url_base = "{}/{{}}.git".format(gerrit_url)
    gitweb_code_url_base = "{}/gitweb?p={{}}.git;hb=HEAD;a=blob;f=".format(gerrit_url)
    git_project_url_base = "{}/{{}}.git".format(git_url)

    repos_list = {}
    for project in projects:
        project_url = gerrit_project_url_base.format(project)
        code_url = gitweb_code_url_base.format(project) + CODE_LOCATION
        anchor = GITWEB_ANCHOR

        if ssh and len(ssh) == 2:
            user, port = ssh[0], ssh[1]
            project_url = "ssh://{}@{}:{}/{}.git".format(user, gerrit, port, project)
        if git:
            code_url = "https://{}/{}/tree/".format(git, project) + CODE_LOCATION
            project_url = git_project_url_base.format(project)
            anchor = GIT_ANCHOR

        repos_list[project] = {
            "url": project_url,
            "url-pattern": {
                "base-url": code_url,
                "anchor": anchor,
                "ms-between-poll": poll * 1000
            }
        }

    return repos_list


def parse_arguments():
    """Return parsed command-line arguments."""
    parser = argparse.ArgumentParser(description=__doc__)
    group = parser.add_mutually_exclusive_group()
    parser.add_argument('--gerrit', help='Gerrit address', default=DEFAULT_GERRIT)
    group.add_argument('--ssh', help='SSH information for Gerrit access: user, port', nargs=2)
    group.add_argument('--git', help='External git address. Does not support --ssh')
    parser.add_argument('--poll-interval', help='Repositories polling interval in seconds', type=int, default=DEFAULT_POLL)

    return parser.parse_args()


def main():
    """Main entry point for the script."""
    arguments = parse_arguments()

    projects = get_projects_list(arguments.gerrit)
    repos = create_repos_list(projects, arguments.gerrit, arguments.ssh, arguments.git, arguments.poll_interval)
    config = {
        "max-concurrent-indexers": 2,
        "dbpath": "data",
        "health-check-uri": "/healthz",
        "repos": repos
    }
    print(json.dumps(config, sort_keys=True, indent=4, separators=(',', ': ')))


if __name__ == '__main__':
    sys.exit(main())