berkshelf 2.0.0.beta → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. data/CHANGELOG.md +19 -1
  2. data/CONTRIBUTING.md +1 -3
  3. data/Gemfile +0 -20
  4. data/Guardfile +3 -3
  5. data/LICENSE +6 -5
  6. data/README.md +1 -0
  7. data/Thorfile +48 -67
  8. data/berkshelf.gemspec +48 -37
  9. data/features/apply_command.feature +17 -11
  10. data/features/config.feature +11 -11
  11. data/features/configure_command.feature +8 -8
  12. data/features/contingent_command.feature +37 -8
  13. data/features/cookbook_command.feature +17 -14
  14. data/features/groups_install.feature +24 -20
  15. data/features/install_command.feature +24 -33
  16. data/features/licenses.feature +112 -0
  17. data/features/list_command.feature +17 -5
  18. data/features/lockfile.feature +307 -188
  19. data/features/outdated_command.feature +1 -4
  20. data/features/package_command.feature +41 -19
  21. data/features/shelf/list.feature +39 -0
  22. data/features/shelf/show.feature +152 -0
  23. data/features/shelf/uninstall.feature +103 -0
  24. data/features/show_command.feature +49 -17
  25. data/features/step_definitions/filesystem_steps.rb +12 -3
  26. data/features/step_definitions/utility_steps.rb +0 -1
  27. data/features/support/env.rb +11 -4
  28. data/features/update_command.feature +22 -10
  29. data/features/upload_command.feature +174 -127
  30. data/features/vendor_install.feature +6 -6
  31. data/generator_files/Berksfile.erb +1 -1
  32. data/generator_files/metadata.rb.erb +7 -7
  33. data/lib/berkshelf.rb +39 -27
  34. data/lib/berkshelf/base_generator.rb +2 -3
  35. data/lib/berkshelf/berksfile.rb +69 -17
  36. data/lib/berkshelf/cached_cookbook.rb +17 -1
  37. data/lib/berkshelf/chef.rb +2 -4
  38. data/lib/berkshelf/chef/config.rb +51 -75
  39. data/lib/berkshelf/chef/cookbook.rb +1 -2
  40. data/lib/berkshelf/chef/cookbook/chefignore.rb +1 -1
  41. data/lib/berkshelf/cli.rb +144 -194
  42. data/lib/berkshelf/command.rb +11 -12
  43. data/lib/berkshelf/commands/shelf.rb +130 -0
  44. data/lib/berkshelf/commands/test_command.rb +11 -0
  45. data/lib/berkshelf/community_rest.rb +1 -2
  46. data/lib/berkshelf/config.rb +14 -10
  47. data/lib/berkshelf/cookbook_generator.rb +30 -24
  48. data/lib/berkshelf/cookbook_source.rb +1 -1
  49. data/lib/berkshelf/cookbook_store.rb +0 -1
  50. data/lib/berkshelf/core_ext.rb +1 -1
  51. data/lib/berkshelf/core_ext/file.rb +1 -1
  52. data/lib/berkshelf/downloader.rb +3 -1
  53. data/lib/berkshelf/errors.rb +128 -53
  54. data/lib/berkshelf/formatters.rb +2 -6
  55. data/lib/berkshelf/formatters/human_readable.rb +8 -2
  56. data/lib/berkshelf/formatters/json.rb +7 -1
  57. data/lib/berkshelf/formatters/null.rb +0 -1
  58. data/lib/berkshelf/git.rb +16 -16
  59. data/lib/berkshelf/init_generator.rb +28 -26
  60. data/lib/berkshelf/location.rb +12 -11
  61. data/lib/berkshelf/locations/chef_api_location.rb +2 -2
  62. data/lib/berkshelf/locations/git_location.rb +0 -1
  63. data/lib/berkshelf/locations/github_location.rb +0 -1
  64. data/lib/berkshelf/locations/path_location.rb +1 -2
  65. data/lib/berkshelf/locations/site_location.rb +3 -2
  66. data/lib/berkshelf/lockfile.rb +29 -10
  67. data/lib/berkshelf/mixin/config.rb +155 -0
  68. data/lib/berkshelf/mixin/logging.rb +0 -1
  69. data/lib/berkshelf/mixin/shellout.rb +71 -0
  70. data/lib/berkshelf/resolver.rb +7 -4
  71. data/lib/berkshelf/test.rb +1 -3
  72. data/lib/berkshelf/ui.rb +8 -4
  73. data/lib/berkshelf/version.rb +1 -1
  74. data/lib/thor/monkies/shell.rb +0 -1
  75. data/spec/config/berkshelf.pem +27 -0
  76. data/spec/config/knife.rb +12 -0
  77. data/spec/config/validator.pem +27 -0
  78. data/spec/spec_helper.rb +4 -8
  79. data/spec/support/chef_api.rb +14 -9
  80. data/spec/support/chef_server.rb +3 -4
  81. data/spec/unit/berkshelf/berksfile_spec.rb +1 -1
  82. data/spec/unit/berkshelf/cookbook_generator_spec.rb +12 -6
  83. data/spec/unit/berkshelf/cookbook_source_spec.rb +13 -1
  84. data/spec/unit/berkshelf/init_generator_spec.rb +5 -0
  85. data/spec/unit/chef/config_spec.rb +9 -10
  86. metadata +216 -93
  87. data/features/info_command.feature +0 -39
  88. data/features/open_command.feature +0 -36
  89. data/lib/berkshelf/cli_commands/test_command.rb +0 -11
  90. data/lib/berkshelf/mixin.rb +0 -10
  91. data/lib/berkshelf/mixin/path_helpers.rb +0 -30
  92. data/spec/support/knife.rb +0 -18
