opsicle 2.6.0 → 2.8.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 62234a4db3f58fa24aff77217786dd4be48d0763
4
- data.tar.gz: ac69c2625a780fdd78ceaaf38e3299fe2c1807c0
3
+ metadata.gz: 1e61d35388f34cdb0123201879ba2a6e0b8737d6
4
+ data.tar.gz: ba08ee8d2d71fdf3dcefd6e5ba89dfd098f196c6
5
5
  SHA512:
6
- metadata.gz: c38462e8b4c1cc7205bc71a73936e6e9df19845cfed644ea18078339d872a7e132ee9be688e03ea587642b83ba0d2a4a8b23da5caa09a26a4dfa67752548fd26
7
- data.tar.gz: 702c9a75c1e83385437d41a5603c62f7b0d57564228444f4e1a8e1e056793eb05bc4df66d10f10a4e8573c2f445526733484f777964717b80be567ef1ee25aba
6
+ metadata.gz: e1ec727a15e561239139e17f484a67c4708d8c42102187f47d2df59fd3722e5b547c50e7837c8cae10281d48ad3d94ff7976b797f9a1a6f6995b7ffa9e92a9ed
7
+ data.tar.gz: f450d31f77ef707f45bc55c921a895a12769374de33d9ec1789d40c10d6b45ae63edcb7596596ef4ea251a1a8a85fd286ce37cd2dadf2bb79c18a5d376c93068
data/bin/opsicle CHANGED
@@ -196,6 +196,7 @@ end
196
196
  desc "Clone instances in the given environment stack"
197
197
  arg_name '<environment>'
198
198
  command 'clone-instance' do |c|
199
+ c.switch [:d, :'with-defaults'], desc: "Clone the instances with no overrides", default_value: false
199
200
  c.action do |global_options, options, args|
200
201
  raise ArgumentError, "Environment is required" unless args.first
201
202
  Opsicle::CloneInstance.new(args.first).execute global_options.merge options
@@ -1,8 +1,30 @@
1
1
  module Opsicle
2
2
  class CloneableInstance
3
- attr_accessor :hostname, :status, :layer, :ami_id, :instance_type, :agent_version, :stack_id, :layer_ids,
4
- :auto_scaling_type, :os, :ssh_key_name, :availability_zone, :virtualization_type, :subnet_id,
5
- :architecture, :root_device_type, :install_updates_on_boot, :ebs_optimized, :tenancy, :opsworks, :cli
3
+ attr_accessor(
4
+ :hostname,
5
+ :status,
6
+ :layer,
7
+ :ami_id,
8
+ :instance_type,
9
+ :instance_id,
10
+ :new_instance_id,
11
+ :agent_version,
12
+ :stack_id,
13
+ :layer_ids,
14
+ :auto_scaling_type,
15
+ :os,
16
+ :ssh_key_name,
17
+ :availability_zone,
18
+ :virtualization_type,
19
+ :subnet_id,
20
+ :architecture,
21
+ :root_device_type,
22
+ :install_updates_on_boot,
23
+ :ebs_optimized,
24
+ :tenancy,
25
+ :opsworks,
26
+ :cli
27
+ )
6
28
 
7
29
  def initialize(instance, layer, opsworks, cli)
8
30
  self.hostname = instance.hostname
@@ -26,44 +48,65 @@ module Opsicle
26
48
  self.tenancy = instance.tenancy
27
49
  self.opsworks = opsworks
28
50
  self.cli = cli
51
+ self.instance_id = instance.instance_id
52
+ self.new_instance_id = nil
29
53
  end
30
54
 
31
55
  def clone(options)
32
56
  puts "\nCloning an instance..."
33
-
34
- new_instance_hostname = make_new_hostname(self.hostname)
57
+
58
+ new_instance_hostname = make_new_hostname
35
59
  ami_id = verify_ami_id
36
60
  agent_version = verify_agent_version
37
61
  subnet_id = verify_subnet_id
38
62
  instance_type = verify_instance_type
39
63
 
40
64
  create_new_instance(new_instance_hostname, instance_type, ami_id, agent_version, subnet_id)
65
+ start_new_instance
41
66
  end
42
67
 
43
- def make_new_hostname(old_hostname)
44
- all_sibling_hostnames = self.layer.instances.collect { |instance| instance.hostname }
45
68
 
46
- if old_hostname =~ /\d\d\z/
47
- new_instance_hostname = increment_hostname(old_hostname, all_sibling_hostnames)
48
- else
49
- new_instance_hostname = old_hostname << "-clone"
50
- end
51
-
69
+ def clone_with_defaults(options)
70
+ puts "\nCloning an instance..."
71
+ new_hostname = auto_generated_hostname
72
+ create_new_instance(new_hostname, instance_type, ami_id, agent_version, subnet_id)
73
+ opsworks.start_instance(instance_id: new_instance_id)
74
+ puts "\nNew instance is starting…"
75
+ end
76
+
77
+ def make_new_hostname
78
+ new_instance_hostname = auto_generated_hostname
52
79
  puts "\nAutomatically generated hostname: #{new_instance_hostname}\n"
