opsworks-cli 0.6.0 → 0.7.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/.github/CODEOWNERS +1 -0
- data/README.md +1 -3
- data/lib/opsworks/cli/subcommands/instances.rb +7 -2
- data/lib/opsworks/cli/subcommands/recipes.rb +2 -1
- data/lib/opsworks/cli/version.rb +1 -1
- data/lib/opsworks/instance.rb +14 -2
- data/lib/opsworks/stack.rb +14 -8
- data/opsworks-cli.gemspec +1 -1
- data/spec/fabricators/opsworks/instance_fabricator.rb +1 -0
- data/spec/opsworks/cli/subcommands/recipes_spec.rb +14 -4
- metadata +6 -6
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 4559d0b2cb6a2d928f5ada92931a25d2dc6a1701549cace6f847989edd93e66c
         | 
| 4 | 
            +
              data.tar.gz: b59bf1e379e042ebae144fef653da7e45678b5c9b47e4f9e1ae12c2903d435df
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: ad0296093d9d19cd0fb49fb83c5b6b3a0d1477024dafc3402af1ebb508b49c39fa78e0c4eab236a44b343f1065483c53ee18dfbd2e0eff0aa329a31ed0c3d36c
         | 
| 7 | 
            +
              data.tar.gz: 5598f4b72427313587c8b6e53de8945776e969c46cb07cf0d8be03366ff28db7f27bb0532e3bc452580d499d700935e7dc33037611a5d2626a05d36c1dc2880a
         | 
    
        data/.github/CODEOWNERS
    ADDED
    
    | @@ -0,0 +1 @@ | |
| 1 | 
            +
            *   @almathew
         | 
    
        data/README.md
    CHANGED
    
    | @@ -56,6 +56,4 @@ Commands: | |
| 56 56 |  | 
| 57 57 | 
             
            MIT License, see [LICENSE](LICENSE.md) for details.
         | 
| 58 58 |  | 
| 59 | 
            -
            Copyright (c)  | 
| 60 | 
            -
             | 
