Example #1
0
    def parse(self):
        ''' parse cli arguments from packager '''
        parser = argparse.ArgumentParser(add_help=False, parents=[self.parser])
        cfg_file_defaults = self.parse_cfg_file(self.cfg_file)
        parser.set_defaults(**self.defaults)
        parser.set_defaults(**cfg_file_defaults['config'])
        ns_cliargs = parser.parse_args(self.unparsed_args)

        # Create log file
        ns_cliargs.logfile = self.defaults['logfile'].format(
            storedir=ns_cliargs.store_dir, id=ns_cliargs.build_id)
        if not os.path.isdir(os.path.dirname(ns_cliargs.logfile)):
            os.makedirs(os.path.dirname(ns_cliargs.logfile))
        logging.config.fileConfig(self.defaults['log_config'],
                                  defaults={
                                      'loglevel': self.defaults['loglevel'],
                                      'logfile': ns_cliargs.logfile
                                  })

        # update sku in package files
        ns_cliargs.base_package_file = [base_file.format(skuname=ns_cliargs.sku) for \
                                        base_file in Utils.get_as_list(ns_cliargs.base_package_file)]
        ns_cliargs.base_package_file = self.get_files_by_pattern(
            ns_cliargs.base_package_file, True)

        ns_cliargs.depends_package_file = [deps_file.format(skuname=ns_cliargs.sku) for \
                                           deps_file in Utils.get_as_list(ns_cliargs.depends_package_file)]
        ns_cliargs.depends_package_file = self.get_files_by_pattern(
            ns_cliargs.depends_package_file, True)

        ns_cliargs.contrail_package_file = [cont_file.format(skuname=ns_cliargs.sku) for \
                                            cont_file in Utils.get_as_list(ns_cliargs.contrail_package_file)]
        ns_cliargs.contrail_package_file = self.get_files_by_pattern(
            ns_cliargs.contrail_package_file, True)

        # validate file and dir exists
        self.is_dir_exists(ns_cliargs.cache_base_dir)
        if ns_cliargs.absolute_package_dir is not None:
            self.is_dir_exists(ns_cliargs.absolute_package_dir)
        if ns_cliargs.contrail_package_dir is not None:
            self.is_dir_exists(ns_cliargs.contrail_package_dir)
        self.is_file_exists(ns_cliargs.base_package_file)
        self.is_file_exists(ns_cliargs.depends_package_file)
        self.is_file_exists(ns_cliargs.contrail_package_file)

        # convert namespace as a dict
        self.cliargs = dict(ns_cliargs._get_kwargs())
Example #2
0
    def parse(self):
        ''' parse cli arguments from packager '''
        parser = argparse.ArgumentParser(add_help=False,
                                         parents=[self.parser])
        cfg_file_defaults = self.parse_cfg_file(self.cfg_file)
        parser.set_defaults(**self.defaults)
        parser.set_defaults(**cfg_file_defaults['config'])
        ns_cliargs = parser.parse_args(self.unparsed_args)

        # Create log file
        ns_cliargs.logfile = self.defaults['logfile'].format(storedir=ns_cliargs.store_dir,
                                                             id=ns_cliargs.build_id)
        if not os.path.isdir(os.path.dirname(ns_cliargs.logfile)):
            os.makedirs(os.path.dirname(ns_cliargs.logfile))
        logging.config.fileConfig(self.defaults['log_config'],
                                  defaults={'loglevel': self.defaults['loglevel'], 
                                            'logfile': ns_cliargs.logfile})

        # update sku in package files
        ns_cliargs.base_package_file = [base_file.format(skuname=ns_cliargs.sku) for \
                                        base_file in Utils.get_as_list(ns_cliargs.base_package_file)]
        ns_cliargs.base_package_file = self.get_files_by_pattern(ns_cliargs.base_package_file, True)

        ns_cliargs.depends_package_file = [deps_file.format(skuname=ns_cliargs.sku) for \
                                           deps_file in Utils.get_as_list(ns_cliargs.depends_package_file)]
        ns_cliargs.depends_package_file = self.get_files_by_pattern(ns_cliargs.depends_package_file, True)

        ns_cliargs.contrail_package_file = [cont_file.format(skuname=ns_cliargs.sku) for \
                                            cont_file in Utils.get_as_list(ns_cliargs.contrail_package_file)]
        ns_cliargs.contrail_package_file = self.get_files_by_pattern(ns_cliargs.contrail_package_file, True)

        # validate file and dir exists
        self.is_dir_exists(ns_cliargs.cache_base_dir)
        if ns_cliargs.absolute_package_dir is not None:
            self.is_dir_exists(ns_cliargs.absolute_package_dir)
        if ns_cliargs.contrail_package_dir is not None:
            self.is_dir_exists(ns_cliargs.contrail_package_dir)
        self.is_file_exists(ns_cliargs.base_package_file)
        self.is_file_exists(ns_cliargs.depends_package_file)
        self.is_file_exists(ns_cliargs.contrail_package_file)

        # convert namespace as a dict
        self.cliargs = dict(ns_cliargs._get_kwargs())
