knife-solo 0.3.0.pre3 → 0.3.0.pre4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +29 -4
  3. data/lib/chef/knife/solo_bootstrap.rb +1 -1
  4. data/lib/chef/knife/solo_clean.rb +1 -0
  5. data/lib/chef/knife/solo_cook.rb +32 -37
  6. data/lib/chef/knife/solo_init.rb +22 -16
  7. data/lib/knife-solo.rb +1 -0
  8. data/lib/knife-solo/berkshelf.rb +37 -0
  9. data/lib/knife-solo/bootstraps/linux.rb +12 -17
  10. data/lib/knife-solo/cookbook_manager.rb +120 -0
  11. data/lib/knife-solo/cookbook_manager_selector.rb +75 -0
  12. data/lib/knife-solo/deprecated_command.rb +5 -0
  13. data/lib/knife-solo/info.rb +1 -1
  14. data/lib/knife-solo/librarian.rb +39 -0
  15. data/lib/knife-solo/node_config_command.rb +10 -1
  16. data/lib/knife-solo/resources/knife.rb +3 -0
  17. data/lib/knife-solo/resources/solo.rb.erb +1 -0
  18. data/lib/knife-solo/ssh_command.rb +14 -2
  19. data/test/deprecated_command_test.rb +14 -1
  20. data/test/gemfiles/Gemfile.chef-10 +5 -0
  21. data/test/gemfiles/Gemfile.chef-11 +5 -0
  22. data/test/integration/cases/apache2_bootstrap.rb +8 -1
  23. data/test/integration/cases/cache_path_usage.rb +1 -1
  24. data/test/integration/cases/encrypted_data_bag.rb +1 -1
  25. data/test/integration/{centos5_6_test.rb → centos5_8_test.rb} +2 -2
  26. data/test/integration/centos6_3_test.rb +24 -0
  27. data/test/integration/debian7_knife_bootstrap_test.rb +1 -1
  28. data/test/solo_clean_test.rb +6 -0
  29. data/test/solo_cook_test.rb +60 -9
  30. data/test/solo_init_test.rb +149 -9
  31. data/test/ssh_command_test.rb +27 -0
  32. data/test/support/ec2_runner.rb +2 -2
  33. data/test/support/integration_test.rb +3 -3
  34. data/test/support/kitchen_helper.rb +1 -1
  35. data/test/support/secret_cookbook/metadata.rb +1 -0
  36. metadata +66 -63
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 904d74c337d53936e856d39cbba88504da008ba8
4
+ data.tar.gz: 450ff917a4c869ed34b664083c00b15534281244
5
+ SHA512:
6
+ metadata.gz: 1ab1298a915aa64fdc6e5b84dafa6f7c792c6ad8ff279c9b02e96916c85140515f2b6e9a74d8d320f1f3fbf9f5f9441f24be54e4c93a07ce6740a0c398f595ae
7
+ data.tar.gz: 2049637c24941db8f9828cb8fcf7b14f1e6e644944bfb9fca1ee79e4e8be50356e3d5b7f71ba2167949deaca532abd3f51058bafbbca90be3d4c7040b218b093
@@ -4,19 +4,22 @@
4
4
 
5
5
  ## Changes and new features
6
6
 
7
- * Automatically add librarian to cookbook paths when syncing ([226])
8
7
  * BREAKING: Generate solo.rb based on knife.rb settings ([199])
9
- - `solo.rb` is not used and a warning is issued if it still found
8
+ - `solo.rb` is not used and a warning is issued if it is still found
10
9
  - You have to specify the local cookbook etc. paths in `.chef/knife.rb`
11
10
  * BREAKING: Set root path with `--provisioning-path` or `knife[:provisioning_path]` and use ~/chef-solo by default ([1], [86], [125], [128], [177], [197])
12
11
  * BREAKING: Remove hard dependency on Librarian-Chef ([211])
13
12
  - If you use Librarian integration you need to install the librarian-chef gem yourself