@@ -1,19 +1,19 @@
1
- Feature: install cookbooks to a given vendor path
1
+ Feature: Vendoring cookbooks to a specific path
2
2
  As a user of Berkshelf
3
3
  I want to be able to install cookbooks to a specific directory
4
4
  So I vendor my cookbooks and package them with my application
5
5
 
6
- Scenario: default
6
+ Scenario: With a path option
7
+ Given the cookbook store has the cookbooks:
8
+ | fake | 1.0.0 |
7
9
  Given I write to "Berksfile" with:
8
10
  """
9
11
  site :opscode
10
- cookbook 'berkshelf-cookbook-fixture', '1.0.0'
12
+ cookbook 'fake', '1.0.0'
11
13
  """
12
14
  When I run the install command with flags:
13
15
  | --path vendor/cookbooks |
14
- Then the cookbook store should have the cookbooks:
15
- | berkshelf-cookbook-fixture | 1.0.0 |
16
16
  Then the following directories should exist:
17
17
  | vendor/cookbooks |
18
- | vendor/cookbooks/berkshelf-cookbook-fixture |
18
+ | vendor/cookbooks/fake |
19
19
  And the exit status should be 0
@@ -1,7 +1,7 @@
1
1
  site :opscode
2
2
  <% if options[:chef_minitest] -%>
3
3
  group :integration do
4
- cookbook "minitest-handler"
4
+ cookbook 'minitest-handler'
5
5
  end
6
6
  <% end -%>
7
7
  <% if options[:metadata_entry] -%>
@@ -1,12 +1,12 @@
1
- name "<%= name %>"
2
- maintainer "<%= maintainer %>"
3
- maintainer_email "<%= maintainer_email %>"
4
- license "<%= license_name %>"
5
- description "Installs/Configures <%= name %>"
1
+ name '<%= name %>'
2
+ maintainer '<%= maintainer %>'
3
+ maintainer_email '<%= maintainer_email %>'
4
+ license '<%= license_name %>'
5
+ description 'Installs/Configures <%= name %>'
6
6
  long_description IO.read(File.join(File.dirname(__FILE__), 'README.md'))
