Add option for real time Terraform output

This commit is contained in:
Derrick Bryant 2017-03-31 11:32:47 -07:00
parent 376c71d1ea
commit 7a553c569f
2 changed files with 30 additions and 4 deletions

View file

@ -97,6 +97,16 @@ In python-terraform:
from python_terraform import Terraform from python_terraform import Terraform
tf = terraform(working_dir='/home/test') tf = terraform(working_dir='/home/test')
tf.fmt(diff=True) 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.<cmd_name>(capture_output=False)
## default values ## default values
for apply/plan/destroy command, assign with following default value to make 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`

View file

@ -3,6 +3,7 @@
import subprocess import subprocess
import os import os
import sys
import json import json
import logging import logging
import tempfile 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 flag could be used multiple times, assign list to it's value
if it's a "var" variable flag, assign dictionary to it if it's a "var" variable flag, assign dictionary to it
if a value is None, will skip this option 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 :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) cmd_string = self.generate_cmd_string(cmd, *args, **kwargs)
log.debug('command: {c}'.format(c=cmd_string)) log.debug('command: {c}'.format(c=cmd_string))
working_folder = self.working_dir if self.working_dir else None working_folder = self.working_dir if self.working_dir else None
p = subprocess.Popen(cmd_string, stdout=subprocess.PIPE, p = subprocess.Popen(cmd_string, stdout=stdout,
stderr=subprocess.PIPE, shell=True, stderr=stderr, shell=True,
cwd=working_folder) cwd=working_folder)
out, err = p.communicate() out, err = p.communicate()
ret_code = p.returncode ret_code = p.returncode
@ -222,7 +235,10 @@ class Terraform(object):
log.warn('error: {e}'.format(e=err)) log.warn('error: {e}'.format(e=err))
self.temp_var_files.clean_up() 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): def output(self, name):
""" """