pulumi/sdk/python/cmd/pulumi-language-python-exec
Sean Gillespie f625376915
Fix presentation of RunErrors (#2188)
The correct way to retrieve an exception's message in Python is to
stringify it with str.
2018-11-09 12:55:10 -08:00

75 lines
2.7 KiB
Python

#!/usr/bin/env python
# Copyright 2016-2018, Pulumi Corporation. All rights reserved.
import argparse
import asyncio
import os
import sys
import traceback
import runpy
try:
import pulumi
import pulumi.runtime
except ImportError:
sys.stderr.write("It looks like the Pulumi SDK has not been installed. Have you run pip install?")
sys.exit(1)
if __name__ == "__main__":
# Parse the arguments, program name, and optional arguments.
ap = argparse.ArgumentParser(description='Execute a Pulumi Python program')
ap.add_argument('--project', help='Set the project name')
ap.add_argument('--stack', help='Set the stack name')
ap.add_argument('--parallel', help='Run P resource operations in parallel (default=none)')
ap.add_argument('--dry_run', help='Simulate resource changes, but without making them')
ap.add_argument('--pwd', help='Change the working directory before running the program')
ap.add_argument('--monitor', help='An RPC address for the resource monitor to connect to')
ap.add_argument('--engine', help='An RPC address for the engine to connect to')
ap.add_argument('--tracing', help='A Zipkin-compatible endpoint to send tracing data to')
ap.add_argument('PROGRAM', help='The Python program to run')
ap.add_argument('ARGS', help='Arguments to pass to the program', nargs='*')
args = ap.parse_args()
# If any config variables are present, parse and set them, so subsequent accesses are fast.
config_env = pulumi.runtime.get_config_env()
for k, v in config_env.items():
pulumi.runtime.set_config(k, v)
# Configure the runtime so that the user program hooks up to Pulumi as appropriate.
pulumi.runtime.configure(
pulumi.runtime.Settings(
monitor=args.monitor,
engine=args.engine,
project=args.project,
stack=args.stack,
parallel=args.parallel,
dry_run=args.dry_run
)
)
# Finally, swap in the args, chdir if needed, and run the program as if it had been executed directly.
sys.argv = [args.PROGRAM] + args.ARGS
if not args.pwd is None:
os.chdir(args.pwd)
successful = False
loop = asyncio.get_event_loop()
try:
coro = pulumi.runtime.run_in_stack(lambda: runpy.run_path(args.PROGRAM, run_name='__main__'))
loop.run_until_complete(coro)
successful = True
except pulumi.RunError as e:
pulumi.log.error(str(e))
except Exception as e:
pulumi.log.error("Program failed with an unhandled exception:")
pulumi.log.error(traceback.format_exc())
finally:
loop.close()
sys.stdout.flush()
sys.stderr.flush()
exit_code = 0 if successful else 1
sys.exit(exit_code)