7
7
  <% if options[:scmversion] -%>
8
- version IO.read(File.join(File.dirname(__FILE__), 'VERSION')) rescue "0.1.0"
8
+ version IO.read(File.join(File.dirname(__FILE__), 'VERSION')) rescue '0.1.0'
9
9
  <% else -%>
10
- version "0.1.0"
10
+ version '0.1.0'
11
11
  <% end -%>
12
12
 
@@ -2,6 +2,7 @@ require 'active_support/core_ext'
2
2
  require 'archive/tar/minitar'
3
3
  require 'celluloid'
4
4
  require 'chozo/core_ext'
5
+ require 'digest/md5'
5
6
  require 'forwardable'
6
7
  require 'hashie'
7
8
  require 'json'
@@ -15,8 +16,6 @@ require 'zlib'
15
16
 
16
17
  require 'berkshelf/core_ext'
17
18
  require 'berkshelf/errors'
18
- require 'berkshelf/test' if ENV['RUBY_ENV'] == 'test'
19
- require 'berkshelf/version'
20
19
  require 'thor/monkies'
21
20
 
22
21
  JSON.create_id = nil
@@ -24,28 +23,8 @@ JSON.create_id = nil
24
23
  module Berkshelf
25
24
  DEFAULT_FILENAME = 'Berksfile'.freeze
26
25
 
27
- autoload :BaseGenerator, 'berkshelf/base_generator'
28
- autoload :Berksfile, 'berkshelf/berksfile'
29
- autoload :CachedCookbook, 'berkshelf/cached_cookbook'
30
- autoload :Chef, 'berkshelf/chef'
31
- autoload :Cli, 'berkshelf/cli'
32
- autoload :CommunityREST, 'berkshelf/community_rest'
33
- autoload :Config, 'berkshelf/config'
34
- autoload :CookbookGenerator, 'berkshelf/cookbook_generator'
35
- autoload :CookbookSource, 'berkshelf/cookbook_source'
36
- autoload :CookbookStore, 'berkshelf/cookbook_store'
37
- autoload :Downloader, 'berkshelf/downloader'
38
- autoload :Git, 'berkshelf/git'
39
- autoload :InitGenerator, 'berkshelf/init_generator'
40
- autoload :Lockfile, 'berkshelf/lockfile'
41
- autoload :Logger, 'berkshelf/logger'
42
- autoload :Mixin, 'berkshelf/mixin'
43
- autoload :Resolver, 'berkshelf/resolver'
44
- autoload :UI, 'berkshelf/ui'
45
-
46
- require 'berkshelf/location'
47
-
48
26
  class << self
27
+ require 'berkshelf/mixin/logging'
49
28
  include Berkshelf::Mixin::Logging
50
29
 
51
30
  attr_accessor :ui
@@ -70,9 +49,22 @@ module Berkshelf
70
49
  #
71
50
  # @return [String]
72
51
  def berkshelf_path
73
- ENV["BERKSHELF_PATH"] || File.expand_path("~/.berkshelf")
52
+ ENV['BERKSHELF_PATH'] || File.expand_path('~/.berkshelf')
53
+ end
54
+
55
+ # The Chef configuration file.
56
+ #
57
+ # @return [Berkshelf::Chef::Config]
58
+ def chef_config
59
+ @chef_config ||= Berkshelf::Chef::Config.load
74
60
  end
75
61
 
62
+ # Set the Chef configuration file.
63
+ #
64
+ # @param [Berkshelf::Chef::Config] new_config
65
+ # the new configuration file to use
66
+ attr_writer :chef_config
67
+
76
68
  # @return [Logger]
77
69
  def logger
78
70
  Celluloid.logger
@@ -80,7 +72,7 @@ module Berkshelf
80
72
 
81
73
  # @return [String]
82
74
  def tmp_dir
83
- File.join(berkshelf_path, "tmp")
75
+ File.join(berkshelf_path, 'tmp')
84
76
  end
85
77
 
