def main()

in src/pydeploy/__main__.py [0:0]


def main():
    parser = argparse.ArgumentParser(description='deploy composition', prog='pydeploy', usage='%(prog)s composition composition.json [flags]')
    parser.add_argument('name', metavar='composition', type=str, help='composition name')
    parser.add_argument('file', metavar='composition', type=str, help='composition')
    parser.add_argument('--apihost', action='store', metavar='HOST', help='API HOST')
    parser.add_argument('-i', '--insecure', action='store_true', help='bypass certificate checking')
    parser.add_argument('-u', '--auth', metavar='KEY', help='authorization KEY')
    parser.add_argument('-v', '--version', action='version', version='%(prog)s '+ composer.__version__)
    parser.add_argument('-a', '--annotation', action='append', nargs=1, help='add KEY annotation with VALUE')
    parser.add_argument('-A', '--annotation-file', action='append', nargs=1, help='add KEY annotation with FILE content')
    parser.add_argument('-w', '--overwrite',  action='store_true', help='overwrite actions if already defined')

    args = parser.parse_args()

    try:
        filename = args.file

        with open(filename, encoding='UTF-8') as f:
            composition = json.load(f)

        if 'ast' not in composition:
            raise 'Composition must have a field "ast" of type dictionary'
        if 'composition' not in composition:
            raise 'Composition must have a field "composition" of type dictionary'
        if 'version' not in composition:
            raise 'Composition must have a field "composition" of type dictionary'
        if 'actions' in composition:
            if not isinstance(composition['actions'], list):
                raise 'Optional field "actions" must be an array'

        composition['annotations'] = []

        if args.annotation is not None:
            composition['annotations'].extend([keyValue(a[0]) for a in args.annotation])

        if args.annotation is not None:
            composition['annotations'].extend([keyValueFromFile(a[0]) for a in args.annotation_file])

    except Exception as err:
        print(err)
        sys.exit(422 - 256) # Unprocessable Entity


    options = { 'ignore_certs': args.insecure }
    if args.apihost is not None:
        options['apihost'] = args.apihost
    if args.auth is not None:
        options['api_key'] = args.auth

    try:
        composition['name'] = composer.parse_action_name(args.name)
    except Exception as err:
        print(err)
        sys.exit(400 - 256) # Bad Request

    try:
        actions = conductor.openwhisk(options).compositions.deploy(composition, args.overwrite)
        names = ' '.join([n['name'] for n in actions])
        print('ok: created action'+ ('s' if len(names) > 1 else '') + '' + names)
    except Exception as err:
        print(err.error)
        sys.exit(500 - 256)