| 61 | 
            -
            [<img src="https://s.gravatar.com/avatar/f7790b867ae619ae0496460aa28c5861?s=60" style="border-radius: 50%;" alt="@fancyremarker" />](https://github.com/fancyremarker)
         | 
| 59 | 
            +
            Copyright (c) 2019 [Aptible](https://www.aptible.com) and contributors.
         | 
| @@ -11,11 +11,16 @@ module OpsWorks | |
| 11 11 | 
             
                          stacks = parse_stacks(options)
         | 
| 12 12 | 
             
                          stacks.each do |stack|
         | 
| 13 13 | 
             
                            stack.instances.each do |instance|
         | 
| 14 | 
            -
                               | 
| 14 | 
            +
                              arr = [
         | 
| 15 15 | 
             
                                stack.name,
         | 
| 16 16 | 
             
                                instance.hostname,
         | 
| 17 17 | 
             
                                instance.status
         | 
| 18 | 
            -
                              ] | 
| 18 | 
            +
                              ]
         | 
| 19 | 
            +
                              # TODO: Why does a EOL tab break say?
         | 
| 20 | 
            +
                              if (errors = instance.service_errors).any?
         | 
| 21 | 
            +
                                arr << errors.join(', ')
         | 
| 22 | 
            +
                              end
         | 
| 23 | 
            +
                              say arr.join("\t")
         | 
| 19 24 | 
             
                            end
         | 
| 20 25 | 
             
                          end
         | 
| 21 26 | 
             
                        end
         | 
| @@ -7,11 +7,12 @@ module OpsWorks | |
| 7 7 | 
             
                        desc 'recipes:run RECIPE [--stack STACK]', 'Execute a Chef recipe'
         | 
| 8 8 | 
             
                        option :stack, type: :array
         | 
| 9 9 | 
             
                        option :timeout, type: :numeric, default: 300
         | 
| 10 | 
            +
                        option :layer, type: :string
         | 
| 10 11 | 
             
                        define_method 'recipes:run' do |recipe|
         | 
| 11 12 | 
             
                          stacks = parse_stacks(options.merge(active: true))
         | 
| 12 13 | 
             
                          deployments = stacks.map do |stack|
         | 
| 13 14 | 
             
                            say "Executing recipe on #{stack.name}..."
         | 
| 14 | 
            -
                            stack.execute_recipe(recipe)
         | 
| 15 | 
            +
                            stack.execute_recipe(recipe, layer: options[:layer])
         | 
| 15 16 | 
             
                          end
         | 
| 16 17 | 
             
                          OpsWorks::Deployment.wait(deployments, options[:timeout])
         | 
| 17 18 | 
             
                          unless deployments.all?(&:success?)
         | 
    
        data/lib/opsworks/cli/version.rb
    CHANGED
    
    
    
        data/lib/opsworks/instance.rb
    CHANGED
    
    | @@ -1,6 +1,7 @@ | |
| 1 1 | 
             
            module OpsWorks
         | 
| 2 2 | 
             
              class Instance < Resource
         | 
| 3 | 
            -
                attr_accessor :id, :hostname, :ec2_instance_id, :instance_type, :status
         | 
| 3 | 
            +
                attr_accessor :id, :hostname, :ec2_instance_id, :instance_type, :status,
         | 
| 4 | 
            +
                              :service_errors
         | 
| 4 5 |  | 
| 5 6 | 
             
                FATAL_STATUSES = %w(
         | 
| 6 7 | 
             
                  connection_lost setup_failed start_failed stop_failed
         | 
| @@ -12,13 +13,24 @@ module OpsWorks | |
| 12 13 |  | 
| 13 14 | 
             
                def self.from_collection_response(client, response)
         | 
| 14 15 | 
             
                  response.data[:instances].map do |hash|
         | 
| 16 | 
            +
                    # If instance is in start_failed status, grab the service errors to
         | 
| 17 | 
            +
                    # help explain why
         | 
| 18 | 
            +
                    if hash[:status] == 'start_failed'
         | 
| 19 | 
            +
                      instance_id = hash[:instance_id]
         | 
| 20 | 
            +
                      raw = client.describe_service_errors(instance_id: instance_id)
         | 
| 21 | 
            +
                      service_errors = raw[:service_errors].map { |e| e[:message] }
         | 
| 22 | 
            +
                    else
         | 
| 23 | 
            +
                      service_errors = []
         | 
| 24 | 
            +
                    end
         | 
| 25 | 
            +
             | 
| 15 26 | 
             
                    new(
         | 
| 16 27 | 
             
                      client,
         | 
| 17 28 | 
             
                      id: hash[:instance_id],
         | 
| 18 29 | 
             
                      hostname: hash[:hostname],
         | 
| 19 30 | 
             
                      ec2_instance_id: hash[:ec2_instance_id],
         | 
| 20 31 | 
             
                      instance_type: hash[:instance_type],
         | 
| 21 | 
            -
                      status: hash[:status]
         | 
| 32 | 
            +
                      status: hash[:status],
         | 
| 33 | 
            +
                      service_errors: service_errors
         | 
| 22 34 | 
             
                    )
         | 
| 23 35 | 
             
                  end
         | 
| 24 36 | 
             
                end
         | 
    
        data/lib/opsworks/stack.rb
    CHANGED
    
    | @@ -103,13 +103,17 @@ module OpsWorks | |
| 103 103 | 
             
                  create_deployment(command: { name: 'update_custom_cookbooks' })
         | 
| 104 104 | 
             
                end
         | 
| 105 105 |  | 
| 106 | 
            -
                def execute_recipe(recipe)
         | 
| 107 | 
            -
                   | 
| 106 | 
            +
                def execute_recipe(recipe, layer: nil)
         | 
| 107 | 
            +
                  deploy_args = {
         | 
| 108 108 | 
             
                    command: {
         | 
| 109 109 | 
             
                      name: 'execute_recipes',
         | 
| 110 110 | 
             
                      args: { 'recipes' => [recipe] }
         | 
| 111 111 | 
             
                    }
         | 
| 112 | 
            -
                   | 
| 112 | 
            +
                  }
         | 
| 113 | 
            +
             | 
| 114 | 
            +
                  deploy_args[:layer_ids] = [layer_id_from_name(layer)] if layer
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                  create_deployment(**deploy_args)
         | 
| 113 117 | 
             
                end
         | 
| 114 118 |  | 
| 115 119 | 
             
                def deploy_app(app, layer: nil, args: {})
         | 
| @@ -123,11 +127,7 @@ module OpsWorks | |
| 123 127 | 
             
                    }
         | 
| 124 128 | 
             
                  }
         | 