86
78
  # Creates a temporary directory within the Berkshelf path
@@ -93,7 +85,7 @@ module Berkshelf
93
85
  end
94
86
 
95
87
  def cookbooks_dir
96
- File.join(berkshelf_path, "cookbooks")
88
+ File.join(berkshelf_path, 'cookbooks')
97
89
  end
98
90
 
99
91
  # @return [Berkshelf::CookbookStore]
@@ -149,4 +141,24 @@ module Berkshelf
149
141
  end
150
142
  end
151
143
 
152
- require 'berkshelf/formatters'
144
+ require_relative 'berkshelf/base_generator'
145
+ require_relative 'berkshelf/berksfile'
146
+ require_relative 'berkshelf/cached_cookbook'
147
+ require_relative 'berkshelf/chef'
148
+ require_relative 'berkshelf/cli'
149
+ require_relative 'berkshelf/community_rest'
150
+ require_relative 'berkshelf/cookbook_generator'
151
+ require_relative 'berkshelf/cookbook_source'
152
+ require_relative 'berkshelf/cookbook_store'
153
+ require_relative 'berkshelf/config'
154
+ require_relative 'berkshelf/downloader'
155
+ require_relative 'berkshelf/formatters'
156
+ require_relative 'berkshelf/git'
157
+ require_relative 'berkshelf/init_generator'
158
+ require_relative 'berkshelf/location'
159
+ require_relative 'berkshelf/lockfile'
160
+ require_relative 'berkshelf/logger'
161
+ require_relative 'berkshelf/resolver'
162
+ require_relative 'berkshelf/test' if ENV['RUBY_ENV'] == 'test'
163
+ require_relative 'berkshelf/ui'
164
+ require_relative 'berkshelf/version'
@@ -1,11 +1,10 @@
1
1
  require 'thor/group'
2
2
 
3
3
  module Berkshelf
4
- # @author Jamie Winsor <reset@riotgames.com>
5
4
  class BaseGenerator < Thor::Group
6
5
  class << self
7
6
  def source_root
8
- Berkshelf.root.join("generator_files")
7
+ Berkshelf.root.join('generator_files')
9
8
  end
10
9
  end
11
10
 
@@ -18,7 +17,7 @@ module Berkshelf
18
17
  include Thor::Actions
19
18
 
20
19
  private
21
-
20
+
22
21
  def target
23
22
  @target ||= Pathname.new(File.expand_path(path))
24
23
  end
@@ -1,9 +1,10 @@
1
1
  module Berkshelf
2
- # @author Jamie Winsor <reset@riotgames.com>
3
2
  class Berksfile
4
- extend Forwardable
3
+ require 'berkshelf/mixin/logging'
5
4
  include Berkshelf::Mixin::Logging
6
5
 
6
+ extend Forwardable
7
+
7
8
  class << self
8
9
  # @param [String] file
9
10
  # a path on disk to a Berksfile to instantiate from
@@ -39,12 +40,12 @@ module Berkshelf
39
40
  end
40
41
 
41
42
  cookbooks.each do |cb|
42
- dest = File.join(scratch, cb.cookbook_name, "/")
43
+ dest = File.join(scratch, cb.cookbook_name, '/')
43
44
  FileUtils.mkdir_p(dest)
44
45
 
45
46
  # Dir.glob does not support backslash as a File separator
46
47
  src = cb.path.to_s.gsub('\\', '/')
47
- files = Dir.glob(File.join(src, "*"))
48
+ files = Dir.glob(File.join(src, '*'))
48
49
 
49
50
  # Filter out files using chefignore
50
51
  files = chefignore.remove_ignores_from(files) if chefignore
@@ -235,8 +236,8 @@ module Berkshelf
235
236
  # chef_api :config
236
237
  #
237
238
  # @example using a URL, node_name, and client_key to add a Chef API default location
