opsicle 2.12.3 → 2.12.5
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 +5 -5
- data/lib/opsicle/commands/delete_instance.rb +10 -0
- data/lib/opsicle/commands/stop_instance.rb +10 -0
- data/lib/opsicle/ec2_adapter.rb +2 -2
- data/lib/opsicle/manageable_instance.rb +0 -1
- data/lib/opsicle/questionnaire/eip_inquiry.rb +13 -1
- data/lib/opsicle/version.rb +1 -1
- data/spec/opsicle/commands/delete_instance_spec.rb +90 -71
- data/spec/opsicle/commands/stop_instance_spec.rb +100 -0
- data/spec/opsicle/questionnaire/eip_inquiry_spec.rb +50 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 0d4b66a5b078018b67348b894fe8274491719348c5d24d3672ddaebdbd667d2e
|
4
|
+
data.tar.gz: c6928a8a60d29c02924287bba794a3c0f75767916610020d905119d8abb4b65e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 71647e38b87fa0077864cc3f255e2edf1ee9c9be3a0a59f59d66bd2d1c7e3169d76a7a0f2c43a17836b8de6278ef554144fd8067c10d446d30e84835ac15a493
|
7
|
+
data.tar.gz: 5229246562d67aa4405589eb00fedecb72e0f94c3bf8274bc8bbd45e9e1e7190a812aa7c1765f2aebff6c81c53e20a740abdd077cfc27faf75cb0b700d572c9e
|
@@ -60,6 +60,7 @@ module Opsicle
|
|
60
60
|
instances.each_with_index { |instance, index| puts "#{index.to_i + 1}) #{instance.status} - #{instance.hostname}" }
|
61
61
|
instance_indices_string = @cli.ask("Which instances would you like to delete? (enter as a comma separated list)\n", String)
|
62
62
|
instance_indices_list = instance_indices_string.split(/,\s*/)
|
63
|
+
check_for_valid_indices!(instance_indices_list, instances.count)
|
63
64
|
instance_indices_list.map! { |instance_index| instance_index.to_i - 1 }
|
64
65
|
instance_indices_list.each do |index|
|
65
66
|
return_array << instances[index]
|
@@ -67,5 +68,14 @@ module Opsicle
|
|
67
68
|
end
|
68
69
|
return_array
|
69
70
|
end
|
71
|
+
|
72
|
+
def check_for_valid_indices!(instance_indices_list, option_count)
|
73
|
+
valid_indices = 1..option_count
|
74
|
+
|
75
|
+
unless instance_indices_list.all?{ |i| valid_indices.include?(i.to_i) }
|
76
|
+
raise StandardError, "At least one of the indices passed is invalid. Please try again."
|
77
|
+
end
|
78
|
+
end
|
79
|
+
private :check_for_valid_indices!
|
70
80
|
end
|
71
81
|
end
|
@@ -60,6 +60,7 @@ module Opsicle
|
|
60
60
|
instances.each_with_index { |instance, index| puts "#{index.to_i + 1}) #{instance.status} - #{instance.hostname}" }
|
61
61
|
instance_indices_string = @cli.ask("Which instances would you like to stop? (enter as a comma separated list)\n", String)
|
62
62
|
instance_indices_list = instance_indices_string.split(/,\s*/)
|
63
|
+
check_for_valid_indices!(instance_indices_list, instances.count)
|
63
64
|
instance_indices_list.map! { |instance_index| instance_index.to_i - 1 }
|
64
65
|
instance_indices_list.each do |index|
|
65
66
|
return_array << instances[index]
|
@@ -67,5 +68,14 @@ module Opsicle
|
|
67
68
|
end
|
68
69
|
return_array
|
69
70
|
end
|
71
|
+
|
72
|
+
def check_for_valid_indices!(instance_indices_list, option_count)
|
73
|
+
valid_indices = 1..option_count
|
74
|
+
|
75
|
+
unless instance_indices_list.all?{ |i| valid_indices.include?(i.to_i) }
|
76
|
+
raise StandardError, "At least one of the indices passed is invalid. Please try again."
|
77
|
+
end
|
78
|
+
end
|
79
|
+
private :check_for_valid_indices!
|
70
80
|
end
|
71
81
|
end
|
data/lib/opsicle/ec2_adapter.rb
CHANGED
@@ -18,6 +18,7 @@ module Opsicle
|
|
18
18
|
def which_instance_should_get_eip(moveable_eip)
|
19
19
|
puts "\nHere are all of the instances in the current instance's layer:"
|
20
20
|
instances = get_potential_target_instances(moveable_eip)
|
21
|
+
check_for_printable_items!(instances)
|
21
22
|
print_potential_target_instances(instances)
|
22
23
|
instance_index = ask_eip_question("What is your target instance?\n", instances)
|
23
24
|
instances[instance_index].instance_id
|
@@ -40,9 +41,20 @@ module Opsicle
|
|
40
41
|
|
41
42
|
def get_potential_target_instances(moveable_eip)
|
42
43
|
instances = @opsworks_adapter.instances_by_layer(moveable_eip[:layer_id])
|
43
|
-
instances.select
|
44
|
+
instances.select do |instance|
|
45
|
+
instance.elastic_ip.nil? &&
|
46
|
+
instance.auto_scaling_type.nil? &&
|
47
|
+
instance.status == "online"
|
48
|
+
end
|
44
49
|
end
|
45
50
|
private :get_potential_target_instances
|
51
|
+
|
52
|
+
def check_for_printable_items!(instances)
|
53
|
+
if instances.empty? # instances is the list of instances that an eip can be moved to
|
54
|
+
raise StandardError, "You cannot move an EIP when there's only one instance running."
|
55
|
+
end
|
56
|
+
end
|
57
|
+
private :check_for_printable_items!
|
46
58
|
end
|
47
59
|
end
|
48
60
|
end
|
data/lib/opsicle/version.rb
CHANGED
@@ -3,79 +3,98 @@ require "opsicle"
|
|
3
3
|
require 'gli'
|
4
4
|
require "opsicle/user_profile"
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
6
|
+
describe Opsicle::DeleteInstance do
|
7
|
+
let(:config) { double(:config, opsworks_config: {stack_id: "1234"}) }
|
8
|
+
let(:opsicle_client) { double(:client, config: config, opsworks: opsworks_client, ec2: ec2_client) }
|
9
|
+
let(:opsworks_stack) { double(:stack, id: "1234", vpc_id: "21") }
|
10
|
+
let(:layer1) { double(:layer, name: "layer1", layer_id: "123") }
|
11
|
+
let(:layer2) { double(:layer, name: "layer2", layer_id: "456") }
|
12
|
+
|
13
|
+
let(:instance1) do
|
14
|
+
double(:instance,
|
15
|
+
name: "instance1",
|
16
|
+
layer_ids: [ "456" ],
|
17
|
+
status: "stopped",
|
18
|
+
auto_scaling_type: nil,
|
19
|
+
instance_id: "123",
|
20
|
+
hostname: "instance1"
|
21
|
+
)
|
22
|
+
end
|
23
|
+
|
24
|
+
let(:opsworks_client) do
|
25
|
+
double(:opsworks_client,
|
26
|
+
associate_elastic_ip: true,
|
27
|
+
describe_stacks: double(stack: [ opsworks_stack ]),
|
28
|
+
describe_instances: double(instances: [ instance1 ])
|
29
|
+
)
|
30
|
+
end
|
31
|
+
|
32
|
+
let(:ec2_client) { double(:ec2_client) }
|
33
|
+
|
34
|
+
let(:opsworks_adapter) do
|
35
|
+
double(:opsworks_adapter,
|
36
|
+
client: opsworks_client,
|
37
|
+
stack: opsworks_stack,
|
38
|
+
layers: [ layer1, layer2 ],
|
39
|
+
instances_by_stack: [ instance1 ]
|
40
|
+
)
|
41
|
+
end
|
42
|
+
|
43
|
+
let(:ec2_adapter) do
|
44
|
+
double(:ec2_adapter,
|
45
|
+
client: ec2_client,
|
46
|
+
stack: opsworks_stack,
|
47
|
+
elastic_ips: []
|
48
|
+
)
|
49
|
+
end
|
50
|
+
|
51
|
+
before do
|
52
|
+
allow(Opsicle::Client).to receive(:new).with("staging").and_return(opsicle_client)
|
53
|
+
allow(Opsicle::OpsworksAdapter).to receive(:new).and_return(opsworks_adapter)
|
54
|
+
allow_any_instance_of(HighLine).to receive(:ask).with("Layer?\n", Integer).and_return(2)
|
55
|
+
end
|
56
|
+
|
57
|
+
subject { described_class.new("staging") }
|
58
|
+
|
59
|
+
|
60
|
+
describe "#execute" do
|
61
|
+
context "when everything works as expected" do
|
62
|
+
before do
|
63
|
+
allow_any_instance_of(HighLine).to receive(:ask).with("Which instances would you like to delete? (enter as a comma separated list)\n", String).and_return("1")
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should properly ask to delete instances" do
|
67
|
+
expect(opsworks_adapter).to receive(:delete_instance).with("123")
|
68
|
+
subject.execute
|
69
|
+
end
|
63
70
|
end
|
64
71
|
|
65
|
-
|
72
|
+
context "when an improper value is passed in as something to delete" do
|
73
|
+
before do
|
74
|
+
allow_any_instance_of(HighLine).to receive(:ask).with("Which instances would you like to delete? (enter as a comma separated list)\n", String).and_return("-1")
|
75
|
+
end
|
66
76
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
77
|
+
it "should properly ask to delete instances" do
|
78
|
+
expect{subject.execute}.to raise_error(StandardError)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context "when there are no deletable instances" do
|
83
|
+
let(:instance1) do
|
84
|
+
double(:instance,
|
85
|
+
name: "instance1",
|
86
|
+
layer_ids: [ "456" ],
|
87
|
+
status: "online",
|
88
|
+
auto_scaling_type: nil,
|
89
|
+
instance_id: "123",
|
90
|
+
hostname: "instance1"
|
91
|
+
)
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should not delete any instances" do
|
95
|
+
expect(opsworks_adapter).not_to receive(:delete_instance)
|
96
|
+
subject.execute
|
97
|
+
end
|
98
|
+
end
|
80
99
|
end
|
81
100
|
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "opsicle"
|
3
|
+
require 'gli'
|
4
|
+
require "opsicle/user_profile"
|
5
|
+
|
6
|
+
describe Opsicle::StopInstance do
|
7
|
+
let(:config) { double(:config, opsworks_config: {stack_id: "1234"}) }
|
8
|
+
let(:opsicle_client) { double(:client, config: config, opsworks: opsworks_client, ec2: ec2_client) }
|
9
|
+
let(:opsworks_stack) { double(:stack, id: "1234", vpc_id: "21") }
|
10
|
+
let(:layer1) { double(:layer, name: "layer1", layer_id: "123") }
|
11
|
+
let(:layer2) { double(:layer, name: "layer2", layer_id: "456") }
|
12
|
+
|
13
|
+
let(:instance1) do
|
14
|
+
double(:instance,
|
15
|
+
name: "instance1",
|
16
|
+
layer_ids: [ "456" ],
|
17
|
+
status: "online",
|
18
|
+
elastic_ip: nil,
|
19
|
+
instance_id: "123",
|
20
|
+
hostname: "instance1"
|
21
|
+
)
|
22
|
+
end
|
23
|
+
|
24
|
+
let(:opsworks_client) do
|
25
|
+
double(:opsworks_client,
|
26
|
+
associate_elastic_ip: true,
|
27
|
+
describe_stacks: double(stack: [ opsworks_stack ]),
|
28
|
+
describe_instances: double(instances: [ instance1 ])
|
29
|
+
)
|
30
|
+
end
|
31
|
+
|
32
|
+
let(:ec2_client) { double(:ec2_client) }
|
33
|
+
|
34
|
+
let(:opsworks_adapter) do
|
35
|
+
double(:opsworks_adapter,
|
36
|
+
client: opsworks_client,
|
37
|
+
stack: opsworks_stack,
|
38
|
+
layers: [ layer1, layer2 ],
|
39
|
+
instances_by_stack: [ instance1 ]
|
40
|
+
)
|
41
|
+
end
|
42
|
+
|
43
|
+
let(:ec2_adapter) do
|
44
|
+
double(:ec2_adapter,
|
45
|
+
client: ec2_client,
|
46
|
+
stack: opsworks_stack,
|
47
|
+
elastic_ips: []
|
48
|
+
)
|
49
|
+
end
|
50
|
+
|
51
|
+
before do
|
52
|
+
allow(Opsicle::Client).to receive(:new).with("staging").and_return(opsicle_client)
|
53
|
+
allow(Opsicle::OpsworksAdapter).to receive(:new).and_return(opsworks_adapter)
|
54
|
+
allow_any_instance_of(HighLine).to receive(:ask).with("Layer?\n", Integer).and_return(2)
|
55
|
+
end
|
56
|
+
|
57
|
+
subject { described_class.new("staging") }
|
58
|
+
|
59
|
+
|
60
|
+
describe "#execute" do
|
61
|
+
context "when everything works as expected" do
|
62
|
+
before do
|
63
|
+
allow_any_instance_of(HighLine).to receive(:ask).with("Which instances would you like to stop? (enter as a comma separated list)\n", String).and_return("1")
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should properly ask to stop instances" do
|
67
|
+
expect(opsworks_adapter).to receive(:stop_instance).with("123")
|
68
|
+
subject.execute
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context "when an improper value is passed in as something to stop" do
|
73
|
+
before do
|
74
|
+
allow_any_instance_of(HighLine).to receive(:ask).with("Which instances would you like to stop? (enter as a comma separated list)\n", String).and_return("-1")
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should properly ask to stop instances" do
|
78
|
+
expect{subject.execute}.to raise_error(StandardError)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context "when there are no stoppable instances" do
|
83
|
+
let(:instance1) do
|
84
|
+
double(:instance,
|
85
|
+
name: "instance1",
|
86
|
+
layer_ids: [ "456" ],
|
87
|
+
status: "stopped",
|
88
|
+
elastic_ip: nil,
|
89
|
+
instance_id: "123",
|
90
|
+
hostname: "instance1"
|
91
|
+
)
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should not stop any instances" do
|
95
|
+
expect(opsworks_adapter).not_to receive(:stop_instance)
|
96
|
+
subject.execute
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
@@ -66,5 +66,55 @@ describe Opsicle::Questionnaire::EipInquiry do
|
|
66
66
|
it "should return a single instance" do
|
67
67
|
expect(instance_response).to eq("instance-id")
|
68
68
|
end
|
69
|
+
|
70
|
+
context "when there are no target instances" do
|
71
|
+
let(:online_instance_with_eip) do
|
72
|
+
double(:instance,
|
73
|
+
elastic_ip: true,
|
74
|
+
auto_scaling_type: nil,
|
75
|
+
status: "stopped",
|
76
|
+
hostname: "example",
|
77
|
+
instance_id: "instance-id"
|
78
|
+
)
|
79
|
+
end
|
80
|
+
|
81
|
+
let(:online_instance_without_eip) do
|
82
|
+
double(:instance,
|
83
|
+
elastic_ip: nil,
|
84
|
+
auto_scaling_type: nil,
|
85
|
+
status: "stopped",
|
86
|
+
hostname: "example",
|
87
|
+
instance_id: "instance-id"
|
88
|
+
)
|
89
|
+
end
|
90
|
+
|
91
|
+
let(:stopped_instance) do
|
92
|
+
double(:instance,
|
93
|
+
elastic_ip: nil,
|
94
|
+
auto_scaling_type: nil,
|
95
|
+
status: "stopped",
|
96
|
+
hostname: "example",
|
97
|
+
instance_id: "instance-id"
|
98
|
+
)
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should raise an error" do
|
102
|
+
expect{subject.which_instance_should_get_eip(eip_info)}.to raise_error(StandardError)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
describe "#check_for_printable_items" do
|
108
|
+
context "when there are instances" do
|
109
|
+
it "should not raise an error" do
|
110
|
+
expect(subject.send(:check_for_printable_items!, [ 1, 2, 3 ])).to eq(nil)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
context "when there are no instances" do
|
115
|
+
it "should raise an error" do
|
116
|
+
expect{subject.send(:check_for_printable_items!, [])}.to raise_error(StandardError)
|
117
|
+
end
|
118
|
+
end
|
69
119
|
end
|
70
120
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opsicle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.12.
|
4
|
+
version: 2.12.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Fleener
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2019-01-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: aws-sdk
|
@@ -255,6 +255,7 @@ files:
|
|
255
255
|
- spec/opsicle/commands/move_eip_spec.rb
|
256
256
|
- spec/opsicle/commands/ssh_key_spec.rb
|
257
257
|
- spec/opsicle/commands/ssh_spec.rb
|
258
|
+
- spec/opsicle/commands/stop_instance_spec.rb
|
258
259
|
- spec/opsicle/commands/update_spec.rb
|
259
260
|
- spec/opsicle/commands/user_profile_info_spec.rb
|
260
261
|
- spec/opsicle/config_spec.rb
|
@@ -296,7 +297,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
296
297
|
version: '0'
|
297
298
|
requirements: []
|
298
299
|
rubyforge_project:
|
299
|
-
rubygems_version: 2.
|
300
|
+
rubygems_version: 2.7.8
|
300
301
|
signing_key:
|
301
302
|
specification_version: 4
|
302
303
|
summary: An opsworks specific abstraction on top of the aws sdk
|
@@ -323,6 +324,7 @@ test_files:
|
|
323
324
|
- spec/opsicle/commands/list_spec.rb
|
324
325
|
- spec/opsicle/commands/ssh_key_spec.rb
|
325
326
|
- spec/opsicle/commands/update_spec.rb
|
327
|
+
- spec/opsicle/commands/stop_instance_spec.rb
|
326
328
|
- spec/opsicle/commands/failure_log_spec.rb
|
327
329
|
- spec/opsicle/commands/delete_instance_spec.rb
|
328
330
|
- spec/opsicle/commands/move_eip_spec.rb
|