def main():
    args = PackagerArgParser(__doc__, VERSION, sys.argv[1:])
    args.parse()

    # Define except hook to redirect all erros to file
    sys.excepthook = lambda tp, v, tb: log.error('ERROR', exc_info=(tp,v,tb))

    log.info('Received CLI: %s' %" ".join(sys.argv))
    log.info('')
    log.info('Arguments from config file')
    log.info(args.cliargs['config'])
    args.banner(args.get_config_file_args())
    log.info('Working with Argument Set: ')
    args.banner(args.cliargs)
    log.info('')
    time.sleep(3)
    log.info('')
    start = datetime.datetime.now()

    # Packager
    platform_info = Utils.get_platform_info(args.cliargs['os_version'])
    packager = __import__('%s_packager' % platform_info['default'][0])
    packer = packager.Packager(**args.cliargs)

    # Build
    try:
        packer.ks_build()
    except:
        packer.exec_status = 1
        log.error('** Packager Failed **')
        raise
    else:
        if packer.exec_status != 0:
            sys.exit(packer.exec_status)
    finally:
        log.info('Copying available built ' \
                 'packages to (%s)' %packer.artifacts_dir)
        packer.copy_to_artifacts()
        if packer.exec_status != 0:
            log.info('*' * 78)
            log.info('Packager completed with ERRORs...')
            log.info('Reprinting ALL ERRORS...')
            log.reprint_errors()
            log.error('View detailed logs at (%s)' % args.cliargs['logfile'])
        elif args.cliargs['post_job']:
            log.info('Running Post Job')
            packer.exec_cmd(args.cliargs['post_job'])
        duration = datetime.datetime.now() - start
        log.info('Execution Duration: %s' %str(duration))
    log.info('Packaging Complete!')
