opsicle 0.5.1 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- YjgxNjkzMWVjMmJlYTllZWFjNjI0NTQzMjRlODFiNzYwMTM2Y2NlYQ==
4
+ MGY1ZDM5ZDM1MDU0OTY0M2Y1NmZiODY1MTQzZmQ4MDBjODc0MTMxNg==
5
5
  data.tar.gz: !binary |-
6
- YzdlMDkyYzMxMzI1ZDg0ZjYyNDllZTk4YmZjZDdkZDc1NGQ1YWE4Ng==
6
+ NjhkZWQzNmRhY2I0ZDJjMWM0Y2RkYTYyN2MxY2Y4OTlmNzZmOTE0Nw==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- NjUwYzNhMzVmMjMwY2I3NGEyY2VhYzZiMTRkYjc4ZTNhYjU5Nzg5N2I5ZTgx
10
- ZDAyODY1Yjc2ODQ2ZmJkNWYwZGI0Y2ZjMDAwZGJiYWRmMDJiYTg1OTU5YjEy
11
- MjhmNzcxMjVjZTU1OWZmZDFhZWFhYWJiNGEzNTljNjQzYzA4MTY=
9
+ Y2JkYzEyN2I5MTUyMzc4MThiMmExYmJkODc0ZTljOWU5ZDQwMGQ4ZWYyYjA4
10
+ YzU3NjJmZGRhMTFlYWFmMmIwZjFmNzMyNmZmZDAxOGU1ZDViNzU1M2JhZWQ4
11
+ NmNmOWRmMjU0MTU4OTYyNDBkM2NlOTg0ZDdkNGIyMWIxMjljYmY=
12
12
  data.tar.gz: !binary |-
13
- YTNiZTgzMTgxMDY2N2Q4ZjM3ZTMzMmY3NjEzMjExNTU3YTUyODBhNjA4OGZi
14
- NzIxMjZhZGFlMjIyZDExZmYzZmViNzQxY2RkZDk2Y2M4ODkxMDQ2MzUxZDVm
15
- YjhmOTgwODViZGVmZWQ3NTFkOWI5NzZhZDc2ZGFlZjg1MmU1N2Y=
13
+ NWFkZmU4MDcyZTRkMzZlNTU3MWFhZTNhNmY1YTcyZWExYjlkNzQ0MTExYTVm
14
+ NzY3YWJmY2RlNTNmZjZjODFkNGJhYzhjNDk4ODRmYzg5ODVkZWY1YmI3OGYy
15
+ OWEzNGNjZjJiNWRiZDUyOWQxNGNkMzdjODJiZDhhMjllYzg4ZjA=
data/bin/opsicle CHANGED
@@ -140,6 +140,7 @@ command 'execute-recipes' do |c|
140
140
  c.switch [:m, :monitor], :desc => "Run the Stack Monitor on deploy", :default_value => true
141
141
  c.flag [:r, :recipes], :desc => 'The recipes to execute', :type => Array, :required => true
142
142
  c.flag [:i, :instance_ids], :desc => 'The specific instances to execute recipes on', :type => Array
143
+ c.flag [:l, :layers], :desc => 'The specific layers to execute recipes on', :type => Array
143
144
  c.action do |global_options, options, args|
144
145
  raise ArgumentError, "Environment is required" unless args.first
145
146
 
data/lib/opsicle.rb CHANGED
@@ -8,4 +8,4 @@ require "opsicle/output"
8
8
  require "opsicle/version"
9
9
  require "opsicle/commands"
10
10
  require "opsicle/monitor"
11
-
11
+ require "opsicle/layer"
@@ -17,12 +17,20 @@ module Opsicle
17
17
  #http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/OpsWorks/Client.html#create_deployment-instance_method
18
18
  command_args = {}
19
19
  command_args["recipes"] = options[:recipes]
20
-
21
20
  command_opts = {}
22
- command_opts["instance_ids"] = options[:instance_ids] if options[:instance_ids]
21
+ command_opts["instance_ids"] = determine_instance_ids(options) if options[:instance_ids] || options[:layers]
23
22
 
24
23
  response = client.run_command('execute_recipes', command_args, command_opts)
25
24
  launch_stack_monitor(response, options)