238
- # chef_api "https://api.opscode.com/organizations/vialstudios", node_name: "reset",
239
- # client_key: "/Users/reset/.chef/knife.rb"
239
+ # chef_api 'https://api.opscode.com/organizations/vialstudios', node_name: 'reset',
240
+ # client_key: '/Users/reset/.chef/knife.rb'
240
241
  #
241
242
  # @param [String, Symbol] value
242
243
  # @param [Hash] options
@@ -317,10 +318,10 @@ module Berkshelf
317
318
 
318
319
  case
319
320
  when !except.empty? && !only.empty?
320
- raise Berkshelf::ArgumentError, "Cannot specify both :except and :only"
321
+ raise Berkshelf::ArgumentError, 'Cannot specify both :except and :only'
321
322
  when !cookbooks.empty?
322
323
  if !except.empty? && !only.empty?
323
- Berkshelf.ui.warn "Cookbooks were specified, ignoring :except and :only"
324
+ Berkshelf.ui.warn 'Cookbooks were specified, ignoring :except and :only'
324
325
  end
325
326
  l_sources.select { |source| cookbooks.include?(source.name) }
326
327
  when !except.empty?
@@ -349,11 +350,11 @@ module Berkshelf
349
350
  # Example:
350
351
  # {
351
352
  # nautilus: [
352
- # #<Berkshelf::CookbookSource @name="nginx">,
353
- # #<Berkshelf::CookbookSource @name="mysql">,
353
+ # #<Berkshelf::CookbookSource: nginx (~> 1.0.0)>,
354
+ # #<Berkshelf::CookbookSource: mysql (~> 1.2.4)>
354
355
  # ],
355
356
  # skarner: [
356
- # #<Berkshelf::CookbookSource @name="nginx">
357
+ # #<Berkshelf::CookbookSource: nginx (~> 1.0.0)>
357
358
  # ]
358
359
  # }
359
360
  def groups
@@ -430,6 +431,8 @@ module Berkshelf
430
431
  @cached_cookbooks = resolver[:solution]
431
432
  local_sources = resolver[:sources]
432
433
 
434
+ verify_licenses!
435
+
433
436
  self.class.vendor(@cached_cookbooks, options[:path]) if options[:path]
434
437
 
435
438
  lockfile.update(local_sources, sha: self.sha)
@@ -475,7 +478,7 @@ module Berkshelf
475
478
  #
476
479
  # @example
477
480
  # berksfile.outdated => {
478
- # <#CachedCookbook name="artifact"> => "0.11.2"
481
+ # #<CachedCookbook name="artifact"> => "0.11.2"
479
482
  # }
480
483
  def outdated(options = {})
481
484
  outdated = Hash.new
@@ -537,6 +540,8 @@ module Berkshelf
537
540
  solution.each do |cb|
538
541
  Berkshelf.formatter.upload(cb.cookbook_name, cb.version, conn.server_url)
539
542
 
543
+ validate_files!(cb)
544
+
540
545
  begin
541
546
  conn.cookbook.upload(cb.path, upload_opts.merge(name: cb.cookbook_name))
542
547
  rescue Ridley::Errors::FrozenCookbook => ex
@@ -580,7 +585,7 @@ module Berkshelf
580
585
  install
581
586
 
582
587
  environment.cookbook_versions = {}.tap do |cookbook_versions|
583
- lockfile.sources.each { |source| cookbook_versions[source.name] = source.locked_version }
588
+ lockfile.sources.each { |source| cookbook_versions[source.name] = source.locked_version.to_s }
584
589
  end
585
590
 
586
591
  environment.save
@@ -628,6 +633,10 @@ module Berkshelf
628
633
  }
629
634
  end
630
635
 
636
+ package.each do |cookbook|
637
+ validate_files!(cookbook)
638
+ end
639
+
631
640
  Dir.mktmpdir do |tmp|
632
641
  package.each do |cached_cookbook|
633
642
  path = cached_cookbook.path.to_s
@@ -687,7 +696,7 @@ module Berkshelf
687
696
  begin