53
80
  new_instance_hostname = ask_for_new_option("instance's hostname") if ask_for_overriding_permission("hostname", false)
54
-
55
81
  new_instance_hostname
56
82
  end
57
83
 
58
- def increment_hostname(hostname, all_sibling_hostnames)
59
- until hostname_unique?(hostname, all_sibling_hostnames) do
60
- hostname = hostname.gsub(/(\d\d\z)/) { "#{($1.to_i + 1).to_s.rjust(2, '0')}" }
84
+ def auto_generated_hostname
85
+ if hostname =~ /\d\d\z/
86
+ increment_hostname
87
+ else
88
+ hostname << "-clone"
61
89
  end
62
- hostname
63
90
  end
64
91
 
65
- def hostname_unique?(hostname, all_sibling_hostnames)
66
- !all_sibling_hostnames.include?(hostname)
92
+ def sibling_hostnames
93
+ self.layer.instances.collect { |instance| instance.hostname }
94
+ end
95
+
96
+ def increment_hostname
97
+ name = hostname
98
+ until hostname_unique?(name) do
99
+ name = name.gsub(/(\d\d\z)/) { "#{($1.to_i + 1).to_s.rjust(2, '0')}" }
100
+ end
101
+ name
102
+ end
103
+
104
+ def sibling_hostnames
105
+ self.layer.instances.map(&:hostname)
106
+ end
107
+
108
+ def hostname_unique?(name)
109
+ !sibling_hostnames.include?(name)
67
110
  end
68
111
 
69
112
  def verify_ami_id
@@ -179,8 +222,21 @@ module Opsicle
179
222
  agent_version: agent_version,
180
223
  tenancy: self.tenancy,
181
224
  })
182
- self.layer.add_new_instance(new_instance.instance_id)
183
- puts "\nNew instance has been created: #{new_instance.instance_id}"
225
+ self.new_instance_id = new_instance.instance_id
226
+ self.layer.add_new_instance(new_instance_id)
227
+ puts "\nNew instance #{new_instance_hostname} has been created: #{new_instance_id}"
228
+ end
229
+
230
+ def start_new_instance
231
+ if ask_to_start_instance
232
+ @opsworks.start_instance(instance_id: self.new_instance_id)
233
+ puts "\nNew instance is starting…"
234
+ end
235
+ end
236
+
237
+ def ask_to_start_instance
238
+ ans = @cli.ask("Do you wish to start this new instance?\n1) Yes\n2) No", Integer)
239
+ ans == 1
184
240
  end
185
241
  end
186
242
  end
@@ -19,16 +19,20 @@ module Opsicle
19
19
  puts "Stack ID = #{@stack.id}"
20
20
  layer = select_layer
21
21
  all_instances = layer.get_cloneable_instances
22
- instances_to_clone = select_instances(all_instances)
23
-
24
- instances_to_clone.each do |instance|
25
- instance.clone(options)
26
- end
27
-
22
+ instance_to_clone = select_instances(all_instances)
23
+ clone_instances(instance_to_clone, options)
28
24
  layer.ami_id = nil
29
25
  layer.agent_version = nil
30
26
  end
31
27
 
28
+ def clone_instances(instances, options)
29
+ if options[:'with-defaults']
30
+ instances.each { |instance| instance.clone_with_defaults(options) }
31
+ else
32
+ instances.each { |instance| instance.clone(options) }
33
+ end
34
+ end
35
+
32
36
  def select_layer
33
37
  puts "\nLayers:\n"
34
38
  ops_layers = @opsworks.describe_layers({ :stack_id => @stack.id }).layers
@@ -49,7 +53,7 @@ module Opsicle
49
53
  instance_indices_string = @cli.ask("Instances? (enter as a comma separated list)\n", String)
50
54
  instance_indices_list = instance_indices_string.split(/,\s*/)
51
55
  instance_indices_list.map! { |instance_index| instance_index.to_i - 1 }
52
-
56
+
53
57
  return_array = []
54
58
  instance_indices_list.each do |index|
55
59
  return_array << instances[index]
@@ -1,3 +1,3 @@
1
1
  module Opsicle
2
- VERSION = "2.6.0"
2
+ VERSION = "2.8.0"
3
3
  end
@@ -14,7 +14,7 @@ module Opsicle
14
14
  :availability_zone => 'availability_zone', :virtualization_type => 'virtualization_type',
15
15
  :subnet_id => 'subnet_id', :architecture => 'architecture',
