vagrant-cookbook-fetcher 0.0.6 → 0.0.7

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.
Files changed (3) hide show
  1. data/README.md +5 -4
  2. data/lib/vagrant_cookbook_fetcher.rb +119 -90
  3. metadata +39 -40
data/README.md CHANGED
@@ -5,7 +5,7 @@ A Vagrant plugin to automatically fetch cookbooks, roles, and such whenever you
5
5
 
6
6
  ## Behavior
7
7
 
8
- Once you set a URL that provides a list of checkouts, this plugin will create two directory trees:
8
+ Once you set a URL in your Vagrantfile that provides a list of checkouts, this plugin will create two directory trees (checkouts and combined):
9
9
 
10
10
  my-vagrant-project
11
11
  |...Vagrantfile
@@ -16,6 +16,7 @@ Once you set a URL that provides a list of checkouts, this plugin will create tw
16
16
  |...roles
17
17
  |...nodes
18
18
  |...data_bags
19
+ |...specs
19
20
 
20
21
  The plugin will loop through the list of checkouts, perform a clone/checkout or pull/update to make sure the checkout exists in the 'checkouts' directory.
21
22
 
@@ -38,7 +39,7 @@ The fields are: VCS,repo address, directory name, branch, credentials
38
39
 
39
40
  ## Configuration
40
41
 
41
- ### config.auto_checkout.url
42
+ ### config.cookbook_fetcher.url
42
43
 
43
44
  Default: none.
44
45
 
@@ -46,11 +47,11 @@ URL that replies with a CSV file containing the list of checkouts.
46
47
 
47
48
  If absent, no fetch occurs.
48
49
 
49
- ### config.auto_checkout.disable
50
+ ### config.cookbook_fetcher.disable
50
51
 
51
52
  Default: false
52
53
 
53
- If true, no checkout will be be run. This can be useful if you're provisioning frequently and making local changes to your recipes.
54
+ If true, no checkout will be be run. This can be useful if you're provisioning frequently and making local changes to your recipes; if you use git rebase, your build will break whenever you have a local change and an incoming change at the same time.
54
55
 
55
56
  Even if the fetch is disabled, this plugin will still try to tell chef-solo about your cookbook, role, and data_bag paths, unless you override them.
56
57
 
@@ -1,51 +1,41 @@
1
+ module CookbookFetcher
1
2
 
2
- # http://vagrantup.com/v1/docs/extending/configuration.html
3
- class CookbookFetcherConfig < Vagrant::Config::Base
4
- attr_accessor :url
5
- attr_accessor :disable
6
- end
7
- Vagrant.config_keys.register(:cookbook_fetcher) { CookbookFetcherConfig }
8
-
9
-
10
- # This is a Vagrant middleware plugin
11
- # http://vagrantup.com/v1/docs/extending/middleware.html
12
-
13
- class CookbookFetcher
14
- def initialize(app, env)
15
- @app = app
3
+ # http://vagrantup.com/v1/docs/extending/configuration.html
4
+ class Config < Vagrant::Config::Base
5
+ attr_accessor :url
6
+ attr_accessor :disable
16
7
  end
8
+ Vagrant.config_keys.register(:cookbook_fetcher) { CookbookFetcher::Config }
17
9
 
18
- def call(env)
10
+ # Utility method - reads the config, fetches the checkout list,
11
+ # does the checkout, and does the crosslinks. Expects cwd to be the root_path.
12
+ def perform_fetch (global_config, logger)
19
13
 
20
- if !env[:global_config].cookbook_fetcher.disable then
21
- if !env[:global_config].cookbook_fetcher.url.nil? then
22
- fetch_checkouts env
23
- else
24
- env[:ui].warn "No URL set for auto-checkout, skipping"
25
- end
26
- else
27
- env[:ui].info "Auto-checkout disabled, skipping"
14
+ unless global_config.cookbook_fetcher then
15
+ logger.warn "No config.cookbook_fetcher section found in Vagrantfile - skipping checkouts"
16
+ return
28
17
  end
29
18
 
30
- # Continue daisy chain
31
- @app.call(env)
32
- end
33
-
34
-
35
- def fetch_checkouts (env)
36
- url = env[:global_config].cookbook_fetcher.url
37
- env[:ui].info "Fetching checkout list from #{url}"
19
+ url = global_config.cookbook_fetcher.url
20
+ unless url then
21
+ logger.warn "No config.cookbook_fetcher.url value found in Vagrantfile - skipping checkouts"
22
+ return
23
+ end
38
24
 