13
+ * Add Berkshelf integration ([227])
14
+ * Automatically add librarian to cookbook paths when syncing ([226])
14
15
  * Add `--solo` option and `knife[:solo]` configuration option to `knife bootstrap` ([207])
15
16
  * `--prerelease` option to allow pre-release versions of chef omnibus or rubygem to be installed ([205])
16
17
  * Prepare/bootstrap now installs the same version of Chef that the workstation is running ([186])
17
18
  * Switch `--omnibus-version` flag to `--bootstrap-version` ([185])
18
19
  * Support `--override-runlist` option ([204])
20
+ * Support Fedora 18 and other new EL distros ([229], [51a581])
19
21
  * Drop support for openSUSE 11
22
+ * Upgrade chef-solo-search to v0.4.0
20
23
 
21
24
  ## Fixes
22
25
 
@@ -28,14 +31,22 @@
28
31
  * Ensure rsync is installed on openSUSE ([f43ba4])
29
32
  * Clean up bootstrap classes ([213])
30
33
  * Rsync dot files by default, exclude only VCS dirs ([d21756], [1d3485])
31
- * Standardize messaging across commands [215]
34
+ * Standardize messaging across commands ([215], [d37162])
32
35
  * Librarian-Chef was not run by default when knife-solo was invoked from ruby ([221])
36
+ * Fix `solo init` on Ruby 1.8 ([230])
37
+ * Fix deprecated commands to include options and dependencies from the new ones ([233])
38
+ * Parse Chef version even if chef-solo command prints warnings ([235], [238])
39
+ * Upgrade CentOS in integration tests to 5.8 and 6.3 ([237])
40
+ * Default to `lsb_release` for detecting the Linux distro and add support for RHEL based systems where /etc/issue is modified ([234], [242])
33
41
 
34
42
  ## Thanks to our contributors!
35
43
 
36
44
  * [David Kinzer][dkinzer]
37
45
  * [Naoya Ito][naoya]
38
46
  * [David Radcliffe][dwradcliffe]
47
+ * [Łukasz Dubiel][bambuchaAdm]
48
+ * [kmdsbng][kmdsbng]
49
+ * [Darshan Patil][dapatil]
39
50
 
40
51
  [1]: https://github.com/matschaffer/knife-solo/issues/1
41
52
  [86]: https://github.com/matschaffer/knife-solo/issues/86
@@ -56,10 +67,21 @@
56
67
  [213]: https://github.com/matschaffer/knife-solo/issues/213
57
68
  [215]: https://github.com/matschaffer/knife-solo/issues/215
58
69
  [221]: https://github.com/matschaffer/knife-solo/issues/221
59
- [226]: https://github.com/matschaffer/knife-solo/issues/221
70
+ [226]: https://github.com/matschaffer/knife-solo/issues/226
71
+ [227]: https://github.com/matschaffer/knife-solo/issues/227
72
+ [229]: https://github.com/matschaffer/knife-solo/issues/229
73
+ [230]: https://github.com/matschaffer/knife-solo/issues/230
74
+ [233]: https://github.com/matschaffer/knife-solo/issues/233
75
+ [234]: https://github.com/matschaffer/knife-solo/issues/234
76
+ [235]: https://github.com/matschaffer/knife-solo/issues/235
77
+ [237]: https://github.com/matschaffer/knife-solo/issues/237
78
+ [238]: https://github.com/matschaffer/knife-solo/issues/238
79
+ [242]: https://github.com/matschaffer/knife-solo/issues/242
60
80
  [d21756]: https://github.com/matschaffer/knife-solo/commit/d21756
61
81
  [1d3485]: https://github.com/matschaffer/knife-solo/commit/1d3485
62
82
  [f43ba4]: https://github.com/matschaffer/knife-solo/commit/f43ba4
83
+ [51a581]: https://github.com/matschaffer/knife-solo/commit/51a581
84
+ [d37162]: https://github.com/matschaffer/knife-solo/commit/d37162
63
85
 
64
86
  # 0.2.0 / 2013-02-12
