autostacker24 1.0.22 → 1.0.23
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/lib/autostacker24/stacker.rb +45 -39
- data/lib/autostacker24/stacker_tests.rb +21 -0
- metadata +3 -16
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 61080d80be23cf4281dce0607e034ea71639ba98
         | 
| 4 | 
            +
              data.tar.gz: bd143c77bd1bbc32c7d487e87b095a7f67ab3bc2
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 85d3a43d7cf983610b4206d07d7eea0d784cf443d2f76d7e88bd204b33694905275546751863eea7a95be98e72a6bce4b900eec4453114c112ae90c56d8a669a
         | 
| 7 | 
            +
              data.tar.gz: d27c6861e9d0e2c74e32f56edd6e74288d71a85cdd2c1bef9786ee756e4b4ca64f1156b5e98ff23725d3d8d48e2c7510d0b08e722a25c3f5fa4644c3731d04a2
         | 
| @@ -1,5 +1,5 @@ | |
| 1 1 | 
             
            require 'aws-sdk-core'
         | 
| 2 | 
            -
            require ' | 
| 2 | 
            +
            require 'set'
         | 
| 3 3 |  | 
| 4 4 | 
             
            module Stacker
         | 
| 5 5 |  | 
| @@ -26,21 +26,21 @@ module Stacker | |
| 26 26 | 
             
              end
         | 
| 27 27 |  | 
| 28 28 | 
             
              def create_stack(stack_name, template, parameters, parent_stack_name = nil)
         | 
| 29 | 
            -
                 | 
| 29 | 
            +
                merge_and_validate(template, parameters, parent_stack_name)
         | 
| 30 30 | 
             
                cloud_formation.create_stack(stack_name:    stack_name,
         | 
| 31 31 | 
             
                                             template_body: template_body(template),
         | 
| 32 32 | 
             
                                             on_failure:    'DELETE',
         | 
| 33 | 
            -
                                             parameters:     | 
| 33 | 
            +
                                             parameters:    transform_input(parameters),
         | 
| 34 34 | 
             
                                             capabilities:  ['CAPABILITY_IAM'])
         | 
| 35 35 | 
             
                wait_for_stack(stack_name, :create)
         | 
| 36 36 | 
             
              end
         | 
| 37 37 |  | 
| 38 38 | 
             
              def update_stack(stack_name, template, parameters, parent_stack_name = nil)
         | 
| 39 | 
            -
                merge_output_parameters(parent_stack_name, template, parameters) if parent_stack_name
         | 
| 40 39 | 
             
                begin
         | 
| 40 | 
            +
                  merge_and_validate(template, parameters, parent_stack_name)
         | 
| 41 41 | 
             
                  cloud_formation.update_stack(stack_name:    stack_name,
         | 
| 42 42 | 
             
                                               template_body: template_body(template),
         | 
| 43 | 
            -
                                               parameters:     | 
| 43 | 
            +
                                               parameters:    transform_input(parameters),
         | 
| 44 44 | 
             
                                               capabilities:  ['CAPABILITY_IAM'])
         | 
| 45 45 | 
             
                rescue Aws::CloudFormation::Errors::ValidationError => error
         | 
| 46 46 | 
             
                  raise error unless error.message =~ /No updates are to be performed/i # may be flaky, do more research in API
         | 
| @@ -50,13 +50,27 @@ module Stacker | |
| 50 50 | 
             
                end
         | 
| 51 51 | 
             
              end
         | 
| 52 52 |  | 
| 53 | 
            -
               | 
| 54 | 
            -
             | 
| 55 | 
            -
             | 
| 56 | 
            -
             | 
| 53 | 
            +
              # if stack_name is given assign read the output parameters and copy them to the given template parameters
         | 
| 54 | 
            +
              # if a aparameter is already defined, it will not be overwritten
         | 
| 55 | 
            +
              # finally, if mandatory parameters are missing, an error will be raised
         | 
| 56 | 
            +
              def merge_and_validate(template, parameters, stack_name)
         | 
| 57 | 
            +
                valid = validate_template(template).parameters
         | 
| 58 | 
            +
                if stack_name
         | 
| 59 | 
            +
                  present = valid.map{|p| p.parameter_key.to_sym}
         | 
| 60 | 
            +
                  get_stack_output(stack_name).each do |key, value|
         | 
| 61 | 
            +
                    parameters[key] ||= value if present.include?(key)
         | 
| 62 | 
            +
                  end
         | 
