dumbwaiter 0.4.3 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/.travis.yml +1 -0
- data/lib/dumbwaiter/cli.rb +2 -1
- data/lib/dumbwaiter/deployment.rb +1 -1
- data/lib/dumbwaiter/mock.rb +55 -22
- data/lib/dumbwaiter/user_profile.rb +4 -1
- data/lib/dumbwaiter/version.rb +1 -1
- data/spec/lib/dumbwaiter/app_spec.rb +14 -12
- data/spec/lib/dumbwaiter/cli_spec.rb +33 -33
- data/spec/lib/dumbwaiter/deployment_spec.rb +45 -17
- data/spec/lib/dumbwaiter/instance_spec.rb +3 -3
- data/spec/lib/dumbwaiter/layer_spec.rb +11 -8
- data/spec/lib/dumbwaiter/stack_spec.rb +8 -8
- metadata +24 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dcaf684002c436fa32d8091bbc6bfc5058d244cd
|
4
|
+
data.tar.gz: 6118f4b3bb27ca9f007c6421b518e3a9cac822ac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6f73d6c80660e706b578b01648595fc33af488f9891a877f66d210c4d75bbfec7f84f9361e88ef02f2a125b2053c8327df5e63b74f0da84f6bb4e33fbda1a4a8
|
7
|
+
data.tar.gz: 0226c5b905d5bb1b872691123bb514c4cab48ca57a3888adb4ba4e283588d4914c8efad029ecab0106930fd21b0e019c532c0672ba6842c9f2057e1740af110c
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.1.0
|
data/.travis.yml
CHANGED
data/lib/dumbwaiter/cli.rb
CHANGED
@@ -58,7 +58,8 @@ module Dumbwaiter
|
|
58
58
|
def custom_recipes(stack_name, layer_name, event_name)
|
59
59
|
stack = Stack.find(stack_name)
|
60
60
|
layer = Layer.find(stack, layer_name)
|
61
|
-
|
61
|
+
recipes = layer.custom_recipes.fetch(event_name, []).join(" ")
|
62
|
+
Kernel.puts(recipes)
|
62
63
|
rescue Dumbwaiter::Stack::NotFound, Dumbwaiter::Layer::NotFound => e
|
63
64
|
raise Thor::Error.new(e.message)
|
64
65
|
end
|
data/lib/dumbwaiter/mock.rb
CHANGED
@@ -1,8 +1,14 @@
|
|
1
|
+
require "ostruct"
|
1
2
|
require "faker"
|
2
3
|
|
3
4
|
class Dumbwaiter::Mock
|
4
5
|
attr_reader :stacks, :deployments, :apps, :layers, :instances, :user_profiles
|
5
6
|
|
7
|
+
class HashWithIndifferentAccess < Hash
|
8
|
+
include Hashie::Extensions::MergeInitializer
|
9
|
+
include Hashie::Extensions::IndifferentAccess
|
10
|
+
end
|
11
|
+
|
6
12
|
def opsworks; self; end
|
7
13
|
def describe_stacks(*_); OpenStruct.new(stacks: stacks); end
|
8
14
|
def describe_deployments(*_); OpenStruct.new(deployments: deployments); end
|
@@ -21,57 +27,84 @@ class Dumbwaiter::Mock
|
|
21
27
|
end
|
22
28
|
|
23
29
|
def initialize
|
24
|
-
super
|
25
30
|
clear
|
26
31
|
end
|
27
32
|
|
28
|
-
def
|
29
|
-
|
33
|
+
def create_stack(params = {})
|
34
|
+
params[:name] ||= Faker::Name.first_name
|
35
|
+
params[:attributes] ||= {}
|
36
|
+
params[:attributes]["Color"] ||= make_color
|
37
|
+
stack = OpenStruct.new(params.merge(stack_id: make_id))
|
30
38
|
stacks << stack
|
31
39
|
stack
|
32
40
|
end
|
33
41
|
|
34
|
-
def
|
35
|
-
|
42
|
+
def create_app(params = {})
|
43
|
+
params[:stack_id] ||= create_stack.stack_id
|
44
|
+
params[:name] ||= Faker::Name.last_name
|
45
|
+
params[:shortname] ||= Faker::Name.first_name.downcase
|
46
|
+
params[:app_source] = Hashie::Mash.new(params.fetch(:app_source, {}))
|
47
|
+
params[:app_source][:url] ||= Faker::Internet.url
|
48
|
+
params[:app_source][:revision] = params[:app_source].fetch(:revision, make_revision)
|
49
|
+
app = OpenStruct.new(params.merge(app_id: make_id))
|
36
50
|
apps << app
|
37
51
|
app
|
38
52
|
end
|
39
53
|
|
40
|
-
def
|
41
|
-
|
54
|
+
def create_layer(params = {})
|
55
|
+
params[:stack_id] ||= create_stack.stack_id
|
56
|
+
params[:name] ||= Faker::Name.last_name
|
57
|
+
params[:shortname] ||= Faker::Name.first_name.downcase
|
58
|
+
params[:custom_recipes] = HashWithIndifferentAccess.new(params[:custom_recipes] || {})
|
59
|
+
params[:custom_recipes] = HashWithIndifferentAccess.new(setup: [], configure: [], deploy: [], undeploy: [], shutdown:[]).merge(params[:custom_recipes])
|
60
|
+
params[:type] ||= %w[lb web php-app rails-app nodejs-app memcached db-master monitoring-master custom].sample
|
61
|
+
layer = OpenStruct.new(params.merge(layer_id: make_id))
|
42
62
|
layers << layer
|
43
63
|
layer
|
44
64
|
end
|
45
65
|
|
46
|
-
def
|
47
|
-
|
48
|
-
|
66
|
+
def create_deployment(params = {})
|
67
|
+
params[:stack_id] ||= create_stack.stack_id
|
68
|
+
params[:app_id] ||= create_app.app_id
|
69
|
+
params[:command] = Hashie::Mash.new(params.fetch(:command, {}))
|
70
|
+
params[:command][:name] ||= %w[install_dependencies update_dependencies update_custom_cookbooks execute_recipes deploy rollback start stop restart undeploy].sample
|
71
|
+
params[:custom_json] ||= "{}"
|
72
|
+
params[:comment] ||= Faker::Company.bs
|
73
|
+
params[:iam_user_arn] = params.fetch(:iam_user_arn, create_user_profile.iam_user_arn)
|
74
|
+
params[:created_at] ||= Time.now.to_s
|
75
|
+
params[:status] ||= %w[running failed successful].sample
|
76
|
+
deployment = OpenStruct.new(params.merge(deployment_id: make_id))
|
49
77
|
deployments << deployment
|
50
78
|
deployment
|
51
79
|
end
|
52
80
|
|
53
|
-
def
|
54
|
-
|
81
|
+
def create_instance(params = {})
|
82
|
+
params[:stack_id] ||= create_stack.stack_id
|
83
|
+
params[:layer_id] ||= create_layer.layer_id
|
84
|
+
instance = OpenStruct.new(params.merge(instance_id: make_id))
|
85
|
+
instances << instance
|
86
|
+
instance
|
87
|
+
end
|
88
|
+
|
89
|
+
def create_instance(params = {})
|
90
|
+
params[:stack_id] ||= create_stack.stack_id
|
91
|
+
params[:layer_id] ||= create_layer.layer_id
|
92
|
+
instance = OpenStruct.new(params.merge(instance_id: make_id))
|
55
93
|
instances << instance
|
56
94
|
instance
|
57
95
|
end
|
58
96
|
|
59
|
-
def
|
60
|
-
|
97
|
+
def create_user_profile(params = {})
|
98
|
+
params[:iam_user_arn] ||= Faker::Name.first_name.downcase
|
99
|
+
params[:ssh_username] ||= Faker::Name.first_name.downcase
|
100
|
+
params[:name] ||= Faker::Name.first_name.downcase
|
101
|
+
user_profile = OpenStruct.new(params)
|
61
102
|
user_profiles << user_profile
|
62
103
|
user_profile
|
63
104
|
end
|
64
105
|
|
65
106
|
protected
|
66
107
|
|
67
|
-
def make_custom_default_recipes
|
68
|
-
{setup: [], configure: [], deploy: [], undeploy: [], shutdown:[]}
|
69
|
-
end
|
70
|
-
|
71
|
-
def make_app_source(url, revision)
|
72
|
-
OpenStruct.new(url: url, revision: revision)
|
73
|
-
end
|
74
|
-
|
75
108
|
def make_revision
|
76
109
|
"%06x" % (rand * 0xffffff)
|
77
110
|
end
|
@@ -6,7 +6,10 @@ class Dumbwaiter::UserProfile
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def self.find(iam_user_arn, opsworks = Aws::OpsWorks.new(region: "us-east-1"))
|
9
|
-
cache
|
9
|
+
unless cache.has_key?(iam_user_arn)
|
10
|
+
cache[iam_user_arn] = opsworks.describe_user_profiles(iam_user_arns: [iam_user_arn]).user_profiles.detect { |p| p.iam_user_arn == iam_user_arn }
|
11
|
+
end
|
12
|
+
cache[iam_user_arn]
|
10
13
|
end
|
11
14
|
|
12
15
|
def initialize(opsworks_user_profile, opsworks = Aws::OpsWorks.new(region: "us-east-1"))
|
data/lib/dumbwaiter/version.rb
CHANGED
@@ -2,25 +2,27 @@ require "spec_helper"
|
|
2
2
|
|
3
3
|
describe Dumbwaiter::App do
|
4
4
|
let(:fake_opsworks) { Dumbwaiter::Mock.new }
|
5
|
-
let(:fake_stack) { fake_opsworks.
|
6
|
-
let
|
5
|
+
let(:fake_stack) { fake_opsworks.create_stack }
|
6
|
+
let(:fake_custom_recipes) { {setup: ["ham"]} }
|
7
|
+
let(:app_source) { Hashie::Mash.new(url: "git@example.com:tacos/great.git") }
|
8
|
+
let!(:fake_app) { fake_opsworks.create_app(stack_id: fake_stack.stack_id, name: "goose", app_source: app_source) }
|
7
9
|
let(:real_stack) { Dumbwaiter::Stack.new(fake_stack, fake_opsworks) }
|
8
10
|
|
9
11
|
subject(:app) { Dumbwaiter::App.new(real_stack, fake_app, fake_opsworks) }
|
10
12
|
|
11
|
-
its(:id) { should ==
|
13
|
+
its(:id) { should == fake_app.app_id }
|
12
14
|
its(:name) { should == "goose" }
|
13
15
|
its(:url) { should == "git@example.com:tacos/great.git" }
|
14
16
|
|
15
17
|
describe "#revision" do
|
16
18
|
context "when there is no revision specified" do
|
17
|
-
let(:
|
19
|
+
let(:app_source) { {url: "git@example.com:tacos/great.git", revision: nil} }
|
18
20
|
|
19
21
|
its(:revision) { should == "master" }
|
20
22
|
end
|
21
23
|
|
22
24
|
context "when a revision is specified" do
|
23
|
-
let(:
|
25
|
+
let(:app_source) { {url: "git@example.com:tacos/great.git", revision: "wat"} }
|
24
26
|
|
25
27
|
its(:revision) { should == "wat" }
|
26
28
|
end
|
@@ -30,8 +32,8 @@ describe Dumbwaiter::App do
|
|
30
32
|
context "when no revision is specified" do
|
31
33
|
it "creates a deployment" do
|
32
34
|
fake_opsworks.should_receive(:create_deployment) do |params|
|
33
|
-
params[:stack_id].should ==
|
34
|
-
params[:app_id].should ==
|
35
|
+
params[:stack_id].should == fake_stack.stack_id
|
36
|
+
params[:app_id].should == fake_app.app_id
|
35
37
|
params[:command].should == {name: "deploy", args: {migrate: ["true"]}}
|
36
38
|
end
|
37
39
|
app.deploy
|
@@ -51,8 +53,8 @@ describe Dumbwaiter::App do
|
|
51
53
|
describe "#rollback" do
|
52
54
|
it "creates a rollback" do
|
53
55
|
fake_opsworks.should_receive(:create_deployment) do |params|
|
54
|
-
params[:stack_id].should ==
|
55
|
-
params[:app_id].should ==
|
56
|
+
params[:stack_id].should == fake_stack.stack_id
|
57
|
+
params[:app_id].should == fake_app.app_id
|
56
58
|
params[:command].should == {name: "rollback"}
|
57
59
|
end
|
58
60
|
app.rollback
|
@@ -61,7 +63,7 @@ describe Dumbwaiter::App do
|
|
61
63
|
|
62
64
|
describe ".all" do
|
63
65
|
it "fetches all the apps" do
|
64
|
-
fake_opsworks.should_receive(:describe_apps).with(stack_id:
|
66
|
+
fake_opsworks.should_receive(:describe_apps).with(stack_id: fake_stack.stack_id).and_call_original
|
65
67
|
Dumbwaiter::App.all(real_stack, fake_opsworks).should have(1).app
|
66
68
|
end
|
67
69
|
end
|
@@ -69,7 +71,7 @@ describe Dumbwaiter::App do
|
|
69
71
|
describe ".find" do
|
70
72
|
context "when the app exists" do
|
71
73
|
it "finds the app by name" do
|
72
|
-
Dumbwaiter::App.find(real_stack, "goose", fake_opsworks).id.should ==
|
74
|
+
Dumbwaiter::App.find(real_stack, "goose", fake_opsworks).id.should == fake_app.app_id
|
73
75
|
end
|
74
76
|
end
|
75
77
|
|
@@ -85,7 +87,7 @@ describe Dumbwaiter::App do
|
|
85
87
|
describe ".find" do
|
86
88
|
context "when the app exists" do
|
87
89
|
it "finds the app by id" do
|
88
|
-
Dumbwaiter::App.find_by_id(real_stack,
|
90
|
+
Dumbwaiter::App.find_by_id(real_stack, fake_app.app_id, fake_opsworks).name.should == "goose"
|
89
91
|
end
|
90
92
|
end
|
91
93
|
|
@@ -2,9 +2,9 @@ require "spec_helper"
|
|
2
2
|
|
3
3
|
describe Dumbwaiter::Cli do
|
4
4
|
let(:fake_opsworks) { Dumbwaiter::Mock.new }
|
5
|
-
let!(:fake_stack) { fake_opsworks.
|
6
|
-
let!(:fake_layer) { fake_opsworks.
|
7
|
-
let!(:fake_app) { fake_opsworks.
|
5
|
+
let!(:fake_stack) { fake_opsworks.create_stack }
|
6
|
+
let!(:fake_layer) { fake_opsworks.create_layer(stack_id: fake_stack.stack_id, custom_recipes: {setup: %w[ham salami]}) }
|
7
|
+
let!(:fake_app) { fake_opsworks.create_app(stack_id: fake_stack.stack_id) }
|
8
8
|
|
9
9
|
subject(:cli) { Dumbwaiter::Cli.new }
|
10
10
|
|
@@ -15,20 +15,20 @@ describe Dumbwaiter::Cli do
|
|
15
15
|
context "when the app exists" do
|
16
16
|
it "deploys the stack with the resolved id" do
|
17
17
|
Dumbwaiter::App.any_instance.should_receive(:deploy).with("corn")
|
18
|
-
cli.deploy(
|
18
|
+
cli.deploy(fake_stack.name, fake_app.name, "corn")
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
22
|
context "when the app does not exist" do
|
23
23
|
it "blows up" do
|
24
|
-
expect { cli.deploy(
|
24
|
+
expect { cli.deploy(fake_stack.name, "squirrel", "corn") }.to raise_error(Thor::Error)
|
25
25
|
end
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
29
|
context "when the stack does not exist" do
|
30
30
|
it "blows up" do
|
31
|
-
expect { cli.deploy("toques",
|
31
|
+
expect { cli.deploy("toques", fake_app.name, "corn") }.to raise_error(Thor::Error)
|
32
32
|
end
|
33
33
|
end
|
34
34
|
end
|
@@ -38,20 +38,20 @@ describe Dumbwaiter::Cli do
|
|
38
38
|
context "when the app exists" do
|
39
39
|
it "deploys the stack with the resolved id" do
|
40
40
|
Dumbwaiter::App.any_instance.should_receive(:rollback)
|
41
|
-
cli.rollback(
|
41
|
+
cli.rollback(fake_stack.name, fake_app.name)
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
45
|
context "when the app does not exist" do
|
46
46
|
it "blows up" do
|
47
|
-
expect { cli.rollback(
|
47
|
+
expect { cli.rollback(fake_stack.name, "montreal") }.to raise_error(Thor::Error)
|
48
48
|
end
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
52
|
context "when the stack does not exist" do
|
53
53
|
it "blows up" do
|
54
|
-
expect { cli.rollback("maple syrup",
|
54
|
+
expect { cli.rollback("maple syrup", fake_app.name) }.to raise_error(Thor::Error)
|
55
55
|
end
|
56
56
|
end
|
57
57
|
end
|
@@ -59,47 +59,47 @@ describe Dumbwaiter::Cli do
|
|
59
59
|
describe "#list" do
|
60
60
|
context "when the stack exists" do
|
61
61
|
context "when the deployment is a rollback" do
|
62
|
-
before { fake_opsworks.
|
62
|
+
before { fake_opsworks.create_deployment(stack_id: fake_stack.stack_id, command: {name: "rollback"}) }
|
63
63
|
|
64
64
|
it "lists the deployment" do
|
65
65
|
Kernel.should_receive(:puts) { |m| m.should =~ /rollback/ }
|
66
|
-
cli.list(
|
66
|
+
cli.list(fake_stack.name)
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
70
70
|
context "when the deployment is a deploy" do
|
71
|
-
before { fake_opsworks.
|
71
|
+
before { fake_opsworks.create_deployment(stack_id: fake_stack.stack_id, command: {name: "deploy"}) }
|
72
72
|
|
73
73
|
it "lists the deployment" do
|
74
74
|
Kernel.should_receive(:puts) { |m| m.should =~ /deploy/ }
|
75
|
-
cli.list(
|
75
|
+
cli.list(fake_stack.name)
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
79
79
|
context "when the deployment is a custom cookbook update" do
|
80
|
-
before { fake_opsworks.
|
80
|
+
before { fake_opsworks.create_deployment(stack_id: fake_stack.stack_id, command: {name: "update_custom_cookbooks"}) }
|
81
81
|
|
82
82
|
it "lists the deployment" do
|
83
83
|
Kernel.should_receive(:puts) { |m| m.should =~ /update_custom_cookbooks/ }
|
84
|
-
cli.list(
|
84
|
+
cli.list(fake_stack.name)
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
88
88
|
context "when the deployment is a recipe execution" do
|
89
|
-
before { fake_opsworks.
|
89
|
+
before { fake_opsworks.create_deployment(stack_id: fake_stack.stack_id, command: {name: "execute_recipes"}) }
|
90
90
|
|
91
91
|
it "lists the deployment" do
|
92
92
|
Kernel.should_receive(:puts) { |m| m.should =~ /execute_recipes/ }
|
93
|
-
cli.list(
|
93
|
+
cli.list(fake_stack.name)
|
94
94
|
end
|
95
95
|
end
|
96
96
|
|
97
97
|
context "when the deployment is something else" do
|
98
|
-
|
98
|
+
before { fake_opsworks.create_deployment(stack_id: fake_stack.stack_id, command: {name: "wat"}) }
|
99
99
|
|
100
100
|
it "does not print anything" do
|
101
101
|
Kernel.should_not_receive(:puts)
|
102
|
-
cli.list(
|
102
|
+
cli.list(fake_stack.name)
|
103
103
|
end
|
104
104
|
end
|
105
105
|
end
|
@@ -113,11 +113,11 @@ describe Dumbwaiter::Cli do
|
|
113
113
|
|
114
114
|
describe "#layers" do
|
115
115
|
context "when the stack exists" do
|
116
|
-
before { fake_opsworks.
|
116
|
+
before { fake_opsworks.create_layer(stack_id: fake_stack.stack_id, shortname: "frijoles") }
|
117
117
|
|
118
118
|
it "lists the layers" do
|
119
|
-
Kernel.should_receive(:puts).with("
|
120
|
-
cli.layers(
|
119
|
+
Kernel.should_receive(:puts).with("#{fake_layer.shortname} frijoles")
|
120
|
+
cli.layers(fake_stack.name)
|
121
121
|
end
|
122
122
|
end
|
123
123
|
|
@@ -132,7 +132,7 @@ describe Dumbwaiter::Cli do
|
|
132
132
|
context "when the stack exists" do
|
133
133
|
it "deploys the stack with the resolved id" do
|
134
134
|
Dumbwaiter::Stack.any_instance.should_receive(:rechef)
|
135
|
-
cli.rechef(
|
135
|
+
cli.rechef(fake_stack.name)
|
136
136
|
end
|
137
137
|
end
|
138
138
|
|
@@ -148,20 +148,20 @@ describe Dumbwaiter::Cli do
|
|
148
148
|
context "when the layer exists" do
|
149
149
|
it "runs the recipe on the layer" do
|
150
150
|
Dumbwaiter::Layer.any_instance.should_receive(:run_recipe).with("meatballs")
|
151
|
-
cli.run_recipe(
|
151
|
+
cli.run_recipe(fake_stack.name, fake_layer.shortname, "meatballs")
|
152
152
|
end
|
153
153
|
end
|
154
154
|
|
155
155
|
context "when the layer does not exist" do
|
156
156
|
it "blows up" do
|
157
|
-
expect { cli.run_recipe(
|
157
|
+
expect { cli.run_recipe(fake_stack.name, "brick", "setup") }.to raise_error(Thor::Error)
|
158
158
|
end
|
159
159
|
end
|
160
160
|
end
|
161
161
|
|
162
162
|
context "when the stack does not exist" do
|
163
163
|
it "blows up" do
|
164
|
-
expect { cli.run_recipe("toques",
|
164
|
+
expect { cli.run_recipe("toques", fake_layer.shortname, "setup") }.to raise_error(Thor::Error)
|
165
165
|
end
|
166
166
|
end
|
167
167
|
end
|
@@ -171,20 +171,20 @@ describe Dumbwaiter::Cli do
|
|
171
171
|
context "when the layer exists" do
|
172
172
|
it "prints custom recipes for a layer event" do
|
173
173
|
Kernel.should_receive(:puts).with("ham salami")
|
174
|
-
cli.custom_recipes(
|
174
|
+
cli.custom_recipes(fake_stack.name, fake_layer.shortname, "setup")
|
175
175
|
end
|
176
176
|
end
|
177
177
|
|
178
178
|
context "when the layer does not exist" do
|
179
179
|
it "blows up" do
|
180
|
-
expect { cli.custom_recipes(
|
180
|
+
expect { cli.custom_recipes(fake_stack.name, "brick", "setup") }.to raise_error(Thor::Error)
|
181
181
|
end
|
182
182
|
end
|
183
183
|
end
|
184
184
|
|
185
185
|
context "when the stack does not exist" do
|
186
186
|
it "blows up" do
|
187
|
-
expect { cli.custom_recipes("toques",
|
187
|
+
expect { cli.custom_recipes("toques", fake_layer.shortname, "setup") }.to raise_error(Thor::Error)
|
188
188
|
end
|
189
189
|
end
|
190
190
|
end
|
@@ -194,27 +194,27 @@ describe Dumbwaiter::Cli do
|
|
194
194
|
context "when the layer exists" do
|
195
195
|
it "updates custom recipes on the layer for the event" do
|
196
196
|
Dumbwaiter::Layer.any_instance.should_receive(:update_custom_recipes).with(:setup, ["eggs"])
|
197
|
-
cli.update_custom_recipes(
|
197
|
+
cli.update_custom_recipes(fake_stack.name, fake_layer.shortname, "setup", "eggs")
|
198
198
|
end
|
199
199
|
end
|
200
200
|
|
201
201
|
context "when the layer does not exist" do
|
202
202
|
it "blows up" do
|
203
|
-
expect { cli.update_custom_recipes(
|
203
|
+
expect { cli.update_custom_recipes(fake_stack.name, "brick", "meatballs") }.to raise_error(Thor::Error)
|
204
204
|
end
|
205
205
|
end
|
206
206
|
end
|
207
207
|
|
208
208
|
context "when the stack does not exist" do
|
209
209
|
it "blows up" do
|
210
|
-
expect { cli.update_custom_recipes("toques",
|
210
|
+
expect { cli.update_custom_recipes("toques", fake_layer.shortname, "meatballs") }.to raise_error(Thor::Error)
|
211
211
|
end
|
212
212
|
end
|
213
213
|
end
|
214
214
|
|
215
215
|
describe "#stacks" do
|
216
216
|
it "lists the stacks" do
|
217
|
-
Kernel.should_receive(:puts).with("
|
217
|
+
Kernel.should_receive(:puts).with("#{fake_stack.name}: #{fake_app.name}")
|
218
218
|
cli.stacks
|
219
219
|
end
|
220
220
|
end
|
@@ -2,11 +2,27 @@ require "spec_helper"
|
|
2
2
|
|
3
3
|
describe Dumbwaiter::Deployment do
|
4
4
|
let(:fake_opsworks) { Dumbwaiter::Mock.new }
|
5
|
-
let(:fake_stack) { fake_opsworks.
|
6
|
-
let(:fake_app) { fake_opsworks.
|
7
|
-
let!(:fake_user_profile) { fake_opsworks.
|
5
|
+
let(:fake_stack) { fake_opsworks.create_stack }
|
6
|
+
let(:fake_app) { fake_opsworks.create_app(stack_id: fake_stack.stack_id) }
|
7
|
+
let!(:fake_user_profile) { fake_opsworks.create_user_profile(name: "goose") }
|
8
8
|
let(:custom_json) { Dumbwaiter::DeploymentCustomJson.create("hockey", "eh-buddy").to_json }
|
9
|
-
let
|
9
|
+
let(:deployment_params) do
|
10
|
+
{
|
11
|
+
command: {name: "deploy"},
|
12
|
+
status: "badical",
|
13
|
+
comment: "i love sports",
|
14
|
+
created_at: DateTime.parse("last Tuesday").to_s
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
18
|
+
let!(:fake_deployment) do
|
19
|
+
fake_opsworks.create_deployment({
|
20
|
+
iam_user_arn: fake_user_profile.iam_user_arn,
|
21
|
+
stack_id: fake_stack.stack_id,
|
22
|
+
app_id: fake_app.app_id,
|
23
|
+
custom_json: custom_json
|
24
|
+
}.merge(deployment_params))
|
25
|
+
end
|
10
26
|
let(:real_stack) { Dumbwaiter::Stack.new(fake_stack, fake_opsworks) }
|
11
27
|
|
12
28
|
subject(:deployment) { Dumbwaiter::Deployment.new(real_stack, fake_deployment, fake_opsworks) }
|
@@ -23,35 +39,47 @@ describe Dumbwaiter::Deployment do
|
|
23
39
|
end
|
24
40
|
|
25
41
|
context "when the command name is not deploy" do
|
26
|
-
let
|
42
|
+
let(:deployment_params) do
|
43
|
+
{
|
44
|
+
command: {name: "floss"},
|
45
|
+
status: "badical",
|
46
|
+
created_at: DateTime.parse("last Tuesday").to_s
|
47
|
+
}
|
48
|
+
end
|
27
49
|
|
28
50
|
its(:to_log) { should == "#{DateTime.parse("last Tuesday")} - goose - floss - badical" }
|
29
51
|
end
|
30
52
|
|
31
|
-
context "when the iam user
|
32
|
-
let
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
before { fake_opsworks.clear }
|
53
|
+
context "when the iam user does not exist" do
|
54
|
+
let(:deployment_params) do
|
55
|
+
{
|
56
|
+
command: {name: "floss"},
|
57
|
+
status: "badical",
|
58
|
+
created_at: DateTime.parse("last Tuesday").to_s,
|
59
|
+
iam_user_arn: nil
|
60
|
+
}
|
61
|
+
end
|
41
62
|
|
42
63
|
its(:user_name) { should == "OpsWorks" }
|
43
64
|
end
|
44
65
|
|
45
66
|
context "when custom_json is nil" do
|
46
67
|
let(:real_app) { Dumbwaiter::App.new(real_stack, fake_app, fake_opsworks) }
|
47
|
-
let
|
68
|
+
let(:deployment_params) do
|
69
|
+
{
|
70
|
+
command: {name: "floss"},
|
71
|
+
status: "badical",
|
72
|
+
created_at: DateTime.parse("last Tuesday").to_s,
|
73
|
+
custom_json: nil
|
74
|
+
}
|
75
|
+
end
|
48
76
|
|
49
77
|
its(:revision) { should == "#{real_app.revision}@{#{DateTime.parse("last Tuesday")}}" }
|
50
78
|
end
|
51
79
|
|
52
80
|
describe ".all" do
|
53
81
|
it "fetches all the deployments" do
|
54
|
-
fake_opsworks.should_receive(:describe_deployments).with(stack_id:
|
82
|
+
fake_opsworks.should_receive(:describe_deployments).with(stack_id: fake_stack.stack_id).and_call_original
|
55
83
|
Dumbwaiter::Deployment.all(real_stack, fake_opsworks).should have(1).deployment
|
56
84
|
end
|
57
85
|
end
|
@@ -2,9 +2,9 @@ require "spec_helper"
|
|
2
2
|
|
3
3
|
describe Dumbwaiter::Instance do
|
4
4
|
let(:fake_opsworks) { Dumbwaiter::Mock.new }
|
5
|
-
let(:fake_stack) { fake_opsworks.
|
6
|
-
let(:fake_layer) { fake_opsworks.
|
7
|
-
let!(:fake_instance) { fake_opsworks.
|
5
|
+
let(:fake_stack) { fake_opsworks.create_stack }
|
6
|
+
let(:fake_layer) { fake_opsworks.create_layer }
|
7
|
+
let!(:fake_instance) { fake_opsworks.create_instance(stack_id: fake_stack.stack_id, layer_id: fake_layer.layer_id) }
|
8
8
|
|
9
9
|
subject(:instance) { Dumbwaiter::Instance.new(fake_layer, fake_instance, fake_opsworks) }
|
10
10
|
|
@@ -2,16 +2,17 @@ require "spec_helper"
|
|
2
2
|
|
3
3
|
describe Dumbwaiter::Layer do
|
4
4
|
let(:fake_opsworks) { Dumbwaiter::Mock.new }
|
5
|
-
let(:fake_stack) { fake_opsworks.
|
6
|
-
let(:
|
7
|
-
let
|
5
|
+
let(:fake_stack) { fake_opsworks.create_stack }
|
6
|
+
let(:fake_custom_recipes) { {setup: ["ham"]} }
|
7
|
+
let(:fake_layer) { fake_opsworks.create_layer(stack_id: fake_stack.stack_id, shortname: "meaty", custom_recipes: fake_custom_recipes) }
|
8
|
+
let!(:fake_instance) { fake_opsworks.create_instance }
|
8
9
|
|
9
10
|
let(:real_stack) { Dumbwaiter::Stack.new(fake_stack, fake_opsworks) }
|
10
11
|
|
11
12
|
subject(:layer) { Dumbwaiter::Layer.new(real_stack, fake_layer, fake_opsworks) }
|
12
13
|
|
13
14
|
its(:opsworks_layer) { should == fake_layer }
|
14
|
-
its(:id) { should ==
|
15
|
+
its(:id) { should == fake_layer.layer_id }
|
15
16
|
its(:shortname) { should == "meaty" }
|
16
17
|
its(:custom_recipes) { should include(setup: ["ham"]) }
|
17
18
|
|
@@ -21,13 +22,15 @@ describe Dumbwaiter::Layer do
|
|
21
22
|
let(:real_stack) { Dumbwaiter::Stack.new(fake_stack, fake_opsworks) }
|
22
23
|
|
23
24
|
it "fetches all the deployments" do
|
24
|
-
fake_opsworks.should_receive(:describe_layers).with(stack_id:
|
25
|
+
fake_opsworks.should_receive(:describe_layers).with(stack_id: fake_stack.stack_id).and_call_original
|
25
26
|
Dumbwaiter::Layer.all(real_stack, fake_opsworks).should have(1).layer
|
26
27
|
end
|
27
28
|
end
|
28
29
|
|
29
30
|
describe ".find" do
|
30
31
|
context "when the layer exists" do
|
32
|
+
let!(:layer) { Dumbwaiter::Layer.new(real_stack, fake_layer, fake_opsworks) }
|
33
|
+
|
31
34
|
it "finds the layer by name" do
|
32
35
|
Dumbwaiter::Layer.find(real_stack, "meaty", fake_opsworks).shortname.should == "meaty"
|
33
36
|
end
|
@@ -45,8 +48,8 @@ describe Dumbwaiter::Layer do
|
|
45
48
|
describe "#run_recipe" do
|
46
49
|
it "executes a recipe" do
|
47
50
|
fake_opsworks.should_receive(:create_deployment) do |params|
|
48
|
-
params[:stack_id].should ==
|
49
|
-
params[:instance_ids].should == [
|
51
|
+
params[:stack_id].should == fake_stack.stack_id
|
52
|
+
params[:instance_ids].should == [fake_instance.instance_id]
|
50
53
|
params[:command].should == {name: "execute_recipes", args: {recipes: ["meatballs"]}}
|
51
54
|
end
|
52
55
|
layer.run_recipe("meatballs")
|
@@ -56,7 +59,7 @@ describe Dumbwaiter::Layer do
|
|
56
59
|
describe "#update_custom_recipes" do
|
57
60
|
it "overwrites existing custom recipes for an event" do
|
58
61
|
fake_opsworks.should_receive(:update_layer) do |params|
|
59
|
-
params[:layer_id].should ==
|
62
|
+
params[:layer_id].should == fake_layer.layer_id
|
60
63
|
params[:custom_recipes].should include(setup: ["feet"])
|
61
64
|
end
|
62
65
|
layer.update_custom_recipes(:setup, ["feet"])
|
@@ -2,10 +2,10 @@ require "spec_helper"
|
|
2
2
|
|
3
3
|
describe Dumbwaiter::Stack do
|
4
4
|
let(:fake_opsworks) { Dumbwaiter::Mock.new }
|
5
|
-
let!(:fake_stack) { fake_opsworks.
|
6
|
-
let!(:fake_app) { fake_opsworks.
|
7
|
-
let!(:fake_deployment) { fake_opsworks.
|
8
|
-
let!(:fake_layer) { fake_opsworks.
|
5
|
+
let!(:fake_stack) { fake_opsworks.create_stack(name: "ducks", attributes:{"Color" => "hot pink"}) }
|
6
|
+
let!(:fake_app) { fake_opsworks.create_app(stack_id: fake_stack.stack_id) }
|
7
|
+
let!(:fake_deployment) { fake_opsworks.create_deployment(stack_id: fake_stack.stack_id, app_id: fake_app.app_id) }
|
8
|
+
let!(:fake_layer) { fake_opsworks.create_layer(stack_id: fake_stack.stack_id) }
|
9
9
|
|
10
10
|
subject(:stack) { Dumbwaiter::Stack.new(fake_stack, fake_opsworks) }
|
11
11
|
|
@@ -13,7 +13,7 @@ describe Dumbwaiter::Stack do
|
|
13
13
|
it { should have(1).deployments }
|
14
14
|
it { should have(1).layers }
|
15
15
|
|
16
|
-
its(:id) { should ==
|
16
|
+
its(:id) { should == fake_stack.stack_id }
|
17
17
|
its(:name) { should == "ducks" }
|
18
18
|
its(:color) { should == "hot pink" }
|
19
19
|
|
@@ -26,7 +26,7 @@ describe Dumbwaiter::Stack do
|
|
26
26
|
describe ".find" do
|
27
27
|
context "when the stack exists" do
|
28
28
|
it "finds the stack by name" do
|
29
|
-
Dumbwaiter::Stack.find("ducks", fake_opsworks).id.should ==
|
29
|
+
Dumbwaiter::Stack.find("ducks", fake_opsworks).id.should == fake_stack.stack_id
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
@@ -42,7 +42,7 @@ describe Dumbwaiter::Stack do
|
|
42
42
|
describe ".find_by_id" do
|
43
43
|
context "when the stack exists" do
|
44
44
|
it "finds the stack by id" do
|
45
|
-
Dumbwaiter::Stack.find_by_id(
|
45
|
+
Dumbwaiter::Stack.find_by_id(fake_stack.stack_id, fake_opsworks).name.should == "ducks"
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
@@ -58,7 +58,7 @@ describe Dumbwaiter::Stack do
|
|
58
58
|
describe "#rechef" do
|
59
59
|
it "creates a deployment" do
|
60
60
|
fake_opsworks.should_receive(:create_deployment) do |params|
|
61
|
-
params[:stack_id].should ==
|
61
|
+
params[:stack_id].should == fake_stack.stack_id
|
62
62
|
params[:command].should == {name: "update_custom_cookbooks"}
|
63
63
|
end
|
64
64
|
stack.rechef
|
metadata
CHANGED
@@ -1,111 +1,111 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dumbwaiter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Doc Ritezel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-01-
|
11
|
+
date: 2014-01-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk-core
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: hashie
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: thor
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: bundler
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - ~>
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '1.3'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - ~>
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '1.3'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: gem-release
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: rspec
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: faker
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- -
|
101
|
+
- - ">="
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '0'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- -
|
108
|
+
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
111
|
description: Hoist your code up to Opsworks
|
@@ -116,11 +116,11 @@ executables:
|
|
116
116
|
extensions: []
|
117
117
|
extra_rdoc_files: []
|
118
118
|
files:
|
119
|
-
- .gitignore
|
120
|
-
- .rspec
|
121
|
-
- .ruby-gemset
|
122
|
-
- .ruby-version
|
123
|
-
- .travis.yml
|
119
|
+
- ".gitignore"
|
120
|
+
- ".rspec"
|
121
|
+
- ".ruby-gemset"
|
122
|
+
- ".ruby-version"
|
123
|
+
- ".travis.yml"
|
124
124
|
- Gemfile
|
125
125
|
- Guardfile
|
126
126
|
- LICENSE.txt
|
@@ -158,17 +158,17 @@ require_paths:
|
|
158
158
|
- lib
|
159
159
|
required_ruby_version: !ruby/object:Gem::Requirement
|
160
160
|
requirements:
|
161
|
-
- -
|
161
|
+
- - ">="
|
162
162
|
- !ruby/object:Gem::Version
|
163
163
|
version: '0'
|
164
164
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
165
165
|
requirements:
|
166
|
-
- -
|
166
|
+
- - ">="
|
167
167
|
- !ruby/object:Gem::Version
|
168
168
|
version: '0'
|
169
169
|
requirements: []
|
170
170
|
rubyforge_project:
|
171
|
-
rubygems_version: 2.0
|
171
|
+
rubygems_version: 2.2.0
|
172
172
|
signing_key:
|
173
173
|
specification_version: 4
|
174
174
|
summary: Monitor, deploy and maintain your Opsworks application stacks
|