65
87
 
@@ -307,8 +329,10 @@ And a special thanks to [Teemu Matilainen][tmatilai] who is now on the list of d
307
329
  [amoslanka]: https://github.com/amoslanka
308
330
  [ares]: https://github.com/ares
309
331
  [avit]: https://github.com/avit
332
+ [bambuchaAdm]: https://github.com/bambuchaAdm
310
333
  [brynary]: https://github.com/brynary
311
334
  [btm]: https://github.com/btm
335
+ [dapatil]: https://github.com/dapatil
312
336
  [davidsch]: https://github.com/davidsch
313
337
  [deepak]: https://github.com/deepak
314
338
  [dkinzer]: https://github.com/dkinzer
@@ -321,6 +345,7 @@ And a special thanks to [Teemu Matilainen][tmatilai] who is now on the list of d
321
345
  [hrp]: https://github.com/hrp
322
346
  [jgarber]: https://github.com/jgarber
323
347
  [jgrevich]: https://github.com/jgrevich
348
+ [kmdsbng]: https://github.com/kmdsbng
324
349
  [naoya]: https://github.com/naoya
325
350
  [natlownes]: https://github.com/natlownes
326
351
  [patatepartie]: https://github.com/patatepartie
@@ -19,7 +19,7 @@ class Chef
19
19
 
20
20
  # Use (some) options from prepare and cook commands
21
21
  self.options = SoloPrepare.options
22
- [:librarian, :sync_only, :why_run].each { |opt| option opt, SoloCook.options[opt] }
22
+ [:berkshelf, :librarian, :sync_only, :why_run].each { |opt| option opt, SoloCook.options[opt] }
23
23
 
24
24
  def run
25
25
  validate!
@@ -21,6 +21,7 @@ class Chef
21
21
 
22
22
  def run
23
23
  validate!
24
+ ui.msg "Cleaning up #{host}..."
24
25
  run_command "rm -rf #{provisioning_path}"
25
26
  end
26
27
 
@@ -1,6 +1,5 @@
1
1
  require 'chef/knife'
2
2
 
3
- require 'knife-solo'
4
3
  require 'knife-solo/ssh_command'
5
4
  require 'knife-solo/node_config_command'
6
5
  require 'knife-solo/tools'
@@ -18,9 +17,11 @@ class Chef
18
17
 
19
18
  deps do
20
19
  require 'chef/cookbook/chefignore'
20
+ require 'knife-solo'
21
+ require 'knife-solo/berkshelf'
22
+ require 'knife-solo/librarian'
21
23
  require 'erubis'
22
24
  require 'pathname'
23
- require 'tempfile'
24
25
  KnifeSolo::SshCommand.load_deps
25
26
  KnifeSolo::NodeConfigCommand.load_deps
26
27
  end
@@ -40,6 +41,10 @@ class Chef
40
41
  :long => '--sync-only',
41
42
  :description => 'Only sync the cookbook - do not run Chef'
42
43
 
44
+ option :berkshelf,
45
+ :long => '--no-berkshelf',
46
+ :description => 'Skip berks install'
47
+
43
48
  option :librarian,
44
49
  :long => '--no-librarian',
45
50
  :description => 'Skip librarian-chef install'
@@ -72,6 +77,7 @@ class Chef
72
77
 
73
78
  check_chef_version if config[:chef_check]
74
79
  generate_node_config
80
+ berkshelf_install if config_value(:berkshelf, true)
75
81
  librarian_install if config_value(:librarian, true)
76
82
  sync_kitchen
77
83
  generate_solorb
@@ -100,14 +106,19 @@ class Chef
100
106
  cookbook_paths.each_with_index do |path, i|
101
107
  upload_to_provision_path(path, "/cookbooks-#{i + 1}", 'cookbook_path')
102
108
  end
109
+ upload_to_provision_path(node_config, 'dna.json')
103
110
  upload_to_provision_path(nodes_path, 'nodes')
104
111
  upload_to_provision_path(:role_path, 'roles')
