Skip to content

Commit

Permalink
Use the ui I/O helper to properly serialize diff outputs (#717)
Browse files Browse the repository at this point in the history
  • Loading branch information
acmcelwee authored and phobologic committed Mar 20, 2019
1 parent 7f98feb commit 599dd63
Showing 1 changed file with 25 additions and 15 deletions.
40 changes: 25 additions & 15 deletions stacker/actions/diff.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

from .base import plan, build_walker
from . import build
from ..ui import ui
from .. import exceptions
from ..util import parse_cloudformation_template
from ..status import (
Expand Down Expand Up @@ -167,9 +168,10 @@ def normalize_json(template):
return result


def print_stack_changes(stack_name, new_stack, old_stack, new_params,
def build_stack_changes(stack_name, new_stack, old_stack, new_params,
old_params):
"""Prints out the parameters (if changed) and stack diff"""
"""Builds a list of strings to represent the the parameters (if changed)
and stack diff"""
from_file = "old_%s" % (stack_name,)
to_file = "new_%s" % (stack_name,)
lines = difflib.context_diff(
Expand All @@ -178,13 +180,15 @@ def print_stack_changes(stack_name, new_stack, old_stack, new_params,
n=7) # ensure at least a few lines of context are displayed afterward

template_changes = list(lines)
log_lines = []
if not template_changes:
print("*** No changes to template ***")
log_lines.append("*** No changes to template ***")
param_diffs = diff_parameters(old_params, new_params)
if param_diffs:
print(format_params_diff(param_diffs))
log_lines.append(format_params_diff(param_diffs))
if template_changes:
print("".join(template_changes))
log_lines.append("".join(template_changes))
return log_lines


class Action(build.Action):
Expand All @@ -199,15 +203,19 @@ class Action(build.Action):
config.
"""

def _print_new_stack(self, stack, parameters):
"""Prints out the parameters & stack contents of a new stack"""
print("New template parameters:")
def _build_new_template(self, stack, parameters):
"""Constructs the parameters & contents of a new stack and returns a
list(str) representation to be output to the user
"""
log_lines = ["New template parameters:"]
for param in sorted(parameters,
key=lambda param: param['ParameterKey']):
print("%s = %s" % (param['ParameterKey'], param['ParameterValue']))
log_lines.append("%s = %s" % (param['ParameterKey'],
param['ParameterValue']))

print("\nNew template contents:")
print("".join(stack))
log_lines.append("\nNew template contents:")
log_lines.append("".join(stack))
return log_lines

def _diff_stack(self, stack, **kwargs):
"""Handles the diffing a stack in CloudFormation vs our config"""
Expand Down Expand Up @@ -241,10 +249,10 @@ def _diff_stack(self, stack, **kwargs):
new_template = stack.blueprint.rendered
new_stack = normalize_json(new_template)

print("============== Stack: %s ==============" % (stack.name,))
output = ["============== Stack: %s ==============" % (stack.name,)]
# If this is a completely new template dump our params & stack
if not old_template:
self._print_new_stack(new_stack, parameters)
output.extend(self._build_new_template(new_stack, parameters))
else:
# Diff our old & new stack/parameters
old_template = parse_cloudformation_template(old_template)
Expand All @@ -260,8 +268,9 @@ def _diff_stack(self, stack, **kwargs):
indent=4,
default=str)
)
print_stack_changes(stack.name, new_stack, old_stack, new_params,
old_params)
output.extend(build_stack_changes(stack.name, new_stack, old_stack,
new_params, old_params))
ui.info('\n' + '\n'.join(output))

stack.set_outputs(
provider.get_output_dict(provider_stack))
Expand All @@ -285,6 +294,7 @@ def run(self, concurrency=0, *args, **kwargs):
plan.execute(walker)

"""Don't ever do anything for pre_run or post_run"""

def pre_run(self, *args, **kwargs):
pass

Expand Down

0 comments on commit 599dd63

Please sign in to comment.