16
16
  :root_device_type => 'root_device_type', :install_updates_on_boot => 'install_updates_on_boot',
17
- :ebs_optimized => 'ebs_optimized', :tenancy => 'tenancy')
17
+ :ebs_optimized => 'ebs_optimized', :tenancy => 'tenancy', :instance_id => 'some-id')
18
18
  @layer = double('layer1', :name => 'layer-1', :layer_id => 12345, :instances => [@instance], :ami_id => nil, :agent_version => nil)
19
19
  allow(@layer).to receive(:ami_id=)
20
20
  allow(@layer).to receive(:ami_id)
@@ -38,11 +38,10 @@ module Opsicle
38
38
  context "#make_new_hostname" do
39
39
  it "should make a unique incremented hostname" do
40
40
  instance = CloneableInstance.new(@instance, @layer, @opsworks, @cli)
41
- expect(instance).to receive(:increment_hostname).and_return('example-hostname-03')
42
41
  instance1 = double('instance', :hostname => 'example-hostname-01')
43
42
  instance2 = double('instance', :hostname => 'example-hostname-02')
44
43
  allow(@layer).to receive(:instances).and_return([instance1, instance2])
45
- instance.make_new_hostname('example-hostname-01')
44
+ expect(instance.make_new_hostname).to eq('example-hostname-03')
46
45
  end
47
46
 
48
47
  it "should make a unique incremented hostname" do
@@ -51,8 +50,8 @@ module Opsicle
51
50
  instance2 = double('instance', :hostname => 'example-hostname-02')
52
51
  instance3 = double('instance', :hostname => 'example-hostname-03')
53
52
  instance4 = double('instance', :hostname => 'example-hostname-04')
54
- expect(@layer).to receive(:instances).and_return([instance1, instance2, instance3, instance4])
55
- expect(instance.make_new_hostname('example-hostname-01')).to eq('example-hostname-05')
53
+ allow(@layer).to receive(:instances).and_return([instance1, instance2, instance3, instance4])
54
+ expect(instance.make_new_hostname).to eq('example-hostname-05')
56
55
  end
57
56
  end
58
57
 
@@ -61,7 +60,7 @@ module Opsicle
61
60
  instance = CloneableInstance.new(@instance, @layer, @opsworks, @cli)
62
61
  expect(instance).to receive(:hostname_unique?).and_return('example-hostname-03')
63
62
  allow(@opsworks).to receive(:describe_agent_version).with({})
64
- instance.increment_hostname('example-hostname-01', ['example-hostname-01', 'example-hostname-02'])
63
+ expect(instance.increment_hostname).to eq('example-hostname-01')
65
64
  end
66
65
  end
67
66
 
@@ -86,6 +85,13 @@ module Opsicle
86
85
  expect(instance).to receive(:create_new_instance)
87
86
  instance.clone({})
88
87
  end
88
+
89
+ it "should start new instance" do
90
+ instance = CloneableInstance.new(@instance, @layer, @opsworks, @cli)
91
+ allow(instance).to receive(:ask_to_start_instance).and_return(true)
92
+ expect(instance).to receive(:start_new_instance)
93
+ instance.clone({})
94
+ end
89
95
  end
90
96
 
91
97
  context '#verify_agent_version' do
@@ -14,7 +14,7 @@ module Opsicle
14
14
  :availability_zone => 'availability_zone', :virtualization_type => 'virtualization_type',
15
15
  :subnet_id => 'subnet_id', :architecture => 'architecture',
16
16
  :root_device_type => 'root_device_type', :install_updates_on_boot => 'install_updates_on_boot',
17
- :ebs_optimized => 'ebs_optimized', :tenancy => 'tenancy')
17
+ :ebs_optimized => 'ebs_optimized', :tenancy => 'tenancy', :instance_id => 'some-id')
18
18
  @instance2 = double('instance2', :hostname => 'example-hostname-02', :status => 'active',
19
19
  :ami_id => 'ami_id', :instance_type => 'instance_type',
20
20
  :agent_version => 'agent_version', :stack_id => 1234567890,
@@ -23,7 +23,7 @@ module Opsicle
23
23
  :availability_zone => 'availability_zone', :virtualization_type => 'virtualization_type',
24
24
  :subnet_id => 'subnet_id', :architecture => 'architecture',
25
25
  :root_device_type => 'root_device_type', :install_updates_on_boot => 'install_updates_on_boot',
26
- :ebs_optimized => 'ebs_optimized', :tenancy => 'tenancy')
26
+ :ebs_optimized => 'ebs_optimized', :tenancy => 'tenancy', :instance_id => 'some-id')
27
27
  @instance3 = double('instance3', :hostname => 'example-hostname-03', :status => 'stopped',
28
28
  :ami_id => 'ami_id', :instance_type => 'instance_type',
29
29
  :agent_version => 'agent_version', :stack_id => 1234567890,
@@ -32,7 +32,7 @@ module Opsicle
32
32
  :availability_zone => 'availability_zone', :virtualization_type => 'virtualization_type',
33
33
  :subnet_id => 'subnet_id', :architecture => 'architecture',
34
34
  :root_device_type => 'root_device_type', :install_updates_on_boot => 'install_updates_on_boot',
35
- :ebs_optimized => 'ebs_optimized', :tenancy => 'tenancy')
35
+ :ebs_optimized => 'ebs_optimized', :tenancy => 'tenancy', :instance_id => 'some-id')
36
36
  @instances = double('instances', :instances => [@instance1, @instance2])