105
112
  upload_to_provision_path(:data_bag_path, 'data_bags')
106
113
  upload_to_provision_path(:encrypted_data_bag_secret, 'data_bag_key')
107
114
  end
108
115
 
116
+ def expand_path(path)
117
+ Pathname.new(path).expand_path
118
+ end
119
+
109
120
  def expanded_config_paths(key)
110
- Array(Chef::Config[key]).map { |path| Pathname.new(path).expand_path }
121
+ Array(Chef::Config[key]).map { |path| expand_path path }
111
122
  end
112
123
 
113
124
  def cookbook_paths
@@ -115,6 +126,7 @@ class Chef
115
126
  end
116
127
 
117
128
  def add_cookbook_path(path)
129
+ path = expand_path path
118
130
  cookbook_paths.unshift(path) unless cookbook_paths.include?(path)
119
131
  end
120
132
 
@@ -122,10 +134,6 @@ class Chef
122
134
  KnifeSolo.resource('patch_cookbooks')
123
135
  end
124
136
 
125
- def nodes_path
126
- 'nodes'
127
- end
128
-
129
137
  def chefignore
130
138
  @chefignore ||= ::Chef::Cookbook::Chefignore.new("./")
131
139
  end
@@ -146,6 +154,10 @@ class Chef
146
154
  adjust_rsync_path(path)
147
155
  end
148
156
 
157
+ def rsync_debug
158
+ '-v' if debug?
159
+ end
160
+
149
161
  # see http://stackoverflow.com/questions/5798807/rsync-permission-denied-created-directories-have-no-permissions
150
162
  def rsync_permissions
151
163
  '--chmod=ugo=rwX' if windows_client?
@@ -168,33 +180,14 @@ class Chef
168
180
  ui.msg "#{msg} finished in #{Time.now - start} seconds"
169
181
  end
170
182
 
171
- def librarian_install
172
- if !File.exist? 'Cheffile'
173
- Chef::Log.debug "Cheffile not found"
174
- elsif !load_librarian
175
- ui.warn "Librarian-Chef could not be loaded"
176
- ui.warn "Please add the librarian-chef gem to your Gemfile or install it manually with `gem install librarian-chef`"
177
- else
178
- ui.msg "Installing Librarian cookbooks..."
179
- Librarian::Action::Resolve.new(librarian_env).run
180
- Librarian::Action::Install.new(librarian_env).run
181
- add_cookbook_path librarian_env.install_path
182
- end
183
+ def berkshelf_install
184
+ path = KnifeSolo::Berkshelf.new(config, ui).install
185
+ add_cookbook_path(path) if path
183
186
  end
184
187
 
185
- def load_librarian
186
- begin
187
- require 'librarian/action'
188
- require 'librarian/chef'
189
- rescue LoadError
190
- false
191
- else
192
- true
193
- end
194
- end
195
-
196
- def librarian_env
197
- @librarian_env ||= Librarian::Chef::Environment.new
188
+ def librarian_install
189
+ path = KnifeSolo::Librarian.new(config, ui).install
190
+ add_cookbook_path(path) if path
198
191
  end
199
192
 
200
193
  def generate_solorb
@@ -233,8 +226,10 @@ class Chef
233
226
  end
234
227
 
235
228
  def rsync(source_path, target_path, extra_opts = '--delete')
