| #!/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()) |