37
37
  @new_instance = double('new_instance', :instances => [@instance3])
38
38
  @opsworks = double('opsworks', :describe_instances => @instances)
@@ -14,7 +14,7 @@ module Opsicle
14
14
  :availability_zone => 'availability_zone', :virtualization_type => 'virtualization_type',
15
15
  :subnet_id => 'subnet_id', :architecture => 'architecture',
16
16
  :root_device_type => 'root_device_type', :install_updates_on_boot => 'install_updates_on_boot',
17
- :ebs_optimized => 'ebs_optimized', :tenancy => 'tenancy')
17
+ :ebs_optimized => 'ebs_optimized', :tenancy => 'tenancy', :instance_id => 'some-id')
18
18
  @instance2 = double('instance2', :hostname => 'example-hostname-02', :status => 'active',
19
19
  :ami_id => 'ami_id', :instance_type => 'instance_type',
20
20
  :agent_version => 'agent_version', :stack_id => 1234567890,
@@ -23,7 +23,7 @@ module Opsicle
23
23
  :availability_zone => 'availability_zone', :virtualization_type => 'virtualization_type',
24
24
  :subnet_id => 'subnet_id', :architecture => 'architecture',
25
25
  :root_device_type => 'root_device_type', :install_updates_on_boot => 'install_updates_on_boot',
26
- :ebs_optimized => 'ebs_optimized', :tenancy => 'tenancy')
26
+ :ebs_optimized => 'ebs_optimized', :tenancy => 'tenancy', :instance_id => 'some-id')
27
27
  @instances = double('instances', :instances => [@instance1, @instance2])
28
28
  @layer1 = double('layer1', :name => 'layer-1', :layer_id => 12345, :instances => [@instance1, @instance2])
29
29
  @layer2 = double('layer2', :name => 'layer-2', :layer_id => 67890, :instances => [@instance1, @instance2])
@@ -32,7 +32,8 @@ module Opsicle
32
32
  @stack = double('stack')
33
33
  @stacks = double('stacks', :stacks => [@stack])
34
34
  @opsworks = double('opsworks', :describe_instances => @instances, :describe_layers => @layers,
35
- :create_instance => @new_instance, :describe_stacks => @stacks)
35
+ :create_instance => @new_instance, :describe_stacks => @stacks,
36
+ :start_instance => @new_instance)
36
37
  @config = double('config', :opsworks_config => {:stack_id => 1234567890})
37
38
  @client = double('client', :config => @config, :opsworks => @opsworks)
38
39
  allow(Client).to receive(:new).with(:environment).and_return(@client)
@@ -54,8 +55,9 @@ module Opsicle
54
55
  allow_any_instance_of(HighLine).to receive(:ask).with("Please write in the new instance type press ENTER:").and_return('t2.micro')
55
56
  allow_any_instance_of(HighLine).to receive(:ask).with("Do you wish to override this subnet ID? By overriding, you are choosing to override the current subnet ID for all instances you are cloning.\n1) Yes\n2) No", Integer).and_return(2)
56
57
  allow_any_instance_of(HighLine).to receive(:ask).with("Which subnet ID?\n", Integer).and_return(1)
58
+ allow_any_instance_of(HighLine).to receive(:ask).with("Do you wish to start this new instance?\n1) Yes\n2) No", Integer).and_return(1)
57
59
  end
58
-
60
+
59
61
  context "#execute" do
60
62
  it "lists all current layers" do
61
63
  expect(@opsworks).to receive(:describe_layers)
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.6.0
4
+ version: 2.8.0
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: 2017-05-11 00:00:00.000000000 Z
12
+ date: 2017-06-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: aws-sdk
@@ -282,7 +282,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
282
282
  version: '0'
283
283
  requirements: []
284
284
  rubyforge_project:
285
- rubygems_version: 2.4.8
285
+ rubygems_version: 2.6.12
286
286
  signing_key:
287
287
  specification_version: 4
288
288
  summary: An opsworks specific abstraction on top of the aws sdk