require 'sfn' module Sfn class Command # Cloudformation describe command class Describe < Command include Sfn::CommandModule::Base # information available unless(defined?(AVAILABLE_DISPLAYS)) AVAILABLE_DISPLAYS = [:resources, :outputs, :tags] end # Run the stack describe action def execute! name_required! stack_name = name_args.last root_stack = api_action! do provider.connection.stacks.get(stack_name) end if(root_stack) ([root_stack] + root_stack.nested_stacks).compact.each do |stack| ui.info "Stack description of #{ui.color(stack.name, :bold)}:" display = [].tap do |to_display| AVAILABLE_DISPLAYS.each do |display_option| if(config[display_option]) to_display << display_option end end end display = AVAILABLE_DISPLAYS.dup if display.empty? display.each do |display_method| self.send(display_method, stack) end ui.puts end else ui.fatal "Failed to find requested stack: #{ui.color(stack_name, :bold, :red)}" exit -1 end end # Display resources # # @param stack [Miasma::Models::Orchestration::Stack] def resources(stack) stack_resources = stack.resources.all.sort do |x, y| y.updated <=> x.updated end.map do |resource| Smash.new(resource.attributes) end ui.table(self) do table(:border => false) do row(:header => true) do allowed_attributes.each do |attr| column as_title(attr), :width => stack_resources.map{|r| r[attr].to_s.length}.push(as_title(attr).length).max + 2 end end stack_resources.each do |resource| row do allowed_attributes.each do |attr| column resource[attr] end end end end end.display end # Display outputs # # @param stack [Miasma::Models::Orchestration::Stack] def outputs(stack) ui.info "Outputs for stack: #{ui.color(stack.name, :bold)}" unless(stack.outputs.empty?) stack.outputs.each do |output| key, value = output.key, output.value key = snake(key).to_s.split('_').map(&:capitalize).join(' ') ui.info [' ', ui.color("#{key}:", :bold), value].join(' ') end else ui.info " #{ui.color('No outputs found')}" end end # Display tags # # @param stack [Miasma::Models::Orchestration::Stack] def tags(stack) ui.info "Tags for stack: #{ui.color(stack.name, :bold)}" unless(stack.tags.empty?) stack.tags.each do |key, value| ui.info [' ', ui.color("#{key}:", :bold), value].join(' ') end else ui.info " #{ui.color('No tags found')}" end end # @return [Array] default attributes def default_attributes %w(updated logical_id type status status_reason) end end end end