dumbwaiter 0.4.3 → 0.5.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 +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
|