opsicle 2.12.2 → 2.12.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/opsicle/commands/add_tags.rb +2 -2
- data/lib/opsicle/commands/clone_instance.rb +2 -2
- data/lib/opsicle/commands/create_instance.rb +2 -2
- data/lib/opsicle/commands/delete_instance.rb +2 -2
- data/lib/opsicle/commands/move_eip.rb +19 -3
- data/lib/opsicle/commands/stop_instance.rb +2 -2
- data/lib/opsicle/manageable_stack.rb +23 -50
- data/lib/opsicle/opsworks_adapter.rb +34 -3
- data/lib/opsicle/questionnaire/eip_inquiry.rb +48 -0
- data/lib/opsicle/version.rb +1 -1
- data/spec/opsicle/commands/move_eip_spec.rb +47 -0
- data/spec/opsicle/manageable_stack_spec.rb +91 -18
- data/spec/opsicle/opsworks_adapter_spec.rb +64 -4
- data/spec/opsicle/questionnaire/eip_inquiry_spec.rb +70 -0
- data/spec/spec_helper.rb +1 -0
- metadata +6 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 508652e0801f35bc78c6e29e2b990a075b32db81
|
4
|
+
data.tar.gz: a43909b2ff893db83f1cddca4624181e02a837c5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e068df9fe0e064989f92f3f5155644c5cf81c15afa6457641469e4bfae5b0bd3643d4a8ab78cb9c468fb8ce894808219fb3171d21db27a2169c8ea113f77554e
|
7
|
+
data.tar.gz: 6f168db27328423daddb64558e92fb3e50d7135573535652279bdc2206ce3f5ae80751de767326f68ef8ad9e67d6aee318cfcc3ab00632b08ea5e5a4f40544af
|
@@ -14,7 +14,7 @@ module Opsicle
|
|
14
14
|
@ec2_adapter = Ec2Adapter.new(@client)
|
15
15
|
@opsworks_adapter = OpsworksAdapter.new(@client)
|
16
16
|
stack_id = @client.config.opsworks_config[:stack_id]
|
17
|
-
@stack = ManageableStack.new(stack_id, @opsworks_adapter
|
17
|
+
@stack = ManageableStack.new(stack_id, @opsworks_adapter)
|
18
18
|
@cli = HighLine.new
|
19
19
|
end
|
20
20
|
|
@@ -32,7 +32,7 @@ module Opsicle
|
|
32
32
|
|
33
33
|
def select_layer
|
34
34
|
puts "\nLayers:\n"
|
35
|
-
ops_layers = @opsworks_adapter.
|
35
|
+
ops_layers = @opsworks_adapter.layers(@stack.id)
|
36
36
|
|
37
37
|
layers = []
|
38
38
|
ops_layers.each do |layer|
|
@@ -14,7 +14,7 @@ module Opsicle
|
|
14
14
|
@ec2_adapter = Ec2Adapter.new(@client)
|
15
15
|
@opsworks_adapter = OpsworksAdapter.new(@client)
|
16
16
|
stack_id = @client.config.opsworks_config[:stack_id]
|
17
|
-
@stack = ManageableStack.new(stack_id, @opsworks_adapter
|
17
|
+
@stack = ManageableStack.new(stack_id, @opsworks_adapter)
|
18
18
|
@cli = HighLine.new
|
19
19
|
end
|
20
20
|
|
@@ -38,7 +38,7 @@ module Opsicle
|
|
38
38
|
|
39
39
|
def select_layer
|
40
40
|
puts "\nLayers:\n"
|
41
|
-
ops_layers = @opsworks_adapter.
|
41
|
+
ops_layers = @opsworks_adapter.layers(@stack.id)
|
42
42
|
|
43
43
|
layers = []
|
44
44
|
ops_layers.each do |layer|
|
@@ -14,7 +14,7 @@ module Opsicle
|
|
14
14
|
@ec2_adapter = Ec2Adapter.new(@client)
|
15
15
|
@opsworks_adapter = OpsworksAdapter.new(@client)
|
16
16
|
stack_id = @client.config.opsworks_config[:stack_id]
|
17
|
-
@stack = ManageableStack.new(stack_id, @opsworks_adapter
|
17
|
+
@stack = ManageableStack.new(stack_id, @opsworks_adapter)
|
18
18
|
@cli = HighLine.new
|
19
19
|
end
|
20
20
|
|
@@ -33,7 +33,7 @@ module Opsicle
|
|
33
33
|
|
34
34
|
def select_layer
|
35
35
|
puts "\nLayers:\n"
|
36
|
-
ops_layers = @opsworks_adapter.
|
36
|
+
ops_layers = @opsworks_adapter.layers(@stack.id)
|
37
37
|
|
38
38
|
layers = []
|
39
39
|
ops_layers.each do |layer|
|
@@ -14,7 +14,7 @@ module Opsicle
|
|
14
14
|
@ec2_adapter = Ec2Adapter.new(@client)
|
15
15
|
@opsworks_adapter = OpsworksAdapter.new(@client)
|
16
16
|
stack_id = @client.config.opsworks_config[:stack_id]
|
17
|
-
@stack = ManageableStack.new(stack_id, @opsworks_adapter
|
17
|
+
@stack = ManageableStack.new(stack_id, @opsworks_adapter)
|
18
18
|
@cli = HighLine.new
|
19
19
|
end
|
20
20
|
|
@@ -38,7 +38,7 @@ module Opsicle
|
|
38
38
|
|
39
39
|
def select_layer
|
40
40
|
puts "\nLayers:\n"
|
41
|
-
ops_layers = @opsworks_adapter.
|
41
|
+
ops_layers = @opsworks_adapter.layers(@stack.id)
|
42
42
|
|
43
43
|
layers = []
|
44
44
|
ops_layers.each do |layer|
|
@@ -4,21 +4,37 @@ require "opsicle/opsworks_adapter"
|
|
4
4
|
require "opsicle/manageable_layer"
|
5
5
|
require "opsicle/manageable_instance"
|
6
6
|
require "opsicle/manageable_stack"
|
7
|
+
require "opsicle/questionnaire/eip_inquiry"
|
7
8
|
|
8
9
|
module Opsicle
|
9
10
|
class MoveEip
|
10
11
|
|
11
12
|
def initialize(environment)
|
12
13
|
@client = Client.new(environment)
|
13
|
-
@
|
14
|
+
@opsworks_adapter = OpsworksAdapter.new(@client)
|
14
15
|
stack_id = @client.config.opsworks_config[:stack_id]
|
15
16
|
@cli = HighLine.new
|
16
|
-
@stack = ManageableStack.new(stack_id, @
|
17
|
+
@stack = ManageableStack.new(stack_id, @opsworks_adapter, @cli)
|
18
|
+
|
19
|
+
@eip_inquiry = Questionnaire::EipInquiry.new(
|
20
|
+
opsworks_adapter: @opsworks_adapter,
|
21
|
+
highline_client: @cli
|
22
|
+
)
|
17
23
|
end
|
18
24
|
|
19
25
|
def execute(options={})
|
20
26
|
puts "Stack ID = #{@stack.id}"
|
21
|
-
|
27
|
+
moved_values = move_eip
|
28
|
+
puts "\nEIP #{moved_values[:ip_address]} was moved to instance #{moved_values[:target_instance_id]}"
|
29
|
+
end
|
30
|
+
|
31
|
+
def move_eip
|
32
|
+
eip_information = @stack.eips
|
33
|
+
moveable_eip = @eip_inquiry.which_eip_should_move(eip_information)
|
34
|
+
target_instance_id = @eip_inquiry.which_instance_should_get_eip(moveable_eip)
|
35
|
+
@stack.transfer_eip(moveable_eip, target_instance_id)
|
36
|
+
{ ip_address: moveable_eip[:ip_address], target_instance_id: target_instance_id }
|
22
37
|
end
|
38
|
+
private :move_eip
|
23
39
|
end
|
24
40
|
end
|
@@ -14,7 +14,7 @@ module Opsicle
|
|
14
14
|
@ec2_adapter = Ec2Adapter.new(@client)
|
15
15
|
@opsworks_adapter = OpsworksAdapter.new(@client)
|
16
16
|
stack_id = @client.config.opsworks_config[:stack_id]
|
17
|
-
@stack = ManageableStack.new(stack_id, @opsworks_adapter
|
17
|
+
@stack = ManageableStack.new(stack_id, @opsworks_adapter)
|
18
18
|
@cli = HighLine.new
|
19
19
|
end
|
20
20
|
|
@@ -38,7 +38,7 @@ module Opsicle
|
|
38
38
|
|
39
39
|
def select_layer
|
40
40
|
puts "\nLayers:\n"
|
41
|
-
ops_layers = @opsworks_adapter.
|
41
|
+
ops_layers = @opsworks_adapter.layers(@stack.id)
|
42
42
|
|
43
43
|
layers = []
|
44
44
|
ops_layers.each do |layer|
|
@@ -1,34 +1,28 @@
|
|
1
1
|
module Opsicle
|
2
2
|
class ManageableStack
|
3
|
-
attr_accessor :id, :
|
3
|
+
attr_accessor :id, :opsworks_adapter, :stack, :vpc_id, :eips, :cli
|
4
4
|
|
5
|
-
|
5
|
+
STOPPABLE_STATES = %w(start_failed stop_failed online running_setup setup_failed booting rebooting)
|
6
|
+
|
7
|
+
def initialize(stack_id, opsworks_adapter, cli=nil)
|
6
8
|
self.id = stack_id
|
7
|
-
self.
|
9
|
+
self.opsworks_adapter = opsworks_adapter
|
8
10
|
self.cli = cli
|
9
|
-
self.stack =
|
11
|
+
self.stack = @opsworks_adapter.stack(id)
|
10
12
|
self.vpc_id = self.stack.vpc_id
|
11
|
-
self.eips = nil
|
12
|
-
end
|
13
|
-
|
14
|
-
def get_stack
|
15
|
-
@opsworks.describe_stacks({ :stack_ids => [self.id.to_s] }).stacks.first
|
16
|
-
end
|
17
|
-
|
18
|
-
def get_eips
|
19
|
-
self.eips = @opsworks.describe_elastic_ips(stack_id: self.id.to_s).elastic_ips
|
20
13
|
end
|
21
14
|
|
22
|
-
def
|
15
|
+
def eips
|
16
|
+
eips = @opsworks_adapter.elastic_ips(id)
|
23
17
|
eip_information = []
|
24
18
|
|
25
|
-
|
19
|
+
eips.each do |eip|
|
26
20
|
next unless eip.instance_id
|
27
21
|
instance_id = eip.instance_id
|
28
|
-
instance = @
|
22
|
+
instance = @opsworks_adapter.instance(instance_id)
|
29
23
|
instance_name = instance.hostname
|
30
24
|
layer_id = instance.layer_ids.first
|
31
|
-
layer = @
|
25
|
+
layer = @opsworks_adapter.layer(layer_id)
|
32
26
|
layer_name = layer.name
|
33
27
|
eip_information << { eip: eip, ip_address: eip.ip, instance_name: instance_name, layer_id: layer_id }
|
34
28
|
end
|
@@ -36,49 +30,28 @@ module Opsicle
|
|
36
30
|
eip_information
|
37
31
|
end
|
38
32
|
|
39
|
-
def ask_which_eip_to_move(eip_information)
|
40
|
-
puts "\nHere are all of the EIPs for this stack:"
|
41
|
-
eip_information.each_with_index { |h, index| puts "#{index.to_i + 1}) #{h[:ip_address]} connected to #{h[:instance_name]}" }
|
42
|
-
eip_index = @cli.ask("Which EIP would you like to move?\n", Integer) { |q| q.in = 1..eip_information.length.to_i } - 1
|
43
|
-
eip_information[eip_index]
|
44
|
-
end
|
45
|
-
|
46
|
-
def ask_which_target_instance(moveable_eip)
|
47
|
-
puts "\nHere are all of the instances in the current instance's layer:"
|
48
|
-
instances = @opsworks.describe_instances(layer_id: moveable_eip[:layer_id]).instances
|
49
|
-
instances = instances.select { |instance| instance.elastic_ip.nil? && instance.auto_scaling_type.nil? }
|
50
|
-
instances.each_with_index { |instance, index| puts "#{index.to_i + 1}) #{instance.status} - #{instance.hostname}" }
|
51
|
-
instance_index = @cli.ask("What is your target instance?\n", Integer) { |q| q.in = 1..instances.length.to_i } - 1
|
52
|
-
instances[instance_index].instance_id
|
53
|
-
end
|
54
|
-
|
55
33
|
def transfer_eip(moveable_eip, target_instance_id)
|
56
|
-
@
|
57
|
-
puts "\nEIP #{moveable_eip[:ip_address]} was moved to instance #{target_instance_id}"
|
58
|
-
end
|
59
|
-
|
60
|
-
def move_eip
|
61
|
-
get_eips
|
62
|
-
eip_information = gather_eip_information
|
63
|
-
moveable_eip = ask_which_eip_to_move(eip_information)
|
64
|
-
target_instance_id = ask_which_target_instance(moveable_eip)
|
65
|
-
transfer_eip(moveable_eip, target_instance_id)
|
34
|
+
@opsworks_adapter.associate_elastic_ip(moveable_eip[:ip_address], target_instance_id)
|
66
35
|
end
|
67
36
|
|
68
37
|
def instances
|
69
|
-
@
|
38
|
+
@opsworks_adapter.instances_by_stack(id)
|
70
39
|
end
|
71
40
|
|
72
41
|
def deleteable_instances(layer)
|
73
|
-
instances.select
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
42
|
+
instances.select do |instance|
|
43
|
+
instance.auto_scaling_type.nil? &&
|
44
|
+
instance.status == "stopped" &&
|
45
|
+
instance.layer_ids.include?(layer.layer_id)
|
46
|
+
end
|
78
47
|
end
|
79
48
|
|
80
49
|
def stoppable_instances(layer)
|
81
|
-
instances.select
|
50
|
+
instances.select do |instance|
|
51
|
+
instance.elastic_ip.nil? &&
|
52
|
+
STOPPABLE_STATES.include?(instance.status) &&
|
53
|
+
instance.layer_ids.include?(layer.layer_id)
|
54
|
+
end
|
82
55
|
end
|
83
56
|
end
|
84
57
|
end
|
@@ -1,14 +1,45 @@
|
|
1
1
|
class Opsicle::OpsworksAdapter
|
2
2
|
attr_reader :client
|
3
3
|
|
4
|
-
def initialize(
|
5
|
-
@client =
|
4
|
+
def initialize(opsicle_client)
|
5
|
+
@client = opsicle_client.opsworks
|
6
6
|
end
|
7
7
|
|
8
|
-
def
|
8
|
+
def stack(stack_id)
|
9
|
+
client.describe_stacks(stack_ids: [ stack_id ]).stacks.first
|
10
|
+
end
|
11
|
+
|
12
|
+
def layers(stack_id)
|
9
13
|
client.describe_layers(stack_id: stack_id).layers
|
10
14
|
end
|
11
15
|
|
16
|
+
def layer(layer_id)
|
17
|
+
client.describe_layers(layer_ids: [ layer_id ]).layers.first
|
18
|
+
end
|
19
|
+
|
20
|
+
def instances_by_stack(stack_id)
|
21
|
+
client.describe_instances(stack_id: stack_id).instances
|
22
|
+
end
|
23
|
+
|
24
|
+
def instances_by_layer(layer_id)
|
25
|
+
client.describe_instances(layer_id: layer_id).instances
|
26
|
+
end
|
27
|
+
|
28
|
+
def instance(instance_id)
|
29
|
+
client.describe_instances(instance_ids: [ instance_id ]).instances.first
|
30
|
+
end
|
31
|
+
|
32
|
+
def elastic_ips(stack_id)
|
33
|
+
client.describe_elastic_ips(stack_id: stack_id).elastic_ips
|
34
|
+
end
|
35
|
+
|
36
|
+
def associate_elastic_ip(elastic_ip, target_instance_id)
|
37
|
+
client.associate_elastic_ip(
|
38
|
+
elastic_ip: elastic_ip,
|
39
|
+
instance_id: target_instance_id
|
40
|
+
)
|
41
|
+
end
|
42
|
+
|
12
43
|
def start_instance(instance_id)
|
13
44
|
client.start_instance(instance_id: instance_id)
|
14
45
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Opsicle
|
2
|
+
module Questionnaire
|
3
|
+
class EipInquiry
|
4
|
+
attr_accessor :opsworks_adapter, :cli
|
5
|
+
|
6
|
+
def initialize(options)
|
7
|
+
self.opsworks_adapter = options[:opsworks_adapter]
|
8
|
+
self.cli = options[:highline_client]
|
9
|
+
end
|
10
|
+
|
11
|
+
def which_eip_should_move(eip_information)
|
12
|
+
puts "\nHere are all of the EIPs for this stack:"
|
13
|
+
print_current_eips(eip_information)
|
14
|
+
eip_index = ask_eip_question("Which EIP would you like to move?\n", eip_information)
|
15
|
+
eip_information[eip_index]
|
16
|
+
end
|
17
|
+
|
18
|
+
def which_instance_should_get_eip(moveable_eip)
|
19
|
+
puts "\nHere are all of the instances in the current instance's layer:"
|
20
|
+
instances = get_potential_target_instances(moveable_eip)
|
21
|
+
print_potential_target_instances(instances)
|
22
|
+
instance_index = ask_eip_question("What is your target instance?\n", instances)
|
23
|
+
instances[instance_index].instance_id
|
24
|
+
end
|
25
|
+
|
26
|
+
def ask_eip_question(prompt, choices)
|
27
|
+
@cli.ask(prompt, Integer) { |q| q.in = 1..choices.length.to_i } - 1
|
28
|
+
end
|
29
|
+
private :ask_eip_question
|
30
|
+
|
31
|
+
def print_current_eips(eip_information)
|
32
|
+
eip_information.each_with_index { |eip, index| puts "#{index.to_i + 1}) #{eip[:ip_address]} connected to #{eip[:instance_name]}" }
|
33
|
+
end
|
34
|
+
private :print_current_eips
|
35
|
+
|
36
|
+
def print_potential_target_instances(instances)
|
37
|
+
instances.each_with_index { |instance, index| puts "#{index.to_i + 1}) #{instance.status} - #{instance.hostname}" }
|
38
|
+
end
|
39
|
+
private :print_potential_target_instances
|
40
|
+
|
41
|
+
def get_potential_target_instances(moveable_eip)
|
42
|
+
instances = @opsworks_adapter.instances_by_layer(moveable_eip[:layer_id])
|
43
|
+
instances.select { |instance| instance.elastic_ip.nil? && instance.auto_scaling_type.nil? }
|
44
|
+
end
|
45
|
+
private :get_potential_target_instances
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/opsicle/version.rb
CHANGED
@@ -0,0 +1,47 @@
|
|
1
|
+
describe Opsicle::MoveEip do
|
2
|
+
let(:old_eip) { 'old_eip' }
|
3
|
+
let(:target_instance) { 'target_instance' }
|
4
|
+
let(:opsworks_eip) { double(:eip, ip: "123", instance_id: "1234") }
|
5
|
+
let(:opsworks_stack) { double(:stack, id: "1234", vpc_id: "21") }
|
6
|
+
let(:config) { double(:config, opsworks_config: {stack_id: "123"}) }
|
7
|
+
let(:opsicle_client) { double(:client, config: config, opsworks: opsworks_client) }
|
8
|
+
|
9
|
+
let(:opsworks_client) do
|
10
|
+
double(:opsworks_client,
|
11
|
+
associate_elastic_ip: true,
|
12
|
+
describe_stacks: double(stack: [opsworks_stack])
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
let(:opsworks_adapter) do
|
17
|
+
double(:opsworks_adapter,
|
18
|
+
client: opsworks_client,
|
19
|
+
stack: opsworks_stack,
|
20
|
+
elastic_ips: [opsworks_eip, opsworks_eip],
|
21
|
+
instance: double(hostname: 'hostname', layer_ids: ['layer_id']),
|
22
|
+
layer: double(name: 'layer_name')
|
23
|
+
)
|
24
|
+
end
|
25
|
+
|
26
|
+
let(:eip_inquiry) do
|
27
|
+
double(:eip_inquiry,
|
28
|
+
which_eip_should_move: { ip_address: old_eip },
|
29
|
+
which_instance_should_get_eip: target_instance
|
30
|
+
)
|
31
|
+
end
|
32
|
+
|
33
|
+
before do
|
34
|
+
allow(Opsicle::Client).to receive(:new).with("staging").and_return(opsicle_client)
|
35
|
+
allow(Opsicle::OpsworksAdapter).to receive(:new).and_return(opsworks_adapter)
|
36
|
+
allow(Opsicle::Questionnaire::EipInquiry).to receive(:new).and_return(eip_inquiry)
|
37
|
+
end
|
38
|
+
|
39
|
+
subject { described_class.new("staging") }
|
40
|
+
|
41
|
+
describe "#execute" do
|
42
|
+
it "should make an API call to opsworks to change the EIP" do
|
43
|
+
expect(opsworks_adapter).to receive(:associate_elastic_ip).with(old_eip, target_instance)
|
44
|
+
subject.execute
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -1,23 +1,96 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
1
|
+
describe Opsicle::ManageableStack do
|
2
|
+
let(:deleteable_instance) do
|
3
|
+
double(:deleteable_instance,
|
4
|
+
auto_scaling_type: nil,
|
5
|
+
status: "stopped",
|
6
|
+
layer_ids: ["456"],
|
7
|
+
elastic_ip: nil,
|
8
|
+
hostname: "example-hostname"
|
9
|
+
)
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:stoppable_instance) do
|
13
|
+
double(:stoppable_instance,
|
14
|
+
elastic_ip: nil,
|
15
|
+
status: "start_failed",
|
16
|
+
layer_ids: ["456"],
|
17
|
+
auto_scaling_type: nil
|
18
|
+
)
|
19
|
+
end
|
20
|
+
|
21
|
+
let(:stack) { double(:stack, vpc_id: "id") }
|
22
|
+
|
23
|
+
let(:layer) do
|
24
|
+
double(:layer,
|
25
|
+
layer_id: "456",
|
26
|
+
name: "layername"
|
27
|
+
)
|
28
|
+
end
|
29
|
+
|
30
|
+
let(:eip) do
|
31
|
+
double(:eip,
|
32
|
+
instance_id: "123",
|
33
|
+
ip: "ip-123",
|
34
|
+
)
|
35
|
+
end
|
36
|
+
|
37
|
+
let(:client) { double(:client, opsworks: aws_opsworks_client) }
|
38
|
+
|
39
|
+
let(:aws_opsworks_client) do
|
40
|
+
double(:aws_opsworks_client,
|
41
|
+
describe_stacks: double(:stacks, stacks: [stack]),
|
42
|
+
describe_layers: double(:layers, layers: [layer]),
|
43
|
+
describe_instances: double(:instances, instances: [deleteable_instance, stoppable_instance]),
|
44
|
+
describe_elastic_ips: double(:eips, elastic_ips: [eip]),
|
45
|
+
associate_elastic_ip: :associated_eip,
|
46
|
+
start_instance: :started,
|
47
|
+
stop_instance: :stopped,
|
48
|
+
delete_instance: :deleted
|
49
|
+
)
|
50
|
+
end
|
51
|
+
|
52
|
+
let(:opsworks_adapter) { Opsicle::OpsworksAdapter.new(client) }
|
53
|
+
let(:stack_id) { '123' }
|
54
|
+
|
55
|
+
subject { described_class.new(stack_id, opsworks_adapter) }
|
56
|
+
|
57
|
+
describe "#eips" do
|
58
|
+
let(:eips) { subject.eips }
|
59
|
+
|
60
|
+
it "should properly find and format EIPs" do
|
61
|
+
expect(eips).to eq([{eip: eip, ip_address: "ip-123", instance_name: "example-hostname", layer_id: "456"}])
|
12
62
|
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "#transfer_eip" do
|
66
|
+
let(:transfer) { subject.transfer_eip({ip_address: true}, "target_instance_id") }
|
67
|
+
|
68
|
+
it "should properly transfer the EIP" do
|
69
|
+
expect(transfer).to eq(:associated_eip)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe "#instances" do
|
74
|
+
let(:instances) { subject.instances }
|
75
|
+
|
76
|
+
it "should properly gather a list of instances" do
|
77
|
+
expect(instances).to eq([deleteable_instance, stoppable_instance])
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe "#deleteable_instances" do
|
82
|
+
let(:instances) { subject.deleteable_instances(layer) }
|
83
|
+
|
84
|
+
it "should look for any instances that are deleteable" do
|
85
|
+
expect(instances).to eq([deleteable_instance])
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
describe "#stoppable_instances" do
|
90
|
+
let(:instances) { subject.stoppable_instances(layer) }
|
13
91
|
|
14
|
-
|
15
|
-
|
16
|
-
stack = ManageableStack.new(12345, @opsworks)
|
17
|
-
expect(@opsworks).to receive(:describe_stacks).and_return(@stacks)
|
18
|
-
expect(@stacks).to receive(:stacks)
|
19
|
-
stack.get_stack
|
20
|
-
end
|
92
|
+
it "should look for any instances that are stoppable" do
|
93
|
+
expect(instances).to eq([stoppable_instance])
|
21
94
|
end
|
22
95
|
end
|
23
96
|
end
|
@@ -1,7 +1,11 @@
|
|
1
1
|
describe Opsicle::OpsworksAdapter do
|
2
2
|
let(:aws_opsworks_client) do
|
3
3
|
double(:aws_opsworks_client,
|
4
|
-
|
4
|
+
describe_stacks: double(:stacks, stacks: [:stack_one]),
|
5
|
+
describe_layers: double(:layers, layers: [:layer_one]),
|
6
|
+
describe_instances: double(:instances, instances: [:instance_one]),
|
7
|
+
describe_elastic_ips: double(:eips, elastic_ips: []),
|
8
|
+
associate_elastic_ip: :associated_eip,
|
5
9
|
start_instance: :started,
|
6
10
|
stop_instance: :stopped,
|
7
11
|
delete_instance: :deleted
|
@@ -11,11 +15,67 @@ describe Opsicle::OpsworksAdapter do
|
|
11
15
|
|
12
16
|
subject { described_class.new(client) }
|
13
17
|
|
14
|
-
describe "#
|
15
|
-
let(:
|
18
|
+
describe "#stack" do
|
19
|
+
let(:stack) { subject.stack(:stack_id) }
|
20
|
+
|
21
|
+
it "should return the stack in question" do
|
22
|
+
expect(stack).to eq(:stack_one)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#layers" do
|
27
|
+
let(:layers) { subject.layers(:stack_id) }
|
16
28
|
|
17
29
|
it "should gather an array of layers for this opsworks client" do
|
18
|
-
expect(
|
30
|
+
expect(layers).to eq([:layer_one])
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "#layer" do
|
35
|
+
let (:layer) { subject.layer(:layer_id) }
|
36
|
+
|
37
|
+
it "should get the layer in question" do
|
38
|
+
expect(layer).to eq(:layer_one)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "#instances_by_stack" do
|
43
|
+
let (:instances) { subject.instances_by_stack(:stack_id) }
|
44
|
+
|
45
|
+
it "should get a list of instances in the stack" do
|
46
|
+
expect(instances).to eq([:instance_one])
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "#instances_by_layer" do
|
51
|
+
let (:instances) { subject.instances_by_layer(:layer_id) }
|
52
|
+
|
53
|
+
it "should get a list of instances in the_layer" do
|
54
|
+
expect(instances).to eq([:instance_one])
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "#instance" do
|
59
|
+
let (:instance) { subject.instance(:instance_id) }
|
60
|
+
|
61
|
+
it "should get the instance in question" do
|
62
|
+
expect(instance).to eq(:instance_one)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe "#elastic_ips" do
|
67
|
+
let (:eips) { subject.elastic_ips(:stack_id) }
|
68
|
+
|
69
|
+
it "should get a list of the EIPs in the stack" do
|
70
|
+
expect(eips).to be_empty
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe "#associate_elastic_ip" do
|
75
|
+
let (:associated) { subject.associate_elastic_ip(:eip, :target_instance_id) }
|
76
|
+
|
77
|
+
it "should get a list of the EIPs in the stack" do
|
78
|
+
expect(associated).to be(:associated_eip)
|
19
79
|
end
|
20
80
|
end
|
21
81
|
|
@@ -0,0 +1,70 @@
|
|
1
|
+
describe Opsicle::Questionnaire::EipInquiry do
|
2
|
+
let(:cli) { double(:cli, ask: 1) }
|
3
|
+
|
4
|
+
let(:online_instance_with_eip) do
|
5
|
+
double(:instance,
|
6
|
+
elastic_ip: true,
|
7
|
+
auto_scaling_type: nil,
|
8
|
+
status: "online",
|
9
|
+
hostname: "example",
|
10
|
+
instance_id: "instance-id"
|
11
|
+
)
|
12
|
+
end
|
13
|
+
|
14
|
+
let(:online_instance_without_eip) do
|
15
|
+
double(:instance,
|
16
|
+
elastic_ip: nil,
|
17
|
+
auto_scaling_type: nil,
|
18
|
+
status: "online",
|
19
|
+
hostname: "example",
|
20
|
+
instance_id: "instance-id"
|
21
|
+
)
|
22
|
+
end
|
23
|
+
|
24
|
+
let(:stopped_instance) do
|
25
|
+
double(:instance,
|
26
|
+
elastic_ip: nil,
|
27
|
+
auto_scaling_type: nil,
|
28
|
+
status: "stopped",
|
29
|
+
hostname: "example",
|
30
|
+
instance_id: "instance-id"
|
31
|
+
)
|
32
|
+
end
|
33
|
+
|
34
|
+
let(:client) { double(:client, opsworks: aws_opsworks_client) }
|
35
|
+
|
36
|
+
let(:aws_opsworks_client) do
|
37
|
+
double(:aws_opsworks_client,
|
38
|
+
describe_instances: double(:instances, instances: [online_instance_with_eip, online_instance_without_eip, stopped_instance])
|
39
|
+
)
|
40
|
+
end
|
41
|
+
|
42
|
+
let(:opsworks_adapter) { Opsicle::OpsworksAdapter.new(client) }
|
43
|
+
|
44
|
+
let(:eip_info) do
|
45
|
+
{ eip: true, ip_address: "ip-123", instance_name: "example-hostname", layer_id: "id1" }
|
46
|
+
end
|
47
|
+
|
48
|
+
subject { described_class.new(opsworks_adapter: opsworks_adapter, highline_client: cli) }
|
49
|
+
|
50
|
+
describe "#which_eip_should_move" do
|
51
|
+
let(:eip_response) { subject.which_eip_should_move([eip_info]) }
|
52
|
+
|
53
|
+
it "should ask the user a question" do
|
54
|
+
expect(cli).to receive(:ask)
|
55
|
+
subject.which_eip_should_move([eip_info])
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should return the EIP to move" do
|
59
|
+
expect(eip_response).to eq(eip_info)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe "#which_instance_should_get_eip" do
|
64
|
+
let(:instance_response) { subject.which_instance_should_get_eip(eip_info) }
|
65
|
+
|
66
|
+
it "should return a single instance" do
|
67
|
+
expect(instance_response).to eq("instance-id")
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
data/spec/spec_helper.rb
CHANGED
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.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Fleener
|
@@ -238,6 +238,7 @@ files:
|
|
238
238
|
- lib/opsicle/monitor/translatable.rb
|
239
239
|
- lib/opsicle/opsworks_adapter.rb
|
240
240
|
- lib/opsicle/output.rb
|
241
|
+
- lib/opsicle/questionnaire/eip_inquiry.rb
|
241
242
|
- lib/opsicle/s3_bucket.rb
|
242
243
|
- lib/opsicle/stack.rb
|
243
244
|
- lib/opsicle/user_profile.rb
|
@@ -251,6 +252,7 @@ files:
|
|
251
252
|
- spec/opsicle/commands/failure_log_spec.rb
|
252
253
|
- spec/opsicle/commands/list_instances_spec.rb
|
253
254
|
- spec/opsicle/commands/list_spec.rb
|
255
|
+
- spec/opsicle/commands/move_eip_spec.rb
|
254
256
|
- spec/opsicle/commands/ssh_key_spec.rb
|
255
257
|
- spec/opsicle/commands/ssh_spec.rb
|
256
258
|
- spec/opsicle/commands/update_spec.rb
|
@@ -270,6 +272,7 @@ files:
|
|
270
272
|
- spec/opsicle/monitor/subpanel_spec.rb
|
271
273
|
- spec/opsicle/opsworks_adapter_spec.rb
|
272
274
|
- spec/opsicle/output_spec.rb
|
275
|
+
- spec/opsicle/questionnaire/eip_inquiry_spec.rb
|
273
276
|
- spec/opsicle/s3_bucket_spec.rb
|
274
277
|
- spec/opsicle/user_profile_spec.rb
|
275
278
|
- spec/spec_helper.rb
|
@@ -311,6 +314,7 @@ test_files:
|
|
311
314
|
- spec/opsicle/manageable_stack_spec.rb
|
312
315
|
- spec/opsicle/s3_bucket_spec.rb
|
313
316
|
- spec/opsicle/manageable_layer_spec.rb
|
317
|
+
- spec/opsicle/questionnaire/eip_inquiry_spec.rb
|
314
318
|
- spec/opsicle/opsworks_adapter_spec.rb
|
315
319
|
- spec/opsicle/ec2_adapter_spec.rb
|
316
320
|
- spec/opsicle/commands/deploy_spec.rb
|
@@ -321,6 +325,7 @@ test_files:
|
|
321
325
|
- spec/opsicle/commands/update_spec.rb
|
322
326
|
- spec/opsicle/commands/failure_log_spec.rb
|
323
327
|
- spec/opsicle/commands/delete_instance_spec.rb
|
328
|
+
- spec/opsicle/commands/move_eip_spec.rb
|
324
329
|
- spec/opsicle/commands/list_instances_spec.rb
|
325
330
|
- spec/opsicle/commands/execute_recipes_spec.rb
|
326
331
|
- spec/opsicle/commands/ssh_spec.rb
|