39
- checkouts = fetch_checkout_list url
40
- perform_checkouts checkouts
41
- update_links checkouts
25
+ checkouts = CookbookFetcher.fetch_checkout_list(url,logger)
26
+ CookbookFetcher.perform_checkouts(checkouts,logger)
27
+ CookbookFetcher.update_links(checkouts,logger)
42
28
  end
29
+ module_function :perform_fetch
43
30
 
44
- def fetch_checkout_list (url)
31
+ # Utility method, fetches checkout list, parses it,
32
+ # and writes cookbook order to a file in the current working directory.
33
+ def fetch_checkout_list (url, logger)
45
34
  require 'open-uri'
46
-
35
+
47
36
  checkouts = { :by_dir => {}, :cookbook_list => [] }
48
37
 
38
+ logger.info "Fetching checkout list from #{url}"
49
39
  open(url, {:ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE }) do |resp|
50
40
  resp.each do |line|
51
41
  line.chomp!
@@ -70,22 +60,23 @@ class CookbookFetcher
70
60
  File.open('.cookbook-order', 'w') do |f|
71
61
  f.print(checkouts[:cookbook_list].join("\n"))
72
62
  end
73
-
74
63
  end
75
64
  end
76
65
  end
77
-
78
66
  return checkouts
79
-
80
67
  end
68
+ module_function :fetch_checkout_list
81
69
 
82
- def perform_checkouts (checkouts)
70
+ # Utility method. Based on a parsed checkout list,
71
+ # performs each of the checkouts, creating the checkouts/ directory in
72
+ # the current directory.
73
+ def perform_checkouts (checkouts,logger)
83
74
 
84
75
  if !Dir.exists?("checkouts") then Dir.mkdir("checkouts") end
85
76
 
86
77
  Dir.chdir("checkouts") do
87
78
  checkouts[:by_dir].each do |dir, info|
88
- puts "Updating checkout '#{dir}'"
79
+ logger.info "Updating checkout '#{dir}'"
89
80
  if info[:vcs] == 'git' then
90
81
 
91
82
  if Dir.exists?(info[:dir]) then
@@ -103,11 +94,11 @@ class CookbookFetcher
103
94
  unless system cmd then raise "Could not find branch or commit #{info[:branch]}" end
104
95
  cmd = "git checkout -b #{info[:branch]} origin/#{info[:branch]}"
105
96
  unless system cmd then raise "Could not '#{cmd}'" end
106
- # no branch
97
+ # no branch
107
98
  elsif local_branch.empty? then
108
99
  cmd = "git checkout #{info[:branch]}"
109
100
  unless system cmd then raise "Could not '#{cmd}'" end
110
- # local branch already exists
101
+ # local branch already exists
111
102
  else
112
103
  cmd = "git checkout #{info[:branch]}"
113
104
  unless system cmd then raise "Could not '#{cmd}'" end
@@ -132,7 +123,7 @@ class CookbookFetcher
132
123
  cmd = "git checkout -B #{info[:branch]} origin/#{info[:branch]}"
133
124
  unless system cmd then raise "Could not '#{cmd}'" end
134
125
  end
135
- #commit
126
+ #commit
136
127
  else
137
128
  cmd = "git checkout #{info[:branch]}"
138
129
  unless system cmd then raise "Could not '#{cmd}'" end
@@ -145,10 +136,14 @@ class CookbookFetcher
145
136
  end
146
137
  end
147
138
  end
139
+ module_function :perform_checkouts
148
140
 
149
- def update_links (checkouts)
150
- things_to_link = ["roles", "nodes", "handlers", "data_bags"]
151
- puts "Updating links to #{things_to_link.join(', ')}"
141
+ # Utility method - given a parsed checkout list, and assuming the checkout have
142
+ # already been performed, creates the combined/ directory in the current directory,
143
+ # and symlinks in the roles, nodes, etc.
144
+ def update_links (checkouts,logger)
145
+ things_to_link = ["roles", "nodes", "handlers", "data_bags", "specs"]
146
+ logger.info "Updating links to #{things_to_link.join(', ')}"
152
147
 
153
148
  if !Dir.exists?("combined") then Dir.mkdir("combined") end
154
149
  Dir.chdir("combined") do
@@ -202,64 +197,98 @@ class CookbookFetcher
202
197
  end
203
198
  end
204
199
  end
200
+ module_function :update_links
205
201
 