688
697
  instance_eval(content)
689
698
  rescue => e
690
- raise BerksfileReadError.new(e), "An error occurred while reading the Berksfile: #{e.to_s}"
699
+ raise BerksfileReadError.new(e)
691
700
  end
692
701
  self
693
702
  end
@@ -713,15 +722,15 @@ module Berkshelf
713
722
  ridley_options[:ssl] = { verify: (options[:ssl_verify] || Berkshelf::Config.instance.ssl.verify) }
714
723
 
715
724
  unless ridley_options[:server_url].present?
716
- raise ChefConnectionError, "Missing required attribute in your Berkshelf configuration: chef.server_url"
725
+ raise ChefConnectionError, 'Missing required attribute in your Berkshelf configuration: chef.server_url'
717
726
  end
718
727
 
719
728
  unless ridley_options[:client_name].present?
720
- raise ChefConnectionError, "Missing required attribute in your Berkshelf configuration: chef.node_name"
729
+ raise ChefConnectionError, 'Missing required attribute in your Berkshelf configuration: chef.node_name'
721
730
  end
722
731
 
723
732
  unless ridley_options[:client_key].present?
724
- raise ChefConnectionError, "Missing required attribute in your Berkshelf configuration: chef.client_key"
733
+ raise ChefConnectionError, 'Missing required attribute in your Berkshelf configuration: chef.client_key'
725
734
  end
726
735
 
727
736
  Ridley.new(ridley_options)
@@ -787,5 +796,48 @@ module Berkshelf
787
796
  locked_source.version_constraint = source.version_constraint
788
797
  locked_source
789
798
  end
799
+
800
+ # Validate that the given cookbook does not have "bad" files. Currently
801
+ # this means including spaces in filenames (such as recipes)
802
+ #
803
+ # @param [Berkshelf::CachedCookbook] cookbook
804
+ # the Cookbook to validate
805
+ def validate_files!(cookbook)
806
+ path = cookbook.path.to_s
807
+
808
+ files = Dir.glob(File.join(path, '**', '*.rb')).select do |f|
809
+ f =~ /[[:space:]]/
810
+ end
811
+
812
+ raise Berkshelf::InvalidCookbookFiles.new(cookbook, files) unless files.empty?
813
+ end
814
+
815
+ # Verify that the licenses of all the cached cookbooks fall in the realm of
816
+ # allowed licenses from the Berkshelf Config.
817
+ #
818
+ # @raise [Berkshelf::LicenseNotAllowed]
819
+ # if the license is not permitted and `raise_license_exception` is true
820
+ def verify_licenses!
821
+ licenses = Array(Berkshelf::Config.instance.allowed_licenses)
822
+ return if licenses.empty?
823
+
824
+ sources.each do |source|
825
+ next if source.location.is_a?(Berkshelf::PathLocation)
826
+ cached = source.cached_cookbook
827
+
828
+ begin
829
+ unless licenses.include?(cached.metadata.license)
830
+ raise Berkshelf::LicenseNotAllowed.new(cached)
831
+ end
832
+ rescue Berkshelf::LicenseNotAllowed => e
833
+ if Berkshelf::Config.instance.raise_license_exception
834
+ FileUtils.rm_rf(cached.path)
835
+ raise
836
+ end
837
+
838
+ Berkshelf.ui.warn(e.to_s)
839
+ end
840
+ end
841
+ end
790
842
  end
791
843
  end
@@ -1,5 +1,4 @@
1
1
  module Berkshelf
2
- # @author Jamie Winsor <reset@riotgames.com>
3
2
  class CachedCookbook < Ridley::Chef::Cookbook
4
3
  class << self
5
4
  # @param [#to_s] path
@@ -37,6 +36,23 @@ module Berkshelf
37
36
  end.join("\n")
38
37
  end
39
38
 
