stack_master 1.7.2 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +9 -0
- data/lib/stack_master.rb +10 -6
- data/lib/stack_master/cli.rb +22 -0
- data/lib/stack_master/commands/compile.rb +27 -0
- data/lib/stack_master/commands/lint.rb +42 -0
- data/lib/stack_master/parameter_resolvers/acm_certificate.rb +37 -0
- data/lib/stack_master/version.rb +1 -1
- metadata +19 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 141acaa24c68d9cfcca1bdb9f49ab0da7312d16eeee11a61d14e45d8a7e2032a
         | 
| 4 | 
            +
              data.tar.gz: c1af824e3c84cded41092ca995cb3a2febae0ad22781ae8bda4448202602681d
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: e649d82d6a5b088d71485c4c5cae8e0b379396299bed964f4792cbffa3046f1ef6e813a7f6e8d20501a4c07f0fed24dca293587b04fb5a9450c86b182a16a66c
         | 
| 7 | 
            +
              data.tar.gz: 2495f5b12195f698f6870752eca4512ec438b4a18b41d7ee4f9696dfa5eeb2e096fa81caf964a8c8886645c7a682940fc09c420408c019c0bf3bd362be4f840e
         | 
    
        data/README.md
    CHANGED
    
    | @@ -340,6 +340,15 @@ db_username: | |
| 340 340 | 
             
              env: DB_USERNAME
         | 
| 341 341 | 
             
            ```
         | 
| 342 342 |  | 
| 343 | 
            +
            ### ACM Certificates
         | 
| 344 | 
            +
             | 
| 345 | 
            +
            Find an ACM certificate by domain name:
         | 
| 346 | 
            +
             | 
| 347 | 
            +
            ```yaml
         | 
| 348 | 
            +
            cert:
         | 
| 349 | 
            +
              acm_certificate: www.example.com
         | 
