Update Neon SR3 repo links
[integration/packaging.git] / packages / build.py
index 8529006b584bbe53470e4e742a366b9a5a2ac580..3bedc6a2df735b65683bced84ca7d3f21f56cc01 100755 (executable)
@@ -1,5 +1,4 @@
 #!/usr/bin/env python
-
 ##############################################################################
 # Copyright (c) 2016 Daniel Farrell and Others.  All rights reserved.
 #
 import argparse
 import sys
 
-from deb import build as build_deb
-from rpm import build as build_rpm
-import vars
+import lib
+
+from deb import lib as deb_lib
+from rpm import lib as rpm_lib
 
 if __name__ == "__main__":
-    # Accept the version(s) of the build(s) to perform as args
-    # TODO: More docs on ArgParser and argument
-    parser = argparse.ArgumentParser(add_help=False,
-                                     conflict_handler='resolve')
-    parser._optionals.title = "Required Arguments"
-
-    package_build_group = parser.add_mutually_exclusive_group(required=True)
-    package_build_group.add_argument("--rpm", action="store_true",
-                                     help="Builds RPM package")
-    package_build_group.add_argument("--deb", action="store_true",
-                                     help="Builds DEB package")
-
-    new_build_group = parser.add_argument_group("New build")
-    new_build_group.add_argument(
-        "--download_url", help="Tarball to repackage into package")
-    new_build_group.add_argument(
-        "--sysd_commit", help="Version of ODL unitfile to package")
-    new_build_group.add_argument(
-        "--changelog_name", help="Name of person who defined package")
-    new_build_group.add_argument(
-        "--changelog_email", help="Email of person who defined package")
-
-    # Arguments needed to build RPM from latest snapshot
-    # given a stable major branch
-    latest_snap_group = parser.add_argument_group("Latest snapshot build")
-    latest_snap_group.add_argument("--build-latest-snap", action='store_true',
-                                   help="Build package from the latest snpashot")
-    latest_snap_group.add_argument("--major", help="Stable branch from which "
-                                   "to build the snapshot")
-    latest_snap_group.add_argument("--minor", help="Minor version of the "
-                                   "stable branch to build the snapshot")
-    latest_snap_group.add_argument("--sysd_commit",
-                                   help="Version of ODL unitfile to package")
-    latest_snap_group.add_argument("--changelog_name",
-                                   help="Name of person who defined package")
-    latest_snap_group.add_argument("--changelog_email",
-                                   help="Email of person who defined package")
+    # Accept a build definition via args
+    parent_parser = argparse.ArgumentParser(
+        add_help=False,
+        description="Package OpenDaylight build as RPM/deb.")
+    parent_parser._optionals.title = "Package type (required)"
+
+    # All builds require a package-type arg
+    pkg_type_group = parent_parser.add_mutually_exclusive_group(required=True)
+    pkg_type_group.add_argument("--rpm", action="store_true",
+                                help="package build as RPM")
+    pkg_type_group.add_argument("--deb", action="store_true",
+                                help="package build as deb")
+
+    # All builds accept optional changelog name/email, sysd commit args
+    opt_args_group = parent_parser.add_argument_group(
+        "Additional config (optional)")
+    opt_args_group.add_argument(
+        "--sysd_commit", help="version of ODL systemd unit file to package")
+    opt_args_group.add_argument("--changelog_name", default="Jenkins",
+                                help="name of person who defined package")
+    opt_args_group.add_argument("--changelog_email",
+                                default="jenkins-donotreply@opendaylight.org",
+                                help="email of person who defined package")
+
+    # Use subparsers to accept args specific to build location
+    subparsers = parent_parser.add_subparsers(
+        title="Build location (required)")
+
+    # Create subparser for defining builds directly from a URL
+    direct_parser = subparsers.add_parser("direct",
+                                          help="package build at URL")
+
+    direct_parser._optionals.title = "Options"
+
+    # Direct builds require an archive URL
+    direct_parser.add_argument("--download_url", required=True,
+                               help="URL to tar/zip build archive to package")
+    direct_parser.add_argument(
+        "--pkg_version", help="Override autodetected package component of RPM version (maj.min.pat-pkg)'")
+
+    # Create subparser for building latest snapshot from a given branch
+    latest_snap_parser = subparsers.add_parser(
+        "latest_snap",
+        help="package latest snapshot build of given major version")
+
+    latest_snap_parser._optionals.title = "Options"
+
+    # Latest-snapshot builds require a major version to pkg last build from
+    latest_snap_parser.add_argument(
+        "--major", required=True,
+        help="major version to package latest snapshot from")
+
     # Print help if no arguments are given
     if len(sys.argv) == 1:
-        parser.print_help()
+        parent_parser.print_help()
         sys.exit(1)
 
-    # Parse the given args
-    args = parser.parse_args()
+    # Extract passed args
+    args = parent_parser.parse_args()
 
-    # A dictionary containing essential build variables
+    # Build definition, populated below
     build = {}
 
-    # Depending on package type, create an appropriate changelog datetime
+    # Add changelog name to build definition
+    if not args.changelog_name:
+        # If empty string passed, as happens when a bash script calls this
+        # script with unset var, use default
+        build.update({"changelog_name": "Jenkins"})
+    else:
+        build.update({"changelog_name": args.changelog_name})
+
+    # Add changelog email to build definition
+    if not args.changelog_email:
+        # If empty string passed, as happens when a bash script calls this
+        # script with unset var, use default
+        build.update(
+            {"changelog_email": "jenkins-donotreply@opendaylight.org"})
+    else:
+        build.update({"changelog_email": args.changelog_email})
+
+    # Depending on pkg type, add appropriate-format changelog date to build def
     if args.rpm:
-        build.update({"changelog_date": vars.get_changelog_date("rpm")})
+        build.update({"changelog_date": lib.get_changelog_date("rpm")})
     if args.deb:
-        build.update({"changelog_date": vars.get_changelog_date("deb")})
-
-    # Check if `sysd_commit` has been passed as an arg
-    # Use latest Int/Pack repo commit hash as sysd_commit var
-    # unless passed by param
-    if not args.sysd_commit:
-        args.sysd_commit = vars.get_sysd_commit()
-
-    # If the flag `--build-latest-snap` is true, extract information
-    # from the snapshot URL using major version and minor version(optional)
-    if args.build_latest_snap:
-        if args.major:
-            build.update({'version_major': args.major})
-            if args.minor:
-                build.update({'version_minor': args.minor})
-            args.download_url = vars.get_snap_url(args.major, args.minor)
-
-    # If download_url is given, update version info
-    if args.download_url:
+        build.update({"changelog_date": lib.get_changelog_date("deb")})
+
+    # If hash of systemd unit file given add to build def, else use latest hash
+    if args.sysd_commit:
+        build.update({"sysd_commit": args.sysd_commit})
+    else:
+        build.update({"sysd_commit": lib.get_sysd_commit()})
+
+    # Argparse rules imply args.major will only be present for latest_snap
+    # builds and args.download_url will only be present for generic builds.
+    # If doing a latest-snap build, find latest build tarball URL for given
+    # major version and add to build definition. Else, add URL directly.
+    if hasattr(args, "major"):
+        build.update({"download_url": lib.get_snap_url(args.major)})
+    else:
         build.update({"download_url": args.download_url})
-        version = vars.extract_version(args.download_url)
-        build.update(version)
 
-    java_version_required = vars.get_java_version(build['version_major'])
+    # Use download_url to find pkg version, add to build def
+    build.update(lib.extract_version(build["download_url"]))
+
+    # Override automatically extracted package version with param if passed
+    if (hasattr(args, "pkg_version") and args.pkg_version is not None and
+            args.pkg_version is not ""):
+        build['pkg_version'] = args.pkg_version
 
     # Karaf 3 distros use distribution-karaf-, Karaf 4 uses karaf-
-    build.update({"distro_name_prefix": vars.get_distro_name_prefix(
+    build.update({"distro_name_prefix": lib.get_distro_name_prefix(
+        build['version_major'], build['download_url'])})
+
+    # Update build definition with Java version required by ODL version
+    build.update({"java_version": lib.get_java_version(
         build['version_major'])})
 
-    # Common parameters for all new and snapshot builds
-    build.update({"download_url": args.download_url,
-                  "sysd_commit": args.sysd_commit,
-                  "java_version": java_version_required,
-                  "changelog_name": args.changelog_name,
-                  "changelog_email": args.changelog_email,
-                  })
+    # Use package-specific helper logic to do the specified build
     if args.rpm:
-        build_rpm.build_rpm(build)
+        rpm_lib.build_rpm(build)
     elif args.deb:
-        build_deb.build_deb(build)
-    else:
-        raise ValueError("Unknown package type")
+        deb_lib.build_deb(build)