Blame tools/extra/packager/packager.py

Packit 534379
#!/usr/bin/env python
Packit 534379
# Copyright(c) 2017, Intel Corporation
Packit 534379
#
Packit 534379
# Redistribution  and  use  in source  and  binary  forms,  with  or  without
Packit 534379
# modification, are permitted provided that the following conditions are met:
Packit 534379
#
Packit 534379
# * Redistributions of  source code  must retain the  above copyright notice,
Packit 534379
#  this list of conditions and the following disclaimer.
Packit 534379
# * Redistributions in binary form must reproduce the above copyright notice,
Packit 534379
#  this list of conditions and the following disclaimer in the documentation
Packit 534379
#   and/or other materials provided with the distribution.
Packit 534379
# * Neither the name  of Intel Corporation  nor the names of its contributors
Packit 534379
#   may be used to  endorse or promote  products derived  from this  software
Packit 534379
#   without specific prior written permission.
Packit 534379
#
Packit 534379
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
Packit 534379
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,  BUT NOT LIMITED TO,  THE
Packit 534379
# IMPLIED WARRANTIES OF  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
Packit 534379
# ARE DISCLAIMED.  IN NO EVENT  SHALL THE COPYRIGHT OWNER  OR CONTRIBUTORS BE
Packit 534379
# LIABLE  FOR  ANY  DIRECT,  INDIRECT,  INCIDENTAL,  SPECIAL,  EXEMPLARY,  OR
Packit 534379
# CONSEQUENTIAL  DAMAGES  (INCLUDING,  BUT  NOT LIMITED  TO,  PROCUREMENT  OF
Packit 534379
# SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE,  DATA, OR PROFITS;  OR BUSINESS
Packit 534379
# INTERRUPTION)  HOWEVER CAUSED  AND ON ANY THEORY  OF LIABILITY,  WHETHER IN
Packit 534379
# CONTRACT,  STRICT LIABILITY,  OR TORT  (INCLUDING NEGLIGENCE  OR OTHERWISE)
Packit 534379
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,  EVEN IF ADVISED OF THE
Packit 534379
# POSSIBILITY OF SUCH DAMAGE.
Packit 534379
Packit 534379
import os
Packit 534379
import sys
Packit 534379
import subprocess
Packit 534379
import shutil
Packit 534379
import argparse
Packit 534379
import json
Packit 534379
import utils
Packit 534379
from afu import AFU
Packit 534379
from gbs import GBS
Packit 534379
from metadata import metadata
Packit 534379
Packit 534379
Packit 534379
PACKAGER_EXEC = "packager"
Packit 534379
DESCRIPTION = 'Intel OPAE FPGA Packager'
Packit 534379
VERSION = "@OPAE_VERSION@"
Packit 534379
Packit 534379
try:
Packit 534379
    assert sys.version_info >= (2, 7)
Packit 534379
except AssertionError:
Packit 534379
    print(DESCRIPTION + " requires Python 2 version 2.7+")
Packit 534379
    sys.exit(1)
Packit 534379
Packit 534379
USAGE = """
Packit 534379
{0}
Packit 534379
Packit 534379
{1} <cmd> [options]
Packit 534379
Packit 534379
The following values for <cmd> are currently supported:
Packit 534379
\t help - displays this message
Packit 534379
\t create-gbs - creates GBS file from RBF and Accelerator Description File
Packit 534379
\t modify-gbs - modify metadata of existing GBS file using --set-value
Packit 534379
\t gbs-info - prints information about GBS file
Packit 534379
\t get-rbf - creates RBF file by extracting RBF from GBS file
Packit 534379
Packit 534379
{1} <cmd> --h will give command specific help
Packit 534379
""".format(DESCRIPTION, PACKAGER_EXEC)
Packit 534379
Packit 534379
Packit 534379
def run_packager():
Packit 534379
    parser = argparse.ArgumentParser(usage=USAGE, add_help=False)
Packit 534379
    parser.add_argument("cmd", nargs="?")
Packit 534379
    parser.add_argument("remain_args", nargs=argparse.REMAINDER)
