knife-solo 0.3.0.pre3 → 0.3.0.pre4

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 (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