| 350 | 
            +
            ```
         | 
| 351 | 
            +
             | 
| 343 352 | 
             
            ### Custom parameter resolvers
         | 
| 344 353 |  | 
| 345 354 | 
             
            New parameter resolvers can be created in a separate gem.
         | 
    
        data/lib/stack_master.rb
    CHANGED
    
    | @@ -1,11 +1,12 @@ | |
| 1 1 | 
             
            require 'commander'
         | 
| 2 2 | 
             
            require 'yaml'
         | 
| 3 | 
            -
            require  | 
| 4 | 
            -
            require  | 
| 5 | 
            -
            require  | 
| 6 | 
            -
            require  | 
| 7 | 
            -
            require  | 
| 8 | 
            -
            require  | 
| 3 | 
            +
            require 'aws-sdk-acm'
         | 
| 4 | 
            +
            require 'aws-sdk-cloudformation'
         | 
| 5 | 
            +
            require 'aws-sdk-ec2'
         | 
| 6 | 
            +
            require 'aws-sdk-s3'
         | 
| 7 | 
            +
            require 'aws-sdk-sns'
         | 
| 8 | 
            +
            require 'aws-sdk-ssm'
         | 
| 9 | 
            +
            require 'colorize'
         | 
| 9 10 | 
             
            require 'active_support/core_ext/string'
         | 
| 10 11 | 
             
            require 'multi_json'
         | 
| 11 12 |  | 
| @@ -54,12 +55,15 @@ module StackMaster | |
| 54 55 | 
             
                autoload :Diff, 'stack_master/commands/diff'
         | 
| 55 56 | 
             
                autoload :ListStacks, 'stack_master/commands/list_stacks'
         | 
| 56 57 | 
             
                autoload :Validate, 'stack_master/commands/validate'
         | 
| 58 | 
            +
                autoload :Lint, 'stack_master/commands/lint'
         | 
| 59 | 
            +
                autoload :Compile, 'stack_master/commands/compile'
         | 
| 57 60 | 
             
                autoload :Resources, 'stack_master/commands/resources'
         | 
| 58 61 | 
             
                autoload :Delete, 'stack_master/commands/delete'
         | 
| 59 62 | 
             
                autoload :Status, 'stack_master/commands/status'
         | 
| 60 63 | 
             
              end
         | 
| 61 64 |  | 
| 62 65 | 
             
              module ParameterResolvers
         | 
| 66 | 
            +
                autoload :AcmCertificate, 'stack_master/parameter_resolvers/acm_certificate'
         | 
| 63 67 | 
             
                autoload :AmiFinder, 'stack_master/parameter_resolvers/ami_finder'
         | 
| 64 68 | 
             
                autoload :StackOutput, 'stack_master/parameter_resolvers/stack_output'
         | 
| 65 69 | 
             
                autoload :Secret, 'stack_master/parameter_resolvers/secret'
         | 
    
        data/lib/stack_master/cli.rb
    CHANGED
    
    | @@ -131,6 +131,28 @@ module StackMaster | |
| 131 131 | 
             
                    end
         | 
| 132 132 | 
             
                  end
         | 
| 133 133 |  | 
| 134 | 
            +
                  command :lint do |c|
         | 
| 135 | 
            +
                    c.syntax = 'stack_master lint [region_or_alias] [stack_name]'
         | 
| 136 | 
            +
                    c.summary = "Check the stack definition locally"
         | 
| 137 | 
            +
                    c.description = "Runs cfn-lint on the template which would be sent to AWS on apply"
         | 
| 138 | 
            +
                    c.example 'run cfn-lint on stack myapp-vpc with us-east-1 settings', 'stack_master lint us-east-1 myapp-vpc'
         | 
| 139 | 
            +
                    c.action do |args, options|
         | 
| 140 | 
            +
                      options.defaults config: default_config_file
         | 
| 141 | 
            +
                      execute_stacks_command(StackMaster::Commands::Lint, args, options)
         | 
| 142 | 
            +
                    end
         | 
| 143 | 
            +
                  end
         | 
| 144 | 
            +
             | 
| 145 | 
            +
                  command :compile do |c|
         | 
| 146 | 
            +
                    c.syntax = 'stack_master compile [region_or_alias] [stack_name]'
         | 
| 147 | 
            +
                    c.summary = "Print the compiled version of a given stack"
         | 
| 148 | 
            +
                    c.description = "Processes the stack and prints out a compiled version - same we'd send to AWS"
         | 
| 149 | 
            +
                    c.example 'print compiled stack myapp-vpc with us-east-1 settings', 'stack_master compile us-east-1 myapp-vpc'
         | 
| 150 | 
            +
                    c.action do |args, options|
         | 
| 151 | 
            +
                      options.defaults config: default_config_file
         | 
| 152 | 
            +
                      execute_stacks_command(StackMaster::Commands::Compile, args, options)
         | 
| 153 | 
            +
                    end
         | 
| 154 | 
            +
                  end
         | 
| 155 | 
            +
             | 
| 134 156 | 
             
                  command :status do |c|
         | 
| 135 157 | 
             
                    c.syntax = 'stack_master status'
         | 
| 136 158 | 
             
                    c.summary = 'Check the current status stacks.'
         | 
| @@ -0,0 +1,27 @@ | |
| 1 | 
            +
            module StackMaster
         | 
| 2 | 
            +
              module Commands
         | 
| 3 | 
            +
                class Compile
         | 
| 4 | 
            +
                  include Command
         | 
| 5 | 
            +
                  include Commander::UI
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                  def initialize(config, stack_definition, options = {})
         | 
| 8 | 
            +
                    @config = config
         | 
| 9 | 
            +
                    @stack_definition = stack_definition
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  def perform
         | 
| 13 | 
            +
                    puts(proposed_stack.template_body)
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  private
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  def stack_definition
         | 
| 19 | 
            +
                    @stack_definition ||= @config.find_stack(@region, @stack_name)
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                  def proposed_stack
         | 
| 23 | 
            +
                    @proposed_stack ||= Stack.generate(stack_definition, @config)
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
            end
         | 
| @@ -0,0 +1,42 @@ | |
| 1 | 
            +
            require 'tempfile'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module StackMaster
         | 
| 4 | 
            +
              module Commands
         | 
| 5 | 
            +
                class Lint
         | 
| 6 | 
            +
                  include Command
         | 
| 7 | 
            +
                  include Commander::UI
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  def initialize(config, stack_definition, options = {})
         | 
| 10 | 
            +
                    @config = config
         | 
| 11 | 
            +
                    @stack_definition = stack_definition
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  def perform
         | 
| 15 | 
            +
                    unless cfn_lint_available
         | 
| 16 | 
            +
                      failed! "Failed to run cfn-lint, do you have it installed and available in $PATH?"
         | 
| 17 | 
            +
                    end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                    Tempfile.open(['stack', ".#{proposed_stack.template_format}"]) do |f|
         | 
| 20 | 
            +
                      f.write(proposed_stack.template_body)
         | 
| 21 | 
            +
                      f.flush
         | 
| 22 | 
            +
                      system('cfn-lint', f.path)
         | 
| 23 | 
            +
                      puts "cfn-lint run complete"
         | 
| 24 | 
            +
                    end
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                  private
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                  def stack_definition
         | 
| 30 | 
            +
                    @stack_definition ||= @config.find_stack(@region, @stack_name)
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                  def proposed_stack
         | 
| 34 | 
            +
                    @proposed_stack ||= Stack.generate(stack_definition, @config)
         | 
| 35 | 
            +
                  end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                  def cfn_lint_available
         | 
| 38 | 
            +
                    !system('cfn-lint', '--version').nil?
         | 
| 39 | 
            +
                  end
         | 
| 40 | 
            +
                end
         | 
| 41 | 
            +
              end
         | 
| 42 | 
            +
            end
         | 
| @@ -0,0 +1,37 @@ | |
| 1 | 
            +
            module StackMaster
         | 
| 2 | 
            +
              module ParameterResolvers
         | 
| 3 | 
            +
                class AcmCertificate < Resolver
         | 
| 4 | 
            +
                  CertificateNotFound = Class.new(StandardError)
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                  def initialize(config, stack_definition)
         | 
| 7 | 
            +
                    @config = config
         | 
| 8 | 
            +
                    @stack_definition = stack_definition
         | 
| 9 | 
            +
                  end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  def resolve(domain_name)
         | 
| 12 | 
            +
                    cert_arn = find_cert_arn_by_domain_name(domain_name)
         | 
| 13 | 
            +
                    raise CertificateNotFound, "Could not find certificate #{domain_name} in #{@stack_definition.region}" unless cert_arn
         | 
| 14 | 
            +
                    cert_arn
         | 
| 15 | 
            +
                  end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                  private
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  def all_certs
         | 
| 20 | 
            +
                    certs = []
         | 
| 21 | 
            +
                    next_token = nil
         | 
| 22 | 
            +
                    client = Aws::ACM::Client.new(region: @stack_definition.region)
         | 
| 23 | 
            +
                    loop do
         | 
| 24 | 
            +
                      resp = client.list_certificates(certificate_statuses: ['ISSUED'], next_token: next_token)
         | 
| 25 | 
            +
                      certs << resp.certificate_summary_list
         | 
| 26 | 
            +
                      next_token = resp.next_token
         | 
| 27 | 
            +
                      break if next_token.nil?
         | 
| 28 | 
            +
                    end
         | 
| 29 | 
            +
                    certs.flatten
         | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  def find_cert_arn_by_domain_name(domain_name)
         | 
| 33 | 
            +
                    all_certs.map { |c| c.certificate_arn if c.domain_name == domain_name }.compact.first
         | 
| 34 | 
            +
                  end
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
              end
         | 
| 37 | 
            +
            end
         | 
    
        data/lib/stack_master/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: stack_master
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1. | 
| 4 | 
            +
              version: 1.8.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Steve Hodgkiss
         | 
| @@ -9,7 +9,7 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date: 2018-07- | 
| 12 | 
            +
            date: 2018-07-23 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: bundler
         | 
| @@ -151,6 +151,20 @@ dependencies: | |
| 151 151 | 
             
                - - ">="
         | 
| 152 152 | 
             
                  - !ruby/object:Gem::Version
         | 
| 153 153 | 
             
                    version: '0'
         | 
| 154 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 155 | 
            +
              name: aws-sdk-acm
         | 
| 156 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 157 | 
            +
                requirements:
         | 
| 158 | 
            +
                - - "~>"
         | 
| 159 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 160 | 
            +
                    version: '1'
         | 
| 161 | 
            +
              type: :runtime
         | 
| 162 | 
            +
              prerelease: false
         | 
| 163 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 164 | 
            +
                requirements:
         | 
| 165 | 
            +
                - - "~>"
         | 
| 166 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 167 | 
            +
                    version: '1'
         | 
| 154 168 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 155 169 | 
             
              name: aws-sdk-cloudformation
         | 
| 156 170 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -379,10 +393,12 @@ files: | |
| 379 393 | 
             
            - lib/stack_master/cli.rb
         | 
| 380 394 | 
             
            - lib/stack_master/command.rb
         | 
| 381 395 | 
             
            - lib/stack_master/commands/apply.rb
         | 
| 396 | 
            +
            - lib/stack_master/commands/compile.rb
         | 
| 382 397 | 
             
            - lib/stack_master/commands/delete.rb
         | 
| 383 398 | 
             
            - lib/stack_master/commands/diff.rb
         | 
| 384 399 | 
             
            - lib/stack_master/commands/events.rb
         | 
| 385 400 | 
             
            - lib/stack_master/commands/init.rb
         | 
| 401 | 
            +
            - lib/stack_master/commands/lint.rb
         | 
| 386 402 | 
             
            - lib/stack_master/commands/list_stacks.rb
         | 
| 387 403 | 
             
            - lib/stack_master/commands/outputs.rb
         | 
| 388 404 | 
             
            - lib/stack_master/commands/resources.rb
         | 
| @@ -394,6 +410,7 @@ files: | |
| 394 410 | 
             
            - lib/stack_master/paged_response_accumulator.rb
         | 
| 395 411 | 
             
            - lib/stack_master/parameter_loader.rb
         | 
| 396 412 | 
             
            - lib/stack_master/parameter_resolver.rb
         | 
| 413 | 
            +
            - lib/stack_master/parameter_resolvers/acm_certificate.rb
         | 
| 397 414 | 
             
            - lib/stack_master/parameter_resolvers/ami_finder.rb
         | 
| 398 415 | 
             
            - lib/stack_master/parameter_resolvers/env.rb
         | 
| 399 416 | 
             
            - lib/stack_master/parameter_resolvers/latest_ami.rb
         |