def estimate_cost_command(ctx, path): """ Estimates the cost of the template. Prints a URI to STOUT that provides an estimated cost based on the resources in the stack. This command will also attempt to open a web browser with the returned URI. """ action = 'estimate_cost' context = SceptreContext( command_path=path, project_path=ctx.obj.get("project_path"), user_variables=ctx.obj.get("user_variables"), options=ctx.obj.get("options"), output_format=ctx.obj.get("output_format") ) stack, _ = get_stack_or_stack_group(context) plan = SceptrePlan(context, action, stack.template) response = plan.execute() if response['ResponseMetadata']['HTTPStatusCode'] == 200: del response['ResponseMetadata'] click.echo("View the estimated cost at:") response = response["Url"] webbrowser.open(response, new=2) write(response + "\n", 'str')
def launch_command(ctx, path, yes): """ Launch a stack or stack_group. Launch a stack or stack_group for a given config PATH. """ context = SceptreContext(command_path=path, project_path=ctx.obj.get("project_path"), user_variables=ctx.obj.get("user_variables"), options=ctx.obj.get("options")) action = "launch" stack, stack_group = get_stack_or_stack_group(context) if stack: confirmation(action, yes, stack=path) plan = SceptrePlan(context, action, stack) response = plan.execute() if response != StackStatus.COMPLETE: exit(1) elif stack_group: confirmation(action, yes, stack_group=path) plan = SceptrePlan(context, action, stack_group) response = plan.execute() if not all(status == StackStatus.COMPLETE for status in response.values()): exit(1)
def set_policy_command(ctx, path, policy_file, built_in): """ Sets stack policy. Sets a specific stack policy for either a file or using a built-in policy. """ context = SceptreContext(command_path=path, project_path=ctx.obj.get("project_path"), user_variables=ctx.obj.get("user_variables"), options=ctx.obj.get("options")) stack, _ = get_stack_or_stack_group(context) if built_in == 'deny-all': action = 'lock' plan = SceptrePlan(context, action, stack) plan.execute() elif built_in == 'allow-all': action = 'unlock' plan = SceptrePlan(context, action, stack) plan.execute() else: action = 'set_policy' plan = SceptrePlan(context, action, stack) plan.execute(policy_file)
def delete_command(ctx, path, change_set_name, yes): """ Deletes a stack or a change set. Deletes a stack for a given config PATH. Or if CHANGE_SET_NAME is specified deletes a change set for stack in PATH. """ context = SceptreContext(command_path=path, project_path=ctx.obj.get("project_path"), user_variables=ctx.obj.get("user_variables"), options=ctx.obj.get("options")) action = "delete" stack, stack_group = get_stack_or_stack_group(context) if stack: if change_set_name: confirmation(action, yes, change_set=change_set_name, stack=path) command = 'delete_change_set' plan = SceptrePlan(context, command, stack) plan.execute(change_set_name) else: confirmation(action, yes, stack=path) plan = SceptrePlan(context, action, stack) response = plan.execute() if response != StackStatus.COMPLETE: exit(1) elif stack_group: confirmation(action, yes, stack_group=path) plan = SceptrePlan(context, action, stack_group) response = plan.execute() if not all(status == StackStatus.COMPLETE for status in response.values()): exit(1)
def delete_command(ctx, path, change_set_name, yes): """ Deletes a stack or a change set. Deletes a stack for a given config PATH. Or if CHANGE_SET_NAME is specified deletes a change set for stack in PATH. """ action = "delete" stack, stack_group = get_stack_or_stack_group(ctx, path) if stack: if change_set_name: confirmation(action, yes, change_set=change_set_name, stack=path) stack.delete_change_set(change_set_name) else: confirmation(action, yes, stack=path) response = stack.delete() if response != StackStatus.COMPLETE: exit(1) elif stack_group: confirmation(action, yes, stack_group=path) response = stack_group.delete() if not all(status == StackStatus.COMPLETE for status in response.values()): exit(1)
def status_command(ctx, path): """ Print status of stack or stack_group. Prints the stack status or the status of the stacks within a stack_group for a given config PATH. """ context = SceptreContext( command_path=path, project_path=ctx.obj.get("project_path"), user_variables=ctx.obj.get("user_variables"), options=ctx.obj.get("options"), no_colour=ctx.obj.get("no_colour"), output_format=ctx.obj.get("output_format") ) stack, stack_group = get_stack_or_stack_group(context) if stack: command = 'get_status' plan = SceptrePlan(context, command, stack) write(plan.execute(), no_colour=context.no_colour) elif stack_group: command = 'describe' plan = SceptrePlan(context, command, stack_group) write(plan.execute(), output_format=context.output_format, no_colour=context.no_colour)
def execute_command(ctx, path, change_set_name, yes): """ Executes a change set. """ stack, _ = get_stack_or_stack_group(ctx, path) confirmation("execute", yes, change_set=change_set_name, stack=path) stack.execute_change_set(change_set_name)
def generate_command(ctx, path): """ Prints the template. Prints the template used for stack in PATH. """ stack, _ = get_stack_or_stack_group(ctx, path) write(stack.template.body)
def describe_policy(ctx, path): """ Displays the stack policy used. """ stack, _ = get_stack_or_stack_group(ctx, path) response = stack.get_policy() write(response.get('StackPolicyBody', {}))
def list_change_sets(ctx, path): """ List change sets for stack. """ stack, _ = get_stack_or_stack_group(ctx, path) response = stack.list_change_sets() if response['ResponseMetadata']['HTTPStatusCode'] == 200: del response['ResponseMetadata'] write(response, ctx.obj["output_format"])
def describe_policy(ctx, path): """ Displays the stack policy used. """ stack, _ = get_stack_or_stack_group(ctx, path) action = 'get_policy' plan = SceptrePlan(path, action, stack) response = plan.execute() write(response.get('StackPolicyBody', {}))
def describe_change_set(ctx, path, change_set_name, verbose): """ Describes the change set. """ stack, _ = get_stack_or_stack_group(ctx, path) description = stack.describe_change_set(change_set_name) if not verbose: description = simplify_change_set_description(description) write(description, ctx.obj["output_format"])
def generate_command(ctx, path): """ Prints the template. Prints the template used for stack in PATH. """ stack, _ = get_stack_or_stack_group(ctx, path) action = 'generate' plan = SceptrePlan(path, action, stack.template) write(plan.execute())
def execute_command(ctx, path, change_set_name, yes): """ Executes a change set. """ stack, _ = get_stack_or_stack_group(ctx, path) confirmation("execute", yes, change_set=change_set_name, stack=path) action = 'execute_change_set' plan = SceptrePlan(path, action, stack) plan.execute(change_set_name)
def test_get_stack_or_stack_group_with_group(self): ctx = MagicMock( obj={ "sceptre_dir": sentinel.sceptre_dir, "user_variables": sentinel.user_variables }) stack, stack_group = get_stack_or_stack_group(ctx, "stack-group/dir") self.mock_ConfigReader.assert_called_once_with(sentinel.sceptre_dir, sentinel.user_variables) assert isinstance(stack_group, StackGroup) assert stack is None
def test_get_stack_or_stack_group_with_nested_stack(self): context = MagicMock(spec=SceptreContext) context.project_path = "tests/fixtures" context.command_path = "account/stack-group/region/vpc.yaml" context.user_variables = sentinel.user_variables stack, stack_group = get_stack_or_stack_group(context) self.mock_ConfigReader.assert_called_once_with( context.project_path, context.user_variables ) assert isinstance(stack, Stack) assert stack_group is None
def validate_command(ctx, path): """ Validates the template. Validates the template used for stack in PATH. """ stack, _ = get_stack_or_stack_group(ctx, path) response = stack.template.validate() if response['ResponseMetadata']['HTTPStatusCode'] == 200: del response['ResponseMetadata'] click.echo("Template is valid. Template details:\n") write(response, ctx.obj["output_format"])
def describe_change_set(ctx, path, change_set_name, verbose): """ Describes the change set. """ stack, _ = get_stack_or_stack_group(ctx, path) action = 'describe_change_set' plan = SceptrePlan(path, action, stack) description = plan.execute(change_set_name) if not verbose: description = simplify_change_set_description(description) write(description, ctx.obj["output_format"])
def list_resources(ctx, path): """ List resources for stack or stack_group. """ stack, stack_group = get_stack_or_stack_group(ctx, path) output_format = ctx.obj["output_format"] if stack: write(stack.describe_resources(), output_format) elif stack_group: write(stack_group.describe_resources(), output_format)
def update_command(ctx, path, change_set, verbose, yes): """ Update a stack. Updates a stack for a given config PATH. Or perform an update via change-set when the change-set flag is set. """ context = SceptreContext( command_path=path, project_path=ctx.obj.get("project_path"), user_variables=ctx.obj.get("user_variables"), options=ctx.obj.get("options"), output_format=ctx.obj.get("output_format") ) stack, _ = get_stack_or_stack_group(context) if change_set: action = 'create_change_set' change_set_name = "-".join(["change-set", uuid1().hex]) plan = SceptrePlan(context, action, stack) plan.execute(change_set_name) try: # Wait for change set to be created plan.action = 'wait_for_cs_completion' status = plan.execute(change_set_name) # Exit if change set fails to create if status != StackChangeSetStatus.READY: exit(1) # Describe changes plan.action = 'describe_change_set' description = plan.execute(change_set_name) if not verbose: description = simplify_change_set_description(description) write(description, context.output_format) # Execute change set if happy with changes if yes or click.confirm("Proceed with stack update?"): plan.action = 'execute_change_set' plan.execute(change_set_name) finally: # Clean up by deleting change set plan.action = 'delete_change_set' plan.execute(change_set_name) else: confirmation("update", yes, stack=path) action = 'update' plan = SceptrePlan(context, action, stack) response = plan.execute() if response != StackStatus.COMPLETE: exit(1)
def list_change_sets(ctx, path): """ List change sets for stack. """ stack, _ = get_stack_or_stack_group(ctx, path) action = 'list_change_sets' plan = SceptrePlan(path, action, stack) response = plan.execute() if response['ResponseMetadata']['HTTPStatusCode'] == 200: del response['ResponseMetadata'] write(response, ctx.obj["output_format"])
def set_policy_command(ctx, path, policy_file, built_in): """ Sets stack policy. Sets a specific stack policy for either a file or using a built-in policy. """ stack, _ = get_stack_or_stack_group(ctx, path) if built_in == 'deny-all': stack.lock() elif built_in == 'allow-all': stack.unlock() else: stack.set_policy(policy_file)
def describe_policy(ctx, path): """ Displays the stack policy used. """ context = SceptreContext(command_path=path, project_path=ctx.obj.get("project_path"), user_variables=ctx.obj.get("user_variables"), options=ctx.obj.get("options")) stack, _ = get_stack_or_stack_group(context) action = 'get_policy' plan = SceptrePlan(context, action, stack) response = plan.execute() write(response.get('StackPolicyBody', {}))
def list_resources(ctx, path): """ List resources for stack or stack_group. """ stack, stack_group = get_stack_or_stack_group(ctx, path) output_format = ctx.obj["output_format"] action = 'describe_resources' if stack: plan = SceptrePlan(path, action, stack) write(plan.execute(), output_format) elif stack_group: plan = SceptrePlan(path, action, stack_group) write(plan.execute(), output_format)
def estimate_cost_command(ctx, path): """ Estimates the cost of the template. Prints a URI to STOUT that provides an estimated cost based on the resources in the stack. This command will also attempt to open a web browser with the returned URI. """ stack, _ = get_stack_or_stack_group(ctx, path) response = stack.template.estimate_cost() if response['ResponseMetadata']['HTTPStatusCode'] == 200: del response['ResponseMetadata'] click.echo("View the estimated cost at:") response = response["Url"] webbrowser.open(response, new=2) write(response + "\n", 'str')
def execute_command(ctx, path, change_set_name, yes): """ Executes a change set. """ context = SceptreContext( command_path=path, project_path=ctx.obj.get("project_path"), user_variables=ctx.obj.get("user_variables"), options=ctx.obj.get("options") ) stack, _ = get_stack_or_stack_group(context) confirmation("execute", yes, change_set=change_set_name, stack=path) action = 'execute_change_set' plan = SceptrePlan(context, action, stack) plan.execute(change_set_name)
def describe_change_set(ctx, path, change_set_name, verbose): """ Describes the change set. """ context = SceptreContext(command_path=path, project_path=ctx.obj.get("project_path"), user_variables=ctx.obj.get("user_variables"), options=ctx.obj.get("options")) stack, _ = get_stack_or_stack_group(context) action = 'describe_change_set' plan = SceptrePlan(context, action, stack) description = plan.execute(change_set_name) if not verbose: description = simplify_change_set_description(description) write(description, context.output_format)
def status_command(ctx, path): """ Print status of stack or stack_group. Prints the stack status or the status of the stacks within a stack_group for a given config PATH. """ output_format = ctx.obj["output_format"] no_colour = ctx.obj["no_colour"] stack, stack_group = get_stack_or_stack_group(ctx, path) if stack: write(stack.get_status(), no_colour=no_colour) elif stack_group: write(stack_group.describe(), output_format=output_format, no_colour=no_colour)
def generate_command(ctx, path): """ Prints the template. Prints the template used for stack in PATH. """ context = SceptreContext( command_path=path, project_path=ctx.obj.get("project_path"), user_variables=ctx.obj.get("user_variables"), options=ctx.obj.get("options") ) stack, _ = get_stack_or_stack_group(context) action = 'generate' plan = SceptrePlan(context, action, stack.template) write(plan.execute())
def create_command(ctx, path, change_set_name, yes): """ Creates a stack or a change set. Creates a stack for a given config PATH. Or if CHANGE_SET_NAME is specified creates a change set for stack in PATH. """ action = "create" stack, _ = get_stack_or_stack_group(ctx, path) if change_set_name: confirmation(action, yes, change_set=change_set_name, stack=path) stack.create_change_set(change_set_name) else: confirmation(action, yes, stack=path) response = stack.create() if response != StackStatus.COMPLETE: exit(1)