39
+ def pretty_json
40
+ pretty_hash.to_json
41
+ end
42
+
43
+ def pretty_hash
44
+ {}.tap do |h|
45
+ h[:name] = cookbook_name unless name.blank?
46
+ h[:version] = version unless version.blank?
47
+ h[:description] = metadata.description unless metadata.description.blank?
48
+ h[:author] = metadata.maintainer unless metadata.maintainer.blank?
49
+ h[:email] = metadata.maintainer_email unless metadata.maintainer_email.blank?
50
+ h[:license] = metadata.license unless metadata.license.blank?
51
+ h[:platforms] = metadata.platforms.to_hash unless metadata.platforms.blank?
52
+ h[:dependencies] = dependencies.to_hash unless dependencies.blank?
53
+ end
54
+ end
55
+
40
56
  private
41
57
  def pretty_map(hash, padding)
42
58
  hash.map { |k,v| "#{k} (#{v})" }.join("\n" + ' '*padding)
@@ -1,10 +1,8 @@
1
1
  module Berkshelf
2
- # @author Jamie Winsor <reset@riotgames.com>
3
- #
4
2
  # Classes and modules used for integrating with a Chef Server, the Chef community
5
3
  # site, and Chef Cookbooks
6
4
  module Chef
7
- autoload :Config, 'berkshelf/chef/config'
8
- autoload :Cookbook, 'berkshelf/chef/cookbook'
5
+ require_relative 'chef/config'
6
+ require_relative 'chef/cookbook'
9
7
  end
10
8
  end
@@ -1,91 +1,67 @@
1
1
  require 'socket'
2
- require 'tmpdir'
3
- require 'berkshelf/mixin'
4
- require 'mixlib/config'
5
2
 
6
- module Berkshelf::Chef
7
- # @author Jamie Winsor <reset@riotgames.com>
8
- #
9
- # Inspired by and a dependency-free replacement for {https://raw.github.com/opscode/chef/11.4.0/lib/chef/config.rb}
10
- class Config
11
- class << self
12
- # Load and return a Chef::Config for Berkshelf. The location of the configuration to be loaded
13
- # can be configured by setting a value for {Berkshelf::Chef::Config.path=}
14
- #
15
- # @return [Berkshelf::Chef::Config]
16
- def instance
17
- @instance ||= begin
18
- self.from_file(File.expand_path(path))
19
- self
20
- rescue
21
- self
22
- end
23
- end
3
+ module Berkshelf
4
+ module Chef
5
+ class Config
6
+ require 'berkshelf/mixin/config'
7
+ include Berkshelf::Mixin::Config
24
8
 
25
- # Return the most sensible path to the Chef configuration file. This can be configured by setting a
26
- # value for the 'BERKSHELF_CHEF_CONFIG' environment variable.
27
- #
28
- # @return [String, nil]
29
- def path
30
- @path ||= begin
31
- possibles = []
9
+ class << self
10
+ private
11
+ # Return the most sensible path to the Chef configuration file. This can
12
+ # be configured by setting a value for the 'BERKSHELF_CHEF_CONFIG' environment
13
+ # variable.
14
+ #
15
+ # @return [String, nil]
16
+ def location
17
+ possibles = []
32
18
 
33
- possibles << ENV['BERKSHELF_CHEF_CONFIG'] if ENV['BERKSHELF_CHEF_CONFIG']
34
- possibles << File.join(ENV['KNIFE_HOME'], 'knife.rb') if ENV['KNIFE_HOME']
35
- possibles << File.join(working_dir, 'knife.rb') if working_dir
19
+ possibles << ENV['BERKSHELF_CHEF_CONFIG'] if ENV['BERKSHELF_CHEF_CONFIG']
20
+ possibles << File.join(ENV['KNIFE_HOME'], 'knife.rb') if ENV['KNIFE_HOME']
21
+ possibles << File.join(working_dir, 'knife.rb') if working_dir
36
22
 