Example #4
0
def main():
    args = PackagerArgParser(__doc__, VERSION, sys.argv[1:])
    args.parse()

    # Define except hook to redirect all erros to file
    sys.excepthook = lambda tp, v, tb: log.error('ERROR', exc_info=(tp, v, tb))

    log.info('Received CLI: %s' % " ".join(sys.argv))
    log.info('')
    log.info('Arguments from config file')
    log.info(args.cliargs['config'])
    args.banner(args.get_config_file_args())
    log.info('Working with Argument Set: ')
    args.banner(args.cliargs)
    log.info('')
    time.sleep(3)
    log.info('')
    start = datetime.datetime.now()

    # Packager
    platform_info = Utils.get_platform_info(args.cliargs['os_version'])
    packager = __import__('%s_packager' % platform_info['default'][0])
    packer = packager.Packager(**args.cliargs)

    # Build
    try:
        packer.ks_build()
    except:
        packer.exec_status = 1
        log.error('** Packager Failed **')
        raise
    else:
        if packer.exec_status != 0:
            sys.exit(packer.exec_status)
    finally:
        log.info('Copying available built ' \
                 'packages to (%s)' %packer.artifacts_dir)
        packer.copy_to_artifacts()
        if packer.exec_status != 0:
            log.info('*' * 78)
            log.info('Packager completed with ERRORs...')
            log.info('Reprinting ALL ERRORS...')
            log.reprint_errors()
            log.error('View detailed logs at (%s)' % args.cliargs['logfile'])
        elif args.cliargs['post_job']:
            log.info('Running Post Job')
            packer.exec_cmd(args.cliargs['post_job'])
        duration = datetime.datetime.now() - start
        log.info('Execution Duration: %s' % str(duration))
    log.info('Packaging Complete!')
    def define_args(self):
        ''' Define arguments for packager script '''
        cparser = argparse.ArgumentParser(add_help=False)
        cparser.add_argument('--config', '-c',
                             action='store',
                             default=os.path.join(SCRIPTDIR, 'config.cfg'),
                             help='Config File for the Packager')
        file_ns, rargs = cparser.parse_known_args(self.unparsed_args)
        self.cfg_file = file_ns.config

        os_parser = argparse.ArgumentParser(add_help=False)
        platform_info = Utils.get_platform_info()
        os_parser.add_argument('--os-version', '-O',
                             action='store',
                             default=platform_info['formatted'],
                             help='Specify OS Type and Version. \
                                   eg: centos64, ubuntu1204, redhatlinuxenterprise70')
        file_ns, rargs = os_parser.parse_known_args(self.unparsed_args)

        aparser = argparse.ArgumentParser(parents=[cparser, os_parser],
                                          formatter_class=argparse.RawTextHelpFormatter,
                                          description=self.desc)
        aparser.add_argument('--loglevel',
                             action='store',
                             help='set the loglevel for console output (DEBUG, WARN, ERROR)')
        aparser.add_argument('--logfile',
                             action='store',
                             help='logging file for more verbose output')
        aparser.add_argument('--log_config',
                             action='store',
                             help='file for logger config')
        aparser.add_argument('--version', '-v',
                             action='version',
                             version=self.version,
                             help='Print version and exit')
        aparser.add_argument('--build-id', '-i',
                             action='store',
                             default='Random number from 1000-9999',
                             help='Build ID of the new packages')
        aparser.add_argument('--sku',
                             action='store',
                             default='Derived from manifest sku',
                             help='Specify Contrail-SKU version')
        aparser.add_argument('--branch',
                             action='store',
                             default='from sandbox/controller/src/base/version.info',
                             help='Specify GIT branch name')
        aparser.add_argument('-p', '--package-types',
                             action='store',
                             default=None,
                             nargs='+',
                             help='One or List of package types which ' \
                                  'packager has to build\n' \
                                  'Multiple package types can be provided like \n' \
                                  '--package-types <type1> <type2> ... <typeN>')
        aparser.add_argument('--store-dir', '-s',
                             action='store',
                             default='sandbox/build/',
                             help='Directory Location to which new packages be saved')
        aparser.add_argument('--cache-base-dir', '-C',
                             action='store',
                             default='/cs-shared/builder/cache',
                             nargs='+',
                             help='Base directory location where OS and third '\
                                   'party packages are available.\n'\
                                   'packager will check files in '\
                                   '<cache_base_dir>/os-distribution/contrail-sku/. ' \
                                   'eg /cs-shared/builder/cache/ubuntu1204/grizzly/ \n' \
                                   'Multiple cache base dir can be provided like \n'\
                                   '--cache-base-dir <dir1> <dir2> <dir3> ... <dirN>')
        aparser.add_argument('--absolute-package-dir', '-a',
                             action='store',
                             default=None,
                             nargs='+',
                             help='Absolute Directory Location where OS and third '\
                                   'party packages are available\n'\
                                   'Multiple directories can be provided like \n'\
                                   '--absolute-package-dir <dir1> <dir2> <dir3> ... <dirN>')
        aparser.add_argument('--contrail-package-dir', '-P',
                             action='store',
                             default=None,
                             nargs='+',
                             help='Directory Location where pre-maked Contrail packages '\
                                   'are available \n'\
                                   'Multiple directories can be provided like\n'\
                                   '--contrail-package-dir <dir1> <dir2> <dir3> ... <dirN>')
        aparser.add_argument('--base-package-file', '-b',
                             action='store',
                             default='sandbox/tools/packaging/build/package_configs/<os>/<sku>/base*_packages.cfg',
                             nargs='+',
                             help='Config files specifying base packages info \n'\
                                  'Multiple package configs can be provided like\n'\
                                  '--base-package-file <file1> <file2> ... <fileN> ')
        aparser.add_argument('--depends-package-file', '-d',
                             action='store',
                             default='sandbox/tools/packaging/build/package_configs/<os>/<sku>/depends*_packages.cfg',
                             nargs='+',
                             help='Config files specifying dependant pacakges info\n'\
                                   'Multiple package files can be provided like \n'\
                                   '-depends-package-file <file1> <file2> <file3> ... <fileN>')
        aparser.add_argument('--contrail-package-file', '-f',
                             action='store',
                             default='sandbox/tools/packaging/build/package_configs/<os>/<sku>/contrail*_packages.cfg',
                             nargs='+',
                             help='Config files specifying Contrail packages info\n'\
                                  'Multiple package files can be provided like\n'\
                                  '--contrail-package-file <file1> <file2> <file3> ... <fileN>')
        aparser.add_argument('--make-targets', '-t',
                             action='store',
                             default=None,
                             nargs='+',
                             help='List of Contrail make targets to build \n'\
                                  'Multiple make targets can be provided like \n'\
                                  '--make-targets <target1> <target2> ... <targetN>')
        aparser.add_argument('--make-targets-file', '-T',
                             action='store',
                             default=None,
                             help='Line seperated text file containing list of make targets')
        aparser.add_argument('--fail-on-error', '-e',
                             action='store_true',
                             help='Abort Packager from continuing on first instance of failure')
        aparser.add_argument('--copy-use-hard-link', '-l',
                             action='store_true',
                             help='Use hard links instead of cp when duplicating artifacts like .tgz, .deb, and .rpm')
        aparser.add_argument('--post-job', '-j',
                             action='store',
                             default=None,
                             help='Script to execute after Packaging is successfully complete')
        aparser.add_argument('--populate-defaults',
                             action='store_true',
                             help='Populates packager arguments with default values and prints')
        aparser.parse_args(self.unparsed_args)
        self.parser = aparser
    def parse(self):
        ''' parse cli arguments from packager '''
        parser = argparse.ArgumentParser(add_help=False,
                                         parents=[self.parser])
        cfg_file_defaults = self.parse_cfg_file(self.cfg_file)
        parser.set_defaults(**self.defaults)
        parser.set_defaults(**cfg_file_defaults['config'])
        ns_cliargs = parser.parse_args(self.unparsed_args)

        # Create log file - if logfile is specified via CLI or config file,
        # the .format() will have no effect
        ns_cliargs.logfile = ns_cliargs.logfile.format(storedir=ns_cliargs.store_dir,
                                                       id=ns_cliargs.build_id)
        if not os.path.isdir(os.path.dirname(ns_cliargs.logfile)):
            os.makedirs(os.path.dirname(ns_cliargs.logfile))
        logging.config.fileConfig(ns_cliargs.log_config,
                                  defaults={'loglevel': ns_cliargs.loglevel,
                                            'logfile' : ns_cliargs.logfile})

        # If the console log level is set to debug, we will also
        # echo output of all commands run via Utils.exec_cmd()
        ns_cliargs.debug = ns_cliargs.loglevel == "DEBUG"

        # set default branch
        if ns_cliargs.branch is None:
            output = os.popen('cat %s/controller/src/base/version.info'
                                             % ns_cliargs.git_local_repo)
            ns_cliargs.branch = output.read().strip()

        # update sku in package files
        ns_cliargs.base_package_file = [base_file.format(skuname=ns_cliargs.sku,
                                       dist_dir=ns_cliargs.os_version) for \
                                           base_file in Utils.get_as_list(ns_cliargs.base_package_file)]
        ns_cliargs.base_package_file = self.get_files_by_pattern(ns_cliargs.base_package_file, False)

        ns_cliargs.depends_package_file = [deps_file.format(skuname=ns_cliargs.sku,
                                          dist_dir=ns_cliargs.os_version) for \
                                              deps_file in Utils.get_as_list(ns_cliargs.depends_package_file)]
        ns_cliargs.depends_package_file = self.get_files_by_pattern(ns_cliargs.depends_package_file, True)

        ns_cliargs.contrail_package_file = [cont_file.format(skuname=ns_cliargs.sku,
                                               dist_dir=ns_cliargs.os_version) for \
                                               cont_file in Utils.get_as_list(ns_cliargs.contrail_package_file)]
        ns_cliargs.contrail_package_file = self.get_files_by_pattern(ns_cliargs.contrail_package_file, True)

        # validate file and dir exists
        self.is_dir_exists(ns_cliargs.cache_base_dir)
        if ns_cliargs.absolute_package_dir is not None:
            self.is_dir_exists(ns_cliargs.absolute_package_dir)
        if ns_cliargs.contrail_package_dir is not None:
            self.is_dir_exists(ns_cliargs.contrail_package_dir)
        self.is_file_exists(ns_cliargs.base_package_file)
        self.is_file_exists(ns_cliargs.depends_package_file)
        self.is_file_exists(ns_cliargs.contrail_package_file)

        # convert namespace as a dict
        self.cliargs = dict(ns_cliargs._get_kwargs())
        if self.cliargs['populate_defaults']:
            log.info('Arguments from config file')
            log.info(self.cliargs['config'])
            self.banner(self.get_config_file_args())
            log.info('Populated Arguments: ')
            new_args = dict([('--%s' % key.replace('_', '-'), value) for key, value in self.cliargs.items()])
            new_args['--build-id'] = '%s (random number)' % new_args['--build-id']
            new_args['--logfile'] = '%s (based on build-id and timestamp)' % new_args['--logfile']
            self.banner(new_args)
            sys.exit(0)
    def define_args(self):
        ''' Define arguments for packager script '''
        cparser = argparse.ArgumentParser(add_help=False)
        cparser.add_argument('--config', '-c',
                             action='store',
                             default=os.path.join(SCRIPTDIR, 'config.cfg'),
                             help='Config File for the Packager')
        file_ns, rargs = cparser.parse_known_args(self.unparsed_args)
        self.cfg_file = file_ns.config

        os_parser = argparse.ArgumentParser(add_help=False)
        platform_info = Utils.get_platform_info()
        os_parser.add_argument('--os-version', '-O',
                             action='store',
                             default=platform_info['formatted'],
                             help='Specify OS Type and Version. \
                                   eg: centos64, ubuntu1204, redhatlinuxenterprise70')
        file_ns, rargs = os_parser.parse_known_args(self.unparsed_args)

        aparser = argparse.ArgumentParser(parents=[cparser, os_parser],
                                          formatter_class=argparse.ArgumentDefaultsHelpFormatter,
                                          description=self.desc)
        aparser.add_argument('--version', '-v',
                             action='version',
                             version=self.version,
                             help='Print version and exit')
        aparser.add_argument('--build-id', '-i',
                             action='store',
                             default='Random number from 1000-9999',
                             help='Build ID of the new packages')
        aparser.add_argument('--sku',
                             action='store',
                             default='Derived from manifest sku',
                             help='Specify Openstack release')
        aparser.add_argument('--branch',
                             action='store',
                             default='from sandbox/controller/src/base/version.info',
                             help='Specify GIT branch name')
        aparser.add_argument('--store-dir', '-s',
                             action='store',
                             default='sandbox/build/',
                             help='Directory Location to which new packages be saved')
        aparser.add_argument('--cache-base-dir', '-C',
                             action='store',
                             default='/cs-shared/builder/cache',
                             nargs='+',
                             help='Base directory location where OS and third\
                                   party packages are available.\
                                   packager will check files in \
                                   base_cache_dir/distribution/sku/. eg\
                                   /cs-shared/builder/cache/centos64/grizzly/')
        aparser.add_argument('--absolute-package-dir', '-a',
                             action='store',
                             default=None,
                             nargs='+',
                             help='Absolute Directory Location where OS and third\
                                   party packages are available')
        aparser.add_argument('--contrail-package-dir', '-P',
                             action='store',
                             default=None,
                             nargs='+',
                             help='Directory Location where pre-maked Contrail packages\
                                   are available')
        aparser.add_argument('--base-package-file', '-b',
                             action='store',
                             default='sandbox/tools/packaging/build/package_configs/<os>/<sku>/base*_packages.cfg',
                             nargs='+',
                             help='Config files specifying base packages info')
        aparser.add_argument('--depends-package-file', '-d',
                             action='store',
                             default='sandbox/tools/packaging/build/package_configs/<os>/<sku>/depends*_packages.cfg',
                             nargs='+',
                             help='Config files specifying dependant pacakges info')
        aparser.add_argument('--contrail-package-file', '-f',
                             action='store',
                             default='sandbox/tools/packaging/build/package_configs/<os>/<sku>/contrail*_packages.cfg',
                             nargs='+',
                             help='Config files specifying Contrail packages info')
        aparser.add_argument('--make-targets', '-t',
                             action='store',
                             default=None,
                             nargs='+',
                             help='List of Contrail make targets to build')
        aparser.add_argument('--make-targets-file', '-T',
                             action='store',
                             default=None,
                             help='Line seperated text file containing list of \
                                   make targets')
        aparser.add_argument('--fail-on-error', '-e',
                             action='store_true',
                             help='Aborts Packager from continuing when make fails')
        aparser.add_argument('--post-job', '-j',
                             action='store',
                             default=None,
                             help='Script to execute after Packaging is successfully complete')
        aparser.add_argument('--populate-defaults',
                             action='store_true',
                             help='Populates packager arguments with default values\
                                   and prints')
        aparser.parse_args(self.unparsed_args)
        self.parser = aparser