236
- cmd = %Q{rsync -rl #{rsync_permissions} --rsh="ssh #{ssh_args}" #{extra_opts} #{rsync_excludes.collect{ |ignore| "--exclude #{ignore} " }.join} #{adjust_rsync_path_on_client(source_path)} :#{adjust_rsync_path_on_node(target_path)}}
237
- ui.msg cmd if debug?
229
+ cmd = %Q{rsync -rl #{rsync_debug} #{rsync_permissions} --rsh="ssh #{ssh_args}" #{extra_opts}}
230
+ cmd << rsync_excludes.map { |ignore| " --exclude '#{ignore}'" }.join
231
+ cmd << %Q{ #{adjust_rsync_path_on_client(source_path)} :#{adjust_rsync_path_on_node(target_path)}}
232
+ Chef::Log.debug cmd
238
233
  system! cmd
239
234
  end
240
235
 
@@ -247,13 +242,13 @@ class Chef
247
242
 
248
243
  # Parses "Chef: x.y.z" from the chef-solo version output
249
244
  def chef_version
250
- v = run_command('sudo chef-solo --version').stdout.split(':')
251
- v[0].strip == 'Chef' ? v[1].strip : ''
245
+ cmd = %q{sudo chef-solo --version 2>/dev/null | awk '$1 == "Chef:" {print $2}'}
246
+ run_command(cmd).stdout.strip
252
247
  end
253
248
 
254
249
  def cook
255
250
  ui.msg "Running Chef..."
256
- cmd = "sudo chef-solo -c #{provisioning_path}/solo.rb -j #{provisioning_path}/#{node_config}"
251
+ cmd = "sudo chef-solo -c #{provisioning_path}/solo.rb -j #{provisioning_path}/dna.json"
257
252
  cmd << " -l debug" if debug?
258
253
  cmd << " -N #{config[:chef_node_name]}" if config[:chef_node_name]
259
254
  cmd << " -W" if config[:why_run]
@@ -7,19 +7,25 @@ class Chef
7
7
  include FileUtils
8
8
 
9
9
  deps do
10
+ require 'knife-solo'
11
+ require 'knife-solo/cookbook_manager_selector'
10
12
  require 'knife-solo/gitignore'
13
+ require 'knife-solo/tools'
11
14
  end
12
15
 
13
16
  banner "knife solo init DIRECTORY"
14
17
 
15
18
  option :git,
16
- :long => '--no-git',
17
- :description => 'Do not generate .gitignore',
18
- :default => true
19
+ :long => '--no-git',
20
+ :description => 'Do not generate .gitignore'
21
+
22
+ option :berkshelf,
23
+ :long => '--[no-]berkshelf',
24
+ :description => 'Generate files for Berkshelf support'
19
25
 
20
26
  option :librarian,
21
- :long => '--librarian',
22
- :description => 'Initialize Librarian'
27
+ :long => '--[no-]librarian',
28
+ :description => 'Generate files for Librarian support'
23
29
 
24
30
  def run
25
31
  @base = @name_args.first
@@ -27,7 +33,10 @@ class Chef
27
33
  create_kitchen
28
34
  create_config
29
35
  create_cupboards %w[nodes roles data_bags site-cookbooks cookbooks]
30
- librarian_init if config[:librarian]
36
+ gitignore %w[/cookbooks/]
37
+ if (cm = cookbook_manager)
38
+ cm.bootstrap(@base)
39
+ end
31
40
  end
32
41
 
33
42
  def validate!
@@ -38,6 +47,10 @@ class Chef
38
47
  end
39
48
  end
40
49
 
50
+ def config_value(key, default = nil)
51
+ KnifeSolo::Tools.config_value(config, key, default)
52
+ end
53
+
41
54
  def create_cupboards(dirs)
42
55
  ui.msg "Creating cupboards..."
43
56
  dirs.each do |dir|
@@ -63,19 +76,12 @@ class Chef
63
76
  end
64
77
  end
65
78
 
66
- def librarian_init
67
- ui.msg "Setting up Librarian..."
68
- cheffile = File.join(@base, 'Cheffile')
69
- unless File.exist?(cheffile)
70
- File.open(cheffile, 'w') do |f|
71
- f.puts("site 'http://community.opscode.com/api/v1'")
72
- end
73
- end
74
- gitignore %w[/cookbooks/ /tmp/librarian/]
79
+ def cookbook_manager
80
+ KnifeSolo::CookbookManagerSelector.new(config, ui).select(@base)
75
81
  end
76
82
 
77
83
  def gitignore(*entries)
78
- if config[:git]
84
+ if config_value(:git, true)
79
85
  KnifeSolo::Gitignore.new(@base).add(*entries)
80
86
  end
81
87
  end
@@ -1,4 +1,5 @@
1
1
  require 'knife-solo/info'
2
+ require 'pathname'
2
3
 
3
4
  module KnifeSolo
4
5
  def self.resource(name)
@@ -0,0 +1,37 @@
1
+ require 'digest/sha1'
2
+ require 'knife-solo/cookbook_manager'
3
+ require 'knife-solo/tools'
4
+
5
+ module KnifeSolo
6
+ class Berkshelf
7
+ include CookbookManager
8
+
9
+ def self.gem_libraries
10
+ %w[berkshelf]
11
+ end
12
+
13
+ def self.conf_file_name
14
+ 'Berksfile'
15
+ end
16
+
17
+ def install!
18
+ path = berkshelf_path
19
+ ui.msg "Installing Berkshelf cookbooks to '#{path}'..."
20
+ ::Berkshelf::Berksfile.from_file('Berksfile').install(:path => path)
21
+ path
22
+ end
23
+
24
+ def berkshelf_path
25
+ KnifeSolo::Tools.config_value(config, :berkshelf_path) || default_path
26
+ end
27
+
28
+ def default_path
29
+ File.join(::Berkshelf.berkshelf_path, 'knife-solo',
30
+ Digest::SHA1.hexdigest(File.expand_path('.')))
31
+ end
32
+
33
+ def initial_config
34
+ 'site :opscode'
35
+ end
36
+ end
37
+ end
@@ -1,8 +1,13 @@
1
1
  module KnifeSolo::Bootstraps
2
2
  class Linux < Base
3
-
4
3
  def issue
5
- prepare.run_command("cat /etc/issue").stdout.strip || prepare.run_command("lsb_release -d -s").stdout.strip
4
+ commands = [
5
+ 'lsb_release -d -s',
6
+ 'cat /etc/redhat-release',
7
+ 'cat /etc/issue'
8
+ ]
9
+ result = prepare.run_with_fallbacks(commands)
10
+ result.success? ? result.stdout.strip : nil
6
11
  end
7
12
 
8
13
  def x86?
@@ -66,25 +71,15 @@ module KnifeSolo::Bootstraps
66
71
  {:type => (x86? ? "debianoid_omnibus" : "debianoid_gem")}
67
72
  when %r{Linaro}
68
73
  {:type => "debianoid_gem"}
69
- when %r{CentOS.*? 5}
70
- {:type => "yum_omnibus"}
71
- when %r{CentOS.*? 6}
74
+ when %r{CentOS}
72
75
  {:type => "yum_omnibus"}
73
76
  when %r{Amazon Linux}
74
77
  {:type => "yum_omnibus"}
75
- when %r{Red Hat Enterprise.*? 5}
76
- {:type => "yum_omnibus"}
77
- when %r{Red Hat Enterprise.*? 6}
78
- {:type => "yum_omnibus"}
79
- when %r{Fedora release.*? 15}
80
- {:type => "yum_omnibus"}
81
- when %r{Fedora release.*? 16}
82
- {:type => "yum_omnibus"}
83
- when %r{Fedora release.*? 17}
78
+ when %r{Red Hat Enterprise}
84
79
  {:type => "yum_omnibus"}
85
- when %r{Scientific Linux.*? 5}
80
+ when %r{Fedora release}
86
81
  {:type => "yum_omnibus"}
87
- when %r{Scientific Linux.*? 6}
82
+ when %r{Scientific Linux}
88
83
  {:type => "yum_omnibus"}
89
84
  when %r{SUSE Linux Enterprise Server 1[12]}
90
85
  {:type => "omnibus"}
@@ -93,7 +88,7 @@ module KnifeSolo::Bootstraps
93
88
  when %r{This is \\n\.\\O \(\\s \\m \\r\) \\t}
94
89
  {:type => "emerge_gem"}
95
90
  else
96
- raise "Distro not recognized from looking at /etc/issue. Please fork https://github.com/matschaffer/knife-solo and add support for your distro."
91
+ raise "Distribution not recognized. Please run again with `-VV` option and file an issue: https://github.com/matschaffer/knife-solo/issues"
97
92
  end
98
93
  Chef::Log.debug("Distro detection yielded: #{@distro}")
99
94
  @distro
@@ -0,0 +1,120 @@
1
+ require 'chef/mixin/convert_to_class_name'
2
+ require 'knife-solo/gitignore'
3
+ require 'knife-solo/tools'
4
+
5
+ module KnifeSolo
6
+ module CookbookManager
7
+ def self.included(base)
8
+ base.extend ClassMethods
9
+ base.send(:include, InstanceMethods)
10
+ end
11
+
12
+ module ClassMethods
13
+ include Chef::Mixin::ConvertToClassName
14
+
15
+ # Returns an Array of libraries to load
16
+ def gem_libraries
17
+ raise "Must be overridden by the including class"
18
+ end
19
+
20
+ def gem_name
21
+ gem_libraries.first
22
+ end
23
+
24
+ def load_gem
25
+ begin
26
+ gem_libraries.each { |lib| require lib }
27
+ true
28
+ rescue LoadError
29
+ false
30
+ end
31
+ end
32
+
33
+ # Key in Chef::Config and CLI options
34
+ def config_key
35
+ snake_case_basename(name).to_sym
36
+ end
37
+
38
+ # Returns the base name of the configuration file
39
+ def conf_file_name
40
+ raise "Must be overridden by the including class"
41
+ end
42
+ end
43
+
44
+ module InstanceMethods
45
+ attr_reader :config, :ui
46
+
47
+ def initialize(config, ui)
48
+ @config = config
49
+ @ui = ui
50
+ end
51
+
52
+ def to_s
53
+ name
54
+ end
55
+
56
+ def name
57
+ self.class.name.split('::').last
58
+ end
59
+
60
+ def gem_name
61
+ self.class.gem_name
62
+ end
63
+
64
+ def gem_installed?
65
+ self.class.load_gem
66
+ end
67
+
68
+ def conf_file(base = nil)
69
+ base ? File.join(base, self.class.conf_file_name) : self.class.conf_file_name
70
+ end
71
+
72
+ def enabled_by_chef_config?
73
+ KnifeSolo::Tools.config_value(config, self.class.config_key)
74
+ end
75
+
76
+ def conf_file_exists?(base = nil)
77
+ File.exists?(conf_file(base))
78
+ end
79
+
80
+ # Runs the manager and returns the path to the cookbook directory
81
+ def install!
82
+ raise "Must be overridden by the including class"
83
+ end
84
+
85
+ # Runs installer if the configuration file is found and gem installed
86
+ # Returns the cookbook path or nil
87
+ def install
88
+ if !conf_file_exists?
89
+ Chef::Log.debug "#{conf_file} not found"
90
+ elsif !self.class.load_gem
91
+ ui.warn "#{name} could not be loaded"
92
+ ui.warn "Please add the #{gem_name} gem to your Gemfile or install it manually with `gem install #{gem_name}`"
93
+ else
94
+ return install!
95
+ end
96
+ nil
97
+ end
98
+
99
+ def bootstrap(base)
100
+ ui.msg "Setting up #{name}..."
101
+ unless conf_file_exists?(base)
102
+ File.open(conf_file(base), 'w') { |f| f.puts(initial_config) }
103
+ end
104
+ if KnifeSolo::Tools.config_value(config, :git, true) && gitignores
105
+ KnifeSolo::Gitignore.new(base).add(gitignores)
106
+ end
107
+ end
108
+
109
+ # Returns content for configuration file when bootstrapping
110
+ def initial_config
111
+ raise "Must be overridden by the including class"
112
+ end
113
+
114
+ # Returns an array of strings to gitignore when bootstrapping
115
+ def gitignores
116
+ nil
117
+ end
118
+ end
119
+ end
120
+ end