| 125 129 |  | 
| 126 | 
            -
                  if layer
         | 
| 127 | 
            -
                    layer = layers.find { |l| l.shortname == layer }
         | 
| 128 | 
            -
                    raise "Layer #{layer} not found" unless layer
         | 
| 129 | 
            -
                    deploy_args[:layer_ids] = [layer.id]
         | 
| 130 | 
            -
                  end
         | 
| 130 | 
            +
                  deploy_args[:layer_ids] = [layer_id_from_name(layer)] if layer
         | 
| 131 131 |  | 
| 132 132 | 
             
                  create_deployment(**deploy_args)
         | 
| 133 133 | 
             
                end
         | 
| @@ -193,6 +193,12 @@ module OpsWorks | |
| 193 193 | 
             
                end
         | 
| 194 194 | 
             
                # rubocop:enable Eval
         | 
| 195 195 |  | 
| 196 | 
            +
                def layer_id_from_name(shortname)
         | 
| 197 | 
            +
                  layer = layers.find { |l| l.shortname == shortname }
         | 
| 198 | 
            +
                  raise "Layer #{layer} not found" unless layer
         | 
| 199 | 
            +
                  layer.id
         | 
| 200 | 
            +
                end
         | 
| 201 | 
            +
             | 
| 196 202 | 
             
                def initialize_apps
         | 
| 197 203 | 
             
                  return [] unless id
         | 
| 198 204 | 
             
                  response = client.describe_apps(stack_id: id)
         | 
    
        data/opsworks-cli.gemspec
    CHANGED
    
    | @@ -21,7 +21,7 @@ Gem::Specification.new do |spec| | |
| 21 21 | 
             
              spec.require_paths = ['lib']
         | 
| 22 22 |  | 
| 23 23 | 
             
              spec.add_dependency 'thor'
         | 
| 24 | 
            -
              spec.add_dependency 'aws-sdk', '~> 2. | 
| 24 | 
            +
              spec.add_dependency 'aws-sdk', '~> 2.11.192'
         | 
| 25 25 | 
             
              spec.add_dependency 'jsonpath'
         | 
| 26 26 | 
             
              spec.add_dependency 'activesupport'
         | 
| 27 27 |  | 
| @@ -13,23 +13,33 @@ describe OpsWorks::CLI::Agent do | |
| 13 13 | 
             
                describe 'recipes:run' do
         | 
| 14 14 | 
             
                  let(:success) { Fabricate(:deployment, status: 'successful') }
         | 
| 15 15 | 
             
                  let(:failure) { Fabricate(:deployment, status: 'failed') }
         | 
| 16 | 
            +
                  let(:args) { [recipe, { layer: nil }] }
         | 
| 16 17 |  | 
| 17 18 | 
             
                  it 'should update custom cookbooks on all stacks' do
         | 
