dumbwaiter 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7eec67cf367b40acf1fccfefbd0d5fc9ec93cf08
4
- data.tar.gz: fef98f893af0c623fde70042cde497a97d8dad41
3
+ metadata.gz: 20f20eaec8369f54bbc83d62f0ade5f99a735f98
4
+ data.tar.gz: 1c4eca739c2b72e96ee6908df4ace69fc688f081
5
5
  SHA512:
6
- metadata.gz: 4d277b944f4eeb954bfce508a9c46858f3a9b59471bf5cddd77f3823b291f56d0d5aa12c9de18efe8feac19fdc4a9dc0714d09982dec1eac17fc9bb8ac12d8bf
7
- data.tar.gz: 6b67dad773822e0c930bfd44871defcb6b39b36ebbaa283d03c935a632b74e38549acc8c01cc09cb350ec343ba60f65e960bd271893ecf1fffd9a3248be6e13b
6
+ metadata.gz: fc160beefbabeca4bc392e0b75c8c80d5e94a4abf2aadde4c39c10dbad7e0a5cf3d82cc26164a7d182fb23c7864c2a2bf5a87ba5967b929f434c43fbe7d0b9f7
7
+ data.tar.gz: 2bad21df531df0ea6ec2ba1f4b394a2ebc6528f627d0b72ff440035c248f1fa1b5899e9385fdccba0af9ebd24ed6d8433e6b8485dbf91dadc3d0f950b9974d0c
data/README.md CHANGED
@@ -5,6 +5,39 @@ Dumbwaiter hoists your Rails application up to OpsWorks and ratchets deployment
5
5
  information back down.
6
6
 
7
7
 
8
+ Origin
9
+ ------
10
+
11
+ Before Scalarium became OpsWorks, they maintained a gem that did the sorts of
12
+ functions described here. Like Heroku Toolbelt, the Scalarium gem offered users
13
+ a very basic workflow experience: upload and run Chef recipes, execute commands
14
+ remotely and watch their output.
15
+
16
+
17
+ Goals
18
+ -----
19
+
20
+ Dumbwaiter prescribes a very specific OpsWorks-centric workflow with the same
21
+ feeling of the Scalarium gem's CLI:
22
+
23
+ * Create OpsWorks stacks, layers and instances via YAML files
24
+ * Collect custom Chef cookbooks via Berkshelf and upload to S3
25
+ * Create an application corresponding to a GitHub repo
26
+ * Run versioned deployments, rollbacks and one-off recipes
27
+
28
+
29
+ Non-Goals
30
+ ---------
31
+
32
+ Dumbwaiter only deals with OpsWorks workflow, excluding:
33
+
34
+ * Standing up VPCs
35
+ * Running CloudFormation templates
36
+ * One-off bash-level commands(^) and log tailing
37
+
38
+ `^ Making a cookbook to run one-off commands is totally not unheard-of.`
39
+
40
+
8
41
  Installation
9
42
  ------------
10
43
 
@@ -28,14 +61,18 @@ Deploy the "cinnamon" branch of the "syrup" application to the "Pancake" stack:
28
61
 
29
62
  `dumbwaiter deploy Pancake syrup cinnamon`
30
63
 
31
- Roll back the "Snowman" stack's "dandruff" application:
32
-
33
- `dumbwaiter rollback Snowman dandruff`
34
-
35
64
  List the deployments on the "Maniacal Checklist" stack:
36
65
 
37
66
  `dumbwaiter list "Maniacal Checklist"`
38
67
 
68
+ Upload all the custom cookbooks for the "Sweden" stack:
69
+
70
+ `dumbwaiter rechef Sweden`
71
+
72
+ Roll back the "Snowman" stack's "dandruff" application:
73
+
74
+ `dumbwaiter rollback Snowman dandruff`
75
+
39
76
  List the stacks and apps in your OpsWorks environment:
40
77
 
41
78
  `dumbwaiter stacks`
@@ -14,21 +14,12 @@ module Dumbwaiter
14
14
  raise Thor::Error.new(e.message)
15
15
  end
16
16
 
17
- desc "rollback STACK_NAME APP_NAME", "Roll back an application"
18
- def rollback(stack_name, app_name)
19
- stack = Stack.find(stack_name)
20
- app = App.find(stack, app_name)
21
- app.rollback
22
- rescue Dumbwaiter::Stack::NotFound, Dumbwaiter::App::NotFound => e
23
- raise Thor::Error.new(e.message)
24
- end
25
-
26
17
  desc "list STACK_NAME", "List all the deployments for a stack"