202
+ # This is a Vagrant middleware plugin, which implements fetching the cookbooks
203
+ # http://vagrantup.com/v1/docs/extending/middleware.html
204
+ class FetchHook
205
+ def initialize(app, env)
206
+ @app = app
207
+ end
206
208
 
207
- end
209
+ def call(env)
210
+ if !env[:global_config].cookbook_fetcher.disable then
211
+ Dir.chdir(env[:root_path]) do
212
+ CookbookFetcher.perform_fetch(env[:global_config], env[:ui])
213
+ end
214
+ else
215
+ env[:ui].info "Auto-checkout disabled, skipping"
216
+ end
208
217
 
209
- Vagrant.actions[:provision].insert(Vagrant::Action::General::Validate, CookbookFetcher)
210
- # Note that :up includes :start ( see https://github.com/mitchellh/vagrant/blob/master/lib/vagrant/action/builtin.rb )
211
- Vagrant.actions[:start].insert(Vagrant::Action::General::Validate, CookbookFetcher)
218
+ # Continue daisy chain
219
+ @app.call(env)
220
+ end
221
+ end
212
222
 
223
+ # Install fetcher hook
224
+ Vagrant.actions[:provision].insert(Vagrant::Action::General::Validate, CookbookFetcher::FetchHook)
225
+ # Note that :up includes :start ( see https://github.com/mitchellh/vagrant/blob/master/lib/vagrant/action/builtin.rb )
226
+ Vagrant.actions[:start].insert(Vagrant::Action::General::Validate, CookbookFetcher::FetchHook)
213
227
 
214
- # Injects auto-checkout-derived chef-solo config
215
- class CookbookFetcherConfigureChef
216
- def initialize(app, env)
217
- @app = app
218
- end
219
228
 
220
- def call(env)
221
- # Do this even if fetch is disabled
229
+ # Middleware to tweak chef config
230
+ # Injects auto-checkout-derived chef-solo config
231
+ class ConfigureChef
232
+ def initialize(app, env)
233
+ @app = app
234
+ end
235
+
236
+ def call(env)
237
+ # Do this even if fetch is disabled
222
238
 
223
- require 'pp'
224
- # there has got to be a better way
225
- provisioners_list = env[:vm].config.to_hash["keys"][:vm].provisioners
239
+ # there has got to be a better way
240
+ provisioners_list = env[:vm].config.to_hash["keys"][:vm].provisioners
226
241
 
227
- chef_solo = provisioners_list.find { |p| p.shortcut === :chef_solo }
228
- if !chef_solo.nil? then
229
- solo_cfg = chef_solo.config
242
+ chef_solo = provisioners_list.find { |p| p.shortcut === :chef_solo }
243
+ if !chef_solo.nil? then
244
+ solo_cfg = chef_solo.config
230
245
 
231
- if solo_cfg.roles_path.nil? then
232
- solo_cfg.roles_path = "combined/roles"
233
- else
234
- env[:ui].warn "Auto-checkout is keeping your custom chef-solo role path"
235
- end
246
+ # TODO - need cwd block
247
+ Dir.chdir(env[:root_path]) do
248
+ if solo_cfg.roles_path.nil? then
249
+ solo_cfg.roles_path = "combined/roles"
250
+ else
251
+ env[:ui].warn "Auto-checkout is keeping your custom chef-solo role path"
252
+ end
236
253
 
237
- if solo_cfg.data_bags_path.nil? then
238
- solo_cfg.data_bags_path = "combined/data_bags"
239
- else
240
- env[:ui].warn "Auto-checkout is keeping your custom chef-solo data_bags path"
241
- end
254
+ if solo_cfg.data_bags_path.nil? then
255
+ solo_cfg.data_bags_path = "combined/data_bags"
256
+ else
257
+ env[:ui].warn "Auto-checkout is keeping your custom chef-solo data_bags path"
258
+ end
242
259
 
243
- # Cookbooks has a default
244
- if solo_cfg.cookbooks_path === ["cookbooks", [:vm, "cookbooks"]] then
245
- # Read from filesystem
246
- if !File.exists?(".cookbook-order") then
247
- env[:ui].error "Auto-checkout could not a .cookbook-order file. You need to run provision with autocheckout enabled at least once (or else specify your own cookbook path)"
248
- end
260
+ # Cookbooks has a default
261
+ if solo_cfg.cookbooks_path === ["cookbooks", [:vm, "cookbooks"]] then
262
+ # Read from filesystem
263
+ if !File.exists?(".cookbook-order") then
264
+ env[:ui].error "Auto-checkout could find not a .cookbook-order file. You need to run provision with autocheckout enabled at least once (or else specify your own cookbook path)"
265
+ end
249
266
 