import sys
import copy
import shutil
import logging
import getpass
import tempfile
import operator
import platform
import traceback
from lxml import etree

#from utils import Utils
from libs.packager.utils import Utils

log = logging.getLogger("pkg")
PLATFORM = Utils.get_platform_info()

class MakeError(Exception):
    pass

class BasePackager(Utils):
    ''' Base class for packager methods '''
    def __init__(self, **kwargs):
        self.base_pkg_files        = self.expanduser(kwargs['base_package_file'])
        self.depends_pkg_files     = self.expanduser(kwargs['depends_package_file'])
        self.contrail_pkg_files    = self.expanduser(kwargs['contrail_package_file'])
        self.id                    = kwargs.get('build_id', 999)
        self.sku                   = kwargs.get('sku', 'grizzly')
        self.branch                = kwargs.get('branch', None)
        self.store                 = self.expanduser(kwargs['store_dir'])
        self.abs_pkg_dirs          = self.expanduser(kwargs['absolute_package_dir'])
Example #9
0
    def define_args(self):
        ''' Define arguments for packager script '''
        cparser = argparse.ArgumentParser(add_help=False)
        cparser.add_argument('--config',
                             '-c',
                             action='store',
                             default=os.path.join(SCRIPTDIR, 'config.cfg'),
                             help='Config File for the Packager')
        file_ns, rargs = cparser.parse_known_args(self.unparsed_args)
        self.cfg_file = file_ns.config

        os_parser = argparse.ArgumentParser(add_help=False)
        platform_info = Utils.get_platform_info()
        os_parser.add_argument('--os-version',
                               '-O',
                               action='store',
                               default=platform_info['formatted'],
                               help='Specify OS Type and Version. \
                                   eg: centos64, ubuntu1204, redhatlinuxenterprise70'
                               )
        file_ns, rargs = os_parser.parse_known_args(self.unparsed_args)

        aparser = argparse.ArgumentParser(
            parents=[cparser, os_parser],
            formatter_class=argparse.RawTextHelpFormatter,
            description=self.desc)
        aparser.add_argument('--version',
                             '-v',
                             action='version',
                             version=self.version,
                             help='Print version and exit')
        aparser.add_argument('--build-id',
                             '-i',
                             action='store',
                             default='Random number from 1000-9999',
                             help='Build ID of the new packages')
        aparser.add_argument('--sku',
                             action='store',
                             default='Derived from manifest sku',
                             help='Specify Contrail-SKU version')
        aparser.add_argument(
            '--branch',
            action='store',
            default='from sandbox/controller/src/base/version.info',
            help='Specify GIT branch name')
        aparser.add_argument('-p', '--package-types',
                             action='store',
                             default=None,
                             nargs='+',
                             help='One or List of package types which ' \
                                  'packager has to build\n' \
                                  'Multiple package types can be provided like \n' \
                                  '--package-types <type1> <type2> ... <typeN>')
        aparser.add_argument(
            '--store-dir',
            '-s',
            action='store',
            default='sandbox/build/',
            help='Directory Location to which new packages be saved')
        aparser.add_argument('--cache-base-dir', '-C',
                             action='store',
                             default='/cs-shared/builder/cache',
                             nargs='+',
                             help='Base directory location where OS and third '\
                                   'party packages are available.\n'\
                                   'packager will check files in '\
                                   '<cache_base_dir>/os-distribution/contrail-sku/. ' \
                                   'eg /cs-shared/builder/cache/ubuntu1204/grizzly/ \n' \
                                   'Multiple cache base dir can be provided like \n'\
                                   '--cache-base-dir <dir1> <dir2> <dir3> ... <dirN>')
        aparser.add_argument('--absolute-package-dir', '-a',
                             action='store',
                             default=None,
                             nargs='+',
                             help='Absolute Directory Location where OS and third '\
                                   'party packages are available\n'\
                                   'Multiple directories can be provided like \n'\
                                   '--absolute-package-dir <dir1> <dir2> <dir3> ... <dirN>')
        aparser.add_argument('--contrail-package-dir', '-P',
                             action='store',
                             default=None,
                             nargs='+',
                             help='Directory Location where pre-maked Contrail packages '\
                                   'are available \n'\
                                   'Multiple directories can be provided like\n'\
                                   '--contrail-package-dir <dir1> <dir2> <dir3> ... <dirN>')
        aparser.add_argument('--base-package-file', '-b',
                             action='store',
                             default='sandbox/tools/packaging/build/package_configs/<os>/<sku>/base*_packages.cfg',
                             nargs='+',
                             help='Config files specifying base packages info \n'\
                                  'Multiple package configs can be provided like\n'\
                                  '--base-package-file <file1> <file2> ... <fileN> ')
        aparser.add_argument('--depends-package-file', '-d',
                             action='store',
                             default='sandbox/tools/packaging/build/package_configs/<os>/<sku>/depends*_packages.cfg',
                             nargs='+',
                             help='Config files specifying dependant pacakges info\n'\
                                   'Multiple package files can be provided like \n'\
                                   '-depends-package-file <file1> <file2> <file3> ... <fileN>')
        aparser.add_argument('--contrail-package-file', '-f',
                             action='store',
                             default='sandbox/tools/packaging/build/package_configs/<os>/<sku>/contrail*_packages.cfg',
                             nargs='+',
                             help='Config files specifying Contrail packages info\n'\
                                  'Multiple package files can be provided like\n'\
                                  '--contrail-package-file <file1> <file2> <file3> ... <fileN>')
        aparser.add_argument('--make-targets', '-t',
                             action='store',
                             default=None,
                             nargs='+',
                             help='List of Contrail make targets to build \n'\
                                  'Multiple make targets can be provided like \n'\
                                  '--make-targets <target1> <target2> ... <targetN>')
        aparser.add_argument(
            '--make-targets-file',
            '-T',
            action='store',
            default=None,
            help='Line seperated text file containing list of make targets')
        aparser.add_argument(
            '--fail-on-error',
            '-e',
            action='store_true',
            help='Abort Packager from continuing on first instance of failure')
        aparser.add_argument(
            '--post-job',
            '-j',
            action='store',
            default=None,
            help='Script to execute after Packaging is successfully complete')
        aparser.add_argument(
            '--populate-defaults',
            action='store_true',
            help='Populates packager arguments with default values and prints')
        aparser.parse_args(self.unparsed_args)
        self.parser = aparser