Packit 534379
    args = parser.parse_args(sys.argv[1:])
Packit 534379
    cmd_description = "{0} {1}".format(PACKAGER_EXEC, args.cmd)
Packit 534379
    subparser = argparse.ArgumentParser(description=cmd_description)
Packit 534379
    subparser._optionals.title = 'Options'
Packit 534379
Packit 534379
    if args.cmd == "help" or not args.cmd:
Packit 534379
        print(USAGE)
Packit 534379
Packit 534379
    elif args.cmd == "version":
Packit 534379
        if VERSION.startswith("@"):
Packit 534379
            try:
Packit 534379
                devnull = open(os.devnull, 'w')
Packit 534379
                repo = subprocess.check_output('git remote -v',
Packit 534379
                                               shell=True,
Packit 534379
                                               stderr=devnull)
Packit 534379
                version = (subprocess.check_output('git describe --tags',
Packit 534379
                                                   shell=True,
Packit 534379
                                                   stderr=devnull).split()[0]
Packit 534379
                           if "opae-sdk" in repo else "UNKNOWN REPO")
Packit 534379
            except subprocess.CalledProcessError:
Packit 534379
                version = "UNKNOWN"
Packit 534379
        else:
Packit 534379
            version = VERSION
Packit 534379
        print("{0}: version {1}".format(DESCRIPTION, version))
Packit 534379
    elif args.cmd == "create-gbs":
Packit 534379
        subparser.usage = "\n" + cmd_description + \
Packit 534379
            " --rbf=<RBF_PATH> --afu-json=<AFU_JSON_PATH>"\
Packit 534379
            " --gbs=<NAME_FOR_GBS> --set-value <key>:<value>\n"
Packit 534379
        subparser.add_argument('--rbf', required=True,
Packit 534379
                               help='RBF file (REQUIRED)')
Packit 534379
        subparser.add_argument('--afu-json', required=False,
Packit 534379
                               help='AFU JSON file that contains metadata')
Packit 534379
        subparser.add_argument('--no-metadata', default=False,
Packit 534379
                               action='store_true',
Packit 534379
                               help='Empty metadata section will be appended')
Packit 534379
        subparser.add_argument('--gbs', required=False,
Packit 534379
                               help='Output location for gbs file. '
Packit 534379
                               'Default is <rbf_name>.gbs')
Packit 534379
        subparser.add_argument('--set-value', required=False, nargs='*',
Packit 534379
                               help='set values for keys in JSON metadata as '
Packit 534379
                               '<key>:<value>. Can be followed by more than '
Packit 534379
                               'one <key>:<value> pairs.')
Packit 534379
        subargs = subparser.parse_args(args.remain_args)
Packit 534379
        afu = AFU(subargs.afu_json)
Packit 534379
        gbs_file = afu.create_gbs(subargs.rbf, subargs.gbs, subargs.set_value)
Packit 534379
        print("Wrote {0}".format(gbs_file))
Packit 534379
Packit 534379
    elif args.cmd == "modify-gbs":
Packit 534379
        subparser.usage = "\n" + cmd_description + \
Packit 534379
            " --input-gbs=<PATH_TO_GBS_TO_BE_MODIFIED>"\
Packit 534379
            " --output-gbs=<NAME_FOR_NEW_GBS> --set-value <key>:<value>\n"
Packit 534379
        subparser.add_argument('--input-gbs', required=True,
Packit 534379
                               help='Path to input gbs file')
Packit 534379
        subparser.add_argument('--output-gbs', required=False,
Packit 534379
                               help='Path to output gbs file. Will replace '
Packit 534379
                               'original file if not provided')
Packit 534379
        subparser.add_argument('--set-value', required=True, nargs='*',
Packit 534379
                               help='set values for keys in JSON metadata as '
Packit 534379
                               '<key>:<value>. Can be followed by more than '
Packit 534379
                               'one <key>:<value> pairs.')
Packit 534379
        subargs = subparser.parse_args(args.remain_args)
Packit 534379
        gbs = GBS(subargs.input_gbs)