250
- cbs = []
251
- IO.readlines(".cookbook-order").each { |line| cbs.push line.chomp }
252
- solo_cfg.cookbooks_path = cbs
253
- else
254
- env[:ui].warn "Auto-checkout is keeping your custom chef-solo cookbook path"
267
+ cbs = []
268
+ IO.readlines(".cookbook-order").each { |line| cbs.push line.chomp }
269
+ solo_cfg.cookbooks_path = cbs
270
+ else
271
+ env[:ui].warn "Auto-checkout is keeping your custom chef-solo cookbook path"
272
+ end
273
+ end
255
274
  end
256
275
 
276
+ # Continue daisy chain
277
+ @app.call(env)
257
278
  end
279
+ end
280
+
281
+ Vagrant.actions[:provision].insert(Vagrant::Action::VM::Provision, CookbookFetcher::ConfigureChef)
282
+ Vagrant.actions[:start].insert(Vagrant::Action::VM::Provision, CookbookFetcher::ConfigureChef)
258
283
 
259
- # Continue daisy chain
260
- @app.call(env)
284
+ class CheckoutCommand < Vagrant::Command::Base
285
+ def execute
286
+ Dir.chdir(@env.root_path) do
287
+ CookbookFetcher.perform_fetch(@env.config.global, @env.ui)
288
+ end
289
+ end
261
290
  end
262
- end
291
+ Vagrant.commands.register(:checkout) { CookbookFetcher::CheckoutCommand }
263
292
 
264
- Vagrant.actions[:provision].insert(Vagrant::Action::VM::Provision, CookbookFetcherConfigureChef)
265
- Vagrant.actions[:start].insert(Vagrant::Action::VM::Provision, CookbookFetcherConfigureChef)
293
+
294
+ end
metadata CHANGED
@@ -1,68 +1,67 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: vagrant-cookbook-fetcher
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 0
8
- - 6
9
- version: 0.0.6
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.7
5
+ prerelease:
10
6
  platform: ruby
11
- authors:
7
+ authors:
12
8
  - Clinton Wolfe
13
9
  autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
-
17
- date: 2012-09-25 00:00:00 -04:00
18
- default_executable:
19
- dependencies: []
20
-
21
- description: Whenever you run start, up, or provision, this plugin will dynamically fetch a list of checkouts from a URL; checkout each one; then create a combined roles directory, with symlinks.
12
+ date: 2013-04-06 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: vagrant
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - <=
20
+ - !ruby/object:Gem::Version
21
+ version: 1.0.7
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - <=
28
+ - !ruby/object:Gem::Version
29
+ version: 1.0.7
30
+ description: Whenever you run start, up, or provision, this plugin will dynamically
31
+ fetch a list of checkouts from a URL; checkout each one; then create a combined
32
+ roles directory, with symlinks.
22
33
  email: clinton@NOSPAM.omniti.com
23
34
  executables: []
24
-
25
35
  extensions: []
26
-
27
36
  extra_rdoc_files: []
28
-
29
- files:
37
+ files:
30
38
  - ChangeLog
31
39
  - LICENSE
32
40
  - README.md
33
41
  - lib/vagrant_init.rb
34
42
  - lib/vagrant_cookbook_fetcher.rb
35
- has_rdoc: true
36
43
  homepage: https://github.com/clintoncwolfe/vagrant-cookbook-fetcher
37
44
  licenses: []
38
-
39
45
  post_install_message:
40
46
  rdoc_options: []
41
-
42
- require_paths:
47
+ require_paths:
43
48
  - lib
44
- required_ruby_version: !ruby/object:Gem::Requirement
49
+ required_ruby_version: !ruby/object:Gem::Requirement
45
50
  none: false
46
- requirements:
47
- - - ">="
48
- - !ruby/object:Gem::Version
49
- segments:
50
- - 0
51
- version: "0"
52
- required_rubygems_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
53
56
  none: false
54
- requirements:
55
- - - ">="
56
- - !ruby/object:Gem::Version
57
- segments:
58
- - 0
59
- version: "0"
57
+ requirements:
58
+ - - ! '>='
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
60
61
  requirements: []
61
-
62
62
  rubyforge_project:
63
- rubygems_version: 1.3.7
63
+ rubygems_version: 1.8.24
64
64
  signing_key:
65
65
  specification_version: 3
66
66
  summary: Fetch your Chef cookbooks whenever you provision
67
67
  test_files: []
68
-