27
18
  def list(stack_name)
28
19
  stack = Stack.find(stack_name)
29
20
 
30
21
  deployments = stack.deployments.select do |deployment|
31
- %w(rollback deploy).include?(deployment.command_name)
22
+ %w(rollback deploy update_custom_cookbooks).include?(deployment.command_name)
32
23
  end
33
24
 
34
25
  deployments.each do |deployment|
@@ -38,6 +29,22 @@ module Dumbwaiter
38
29
  raise Thor::Error.new(e.message)
39
30
  end
40
31
 
32
+ desc "rechef STACK", "Upload new cookbooks to a stack"
33
+ def rechef(stack_name)
34
+ Stack.find(stack_name).rechef
35
+ rescue Dumbwaiter::Stack::NotFound => e
36
+ raise Thor::Error.new(e.message)
37
+ end
38
+
39
+ desc "rollback STACK_NAME APP_NAME", "Roll back an application"
40
+ def rollback(stack_name, app_name)
41
+ stack = Stack.find(stack_name)
42
+ app = App.find(stack, app_name)
43
+ app.rollback
44
+ rescue Dumbwaiter::Stack::NotFound, Dumbwaiter::App::NotFound => e
45
+ raise Thor::Error.new(e.message)
46
+ end
47
+
41
48
  desc "stacks", "List all the stacks"
42
49
  def stacks
43
50
  Stack.all.each { |stack| Kernel.puts("#{stack.name}: #{stack.apps.map(&:name).join(', ')}") }
@@ -36,4 +36,8 @@ class Dumbwaiter::Stack
36
36
  def deployments
37
37
  @deployments ||= Dumbwaiter::Deployment.all(self, opsworks)
38
38
  end
39
+
40
+ def rechef
41
+ opsworks.create_deployment(stack_id: id, command: {name: "update_custom_cookbooks"})
42
+ end
39
43
  end
@@ -1,3 +1,3 @@
1
1
  module Dumbwaiter
2
- VERSION = "0.3.1"
2
+ VERSION = "0.3.2"
3
3
  end
@@ -79,6 +79,15 @@ describe Dumbwaiter::Cli do
79
79
  end
80
80
  end
81
81
 
82
+ context "when the deployment is a custom cookbook update" do
83
+ let(:fake_deployment) { double(:deployment, command_name: "update_custom_cookbooks", to_log: "whee!") }
84
+
85
+ it "lists the deployment" do
86
+ Kernel.should_receive(:puts).with("whee!")
87
+ cli.list("ducks")
88
+ end
89
+ end
90
+
82
91
  context "when the deployment is something else" do
83
92
  let(:fake_deployment) { double(:deployment, command_name: "gargle", to_log: "brblrgl") }
84
93
 
@@ -102,4 +111,19 @@ describe Dumbwaiter::Cli do
102
111
  cli.stacks
103
112
  end
104
113
  end
114
+
115
+ describe "#rechef" do
116
+ context "when the stack exists" do
117
+ it "deploys the stack with the resolved id" do
118
+ fake_stack.should_receive(:rechef)
119
+ cli.rechef("ducks")
120
+ end
121
+ end
122
+
123
+ context "when the stack does not exist" do
124
+ it "blows up" do
125
+ expect { cli.rechef("toques") }.to raise_error(Thor::Error)
126
+ end
127
+ end
128
+ end
105
129
  end
@@ -7,7 +7,7 @@ describe Dumbwaiter::Stack do
7
7
  let(:fake_app) { double(:app) }
8
8
  let(:fake_deployment) { double(:deployment) }
9
9
 
10
- subject(:stack) { Dumbwaiter::Stack.new(fake_stack) }
10
+ subject(:stack) { Dumbwaiter::Stack.new(fake_stack, fake_opsworks) }
11
11
 
12
12
  before do
13
13
  Dumbwaiter::App.stub(all: [fake_app])
@@ -42,4 +42,14 @@ describe Dumbwaiter::Stack do
42
42
  end
43
43
  end
44
44
  end
45
+
46
+ describe "#rechef" do
47
+ it "creates a deployment" do
48
+ fake_opsworks.should_receive(:create_deployment) do |params|
49
+ params[:stack_id].should == "cool"
50
+ params[:command].should == {name: "update_custom_cookbooks"}
51
+ end
52
+ stack.rechef
53
+ end
54
+ end
45
55
  end
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.3.1
4
+ version: 0.3.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: 2013-12-10 00:00:00.000000000 Z
11
+ date: 2013-12-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-core