From 2f873523982887e08dcda1d59d6ab5ad804e96bd Mon Sep 17 00:00:00 2001 From: Daniel Farrell Date: Sat, 19 Aug 2017 10:17:07 -0400 Subject: [PATCH] Refactor package building CLI Use subparsers to get correct package building CLI behavior. Fixes issues like: * Major version should be required when using latest-snap * Download URL should be required for new-build but not latest-snap * Minor version shouldn't be accepted Also simplifies build definition-building logic that consumes CLI args. Change-Id: Ie1c71b1828fff592aec74da6e9acfdbe0ed894ee Signed-off-by: Daniel Farrell --- packages/build.py | 152 ++++++++++++++++++++++++---------------------- 1 file changed, 80 insertions(+), 72 deletions(-) diff --git a/packages/build.py b/packages/build.py index 8529006..36dbab7 100755 --- a/packages/build.py +++ b/packages/build.py @@ -1,5 +1,4 @@ #!/usr/bin/env python - ############################################################################## # Copyright (c) 2016 Daniel Farrell and Others. All rights reserved. # @@ -16,97 +15,106 @@ from rpm import build as build_rpm import vars 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 a archive URL + direct_parser.add_argument("--download_url", required=True, + help="URL to tar/zip build archive to package") + + # 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/email to build definition + build.update({"changelog_name": args.changelog_name, + "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")}) 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: + # 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": vars.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"): + # FIXME: In the process of removing minor_version, pass None for now + build.update({"download_url": vars.get_snap_url(args.major, None)}) + 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(vars.extract_version(build["download_url"])) # Karaf 3 distros use distribution-karaf-, Karaf 4 uses karaf- build.update({"distro_name_prefix": vars.get_distro_name_prefix( 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, - }) + # Update build definition with Java version required by ODL version + build.update({"java_version": vars.get_java_version( + build['version_major'])}) + + # Use package-specific helper logic to do the specified build if args.rpm: build_rpm.build_rpm(build) elif args.deb: build_deb.build_deb(build) - else: - raise ValueError("Unknown package type") -- 2.36.6