opsworks-cli 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/lib/opsworks.rb +14 -0
- data/lib/opsworks/app.rb +0 -3
- data/lib/opsworks/cli.rb +1 -0
- data/lib/opsworks/cli/agent.rb +2 -0
- data/lib/opsworks/cli/helpers/options.rb +0 -2
- data/lib/opsworks/cli/helpers/typecasts.rb +0 -2
- data/lib/opsworks/cli/subcommands/apps.rb +0 -2
- data/lib/opsworks/cli/subcommands/chef.rb +0 -2
- data/lib/opsworks/cli/subcommands/config.rb +0 -2
- data/lib/opsworks/cli/subcommands/deployments.rb +6 -1
- data/lib/opsworks/cli/subcommands/iam.rb +0 -2
- data/lib/opsworks/cli/subcommands/instances.rb +65 -0
- data/lib/opsworks/cli/subcommands/recipes.rb +0 -2
- data/lib/opsworks/cli/version.rb +1 -1
- data/lib/opsworks/deployment.rb +0 -2
- data/lib/opsworks/errors.rb +14 -0
- data/lib/opsworks/instance.rb +20 -2
- data/lib/opsworks/layer.rb +0 -3
- data/lib/opsworks/permission.rb +0 -2
- data/lib/opsworks/stack.rb +17 -20
- data/opsworks-cli.gemspec +1 -0
- data/spec/fabricators/opsworks/instance_fabricator.rb +6 -0
- data/spec/opsworks/cli/subcommands/instances_spec.rb +132 -0
- data/spec/opsworks/instance_spec.rb +43 -0
- data/spec/opsworks/stack_spec.rb +76 -0
- data/spec/spec_helper.rb +1 -0
- metadata +28 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 7245edfcd7b7b42bb13b880e8e6e420eed060679712b2f1e6e4d54052387fa99
|
4
|
+
data.tar.gz: 3c8699d3f0b438b1f5a55779dd0f233cd596be5980a35cee36aeeba6ec708bd0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aa0ae55d4ea9198bd44e329e933de21b2a3bf62758537c7816b70730f66a14ac770bdf8f31206c010326599c1998268869328b9382273afa9b19d1ca078e9003
|
7
|
+
data.tar.gz: a5fa63b9259cb2c9aa8f91dd44d2c0a5379f42d4b1d7794f8f93244c48428715cd69e4f456783b3656011ee1599ddae6e82f857134c0c3e58767568547ad9902
|
data/lib/opsworks.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'jsonpath'
|
3
|
+
require 'aws-sdk'
|
4
|
+
require 'active_support/core_ext/hash/slice'
|
5
|
+
|
6
|
+
require 'opsworks/errors'
|
7
|
+
require 'opsworks/resource'
|
8
|
+
require 'opsworks/app'
|
9
|
+
require 'opsworks/instance'
|
10
|
+
require 'opsworks/permission'
|
11
|
+
require 'opsworks/layer'
|
12
|
+
require 'opsworks/resource'
|
13
|
+
require 'opsworks/deployment'
|
14
|
+
require 'opsworks/stack'
|
data/lib/opsworks/app.rb
CHANGED
data/lib/opsworks/cli.rb
CHANGED
data/lib/opsworks/cli/agent.rb
CHANGED
@@ -9,6 +9,7 @@ require_relative 'subcommands/apps'
|
|
9
9
|
require_relative 'subcommands/iam'
|
10
10
|
require_relative 'subcommands/config'
|
11
11
|
require_relative 'subcommands/deployments'
|
12
|
+
require_relative 'subcommands/instances'
|
12
13
|
|
13
14
|
module OpsWorks
|
14
15
|
module CLI
|
@@ -24,6 +25,7 @@ module OpsWorks
|
|
24
25
|
include Subcommands::IAM
|
25
26
|
include Subcommands::Config
|
26
27
|
include Subcommands::Deployments
|
28
|
+
include Subcommands::Instances
|
27
29
|
|
28
30
|
desc 'version', 'Print OpsWorks CLI version'
|
29
31
|
def version
|
@@ -16,6 +16,11 @@ module OpsWorks
|
|
16
16
|
end
|
17
17
|
|
18
18
|
will_retry = last_deployment.map do |stack, deployment|
|
19
|
+
if deployment.nil?
|
20
|
+
say "Skipping stack #{stack.name}: no deployment"
|
21
|
+
next
|
22
|
+
end
|
23
|
+
|
19
24
|
if deployment.status == 'successful'
|
20
25
|
say "Skipping stack #{stack.name}: last deployment is " \
|
21
26
|
"#{deployment.status}"
|
@@ -53,7 +58,7 @@ module OpsWorks
|
|
53
58
|
opts[:app_id] = dep.app_id if dep.app_id
|
54
59
|
opts[:custom_json] = dep.custom_json if dep.custom_json
|
55
60
|
|
56
|
-
new_deployment = stack.
|
61
|
+
new_deployment = stack.create_deployment(opts)
|
57
62
|
|
58
63
|
[stack, new_deployment]
|
59
64
|
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module OpsWorks
|
2
|
+
module CLI
|
3
|
+
module Subcommands
|
4
|
+
module Instances
|
5
|
+
def self.included(thor)
|
6
|
+
thor.class_eval do
|
7
|
+
desc 'instances:status [--stack STACK]',
|
8
|
+
'Display instance status for a stack'
|
9
|
+
option :stack, type: :array
|
10
|
+
define_method 'instances:status' do
|
11
|
+
stacks = parse_stacks(options)
|
12
|
+
stacks.each do |stack|
|
13
|
+
stack.instances.each do |instance|
|
14
|
+
say [
|
15
|
+
stack.name,
|
16
|
+
instance.hostname,
|
17
|
+
instance.status
|
18
|
+
].join("\t")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
desc 'instances:wait [--timeout TIMEOUT] [--stack STACK]',
|
24
|
+
'Wait for all instances to settle'
|
25
|
+
option :timeout, type: :numeric, default: 300
|
26
|
+
option :stack, type: :array
|
27
|
+
define_method 'instances:wait' do
|
28
|
+
deadline = Time.now + options[:timeout]
|
29
|
+
stacks = parse_stacks(options)
|
30
|
+
|
31
|
+
loop do
|
32
|
+
stacks = stacks.reject(&:settled?)
|
33
|
+
break if stacks.empty?
|
34
|
+
|
35
|
+
if Time.now > deadline
|
36
|
+
raise "Stacks did not settle: #{stacks.map(&:name).join(' ')}"
|
37
|
+
end
|
38
|
+
|
39
|
+
sleep 5
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
desc 'instances:setup [--stack STACK]',
|
44
|
+
'Retry setup on any instances where it failed'
|
45
|
+
option :stack, type: :array
|
46
|
+
define_method 'instances:setup' do
|
47
|
+
stacks = parse_stacks(options)
|
48
|
+
stacks.each do |stack|
|
49
|
+
stack.instances.each do |instance|
|
50
|
+
next unless instance.setup_failed?
|
51
|
+
say "Running setup on #{stack.name} #{instance.hostname}"
|
52
|
+
|
53
|
+
stack.create_deployment(
|
54
|
+
command: { name: 'setup' },
|
55
|
+
instance_ids: [instance.id]
|
56
|
+
)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/lib/opsworks/cli/version.rb
CHANGED
data/lib/opsworks/deployment.rb
CHANGED
@@ -0,0 +1,14 @@
|
|
1
|
+
module OpsWorks
|
2
|
+
module Errors
|
3
|
+
class StackInFatalState < StandardError
|
4
|
+
attr_reader :stack, :instances
|
5
|
+
|
6
|
+
def initialize(stack, instances)
|
7
|
+
@stack = stack
|
8
|
+
@instances = instances
|
9
|
+
names = instances.map(&:hostname).join(' ')
|
10
|
+
super("Instances entered a fatal state on #{stack.name}: #{names}")
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/opsworks/instance.rb
CHANGED
@@ -1,9 +1,15 @@
|
|
1
|
-
require 'opsworks/resource'
|
2
|
-
|
3
1
|
module OpsWorks
|
4
2
|
class Instance < Resource
|
5
3
|
attr_accessor :id, :hostname, :ec2_instance_id, :instance_type, :status
|
6
4
|
|
5
|
+
FATAL_STATUSES = %w(
|
6
|
+
connection_lost setup_failed start_failed stop_failed
|
7
|
+
).freeze
|
8
|
+
|
9
|
+
SETTLED_STATUSES = (
|
10
|
+
FATAL_STATUSES + %w(online stopped terminated)
|
11
|
+
).freeze
|
12
|
+
|
7
13
|
def self.from_collection_response(client, response)
|
8
14
|
response.data[:instances].map do |hash|
|
9
15
|
new(
|
@@ -20,5 +26,17 @@ module OpsWorks
|
|
20
26
|
def online?
|
21
27
|
status == 'online'
|
22
28
|
end
|
29
|
+
|
30
|
+
def setup_failed?
|
31
|
+
status == 'setup_failed'
|
32
|
+
end
|
33
|
+
|
34
|
+
def fatal?
|
35
|
+
FATAL_STATUSES.include?(status)
|
36
|
+
end
|
37
|
+
|
38
|
+
def settled?
|
39
|
+
SETTLED_STATUSES.include?(status)
|
40
|
+
end
|
23
41
|
end
|
24
42
|
end
|
data/lib/opsworks/layer.rb
CHANGED
data/lib/opsworks/permission.rb
CHANGED
data/lib/opsworks/stack.rb
CHANGED
@@ -1,13 +1,3 @@
|
|
1
|
-
require 'jsonpath'
|
2
|
-
require 'aws-sdk'
|
3
|
-
require 'active_support/core_ext/hash/slice'
|
4
|
-
|
5
|
-
require 'opsworks/resource'
|
6
|
-
require 'opsworks/app'
|
7
|
-
require 'opsworks/instance'
|
8
|
-
require 'opsworks/permission'
|
9
|
-
require 'opsworks/layer'
|
10
|
-
|
11
1
|
module OpsWorks
|
12
2
|
class Stack < Resource
|
13
3
|
attr_accessor :id, :name, :custom_json
|
@@ -142,6 +132,16 @@ module OpsWorks
|
|
142
132
|
create_deployment(**deploy_args)
|
143
133
|
end
|
144
134
|
|
135
|
+
def create_deployment(options = {})
|
136
|
+
response = client.create_deployment(
|
137
|
+
options.merge(stack_id: id)
|
138
|
+
)
|
139
|
+
rescue Aws::OpsWorks::Errors::ValidationException => e
|
140
|
+
raise unless e.message == DEPLOY_NO_INSTANCES_ERROR
|
141
|
+
else
|
142
|
+
Deployment.from_response(client, response)
|
143
|
+
end
|
144
|
+
|
145
145
|
def active?
|
146
146
|
instances.any?(&:online?)
|
147
147
|
end
|
@@ -164,6 +164,13 @@ module OpsWorks
|
|
164
164
|
client.create_app(options)
|
165
165
|
end
|
166
166
|
|
167
|
+
def settled?
|
168
|
+
instances = initialize_instances
|
169
|
+
fatal = instances.select(&:fatal?)
|
170
|
+
raise Errors::StackInFatalState.new(self, fatal) if fatal.any?
|
171
|
+
instances.all?(&:settled?)
|
172
|
+
end
|
173
|
+
|
167
174
|
private
|
168
175
|
|
169
176
|
# rubocop:disable Eval
|
@@ -215,15 +222,5 @@ module OpsWorks
|
|
215
222
|
response = client.describe_deployments(stack_id: id)
|
216
223
|
Deployment.from_collection_response(client, response)
|
217
224
|
end
|
218
|
-
|
219
|
-
def create_deployment(options = {})
|
220
|
-
response = client.create_deployment(
|
221
|
-
options.merge(stack_id: id)
|
222
|
-
)
|
223
|
-
rescue Aws::OpsWorks::Errors::ValidationException => e
|
224
|
-
raise unless e.message == DEPLOY_NO_INSTANCES_ERROR
|
225
|
-
else
|
226
|
-
Deployment.from_response(client, response)
|
227
|
-
end
|
228
225
|
end
|
229
226
|
end
|
data/opsworks-cli.gemspec
CHANGED
@@ -0,0 +1,132 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe OpsWorks::CLI::Agent do
|
4
|
+
let(:stacks) do
|
5
|
+
Array.new(3) { |i| Fabricate(:stack, name: "stack-#{i}") }
|
6
|
+
end
|
7
|
+
before { allow(OpsWorks::Stack).to receive(:all) { stacks } }
|
8
|
+
|
9
|
+
describe 'instances:status' do
|
10
|
+
it 'returns the status of instances on all stacks' do
|
11
|
+
statuses = %w(starting online setup_failed)
|
12
|
+
|
13
|
+
stacks.zip(statuses).each do |stack, status|
|
14
|
+
i = Fabricate(:instance, hostname: "instance-#{status}", status: status)
|
15
|
+
expect(stack).to receive(:instances).and_return([i])
|
16
|
+
end
|
17
|
+
|
18
|
+
messages = [
|
19
|
+
"stack-0\tinstance-starting\tstarting",
|
20
|
+
"stack-1\tinstance-online\tonline",
|
21
|
+
"stack-2\tinstance-setup_failed\tsetup_failed"
|
22
|
+
]
|
23
|
+
|
24
|
+
messages.each do |m|
|
25
|
+
expect(subject).to receive(:say).with(m).once.ordered
|
26
|
+
end
|
27
|
+
|
28
|
+
subject.send('instances:status')
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'returns the status of instances on the selected stacks' do
|
32
|
+
i = Fabricate(:instance, hostname: 'instance', status: 'online')
|
33
|
+
expect(stacks[1]).to receive(:instances).and_return([i])
|
34
|
+
[0, 2].each { |n| expect(stacks[n]).not_to receive(:instances) }
|
35
|
+
|
36
|
+
expect(subject).to receive(:say).with("stack-1\tinstance\tonline")
|
37
|
+
subject.options = { stack: [stacks[1].name] }
|
38
|
+
|
39
|
+
subject.send('instances:status')
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe 'instances:wait' do
|
44
|
+
before do
|
45
|
+
subject.options = { timeout: 100 }
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'waits until all stacks settle' do
|
49
|
+
stacks.each { |s| expect(s).to receive(:settled?).and_return(false) }
|
50
|
+
expect(subject).to receive(:sleep) do
|
51
|
+
stacks.each { |s| expect(s).to receive(:settled?).and_return(true) }
|
52
|
+
end
|
53
|
+
|
54
|
+
subject.send('instances:wait')
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'waits until selected stacks settle' do
|
58
|
+
expect(stacks[0]).to receive(:settled?).and_return(false)
|
59
|
+
expect(subject).to receive(:sleep) do
|
60
|
+
expect(stacks[0]).to receive(:settled?).and_return(true)
|
61
|
+
end
|
62
|
+
|
63
|
+
expect(stacks[1]).not_to receive(:settled?)
|
64
|
+
expect(stacks[2]).not_to receive(:settled?)
|
65
|
+
|
66
|
+
subject.options[:stack] = [stacks[0].name]
|
67
|
+
|
68
|
+
subject.send('instances:wait')
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'fails if the stacks never settle' do
|
72
|
+
t = 0
|
73
|
+
allow(subject).to receive(:sleep) do |i|
|
74
|
+
t += i
|
75
|
+
Timecop.freeze(t)
|
76
|
+
end
|
77
|
+
|
78
|
+
stacks.each { |s| allow(s).to receive(:settled?).and_return(false) }
|
79
|
+
allow(stacks[0]).to receive(:settled?).and_return(true)
|
80
|
+
|
81
|
+
expect { Timecop.freeze(t) { subject.send('instances:wait') } }
|
82
|
+
.to raise_error(/did not settle: stack-1 stack-2$/i)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe 'instances:setup' do
|
87
|
+
let(:i0) { Fabricate(:instance, hostname: 'i0', status: 'setup_failed') }
|
88
|
+
let(:i1) { Fabricate(:instance, hostname: 'i1', status: 'online') }
|
89
|
+
let(:i2) { Fabricate(:instance, hostname: 'i2', status: 'setup_failed') }
|
90
|
+
|
91
|
+
before do
|
92
|
+
allow(stacks[0]).to receive(:instances).and_return([i0])
|
93
|
+
allow(stacks[1]).to receive(:instances).and_return([i1])
|
94
|
+
allow(stacks[2]).to receive(:instances).and_return([i2])
|
95
|
+
end
|
96
|
+
|
97
|
+
it 're-runs setup on setup_failed instances across all stacks' do
|
98
|
+
expect(stacks[0]).to receive(:create_deployment)
|
99
|
+
.with(command: { name: 'setup' }, instance_ids: [i0.id])
|
100
|
+
|
101
|
+
expect(stacks[1]).not_to receive(:create_deployment)
|
102
|
+
|
103
|
+
expect(stacks[2]).to receive(:create_deployment)
|
104
|
+
.with(command: { name: 'setup' }, instance_ids: [i2.id])
|
105
|
+
|
106
|
+
expect(subject).to receive(:say)
|
107
|
+
.with('Running setup on stack-0 i0')
|
108
|
+
.once.ordered
|
109
|
+
|
110
|
+
expect(subject).to receive(:say)
|
111
|
+
.with('Running setup on stack-2 i2')
|
112
|
+
.once.ordered
|
113
|
+
|
114
|
+
subject.send('instances:setup')
|
115
|
+
end
|
116
|
+
|
117
|
+
it 're-runs setup on setup_failed instances across selected stacks' do
|
118
|
+
expect(stacks[0]).not_to receive(:create_deployment)
|
119
|
+
expect(stacks[1]).not_to receive(:create_deployment)
|
120
|
+
expect(stacks[2]).to receive(:create_deployment)
|
121
|
+
.with(command: { name: 'setup' }, instance_ids: [i2.id])
|
122
|
+
|
123
|
+
expect(subject).to receive(:say)
|
124
|
+
.with('Running setup on stack-2 i2')
|
125
|
+
.once.ordered
|
126
|
+
|
127
|
+
subject.options = { stack: [stacks[2].name] }
|
128
|
+
|
129
|
+
subject.send('instances:setup')
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe OpsWorks::Instance do
|
4
|
+
context 'status' do
|
5
|
+
STATUSES = [
|
6
|
+
['booting', false, false],
|
7
|
+
['connection_lost', true, true],
|
8
|
+
['online', true, false],
|
9
|
+
['pending', false, false],
|
10
|
+
['rebooting', false, false],
|
11
|
+
['requested', false, false],
|
12
|
+
['running_setup', false, false],
|
13
|
+
['setup_failed', true, true],
|
14
|
+
['shutting_down', false, false],
|
15
|
+
['start_failed', true, true],
|
16
|
+
['stop_failed', true, true],
|
17
|
+
['stopped', true, false],
|
18
|
+
['stopping', false, false],
|
19
|
+
['terminated', true, false],
|
20
|
+
['terminating', false, false]
|
21
|
+
].freeze
|
22
|
+
|
23
|
+
STATUSES.each do |status, settled_expected, fatal_expected|
|
24
|
+
context status do
|
25
|
+
it "#settled? is #{settled_expected}" do
|
26
|
+
i = described_class.new(nil, status: status)
|
27
|
+
expect(i.settled?).to be(settled_expected)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "#fatal? is #{fatal_expected}" do
|
31
|
+
i = described_class.new(nil, status: status)
|
32
|
+
expect(i.fatal?).to be(fatal_expected)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'has only a few defined non-fatal settled states' do
|
38
|
+
# We use this to make sure that our test cases above are coherent.
|
39
|
+
expect(STATUSES.select { |_, s, f| s && !f }.map(&:first))
|
40
|
+
.to match_array(%w(online stopped terminated))
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe OpsWorks::Stack do
|
4
|
+
describe '#settled?' do
|
5
|
+
it 'makes a new API call' do
|
6
|
+
client = Aws::OpsWorks::Client.new(
|
7
|
+
stub_responses: {
|
8
|
+
describe_instances: [
|
9
|
+
{ instances: [{ instance_id: 'a', status: 'starting' }] },
|
10
|
+
{ instances: [{ instance_id: 'a', status: 'online' }] },
|
11
|
+
{ instances: [{ instance_id: 'b', status: 'stopping' }] }
|
12
|
+
]
|
13
|
+
}
|
14
|
+
)
|
15
|
+
|
16
|
+
subject = described_class.new(client, id: '123')
|
17
|
+
|
18
|
+
expect(client).to receive(:describe_instances)
|
19
|
+
.with(stack_id: '123')
|
20
|
+
.exactly(3).times
|
21
|
+
.and_call_original
|
22
|
+
|
23
|
+
expect(subject).not_to be_settled
|
24
|
+
expect(subject).to be_settled
|
25
|
+
expect(subject).not_to be_settled
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'returns true if all instances have settled' do
|
29
|
+
client = Aws::OpsWorks::Client.new(
|
30
|
+
stub_responses: {
|
31
|
+
describe_instances: {
|
32
|
+
instances: [
|
33
|
+
{ instance_id: 'a', status: 'online' },
|
34
|
+
{ instance_id: 'b', status: 'stopped' }
|
35
|
+
]
|
36
|
+
}
|
37
|
+
}
|
38
|
+
)
|
39
|
+
|
40
|
+
expect(described_class.new(client, id: '123')).to be_settled
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'returns false if any instances has not settled' do
|
44
|
+
client = Aws::OpsWorks::Client.new(
|
45
|
+
stub_responses: {
|
46
|
+
describe_instances: {
|
47
|
+
instances: [
|
48
|
+
{ instance_id: 'a', status: 'online' },
|
49
|
+
{ instance_id: 'b', status: 'stopping' }
|
50
|
+
]
|
51
|
+
}
|
52
|
+
}
|
53
|
+
)
|
54
|
+
|
55
|
+
expect(described_class.new(client, id: '123')).not_to be_settled
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'fails if any instance will not settle' do
|
59
|
+
client = Aws::OpsWorks::Client.new(
|
60
|
+
stub_responses: {
|
61
|
+
describe_instances: {
|
62
|
+
instances: [
|
63
|
+
{ instance_id: 'a', status: 'online' },
|
64
|
+
{ instance_id: 'b', status: 'setup_failed', hostname: 'bar' }
|
65
|
+
]
|
66
|
+
}
|
67
|
+
}
|
68
|
+
)
|
69
|
+
|
70
|
+
e = OpsWorks::Errors::StackInFatalState
|
71
|
+
|
72
|
+
expect { described_class.new(client, id: '123', name: 'foo').settled? }
|
73
|
+
.to raise_error(e, /fatal.*foo.*bar/i)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
data/spec/spec_helper.rb
CHANGED
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.6.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: 2018-04-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -150,6 +150,20 @@ dependencies:
|
|
150
150
|
- - ">="
|
151
151
|
- !ruby/object:Gem::Version
|
152
152
|
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: timecop
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0.9'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - "~>"
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0.9'
|
153
167
|
description: OpsWorks CLI
|
154
168
|
email:
|
155
169
|
- frank@macreery.com
|
@@ -166,6 +180,7 @@ files:
|
|
166
180
|
- README.md
|
167
181
|
- Rakefile
|
168
182
|
- bin/opsworks
|
183
|
+
- lib/opsworks.rb
|
169
184
|
- lib/opsworks/app.rb
|
170
185
|
- lib/opsworks/cli.rb
|
171
186
|
- lib/opsworks/cli/agent.rb
|
@@ -176,9 +191,11 @@ files:
|
|
176
191
|
- lib/opsworks/cli/subcommands/config.rb
|
177
192
|
- lib/opsworks/cli/subcommands/deployments.rb
|
178
193
|
- lib/opsworks/cli/subcommands/iam.rb
|
194
|
+
- lib/opsworks/cli/subcommands/instances.rb
|
179
195
|
- lib/opsworks/cli/subcommands/recipes.rb
|
180
196
|
- lib/opsworks/cli/version.rb
|
181
197
|
- lib/opsworks/deployment.rb
|
198
|
+
- lib/opsworks/errors.rb
|
182
199
|
- lib/opsworks/instance.rb
|
183
200
|
- lib/opsworks/layer.rb
|
184
201
|
- lib/opsworks/permission.rb
|
@@ -187,6 +204,7 @@ files:
|
|
187
204
|
- opsworks-cli.gemspec
|
188
205
|
- spec/fabricators/opsworks/app_fabricator.rb
|
189
206
|
- spec/fabricators/opsworks/deployment_fabricator.rb
|
207
|
+
- spec/fabricators/opsworks/instance_fabricator.rb
|
190
208
|
- spec/fabricators/opsworks/permission_fabricator.rb
|
191
209
|
- spec/fabricators/opsworks/stack_fabricator.rb
|
192
210
|
- spec/opsworks/cli/agent_spec.rb
|
@@ -194,7 +212,10 @@ files:
|
|
194
212
|
- spec/opsworks/cli/subcommands/chef_spec.rb
|
195
213
|
- spec/opsworks/cli/subcommands/config_spec.rb
|
196
214
|
- spec/opsworks/cli/subcommands/iam_spec.rb
|
215
|
+
- spec/opsworks/cli/subcommands/instances_spec.rb
|
197
216
|
- spec/opsworks/cli/subcommands/recipes_spec.rb
|
217
|
+
- spec/opsworks/instance_spec.rb
|
218
|
+
- spec/opsworks/stack_spec.rb
|
198
219
|
- spec/spec_helper.rb
|
199
220
|
homepage: https://github.com/aptible/opsworks-cli
|
200
221
|
licenses:
|
@@ -216,13 +237,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
216
237
|
version: '0'
|
217
238
|
requirements: []
|
218
239
|
rubyforge_project:
|
219
|
-
rubygems_version: 2.
|
240
|
+
rubygems_version: 2.7.6
|
220
241
|
signing_key:
|
221
242
|
specification_version: 4
|
222
243
|
summary: Alternative CLI for Amazon OpsWorks
|
223
244
|
test_files:
|
224
245
|
- spec/fabricators/opsworks/app_fabricator.rb
|
225
246
|
- spec/fabricators/opsworks/deployment_fabricator.rb
|
247
|
+
- spec/fabricators/opsworks/instance_fabricator.rb
|
226
248
|
- spec/fabricators/opsworks/permission_fabricator.rb
|
227
249
|
- spec/fabricators/opsworks/stack_fabricator.rb
|
228
250
|
- spec/opsworks/cli/agent_spec.rb
|
@@ -230,5 +252,8 @@ test_files:
|
|
230
252
|
- spec/opsworks/cli/subcommands/chef_spec.rb
|
231
253
|
- spec/opsworks/cli/subcommands/config_spec.rb
|
232
254
|
- spec/opsworks/cli/subcommands/iam_spec.rb
|
255
|
+
- spec/opsworks/cli/subcommands/instances_spec.rb
|
233
256
|
- spec/opsworks/cli/subcommands/recipes_spec.rb
|
257
|
+
- spec/opsworks/instance_spec.rb
|
258
|
+
- spec/opsworks/stack_spec.rb
|
234
259
|
- spec/spec_helper.rb
|