dumbwaiter 0.4.1 → 0.4.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/dumbwaiter/cli.rb +18 -0
- data/lib/dumbwaiter/layer.rb +11 -0
- data/lib/dumbwaiter/mock.rb +6 -2
- data/lib/dumbwaiter/version.rb +1 -1
- data/spec/lib/dumbwaiter/cli_spec.rb +49 -3
- data/spec/lib/dumbwaiter/deployment_spec.rb +1 -1
- data/spec/lib/dumbwaiter/layer_spec.rb +19 -1
- data/spec/spec_helper.rb +1 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a3d7718c5ed04fbb0968d7137db8b407664c2208
|
4
|
+
data.tar.gz: 58012f46d1485fc677be218a88accdefe6ea0faa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ca37b421c99a6925f6341f1399e4ec8722d84df5be94bdf7a186da8974beb61bc371bcf3effc5bb22c7ffe6b60d2a5bcfbad8e8695e29caeb96cf10de9af526f
|
7
|
+
data.tar.gz: 1dc41bf27d1fbacb8459bc4c3953cc9b4f053c2428dcdcd4fda46cbe2ae2551880e1d9e3432f665b51a23b9fc0af1268aebad69eecc6107ce8a46af89c064a53
|
data/lib/dumbwaiter/cli.rb
CHANGED
@@ -54,6 +54,24 @@ module Dumbwaiter
|
|
54
54
|
raise Thor::Error.new(e.message)
|
55
55
|
end
|
56
56
|
|
57
|
+
desc "custom_recipes STACK LAYER EVENT", "Show custom recipes for an event"
|
58
|
+
def custom_recipes(stack_name, layer_name, event_name)
|
59
|
+
stack = Stack.find(stack_name)
|
60
|
+
layer = Layer.find(stack, layer_name)
|
61
|
+
Kernel.puts(layer.custom_recipes[event_name.to_sym].join(" "))
|
62
|
+
rescue Dumbwaiter::Stack::NotFound, Dumbwaiter::Layer::NotFound => e
|
63
|
+
raise Thor::Error.new(e.message)
|
64
|
+
end
|
65
|
+
|
66
|
+
desc "update_custom_recipes STACK LAYER EVENT RECIPE...", "Update custom recipes for an event"
|
67
|
+
def update_custom_recipes(stack_name, layer_name, event_name, *recipes)
|
68
|
+
stack = Stack.find(stack_name)
|
69
|
+
layer = Layer.find(stack, layer_name)
|
70
|
+
layer.update_custom_recipes(event_name.to_sym, recipes)
|
71
|
+
rescue Dumbwaiter::Stack::NotFound, Dumbwaiter::Layer::NotFound => e
|
72
|
+
raise Thor::Error.new(e.message)
|
73
|
+
end
|
74
|
+
|
57
75
|
desc "stacks", "List all the stacks"
|
58
76
|
def stacks
|
59
77
|
Stack.all.each { |stack| Kernel.puts("#{stack.name}: #{stack.apps.map(&:name).join(', ')}") }
|
data/lib/dumbwaiter/layer.rb
CHANGED
@@ -40,6 +40,17 @@ class Dumbwaiter::Layer
|
|
40
40
|
)
|
41
41
|
end
|
42
42
|
|
43
|
+
def custom_recipes
|
44
|
+
opsworks_layer.custom_recipes.to_hash
|
45
|
+
end
|
46
|
+
|
47
|
+
def update_custom_recipes(event_name, runlist)
|
48
|
+
opsworks.update_layer(
|
49
|
+
layer_id: id,
|
50
|
+
custom_recipes: custom_recipes.merge(event_name => runlist)
|
51
|
+
)
|
52
|
+
end
|
53
|
+
|
43
54
|
def instances
|
44
55
|
@instances ||= Dumbwaiter::Instance.all(self, opsworks)
|
45
56
|
end
|
data/lib/dumbwaiter/mock.rb
CHANGED
@@ -37,8 +37,8 @@ class Dumbwaiter::Mock
|
|
37
37
|
app
|
38
38
|
end
|
39
39
|
|
40
|
-
def make_layer(stack = make_stack, id = make_id, shortname = Faker::Name.first_name.downcase)
|
41
|
-
layer = OpenStruct.new(stack_id: stack.stack_id, layer_id: id, shortname: shortname)
|
40
|
+
def make_layer(stack = make_stack, id = make_id, shortname = Faker::Name.first_name.downcase, custom_recipes = {})
|
41
|
+
layer = OpenStruct.new(stack_id: stack.stack_id, layer_id: id, shortname: shortname, custom_recipes: make_custom_default_recipes.merge(custom_recipes))
|
42
42
|
layers << layer
|
43
43
|
layer
|
44
44
|
end
|
@@ -64,6 +64,10 @@ class Dumbwaiter::Mock
|
|
64
64
|
|
65
65
|
protected
|
66
66
|
|
67
|
+
def make_custom_default_recipes
|
68
|
+
{setup: [], configure: [], deploy: [], undeploy: [], shutdown:[]}
|
69
|
+
end
|
70
|
+
|
67
71
|
def make_app_source(url, revision)
|
68
72
|
OpenStruct.new(url: url, revision: revision)
|
69
73
|
end
|
data/lib/dumbwaiter/version.rb
CHANGED
@@ -3,7 +3,7 @@ require "spec_helper"
|
|
3
3
|
describe Dumbwaiter::Cli do
|
4
4
|
let(:fake_opsworks) { Dumbwaiter::Mock.new }
|
5
5
|
let!(:fake_stack) { fake_opsworks.make_stack("amazing", "ducks") }
|
6
|
-
let!(:fake_layer) { fake_opsworks.make_layer(fake_stack, "mighty", "beans") }
|
6
|
+
let!(:fake_layer) { fake_opsworks.make_layer(fake_stack, "mighty", "beans", setup: %w[ham salami]) }
|
7
7
|
let!(:fake_app) { fake_opsworks.make_app(fake_stack, "delightful", "reifel") }
|
8
8
|
|
9
9
|
subject(:cli) { Dumbwaiter::Cli.new }
|
@@ -152,14 +152,60 @@ describe Dumbwaiter::Cli do
|
|
152
152
|
|
153
153
|
context "when the layer does not exist" do
|
154
154
|
it "blows up" do
|
155
|
-
expect { cli.run_recipe("ducks", "brick", "
|
155
|
+
expect { cli.run_recipe("ducks", "brick", "setup") }.to raise_error(Thor::Error)
|
156
156
|
end
|
157
157
|
end
|
158
158
|
end
|
159
159
|
|
160
160
|
context "when the stack does not exist" do
|
161
161
|
it "blows up" do
|
162
|
-
expect { cli.run_recipe("toques", "beans", "
|
162
|
+
expect { cli.run_recipe("toques", "beans", "setup") }.to raise_error(Thor::Error)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
describe "#custom_recipes" do
|
168
|
+
context "when the stack exists" do
|
169
|
+
context "when the layer exists" do
|
170
|
+
it "prints custom recipes for a layer event" do
|
171
|
+
Kernel.should_receive(:puts) { |m| m.should == "ham salami" }
|
172
|
+
cli.custom_recipes("ducks", "beans", "setup")
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
context "when the layer does not exist" do
|
177
|
+
it "blows up" do
|
178
|
+
expect { cli.custom_recipes("ducks", "brick", "setup") }.to raise_error(Thor::Error)
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
context "when the stack does not exist" do
|
184
|
+
it "blows up" do
|
185
|
+
expect { cli.custom_recipes("toques", "beans", "setup") }.to raise_error(Thor::Error)
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
describe "#update_custom_recipes" do
|
191
|
+
context "when the stack exists" do
|
192
|
+
context "when the layer exists" do
|
193
|
+
it "updates custom recipes on the layer for the event" do
|
194
|
+
Dumbwaiter::Layer.any_instance.should_receive(:update_custom_recipes).with(:setup, ["eggs"])
|
195
|
+
cli.update_custom_recipes("ducks", "beans", "setup", "eggs")
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
context "when the layer does not exist" do
|
200
|
+
it "blows up" do
|
201
|
+
expect { cli.update_custom_recipes("ducks", "brick", "meatballs") }.to raise_error(Thor::Error)
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
context "when the stack does not exist" do
|
207
|
+
it "blows up" do
|
208
|
+
expect { cli.update_custom_recipes("toques", "beans", "meatballs") }.to raise_error(Thor::Error)
|
163
209
|
end
|
164
210
|
end
|
165
211
|
end
|
@@ -5,7 +5,7 @@ describe Dumbwaiter::Deployment do
|
|
5
5
|
let(:fake_stack) { fake_opsworks.make_stack("pancakes") }
|
6
6
|
let(:fake_app) { fake_opsworks.make_app(fake_stack, "yo") }
|
7
7
|
let!(:fake_user_profile) { fake_opsworks.make_user_profile("ie", "goose") }
|
8
|
-
let(:custom_json) {
|
8
|
+
let(:custom_json) { Dumbwaiter::DeploymentCustomJson.create("hockey", "eh-buddy").to_json }
|
9
9
|
let!(:fake_deployment) { fake_opsworks.make_deployment(fake_stack, fake_app, "jello", "deploy", "badical", custom_json, DateTime.parse("last Tuesday").to_s, "ie", "i love sports") }
|
10
10
|
let(:real_stack) { Dumbwaiter::Stack.new(fake_stack, fake_opsworks) }
|
11
11
|
|
@@ -3,7 +3,7 @@ require "spec_helper"
|
|
3
3
|
describe Dumbwaiter::Layer do
|
4
4
|
let(:fake_opsworks) { Dumbwaiter::Mock.new }
|
5
5
|
let(:fake_stack) { fake_opsworks.make_stack("pancakes") }
|
6
|
-
let(:fake_layer) { fake_opsworks.make_layer(fake_stack, "pinto", "meaty") }
|
6
|
+
let(:fake_layer) { fake_opsworks.make_layer(fake_stack, "pinto", "meaty", setup: ["ham"]) }
|
7
7
|
let!(:fake_instance) { fake_opsworks.make_instance(fake_layer, fake_stack, "dragons") }
|
8
8
|
|
9
9
|
let(:real_stack) { Dumbwaiter::Stack.new(fake_stack, fake_opsworks) }
|
@@ -13,6 +13,7 @@ describe Dumbwaiter::Layer do
|
|
13
13
|
its(:opsworks_layer) { should == fake_layer }
|
14
14
|
its(:id) { should == "pinto" }
|
15
15
|
its(:shortname) { should == "meaty" }
|
16
|
+
its(:custom_recipes) { should include(setup: ["ham"]) }
|
16
17
|
|
17
18
|
it { should have(1).instances }
|
18
19
|
|
@@ -51,4 +52,21 @@ describe Dumbwaiter::Layer do
|
|
51
52
|
layer.run_recipe("meatballs")
|
52
53
|
end
|
53
54
|
end
|
55
|
+
|
56
|
+
describe "#update_custom_recipes" do
|
57
|
+
it "overwrites existing custom recipes for an event" do
|
58
|
+
fake_opsworks.should_receive(:update_layer) do |params|
|
59
|
+
params[:layer_id].should == "pinto"
|
60
|
+
params[:custom_recipes].should include(setup: ["feet"])
|
61
|
+
end
|
62
|
+
layer.update_custom_recipes(:setup, ["feet"])
|
63
|
+
end
|
64
|
+
|
65
|
+
it "preserves existing custom recipes for an event when updating another event" do
|
66
|
+
fake_opsworks.should_receive(:update_layer) do |params|
|
67
|
+
params[:custom_recipes].should include(setup: ["ham"])
|
68
|
+
end
|
69
|
+
layer.update_custom_recipes(:deploy, ["feet"])
|
70
|
+
end
|
71
|
+
end
|
54
72
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -5,6 +5,7 @@ require "dumbwaiter"
|
|
5
5
|
require "dumbwaiter/mock"
|
6
6
|
|
7
7
|
Aws.config = {access_key_id: "tacos", secret_access_key: "secret chocolate"}
|
8
|
+
I18n.enforce_available_locales = false
|
8
9
|
|
9
10
|
# This file was generated by the `rspec --init` command. Conventionally, all
|
10
11
|
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dumbwaiter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Doc Ritezel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-01-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk-core
|