Packit 534379
        afu = AFU.create_afu_from_gbs(gbs)
Packit 534379
        afu.update_afu_json(subargs.set_value)
Packit 534379
        afu.validate(packaging=True)
Packit 534379
        gbs.update_gbs_info(afu.afu_json)
Packit 534379
        gbs_file = gbs.write_gbs(subargs.output_gbs)
Packit 534379
        print("Wrote {0}".format(gbs_file))
Packit 534379
Packit 534379
    elif args.cmd == "package":
Packit 534379
        subparser.usage = "\n" + cmd_description + \
Packit 534379
            " --afu-json=<AFU_JSON_PATH> --rbf=<RBF_PATH>"\
Packit 534379
            " --out=<NAME_OF_PACKAGE>\n"
Packit 534379
        subparser.usage += cmd_description + \
Packit 534379
            " --afu-json=<AFU_JSON_PATH> --rbf=<RBF_PATH> --sw-dir=<SW_DIR>"\
Packit 534379
            " --doc-dir=<DOC_DIR>"
Packit 534379
        subparser.add_argument('--afu-json', required=True,
Packit 534379
                               help='AFU JSON file that contains metadata '
Packit 534379
                               '(REQUIRED)')
Packit 534379
        subparser.add_argument('--rbf', required=True,
Packit 534379
                               help='RBF file (REQUIRED)')
Packit 534379
        subparser.add_argument('--sw-dir', required=False,
Packit 534379
                               help='Location of software files to include')
Packit 534379
        subparser.add_argument('--doc-dir', required=False,
Packit 534379
                               help='Location of documentation files to '
Packit 534379
                               'include')
Packit 534379
        subparser.add_argument('--out', required=False, default="afu",
Packit 534379
                               help='Used to specify name of package')
Packit 534379
        subargs = subparser.parse_args(args.remain_args)
Packit 534379
        afu = AFU(subargs.afu_json)
Packit 534379
        afu.package(subargs.rbf, subargs.sw_dir, subargs.doc_dir, subargs.out)
Packit 534379
        print("Wrote {0}.zip".format(subargs.out))
Packit 534379
Packit 534379
    elif args.cmd == "gbs-info":
Packit 534379
        subparser.usage = "\n" + cmd_description + " --gbs=<GBS_PATH>"
Packit 534379
        subparser.add_argument('--gbs', required=True,
Packit 534379
                               help='Path to GBS file')
Packit 534379
        subargs = subparser.parse_args(args.remain_args)
Packit 534379
        gbs = GBS(subargs.gbs)
Packit 534379
        gbs.print_gbs_info()
Packit 534379
Packit 534379
    elif args.cmd == "get-rbf":
Packit 534379
        subparser.usage = "\n" + cmd_description + \
Packit 534379
            "--gbs=<GBS_PATH> --rbf=<NAME_FOR_RBF>"
Packit 534379
        subparser.add_argument('--gbs', required=True,
Packit 534379
                               help='Path to GBS file from which rbf is to be '
Packit 534379
                               'extracted')
Packit 534379
        subparser.add_argument('--rbf', required=False,
Packit 534379
                               help='Output location for rbf file. Default is '
Packit 534379
                               '<gbs_name>.rbf')
Packit 534379
        subargs = subparser.parse_args(args.remain_args)
Packit 534379
        gbs = GBS(subargs.gbs)
Packit 534379
        rbf_file = gbs.write_rbf(subargs.rbf)
Packit 534379
        print("Wrote {0}".format(rbf_file))
Packit 534379
Packit 534379
    else:
Packit 534379
        raise Exception("{0} is not a command for {1}!".format(
Packit 534379
            args.cmd, DESCRIPTION))
Packit 534379
Packit 534379
Packit 534379
def main():
Packit 534379
    try:
Packit 534379
        sys.exit(run_packager())
Packit 534379
    except Exception as e:
Packit 534379
        print("ERROR: {0}".format(e.__str__()))
Packit 534379
        sys.exit(1)
Packit 534379
Packit 534379
Packit 534379
if __name__ == '__main__':
Packit 534379
    main()