chef_cap 0.3.2 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -0
- data/README.rdoc +2 -0
- data/lib/chef_cap/version.rb +1 -1
- data/recipes/chef_cap.rb +43 -23
- data/spec/chef_cap_mock_cap.rb +24 -4
- data/spec/chef_cap_spec.rb +13 -29
- metadata +9 -9
data/Gemfile
CHANGED
data/README.rdoc
CHANGED
@@ -72,6 +72,8 @@ Optional JSON keys:
|
|
72
72
|
|
73
73
|
{ "environments": { ENVIRONMENT: { "role_order": { FIRST_ROLE: [OTHER_ROLES] } } } }
|
74
74
|
{ "environments": { ENVIRONMENT: { "environment_settings": ENV_HASH } } }
|
75
|
+
{ "rollback_run_list": [] }
|
76
|
+
{ "deploy_recipe": "[some_cookbook]::[some_recipe]" }
|
75
77
|
|
76
78
|
|
77
79
|
== REQUIREMENTS
|
data/lib/chef_cap/version.rb
CHANGED
data/recipes/chef_cap.rb
CHANGED
@@ -25,7 +25,6 @@ if ChefDnaParser.parsed["environments"]
|
|
25
25
|
ChefDnaParser.parsed["environments"].each_key do |environment|
|
26
26
|
next if environment == "default"
|
27
27
|
environment_hash = ChefDnaParser.parsed["environments"][environment]
|
28
|
-
|
29
28
|
set :environments, environments.merge(environment => environment_hash)
|
30
29
|
|
31
30
|
desc "Set server roles for the #{environment} environment"
|
@@ -208,35 +207,56 @@ namespace :chef do
|
|
208
207
|
|
209
208
|
set "node_hash_for_#{channel[:host].gsub(/\./, "_")}", json_to_modify
|
210
209
|
put json_to_modify.to_json, "/tmp/chef-cap-#{rails_env}-#{channel[:host]}.json", :mode => "0600"
|
210
|
+
|
211
|
+
rollback_json = json_to_modify.dup
|
212
|
+
rollback_json["run_list"] = rollback_json["rollback_run_list"] || []
|
213
|
+
set "node_hash_for_#{channel[:host].gsub(/\./, "_")}_rollback", rollback_json
|
214
|
+
put rollback_json.to_json, "/tmp/chef-cap-#{rails_env}-#{channel[:host]}-rollback.json", :mode => "0600"
|
211
215
|
end
|
212
216
|
end
|
213
|
-
|
214
|
-
chef.run_chef_solo
|
217
|
+
transaction { chef.run_chef_solo }
|
215
218
|
end
|
216
219
|
|
217
|
-
task :
|
218
|
-
debug_flag
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
220
|
+
task :setup_to_run_chef_solo do
|
221
|
+
set :debug_flag, ENV['QUIET'] ? '' : '-l debug'
|
222
|
+
exec_chef_solo = "env PATH=$PATH:/usr/sbin `cat #{rvm_bin_path}` default exec chef-solo -c /tmp/chef-cap-solo-#{rails_env}.rb #{debug_flag}"
|
223
|
+
set :run_chef_solo_deploy_command, "#{exec_chef_solo} -j /tmp/chef-cap-#{rails_env}-`hostname`.json"
|
224
|
+
set :run_chef_solo_rollback_command, "#{exec_chef_solo} -j /tmp/chef-cap-#{rails_env}-`hostname`-rollback.json"
|
225
|
+
set :run_chef_solo_block, { :block => lambda { |command_to_run|
|
226
|
+
hosts_that_have_run = []
|
227
|
+
unless role_order.empty?
|
228
|
+
role_order.each do |role, dependent_roles|
|
229
|
+
role_hosts = (find_servers(:roles => [role.to_sym]).map(&:host) - hosts_that_have_run).uniq
|
230
|
+
dependent_hosts = (find_servers(:roles => dependent_roles.map(&:to_sym)).map(&:host) - role_hosts - hosts_that_have_run).uniq
|
231
|
+
if role_hosts.any?
|
232
|
+
sudo(command_to_run, :hosts => role_hosts)
|
233
|
+
hosts_that_have_run += role_hosts
|
234
|
+
end
|
235
|
+
if dependent_hosts.any?
|
236
|
+
sudo(command_to_run, :hosts => dependent_hosts)
|
237
|
+
hosts_that_have_run += dependent_hosts
|
238
|
+
end
|
234
239
|
end
|
240
|
+
else
|
241
|
+
sudo(command_to_run)
|
235
242
|
end
|
236
|
-
|
237
|
-
|
238
|
-
|
243
|
+
} } # Because capistrano automatically calls lambdas on reference which means you can't pass it an argument.
|
244
|
+
end
|
245
|
+
|
246
|
+
task :rollback_pre_hook do
|
247
|
+
end
|
239
248
|
|
249
|
+
task :rollback_post_hook do
|
250
|
+
end
|
251
|
+
|
252
|
+
task :run_chef_solo do
|
253
|
+
chef.setup_to_run_chef_solo
|
254
|
+
on_rollback do
|
255
|
+
chef.rollback_pre_hook
|
256
|
+
run_chef_solo_block[:block].call(run_chef_solo_rollback_command)
|
257
|
+
chef.rollback_post_hook
|
258
|
+
end
|
259
|
+
run_chef_solo_block[:block].call(run_chef_solo_deploy_command)
|
240
260
|
end
|
241
261
|
|
242
262
|
desc "Remove all chef-cap files from /tmp"
|
data/spec/chef_cap_mock_cap.rb
CHANGED
@@ -98,14 +98,26 @@ def unset(key)
|
|
98
98
|
end
|
99
99
|
|
100
100
|
def set(key, value)
|
101
|
-
key.to_s.gsub
|
101
|
+
defined_key = key.to_s.gsub(/\.|-/, '_')
|
102
|
+
accessor_key = "key_#{defined_key}".to_sym
|
103
|
+
@variables ||= {}
|
104
|
+
@variables[accessor_key] = value
|
102
105
|
self.instance_eval(<<-EOS)
|
103
|
-
def #{
|
104
|
-
#{
|
106
|
+
def #{defined_key.to_s}
|
107
|
+
@variables[#{accessor_key}]
|
105
108
|
end
|
106
109
|
EOS
|
110
|
+
end
|
111
|
+
|
112
|
+
def set(key, value)
|
113
|
+
key.to_s.gsub!(/\.|-/, '_')
|
107
114
|
@variables ||= {}
|
108
|
-
@variables[key] = value
|
115
|
+
@variables[key.to_sym] = value
|
116
|
+
self.instance_eval(<<-EOS)
|
117
|
+
def #{key.to_s}
|
118
|
+
@variables['#{key}'.to_sym]
|
119
|
+
end
|
120
|
+
EOS
|
109
121
|
end
|
110
122
|
|
111
123
|
def cap_variable
|
@@ -129,6 +141,14 @@ def current_description
|
|
129
141
|
@task_description
|
130
142
|
end
|
131
143
|
|
144
|
+
def transaction(&block)
|
145
|
+
yield
|
146
|
+
end
|
147
|
+
|
148
|
+
def on_rollback(&block)
|
149
|
+
# ignore for now
|
150
|
+
end
|
151
|
+
|
132
152
|
def namespace(name, &block)
|
133
153
|
@namespaces ||= {}
|
134
154
|
@namespaces[name] = true
|
data/spec/chef_cap_spec.rb
CHANGED
@@ -418,23 +418,11 @@ describe "chef_cap" do
|
|
418
418
|
|
419
419
|
chef_cap.parallel_sessions.each do |server_session|
|
420
420
|
if server_session.things_that_were_set.keys.include? "node_hash_for_localhost"
|
421
|
-
server_session.things_that_were_set["node_hash_for_localhost"].should ==
|
422
|
-
|
423
|
-
"servers"=>[ {"hostname"=>"localhost", "roles"=>["role1", "role2"] }, {"hostname"=>"otherhost.com", "roles"=>["role1"]}]}},
|
424
|
-
"chef" => {"root"=>"path_to_cookbooks", "version"=>"0.1982.1234"},
|
425
|
-
"run_list" => ["foo", "bar"],
|
426
|
-
"environment" => {"rails_env" => "myenv", "roles" => ["role1", "role2"], "servers"=>[ {"primary" => [], "hostname"=>"localhost", "roles"=>["role1", "role2"] },
|
427
|
-
{"primary" => [], "hostname"=>"otherhost.com", "roles"=>["role1"]}]},
|
428
|
-
"roles" => {"role1" => {"run_list"=>["foo"]}, "role2"=>{"run_list"=>["foo", "bar"]}}}
|
421
|
+
server_session.things_that_were_set["node_hash_for_localhost"]["environment"]["roles"].should == ["role1", "role2"]
|
422
|
+
server_session.things_that_were_set["node_hash_for_localhost"]["run_list"].should == ["foo", "bar"]
|
429
423
|
elsif server_session.things_that_were_set.keys.include? "node_hash_for_otherhost"
|
430
|
-
server_session.things_that_were_set["node_hash_for_otherhost"].should ==
|
431
|
-
|
432
|
-
"servers"=>[{"hostname"=>"localhost", "roles"=>["role1", "role2"]}, {"hostname"=>"otherhost.com", "roles"=>["role1"]}]}},
|
433
|
-
"chef"=>{"root"=>"path_to_cookbooks"},
|
434
|
-
"run_list"=>["foo"],
|
435
|
-
"environment"=>{"rails_env" => "myenv", "roles" => ["role1"], "servers"=>[{"primary" => [], "hostname"=>"localhost", "roles"=>["role1", "role2"]},
|
436
|
-
{"primary" => [], "hostname"=>"otherhost.com", "roles"=>["role1"]}]},
|
437
|
-
"roles"=>{"role1"=>{"run_list"=>["foo"]}, "role2"=>{"run_list"=>["foo", "bar"]}}}
|
424
|
+
server_session.things_that_were_set["node_hash_for_otherhost"]["environment"]["roles"].should == ["role1"]
|
425
|
+
server_session.things_that_were_set["node_hash_for_otherhost"]["run_list"].should == ["foo"]
|
438
426
|
end
|
439
427
|
end
|
440
428
|
end
|
@@ -520,6 +508,7 @@ describe "chef_cap" do
|
|
520
508
|
|
521
509
|
chef_cap.cap_task[:some_env].should_not be_nil
|
522
510
|
chef_cap.cap_task[:some_env].call
|
511
|
+
chef_cap.cap_task["chef:setup_to_run_chef_solo"].call
|
523
512
|
end
|
524
513
|
|
525
514
|
it "invokes chef-solo on db hosts then app and web only hosts" do
|
@@ -557,6 +546,7 @@ describe "chef_cap" do
|
|
557
546
|
|
558
547
|
chef_cap.cap_task[:some_env].should_not be_nil
|
559
548
|
chef_cap.cap_task[:some_env].call
|
549
|
+
chef_cap.cap_task["chef:setup_to_run_chef_solo"].call
|
560
550
|
end
|
561
551
|
|
562
552
|
|
@@ -608,6 +598,7 @@ describe "chef_cap" do
|
|
608
598
|
|
609
599
|
chef_cap.cap_task[:some_env].should_not be_nil
|
610
600
|
chef_cap.cap_task[:some_env].call
|
601
|
+
chef_cap.cap_task["chef:setup_to_run_chef_solo"].call
|
611
602
|
end
|
612
603
|
|
613
604
|
it "invokes chef-solo on dep0 then dep1 and dep2 then finally dep3" do
|
@@ -658,6 +649,7 @@ describe "chef_cap" do
|
|
658
649
|
|
659
650
|
chef_cap.cap_task[:some_env].should_not be_nil
|
660
651
|
chef_cap.cap_task[:some_env].call
|
652
|
+
chef_cap.cap_task["chef:setup_to_run_chef_solo"].call
|
661
653
|
end
|
662
654
|
|
663
655
|
it "invokes chef-solo on dep0 then dep1 and dep2 then finally dep3" do
|
@@ -1004,6 +996,7 @@ describe "chef_cap" do
|
|
1004
996
|
it "shoves the value into the node json alongside branch" do
|
1005
997
|
ENV['rev'] = "123"
|
1006
998
|
ENV['branch'] = "somebranch"
|
999
|
+
chef_cap.stub(:system).and_return(true)
|
1007
1000
|
chef_cap.stub!(:put => "stubbed")
|
1008
1001
|
chef_cap.stub!(:upload => "stubbed")
|
1009
1002
|
chef_cap.stub!(:sudo => "stubbed")
|
@@ -1012,19 +1005,10 @@ describe "chef_cap" do
|
|
1012
1005
|
chef_cap.parallel_mocks << proc { |server_session|
|
1013
1006
|
server_session.stub!(:put => "stubbed")
|
1014
1007
|
server_session.stub!(:sudo => "stubbed")
|
1015
|
-
server_session.should_receive(:set)
|
1016
|
-
|
1017
|
-
"
|
1018
|
-
|
1019
|
-
"shared"=>{"foo"=>"bar"},
|
1020
|
-
"foo"=>"bar",
|
1021
|
-
"something"=>"other",
|
1022
|
-
"environment"=> {"revision"=>"123", "branch" => "somebranch",
|
1023
|
-
"roles" => ["role1"],
|
1024
|
-
"servers"=>[{"primary" => [], "hostname"=>"localhost", "roles"=>["role1", "role2"]}]},
|
1025
|
-
"roles"=>{"role1"=>{"something"=>"other"}},
|
1026
|
-
"run_list"=>nil
|
1027
|
-
})
|
1008
|
+
server_session.should_receive(:set) do |key, value|
|
1009
|
+
value["environment"]["revision"].should == "123"
|
1010
|
+
value["environment"]["branch"].should == "somebranch"
|
1011
|
+
end.twice
|
1028
1012
|
}
|
1029
1013
|
chef_cap.cap_task["chef:deploy"].call
|
1030
1014
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chef_cap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-12-
|
12
|
+
date: 2011-12-29 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: capistrano
|
16
|
-
requirement: &
|
16
|
+
requirement: &2157107720 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 2.5.5
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *2157107720
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rspec-rails
|
27
|
-
requirement: &
|
27
|
+
requirement: &2157107140 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
version: '2.1'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *2157107140
|
36
36
|
description: chef_cap uses chef"s JSON config format to drive both capistrano and
|
37
37
|
chef-solo"
|
38
38
|
email:
|
@@ -91,7 +91,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
91
91
|
version: '0'
|
92
92
|
segments:
|
93
93
|
- 0
|
94
|
-
hash: -
|
94
|
+
hash: -4226372811426833892
|
95
95
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
96
|
none: false
|
97
97
|
requirements:
|
@@ -100,10 +100,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
100
100
|
version: '0'
|
101
101
|
segments:
|
102
102
|
- 0
|
103
|
-
hash: -
|
103
|
+
hash: -4226372811426833892
|
104
104
|
requirements: []
|
105
105
|
rubyforge_project:
|
106
|
-
rubygems_version: 1.8.
|
106
|
+
rubygems_version: 1.8.12
|
107
107
|
signing_key:
|
108
108
|
specification_version: 3
|
109
109
|
summary: capistrano + chef-solo == chef_cap"
|