| 18 | 
            -
                    expect(stacks[0]).to receive(:execute_recipe).with( | 
| 19 | 
            -
                    expect(stacks[1]).to receive(:execute_recipe).with( | 
| 19 | 
            +
                    expect(stacks[0]).to receive(:execute_recipe).with(*args) { success }
         | 
| 20 | 
            +
                    expect(stacks[1]).to receive(:execute_recipe).with(*args) { success }
         | 
| 20 21 | 
             
                    subject.send('recipes:run', recipe)
         | 
| 21 22 | 
             
                  end
         | 
| 22 23 |  | 
| 23 24 | 
             
                  it 'should optionally run on a subset of stacks' do
         | 
| 24 | 
            -
                    expect(stacks[0]).to receive(:execute_recipe).with( | 
| 25 | 
            +
                    expect(stacks[0]).to receive(:execute_recipe).with(*args) { success }
         | 
| 25 26 | 
             
                    expect(stacks[1]).not_to receive(:execute_recipe)
         | 
| 26 27 |  | 
| 27 28 | 
             
                    allow(subject).to receive(:options) { { stack: [stacks[0].name] } }
         | 
| 28 29 | 
             
                    subject.send('recipes:run', recipe)
         | 
| 29 30 | 
             
                  end
         | 
| 30 31 |  | 
| 32 | 
            +
                  it 'should optionally run on a single layer' do
         | 
| 33 | 
            +
                    args = [recipe, { layer: 'git' }]
         | 
| 34 | 
            +
                    expect(stacks[0]).to receive(:execute_recipe).with(*args) { success }
         | 
| 35 | 
            +
                    expect(stacks[1]).to receive(:execute_recipe).with(*args) { success }
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                    allow(subject).to receive(:options) { { layer: 'git' } }
         | 
| 38 | 
            +
                    subject.send('recipes:run', recipe)
         | 
| 39 | 
            +
                  end
         | 
| 40 | 
            +
             | 
| 31 41 | 
             
                  it 'should fail if any update fails' do
         | 
| 32 | 
            -
                    expect(stacks[0]).to receive(:execute_recipe).with( | 
| 42 | 
            +
                    expect(stacks[0]).to receive(:execute_recipe).with(*args) { failure }
         | 
| 33 43 |  | 
| 34 44 | 
             
                    allow(subject).to receive(:options) { { stack: [stacks[0].name] } }
         | 
| 35 45 | 
             
                    expect { subject.send('recipes:run', recipe) }.to raise_error
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: opsworks-cli
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.7.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Frank Macreery
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2020-03-30 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: thor
         | 
| @@ -30,14 +30,14 @@ dependencies: | |
| 30 30 | 
             
                requirements:
         | 
| 31 31 | 
             
                - - "~>"
         | 
| 32 32 | 
             
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            -
                    version: 2. | 
| 33 | 
            +
                    version: 2.11.192
         | 
| 34 34 | 
             
              type: :runtime
         | 
| 35 35 | 
             
              prerelease: false
         | 
| 36 36 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 37 | 
             
                requirements:
         | 
| 38 38 | 
             
                - - "~>"
         | 
| 39 39 | 
             
                  - !ruby/object:Gem::Version
         | 
| 40 | 
            -
                    version: 2. | 
| 40 | 
            +
                    version: 2.11.192
         | 
| 41 41 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 42 42 | 
             
              name: jsonpath
         | 
| 43 43 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -172,6 +172,7 @@ executables: | |
| 172 172 | 
             
            extensions: []
         | 
| 173 173 | 
             
            extra_rdoc_files: []
         | 
| 174 174 | 
             
            files:
         | 
| 175 | 
            +
            - ".github/CODEOWNERS"
         | 
| 175 176 | 
             
            - ".gitignore"
         | 
| 176 177 | 
             
            - ".rspec"
         | 
| 177 178 | 
             
            - ".travis.yml"
         | 
| @@ -236,8 +237,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 236 237 | 
             
                - !ruby/object:Gem::Version
         | 
| 237 238 | 
             
                  version: '0'
         | 
| 238 239 | 
             
            requirements: []
         | 
| 239 | 
            -
             | 
| 240 | 
            -
            rubygems_version: 2.7.6
         | 
| 240 | 
            +
            rubygems_version: 3.0.3
         | 
| 241 241 | 
             
            signing_key: 
         | 
| 242 242 | 
             
            specification_version: 4
         | 
| 243 243 | 
             
            summary: Alternative CLI for Amazon OpsWorks
         |