| 57 63 | 
             
                end
         | 
| 64 | 
            +
                mandatory = valid.select{|p| p.default_value.nil?}.map{|p| p.parameter_key.to_sym}
         | 
| 65 | 
            +
                diff = mandatory.to_set - parameters.keys.to_set
         | 
| 66 | 
            +
                raise "Missing one ore more mandatory parameters: #{diff.to_a.join(', ')}" if diff.length > 0
         | 
| 58 67 | 
             
                parameters
         | 
| 59 68 | 
             
              end
         | 
| 69 | 
            +
              private :merge_and_validate
         | 
| 70 | 
            +
             | 
| 71 | 
            +
              def validate_template(template)
         | 
| 72 | 
            +
                cloud_formation.validate_template(template_body: template_body(template))
         | 
| 73 | 
            +
              end
         | 
| 60 74 |  | 
| 61 75 | 
             
              def delete_stack(stack_name)
         | 
| 62 76 | 
             
                cloud_formation.delete_stack(stack_name: stack_name)
         | 
| @@ -75,11 +89,11 @@ module Stacker | |
| 75 89 | 
             
                                      when :delete then /DELETE_COMPLETE$/
         | 
| 76 90 | 
             
                                    end
         | 
| 77 91 | 
             
                  return true if status =~ expected_status
         | 
| 78 | 
            -
                   | 
| 92 | 
            +
                  raise "#{operation} #{stack_name} failed, current status #{status}" if status =~ finished
         | 
| 79 93 | 
             
                  puts "waiting for #{stack_name}, current status #{status}"
         | 
| 80 94 | 
             
                  sleep(7)
         | 
| 81 95 | 
             
                end
         | 
| 82 | 
            -
                 | 
| 96 | 
            +
                raise "waiting for stack timeout after #{timeout_in_minutes} minutes"
         | 
| 83 97 | 
             
              end
         | 
| 84 98 |  | 
| 85 99 | 
             
              def find_stack(stack_name)
         | 
| @@ -98,22 +112,27 @@ module Stacker | |
| 98 112 | 
             
              end
         | 
| 99 113 |  | 
| 100 114 | 
             
              def estimate_template_cost(template, parameters)
         | 
