Merge "Add req.txt description of JJB install reqs"
[releng/builder.git] / scripts / jjblib.py
1 import argparse
2 import collections
3 import os
4
5 import yaml
6
7
8 def parse_jjb_args():
9     parser = argparse.ArgumentParser()
10     parser.add_argument("project", help="project")
11     parser.add_argument("-c", "--conf", help="Config file")
12     parser.add_argument("-d", "--dependencies",
13                         help=("Project dependencies\n\n"
14                               "A comma-seperated (no spaces) list of projects "
15                               "your project depends on. "
16                               "This is used to create an integration job that "
17                               "will trigger when a dependent project-merge "
18                               "job is built successfully.\n\n"
19                               "Example: aaa,controller,yangtools"))
20     parser.add_argument("-t", "--templates", help="Job templates to use")
21     parser.add_argument("-s", "--streams",
22                         help="Release streams to fill with default options")
23     parser.add_argument("-p", "--pom", help="Path to pom.xml to use in Maven "
24                                             "build (Default: pom.xml")
25     parser.add_argument("-g", "--mvn-goals", help="Maven Goals")
26     parser.add_argument("-o", "--mvn-opts", help="Maven Options")
27     parser.add_argument("-a", "--archive-artifacts",
28                         help="Comma-seperated list of patterns of artifacts "
29                              "to archive on build completion. "
30                              "See: http://ant.apache.org/manual/Types/fileset.html")  # noqa
31     parser.add_argument("-r", "--autorelease", action="store_true",
32                         help="Enable the validate-autorelease job, you "
33                              "should enable this if your project is part of "
34                              "the simultanious release.")
35     return parser.parse_args()
36
37
38 STREAM_DEFAULTS = collections.OrderedDict([
39     ("beryllium", {"branch": "master", "jdks": "openjdk8"}),
40     ("stable-lithium", {"branch": "stable/lithium", "jdks": "openjdk7"}),
41     ("stable-helium", {"branch": "stable/helium", "jdks": "openjdk7"}),
42 ])
43
44
45 def create_template_config(project_dir, args):
46     cfg_data = dict()
47
48     if args.templates:
49         cfg_data["JOB_TEMPLATES"] = args.templates
50
51     if args.streams:
52         stream_list = list()
53         for stream in args.streams.split(","):
54             stream_list.append({stream: STREAM_DEFAULTS[stream]})
55         cfg_data["STREAMS"] = stream_list
56
57     if args.pom:
58         cfg_data["POM"] = args.pom
59
60     if args.mvn_goals:
61         cfg_data["MAVEN_GOALS"] = args.mvn_goals
62
63     if args.mvn_opts:
64         cfg_data["MAVEN_OPTS"] = args.mvn_opts
65
66     if args.dependencies:
67         cfg_data["DEPENDENCIES"] = args.dependencies
68
69     if args.archive_artifacts:
70         cfg_data["ARCHIVE"] = args.archive_artifacts
71
72     if args.autorelease:
73         cfg_data["AUTORELEASE"] = args.autorelease
74
75     if cfg_data:
76         # Create project directory if it doesn't exist
77         if not os.path.exists(project_dir):
78             os.makedirs(project_dir)
79
80         print("Creating %s.cfg file" % args.project)
81         cfg_file = os.path.join(project_dir, "%s.cfg" % args.project)
82
83         with open(cfg_file, "w") as outstream:
84             outstream.write(yaml.dump(cfg_data, default_flow_style=False))
85
86
87 class Project:
88     """Represents a Gerrit Project
89
90     Attributes:
91         path(str): The full Gerrit path to a project
92         meta_project(str): The top-level project name in Gerrit
93         project(str): The subproject name or project shortname
94     """
95
96     def __init__(self, project):
97         self.path = project
98         self.meta_project = None
99         self.project = project
100
101         if project.find('/') >= 0:
102             s = project.rsplit('/', 1)
103             self.meta_project = s[0]
104             self.project = s[1]
105
106     def __str__(self):
107         return self.project