26
25
  end
26
+
27
+ def determine_instance_ids(options)
28
+ if options[:instance_ids]
29
+ options[:instance_ids]
30
+ elsif options[:layers]
31
+ Opsicle::Layer.instance_ids(client, options[:layers])
32
+ end
33
+ end
34
+
27
35
  end
28
36
  end
@@ -0,0 +1,48 @@
1
+ module Opsicle
2
+ class Layer
3
+
4
+ attr_accessor :id, :name, :client
5
+ class <<self
6
+ attr_accessor :client
7
+ end
8
+
9
+ def initialize(client, options = {})
10
+ @client = client
11
+ @id = options[:id]
12
+ @name = options[:name]
13
+ end
14
+
15
+ # Public - Gets all the instance ids for a layer
16
+ #
17
+ # Return - An array of instance ids
18
+ def get_instance_ids
19
+ client.api_call('describe_instances', layer_id: id)[:instances].map{ |s| s[:instance_id] }
20
+ end
21
+
22
+ # Private - Gets layer info from OpsWorks
23
+ #
24
+ # Return - An array of layer objects
25
+ def self.get_info
26
+ get_layers.map do |layer|
27
+ new(client, id: layer[:layer_id], name: layer[:shortname])
28
+ end
29
+ end
30
+ private_class_method :get_info
31
+
32
+ def self.get_layers
33
+ client.api_call('describe_layers', stack_id: client.config.opsworks_config[:stack_id])[:layers]
34
+ end
35
+ # Public - gets all the layer ids for the given layers
36
+ #
37
+ # client - a new Client
38
+ # layers - an array of layer shortnames
39
+ #
40
+ # Return - An array of instance ids belonging to the input layers
41
+ def self.instance_ids(client, layers)
42
+ @client = client
43
+ get_info.map{ |layer| layer.get_instance_ids[0] if layers.include?(layer.name) }.uniq.compact
44
+ end
45
+
46
+ end
47
+ end
48
+
@@ -1,3 +1,3 @@
1
1
  module Opsicle
2
- VERSION = "0.5.1"
2
+ VERSION = "0.6.0"
3
3
  end
@@ -5,10 +5,10 @@ module Opsicle
5
5
  describe ExecuteRecipes do
6
6
  subject { ExecuteRecipes.new('derp') }
7
7
  let(:recipes) { ['herp'] }
8
+ let(:client) { double }
9
+ let(:monitor) { double(:start => nil) }
8
10
 
9
11
  context "#execute" do
10
- let(:client) { double }
11
- let(:monitor) { double(:start => nil) }
12
12
  before do
13
13
  allow(Client).to receive(:new).with('derp').and_return(client)
14
14
  allow(client).to receive(:run_command).with('execute_recipes', {"recipes" => ['herp']}, {}).and_return({deployment_id: 'derp'})
@@ -67,5 +67,22 @@ module Opsicle
67
67
  end
68
68
  end
69
69
 
70
+ context "#determine_instance_ids" do
71
+ before do
72
+ allow(Client).to receive(:new).with('derp').and_return(client)
73
+ end
74
+
75
+ it "returns the instance_ids when passed in through options" do
76
+ options = {:instance_ids => ["abcdefg","1234567"]}
77
+ expect(subject.determine_instance_ids(options)).to eq(["abcdefg","1234567"])
78
+ end
79
+
80
+ it "returns the instance_ids when a layer is passed in" do
81
+ options = {:layers => ["main-util"]}
82
+ allow(Opsicle::Layer).to receive(:instance_ids).and_return(["a1b2c3"])
83
+ expect(subject.determine_instance_ids(options)).to eq(["a1b2c3"])
84
+ end
85
+ end
86
+
70
87
  end
71
88
  end