| 101 | 
            -
                cloud_formation.estimate_template_cost(:template_body => template_body(template), :parameters =>  | 
| 115 | 
            +
                cloud_formation.estimate_template_cost(:template_body => template_body(template), :parameters => transform_input(parameters))
         | 
| 102 116 | 
             
              end
         | 
| 103 117 |  | 
| 104 118 | 
             
              def get_stack_outputs(stack_name)
         | 
| 119 | 
            +
                puts 'get_stack_outputs is obsolete, please use get_stack_output'
         | 
| 120 | 
            +
                get_stack_output(stack_name)
         | 
| 121 | 
            +
              end
         | 
| 122 | 
            +
             | 
| 123 | 
            +
              def get_stack_output(stack_name)
         | 
| 105 124 | 
             
                stack = find_stack(stack_name)
         | 
| 106 | 
            -
                 | 
| 107 | 
            -
                 | 
| 125 | 
            +
                raise "stack #{stack_name} not found" unless stack
         | 
| 126 | 
            +
                transform_output(stack.outputs).freeze
         | 
| 108 127 | 
             
              end
         | 
| 109 128 |  | 
| 110 | 
            -
              def  | 
| 111 | 
            -
                 | 
| 129 | 
            +
              def transform_output(output)
         | 
| 130 | 
            +
                output.inject({}) { |m, o| m.merge(o.output_key.to_sym => o.output_value) }
         | 
| 112 131 | 
             
              end
         | 
| 113 132 |  | 
| 114 | 
            -
              def  | 
| 115 | 
            -
                 | 
| 116 | 
            -
                 | 
| 133 | 
            +
              def transform_input(input)
         | 
| 134 | 
            +
                input.each{|k,v| raise "#{k} must not be nil" if v.nil? }
         | 
| 135 | 
            +
                input.inject([]) { |m, kv| m << {parameter_key: kv[0].to_s, parameter_value: kv[1].to_s} }
         | 
| 117 136 | 
             
              end
         | 
| 118 137 |  | 
| 119 138 | 
             
              def get_stack_resources(stack_name)
         | 
| @@ -122,14 +141,13 @@ module Stacker | |
| 122 141 | 
             
              end
         | 
| 123 142 |  | 
| 124 143 | 
             
              def cloud_formation # lazy CloudFormation client
         | 
| 125 | 
            -
                @lazy_cloud_formation | 
| 126 | 
            -
             | 
| 127 | 
            -
             | 
| 128 | 
            -
             | 
| 129 | 
            -
             | 
| 130 | 
            -
                 | 
| 131 | 
            -
                 | 
| 132 | 
            -
                params
         | 
| 144 | 
            +
                unless @lazy_cloud_formation
         | 
| 145 | 
            +
                  params = {}
         | 
| 146 | 
            +
                  params[:credentials] = @credentials if @credentials
         | 
| 147 | 
            +
                  params[:region] = @region if @region
         | 
| 148 | 
            +
                  @lazy_cloud_formation = Aws::CloudFormation::Client.new(params)
         | 
| 149 | 
            +
                end
         | 
| 150 | 
            +
                @lazy_cloud_formation
         | 
| 133 151 | 
             
              end
         | 
| 134 152 |  | 
| 135 153 | 
             
              def template_body(template)
         | 
| @@ -140,15 +158,3 @@ module Stacker | |
| 140 158 | 
             
              extend self
         | 
| 141 159 |  | 
| 142 160 | 
             
            end
         | 
| 143 | 
            -
             | 
| 144 | 
            -
            if $0 ==__FILE__ # placeholder for interactive testing
         | 
| 145 | 
            -
              template = <<-EOL
         | 
| 146 | 
            -
                bla bla //comment
         | 
| 147 | 
            -
                bla "//no comment"
         | 
| 148 | 
            -
                bla // still a "comment"
         | 
| 149 | 
            -
                bla "some string" // comment
         | 
| 150 | 
            -
              EOL
         | 
| 151 | 
            -
             | 
| 152 | 
            -
              puts Stacker.template_body(template)
         | 
| 153 | 
            -
             | 
| 154 | 
            -
            end
         | 
| @@ -0,0 +1,21 @@ | |
| 1 | 
            +
            require 'openssl'
         | 
| 2 | 
            +
            require_relative 'stacker.rb'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            def template_body
         | 
| 5 | 
            +
              template = <<-EOL
         | 
| 6 | 
            +
                bla bla //comment
         | 
| 7 | 
            +
                bla "//no comment"
         | 
| 8 | 
            +
                bla // still a "comment"
         | 
| 9 | 
            +
                bla "some string" // comment
         | 
| 10 | 
            +
              EOL
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              puts Stacker.template_body(template)
         | 
| 13 | 
            +
            end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            if $0 ==__FILE__ # placeholder for interactive testing
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE # Windows Hack
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              template_body
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: autostacker24
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1.0. | 
| 4 | 
            +
              version: 1.0.23
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Johannes Mueller
         | 
| @@ -9,7 +9,7 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date: 2015-01- | 
| 12 | 
            +
            date: 2015-01-24 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: aws-sdk-core
         | 
| @@ -25,20 +25,6 @@ dependencies: | |
| 25 25 | 
             
                - - ~>
         | 
| 26 26 | 
             
                  - !ruby/object:Gem::Version
         | 
| 27 27 | 
             
                    version: '2'
         | 
| 28 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 29 | 
            -
              name: json
         | 
| 30 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 31 | 
            -
                requirements:
         | 
| 32 | 
            -
                - - '>='
         | 
| 33 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 34 | 
            -
                    version: '0'
         | 
| 35 | 
            -
              type: :runtime
         | 
| 36 | 
            -
              prerelease: false
         | 
| 37 | 
            -
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 38 | 
            -
                requirements:
         | 
| 39 | 
            -
                - - '>='
         | 
| 40 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 41 | 
            -
                    version: '0'
         | 
| 42 28 | 
             
            description: n/a
         | 
| 43 29 | 
             
            email:
         | 
| 44 30 | 
             
            - jmueller@autoscout24.com
         | 
| @@ -49,6 +35,7 @@ extra_rdoc_files: [] | |
| 49 35 | 
             
            files:
         | 
| 50 36 | 
             
            - lib/autostacker24.rb
         | 
| 51 37 | 
             
            - lib/autostacker24/stacker.rb
         | 
| 38 | 
            +
            - lib/autostacker24/stacker_tests.rb
         | 
| 52 39 | 
             
            homepage: https://github.com/AutoScout24/autostacker24
         | 
| 53 40 | 
             
            licenses:
         | 
| 54 41 | 
             
            - MIT
         |