diff --git a/.travis.yml b/.travis.yml index 88dc659..c5bd4f8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,60 +1,51 @@ language: python python: - - "2.7" -# - "3.2" -# - "3.3" -# - "3.4" - - "3.5" -# - "3.5-dev" # 3.5 development branch -# - "3.6-dev" # 3.6 development branch -# - "nightly" # currently points to 3.7-dev -# command to install dependencies -before_install: 'sudo apt-get install unzip' +- '2.7' +- '3.5' +before_install: sudo apt-get install unzip before_script: - - 'export TFVER=0.8.1' - - 'export TFURL=https://releases.hashicorp.com/terraform/' - - 'TFURL+=$TFVER' - - 'TFURL+="/terraform_"' - - 'TFURL+=$TFVER' - - 'TFURL+="_linux_amd64.zip"' - - 'wget $TFURL -O terraform_bin.zip' - - 'mkdir tf_bin' - - 'unzip terraform_bin.zip -d tf_bin' - + - export TFVER=0.8.1 + - export TFURL=https://releases.hashicorp.com/terraform/ + - TFURL+=$TFVER + - TFURL+="/terraform_" + - TFURL+=$TFVER + - TFURL+="_linux_amd64.zip" + - wget $TFURL -O terraform_bin.zip + - mkdir tf_bin + - unzip terraform_bin.zip -d tf_bin install: - - "curl https://bootstrap.pypa.io/ez_setup.py -o - | python" - - "pip install tox-travis" - - "pip install ." -# command to run tests + - curl https://bootstrap.pypa.io/ez_setup.py -o - | python + - pip install tox-travis + - pip install . script: - - "export PATH=$PATH:$PWD/tf_bin" + - export PATH=$PATH:$PWD/tf_bin - tox - branches: only: - master - develop - release/** - deploy: - # test pypi - - provider: pypi - distributions: sdist - server: https://testpypi.python.org/pypi - user: "beelit94" - password: - secure: "sWxc+p/gdq3k2WbUGNG2F4TukFNkTkvq6OPaiOvyfgWThYNk6/juRkMd8flmTbh0VGhcjFbpDLeSApb2kFhfiokYJSH1hOOcmXf8xzYH8/+R4DDEiGa5Y/pR9TBvYu4S8eJEfFUFfb1BBpapykj7o43hcaqMExBJIdVJU7aeoEAC1jQeTJh8wWwdJKHy2dNSM+6RVhk3e5+b0LfK7Bk5sU5P+YdEMj79MJU450J4OmZXWzJgvBN5/2QfVa5LrUD00nYuGuiBniz2lVevIHWjUYawUzpPsTa7F0s2WemG9YcV7U8u06xNjY9Ce3CTbxNhc7OIKq+TCkOgR3qZFXVJ8A87G+AT2iQ01VslQ4DJCxnJNTnpqojWnwf6MFL9O8ONioWYO32bhQFKOQ806ASHP4lNMRDKqx8hXtP5In7/r0SARKscv6Bas83rp+FESkKD5vWgkZJG+yx96LlwRLUhSVnVyb/nOJ++zt5RR3BvY2O4p9YAZY3Qt8TQihOdBQKnY3UXsMyNaE25+yvyNWpmyJiePRbTUd+cpLnycnqG9Ll8v6TpFXb6ahFMjlAFfJNQYlREfseClTHSRjZNxfsXGQCsJh6TZAq7jOB5hCk3q41eOUFWARxbyj8j59NBV8fSQrrGJJ9/VZKQeYiQlBB9KpK4PrnH84oeQ8i+VSbVr5w=" - on: - branch: "release/**" - tags: false - condition: $TRAVIS_PYTHON_VERSION = "3.5" - # production pypi - - provider: pypi - distributions: sdist - user: "beelit94" - password: - secure: "QhCiTLrBvw/Uzt3eiLEmvMP3uHnayVCETqEDA+2+Q9vFavqj0CHA76zqYonBFqnh0a3HFCRIVVt+6ynpZ10kpQ3tAObIw+pY39ZPnpAhOjSpFzzMdpIF9Bhv9A93ng2iSESAZPAOwktHzUwjFx0Zvl0lSYD9rutHgttGgdU2CajiUtwTUhCTjOAVdR2Gm+15H808vzKWnMaKflXxZt+fkt279mQTYAtz6eBWtZwIKry/uAJCSrPSWtbi50O0HsWRMXLXWH5Jn/BVjWSDSM92DssUDq0D+tQyp4M5nQXJ9EyAvEdsKNLx3cvNruznh2ohI2jmcoIjwFiS6+wrEmUiXkP86iyzCSqL/EbcOG0xUh3vbfYtMBp7jENgD405+3SEhPY4PlqUmc+HDtB7FUcHz4y7wGWJRGyQzNnjJ6Tv0Ajdz5mfJubWVIvHjcRqkxTVtUKt50o00xZ62M0ZzQkDTIHQEsZly0XeHAgSvNzWkmjt9BiBrZ9OkoWVkRpSrCBy/EcpDNPCTSfSzOQ0Nq1ePFjkkW1n8QWDW9Pdb+/7/P2y9E2S8CT+nXBkRQeQiO86Qf1Ireg7k9TA5VYisVZ6bEXEc9UV0mAojpSsC7zWhVlbAoltN6ZbjKmqy/wqn2QIcJemcSie0JigzKpdw7l8FPT2lCRyTKlYLpRyKXzSkNI=" - on: - branch: master - tags: false - condition: $TRAVIS_PYTHON_VERSION = "3.5" \ No newline at end of file +- provider: pypi + distributions: sdist + server: https://testpypi.python.org/pypi + user: beelit94 + password: + secure: sWxc+p/gdq3k2WbUGNG2F4TukFNkTkvq6OPaiOvyfgWThYNk6/juRkMd8flmTbh0VGhcjFbpDLeSApb2kFhfiokYJSH1hOOcmXf8xzYH8/+R4DDEiGa5Y/pR9TBvYu4S8eJEfFUFfb1BBpapykj7o43hcaqMExBJIdVJU7aeoEAC1jQeTJh8wWwdJKHy2dNSM+6RVhk3e5+b0LfK7Bk5sU5P+YdEMj79MJU450J4OmZXWzJgvBN5/2QfVa5LrUD00nYuGuiBniz2lVevIHWjUYawUzpPsTa7F0s2WemG9YcV7U8u06xNjY9Ce3CTbxNhc7OIKq+TCkOgR3qZFXVJ8A87G+AT2iQ01VslQ4DJCxnJNTnpqojWnwf6MFL9O8ONioWYO32bhQFKOQ806ASHP4lNMRDKqx8hXtP5In7/r0SARKscv6Bas83rp+FESkKD5vWgkZJG+yx96LlwRLUhSVnVyb/nOJ++zt5RR3BvY2O4p9YAZY3Qt8TQihOdBQKnY3UXsMyNaE25+yvyNWpmyJiePRbTUd+cpLnycnqG9Ll8v6TpFXb6ahFMjlAFfJNQYlREfseClTHSRjZNxfsXGQCsJh6TZAq7jOB5hCk3q41eOUFWARxbyj8j59NBV8fSQrrGJJ9/VZKQeYiQlBB9KpK4PrnH84oeQ8i+VSbVr5w= + on: + branch: release/** + tags: false + condition: $TRAVIS_PYTHON_VERSION = "3.5" +- provider: pypi + distributions: sdist + user: beelit94 + password: + secure: QhCiTLrBvw/Uzt3eiLEmvMP3uHnayVCETqEDA+2+Q9vFavqj0CHA76zqYonBFqnh0a3HFCRIVVt+6ynpZ10kpQ3tAObIw+pY39ZPnpAhOjSpFzzMdpIF9Bhv9A93ng2iSESAZPAOwktHzUwjFx0Zvl0lSYD9rutHgttGgdU2CajiUtwTUhCTjOAVdR2Gm+15H808vzKWnMaKflXxZt+fkt279mQTYAtz6eBWtZwIKry/uAJCSrPSWtbi50O0HsWRMXLXWH5Jn/BVjWSDSM92DssUDq0D+tQyp4M5nQXJ9EyAvEdsKNLx3cvNruznh2ohI2jmcoIjwFiS6+wrEmUiXkP86iyzCSqL/EbcOG0xUh3vbfYtMBp7jENgD405+3SEhPY4PlqUmc+HDtB7FUcHz4y7wGWJRGyQzNnjJ6Tv0Ajdz5mfJubWVIvHjcRqkxTVtUKt50o00xZ62M0ZzQkDTIHQEsZly0XeHAgSvNzWkmjt9BiBrZ9OkoWVkRpSrCBy/EcpDNPCTSfSzOQ0Nq1ePFjkkW1n8QWDW9Pdb+/7/P2y9E2S8CT+nXBkRQeQiO86Qf1Ireg7k9TA5VYisVZ6bEXEc9UV0mAojpSsC7zWhVlbAoltN6ZbjKmqy/wqn2QIcJemcSie0JigzKpdw7l8FPT2lCRyTKlYLpRyKXzSkNI= + on: + branch: master + tags: false + condition: $TRAVIS_PYTHON_VERSION = "3.5" +notifications: + email: + recipients: + - beelit94@gmail.com diff --git a/README.md b/README.md index 863e03f..68a6e7a 100644 --- a/README.md +++ b/README.md @@ -97,6 +97,16 @@ In python-terraform: from python_terraform import Terraform tf = terraform(working_dir='/home/test') tf.fmt(diff=True) + +# Terraform Output + +By default, stdout and stderr are captured and returned. This causes the application to appear to hang. To print terraform output in real time, provide the `capture_output` option with any value other than `None`. This will cause the output of terraform to be printed to the terminal in real time. The value of `stdout` and `stderr` below will be `None`. + + + from python_terraform import Terraform + t = Terraform() + return_code, stdout, stderr = t.(capture_output=False) + ## default values for apply/plan/destroy command, assign with following default value to make @@ -120,4 +130,4 @@ like `-no-color` and `True/False` value reserved for option like `refresh=true` - \ No newline at end of file + diff --git a/python_terraform/__init__.py b/python_terraform/__init__.py index 6ed9362..769350e 100644 --- a/python_terraform/__init__.py +++ b/python_terraform/__init__.py @@ -3,6 +3,7 @@ import subprocess import os +import sys import json import logging import tempfile @@ -202,15 +203,27 @@ class Terraform(object): if it's a flag could be used multiple times, assign list to it's value if it's a "var" variable flag, assign dictionary to it if a value is None, will skip this option + if the option 'capture_output' is passed (with any value other than + True), terraform output will be printed to stdout/stderr and + "None" will be returned as out and err. :return: ret_code, out, err """ + + capture_output = kwargs.pop('capture_output', True) + if capture_output is True: + stderr = subprocess.PIPE + stdout = subprocess.PIPE + else: + stderr = sys.stderr + stdout = sys.stdout + cmd_string = self.generate_cmd_string(cmd, *args, **kwargs) log.debug('command: {c}'.format(c=cmd_string)) working_folder = self.working_dir if self.working_dir else None - p = subprocess.Popen(cmd_string, stdout=subprocess.PIPE, - stderr=subprocess.PIPE, shell=True, + p = subprocess.Popen(cmd_string, stdout=stdout, + stderr=stderr, shell=True, cwd=working_folder) out, err = p.communicate() ret_code = p.returncode @@ -222,7 +235,10 @@ class Terraform(object): log.warn('error: {e}'.format(e=err)) self.temp_var_files.clean_up() - return ret_code, out.decode('utf-8'), err.decode('utf-8') + if capture_output is True: + return ret_code, out.decode('utf-8'), err.decode('utf-8') + else: + return ret_code, None, None def output(self, name): """ diff --git a/setup.py b/setup.py index 08d40ab..7acc100 100644 --- a/setup.py +++ b/setup.py @@ -1,7 +1,10 @@ """ This is a python module provide a wrapper of terraform command line tool """ -from setuptools import setup +try: + from setuptools import setup +except ImportError: + from distutils.core import setup dependencies = [] module_name = 'python-terraform'