@@ -0,0 +1,59 @@
1
+ require "spec_helper"
2
+ require "opsicle"
3
+
4
+ module Opsicle
5
+ describe Layer do
6
+ let(:client) { double }
7
+ let(:config) { double }
8
+
9
+ subject { Opsicle::Layer }
10
+ context "#get_info" do
11
+ let(:client) { double }
12
+ let(:layer1) { subject.new(client, :id => 1, :name => "layer1")}
13
+ let(:layer2) { subject.new(client, :id => 2, :name => "layer2")}
14
+ let(:layers) { [ { shortname: "layer1", layer_id: 1, name: "Layer 1" }, { shortname: "layer2", layer_id: 2, name: "Layer 2" }] }
15
+
16
+ before do
17
+ allow(subject).to receive(:get_layers).and_return(layers)
18
+ end
19
+
20
+ it "returns an array of layer_ids from the input layer (singular)" do
21
+ expect(subject.send(:get_info)[0]).to be_an_instance_of Opsicle::Layer
22
+ expect(subject.send(:get_info)[1]).to be_an_instance_of Opsicle::Layer
23
+ end
24
+
25
+ end
26
+
27
+ context "#get_instance_ids" do
28
+ let(:response) {{ :instances => [{:stack_id => "aaa", :instance_id => "111"},{:stack_id => "bbb", :instance_id => "222"}]}}
29
+ before do
30
+ allow(client).to receive(:api_call).with('describe_instances',layer_id: "opsworkslayer").and_return(response)
31
+ end
32
+
33
+ it "returns an array of instance_ids from the input layer_id" do
34
+ expect(subject.new(client, id: "opsworkslayer").get_instance_ids).to eq(["111","222"])
35
+ end
36
+ end
37
+
38
+ context "#instance_ids" do
39
+ let(:layer1) { double }
40
+ let(:layer2) { double }
41
+ before do
42
+ allow(layer1).to receive(:name).and_return("aaa")
43
+ allow(layer2).to receive(:name).and_return("bbb")
44
+ allow(layer1).to receive(:get_instance_ids).and_return(["111","222"])
45
+ allow(layer2).to receive(:get_instance_ids).and_return(["333","444"])
46
+ allow(subject).to receive(:get_info).and_return([layer1,layer2])
47
+ end
48
+
49
+ it "returns the instance ids from layer_names" do
50
+ expect(subject.instance_ids(client, ["aaa","bbb"])).to eq(["111","333"])
51
+ end
52
+
53
+ it "returns the instance ids from layer_names, filters out doubles" do
54
+ allow(layer2).to receive(:get_instance_ids).and_return(["111","222"])
55
+ expect(subject.instance_ids(client, ["aaa","bbb"])).to eq(["111"])
56
+ end
57
+ end
58
+ end
59
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opsicle
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Fleener
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-12 00:00:00.000000000 Z
11
+ date: 2014-09-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk
@@ -184,6 +184,7 @@ files:
184
184
  - lib/opsicle/deployment.rb
185
185
  - lib/opsicle/deployments.rb
186
186
  - lib/opsicle/instances.rb
187
+ - lib/opsicle/layer.rb
187
188
  - lib/opsicle/monitor.rb
188
189
  - lib/opsicle/monitor/app.rb
189
190
  - lib/opsicle/monitor/panel.rb
@@ -211,6 +212,7 @@ files:
211
212
  - spec/opsicle/commands/ssh_key_spec.rb
212
213
  - spec/opsicle/commands/ssh_spec.rb
213
214
  - spec/opsicle/config_spec.rb
215
+ - spec/opsicle/layer_spec.rb
214
216
  - spec/opsicle/monitor/app_spec.rb
215
217
  - spec/opsicle/monitor/panel_spec.rb
216
218
  - spec/opsicle/monitor/screen_spec.rb
@@ -238,7 +240,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
238
240
  version: '0'
239
241
  requirements: []
240
242
  rubyforge_project:
241
- rubygems_version: 2.2.1
243
+ rubygems_version: 2.2.2
242
244
  signing_key:
243
245
  specification_version: 4
244
246
  summary: An opsworks specific abstraction on top of the aws sdk
@@ -252,6 +254,7 @@ test_files:
252
254
  - spec/opsicle/commands/ssh_key_spec.rb
253
255
  - spec/opsicle/commands/ssh_spec.rb
254
256
  - spec/opsicle/config_spec.rb
257
+ - spec/opsicle/layer_spec.rb
255
258
  - spec/opsicle/monitor/app_spec.rb
256
259
  - spec/opsicle/monitor/panel_spec.rb
257
260
  - spec/opsicle/monitor/screen_spec.rb