Example #10
0
    def parse(self):
        ''' parse cli arguments from packager '''
        parser = argparse.ArgumentParser(add_help=False, parents=[self.parser])
        cfg_file_defaults = self.parse_cfg_file(self.cfg_file)
        parser.set_defaults(**self.defaults)
        parser.set_defaults(**cfg_file_defaults['config'])
        ns_cliargs = parser.parse_args(self.unparsed_args)

        # Create log file
        ns_cliargs.logfile = self.defaults['logfile'].format(
            storedir=ns_cliargs.store_dir, id=ns_cliargs.build_id)
        if not os.path.isdir(os.path.dirname(ns_cliargs.logfile)):
            os.makedirs(os.path.dirname(ns_cliargs.logfile))
        logging.config.fileConfig(self.defaults['log_config'],
                                  defaults={
                                      'loglevel': self.defaults['loglevel'],
                                      'logfile': ns_cliargs.logfile
                                  })

        # set default branch
        if ns_cliargs.branch is None:
            output = os.popen('cat %s/controller/src/base/version.info' %
                              ns_cliargs.git_local_repo)
            ns_cliargs.branch = output.read().strip()

        # update sku in package files
        ns_cliargs.base_package_file = [base_file.format(skuname=ns_cliargs.sku,
                                       dist_dir=ns_cliargs.os_version) for \
                                           base_file in Utils.get_as_list(ns_cliargs.base_package_file)]
        ns_cliargs.base_package_file = self.get_files_by_pattern(
            ns_cliargs.base_package_file, False)

        ns_cliargs.depends_package_file = [deps_file.format(skuname=ns_cliargs.sku,
                                          dist_dir=ns_cliargs.os_version) for \
                                              deps_file in Utils.get_as_list(ns_cliargs.depends_package_file)]
        ns_cliargs.depends_package_file = self.get_files_by_pattern(
            ns_cliargs.depends_package_file, True)

        ns_cliargs.contrail_package_file = [cont_file.format(skuname=ns_cliargs.sku,
                                               dist_dir=ns_cliargs.os_version) for \
                                               cont_file in Utils.get_as_list(ns_cliargs.contrail_package_file)]
        ns_cliargs.contrail_package_file = self.get_files_by_pattern(
            ns_cliargs.contrail_package_file, True)

        # validate file and dir exists
        self.is_dir_exists(ns_cliargs.cache_base_dir)
        if ns_cliargs.absolute_package_dir is not None:
            self.is_dir_exists(ns_cliargs.absolute_package_dir)
        if ns_cliargs.contrail_package_dir is not None:
            self.is_dir_exists(ns_cliargs.contrail_package_dir)
        self.is_file_exists(ns_cliargs.base_package_file)
        self.is_file_exists(ns_cliargs.depends_package_file)
        self.is_file_exists(ns_cliargs.contrail_package_file)

        # convert namespace as a dict
        self.cliargs = dict(ns_cliargs._get_kwargs())
        if self.cliargs['populate_defaults']:
            log.info('Arguments from config file')
            log.info(self.cliargs['config'])
            self.banner(self.get_config_file_args())
            log.info('Populated Arguments: ')
            new_args = dict([('--%s' % key.replace('_', '-'), value)
                             for key, value in self.cliargs.items()])
            new_args[
                '--build-id'] = '%s (random number)' % new_args['--build-id']
            new_args[
                '--logfile'] = '%s (based on build-id and timestamp)' % new_args[
                    '--logfile']
            self.banner(new_args)
            sys.exit(0)
Example #11
0
import sys
import copy
import shutil
import logging
import getpass
import tempfile
import operator
import platform
import traceback
from lxml import etree

#from utils import Utils
from libs.packager.utils import Utils

log = logging.getLogger("pkg")
PLATFORM = Utils.get_platform_info()


class MakeError(Exception):
    pass


class BasePackager(Utils):
    ''' Base class for packager methods '''
    def __init__(self, **kwargs):
        self.base_pkg_files = self.expanduser(kwargs['base_package_file'])
        self.depends_pkg_files = self.expanduser(
            kwargs['depends_package_file'])
        self.contrail_pkg_files = self.expanduser(
            kwargs['contrail_package_file'])
        self.id = kwargs.get('build_id', 999)