37
- # Ascending search for .chef directory siblings
38
- Pathname.new(working_dir).ascend do |file|
39
- sibling_chef = File.join(file, '.chef')
40
- possibles << File.join(sibling_chef, 'knife.rb')
41
- end if working_dir
23
+ # Ascending search for .chef directory siblings
24
+ Pathname.new(working_dir).ascend do |file|
25
+ sibling_chef = File.join(file, '.chef')
26
+ possibles << File.join(sibling_chef, 'knife.rb')
27
+ end if working_dir
42
28
 
43
- possibles << File.join(ENV['HOME'], '.chef', 'knife.rb') if ENV['HOME']
44
- possibles.compact!
29
+ possibles << File.join(ENV['HOME'], '.chef', 'knife.rb') if ENV['HOME']
30
+ possibles.compact!
45
31
 
46
- location = possibles.find { |loc| File.exists?(File.expand_path(loc)) }
32
+ location = possibles.find { |loc| File.exists?(File.expand_path(loc)) }
47
33
 
48
- File.expand_path(location) unless location.nil?
49
- end
50
- end
34
+ File.expand_path(location) unless location.nil?
35
+ end
51
36
 
52
- # Set the path the Chef configuration can be found in
53
- #
54
- # @param [String] value
55
- def path=(value)
56
- @instance = nil
57
- @path = value
37
+ # The current working directory
38
+ #
39
+ # @return [String]
40
+ def working_dir
41
+ ENV['PWD'] || Dir.pwd
42
+ end
58
43
  end
59
44
 
60
- private
61
-
62
- def working_dir
63
- ENV['PWD'] || Dir.pwd
64
- end
65
- end
45
+ default_option(:node_name, Socket.gethostname)
46
+ default_option(:chef_server_url, 'http://localhost:4000')
47
+ default_option(:client_key, platform_specific_path('/etc/chef/client.pem'))
48
+ default_option(:validation_key, platform_specific_path('/etc/chef/validation.pem'))
49
+ default_option(:validation_client_name, 'chef-validator')
66
50
 
67
- extend Berkshelf::Mixin::PathHelpers
68
- extend Mixlib::Config
51
+ default_option(:cookbook_copyright, 'YOUR_NAME')
52
+ default_option(:cookbook_email, 'YOUR_EMAIL')
53
+ default_option(:cookbook_license, 'reserved')
69
54
 
70
- node_name Socket.gethostname
71
- chef_server_url "http://localhost:4000"
72
- client_key platform_specific_path("/etc/chef/client.pem")
73
- validation_key platform_specific_path("/etc/chef/validation.pem")
74
- validation_client_name "chef-validator"
55
+ default_option(:knife, {})
75
56
 
76
- cookbook_copyright "YOUR_NAME"
77
- cookbook_email "YOUR_EMAIL"
78
- cookbook_license "reserved"
79
-
80
- knife Hash.new
81
-
82
- # history: prior to Chef 11, the cache implementation was based on
83
- # moneta and configured via cache_options[:path]. Knife configs
84
- # generated with Chef 11 will have `syntax_check_cache_path`, but older
85
- # configs will have `cache_options[:path]`. `cache_options` is marked
86
- # deprecated in chef/config.rb but doesn't currently trigger a warning.
87
- # See also: CHEF-3715
88
- syntax_check_cache_path Dir.mktmpdir
89
- cache_options path: syntax_check_cache_path
57
+ # Prior to Chef 11, the cache implementation was based on
58
+ # moneta and configured via cache_options[:path]. Knife configs
59
+ # generated with Chef 11 will have `syntax_check_cache_path`, but older
60
+ # configs will have `cache_options[:path]`. `cache_options` is marked
61
+ # deprecated in chef/config.rb but doesn't currently trigger a warning.
62
+ # See also: CHEF-3715
63
+ default_option(:syntax_check_cache_path, Dir.mktmpdir)
64
+ default_option(:cache_options, { path: defined?(syntax_check_cache_path) ? syntax_check_cache_path : Dir.mktmpdir })
65
+ end
90
66
  end
91
67
  end