vagrant-chefconfig 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8c980079fd5c2c530dedcc73e25dd65d5990bfb6
4
- data.tar.gz: bdea236f19e96c7696ec82b1fd0e6948ac5cd2e0
3
+ metadata.gz: f509a14e5ea7178235cdbe28f7f5795532e4155b
4
+ data.tar.gz: d33cdfa17892f30c543554d46b0c177acb05bd95
5
5
  SHA512:
6
- metadata.gz: 9188a96baa8a07b7dd5f1aa71d7980897e9cad1366828ce157f37018ee39b21e2c30221e157c432e24d55a353fc1944a6f20a102fcb49080dc7c697c980116d1
7
- data.tar.gz: c5b3275fb47b4e86f4e2ba9fb92d7b946826de41cb65b2bae2e6fbf2ba091ce0df249bc44d88193dd4f7d6eb2c8befee50dd04c3e7c3900e43f9a5598c8144e3
6
+ metadata.gz: f2f953660d958c572f1b79ebfbb0ec3d2b4d9226f797530a3356e90ebd063dc4263510038d6cead17fa597b9f7ff522cca619042e1d36b501529806543e42bc6
7
+ data.tar.gz: f249315e7323e2bd3dd99a805f3f6de46b72ecabf015f5db6b798b8716bc01d253bb4b8df487d7b204b488f284d86366a887bb0d41ba041bc3f2fcd8895c32ab
data/Gemfile CHANGED
@@ -7,7 +7,7 @@ group :development do
7
7
  # We depend on Vagrant for development, but we don't add it as a
8
8
  # gem dependency because we expect to be installed within the
9
9
  # Vagrant environment itself using `vagrant plugin`.
10
- gem "vagrant", :github => 'mitchellh/vagrant'
10
+ gem "vagrant", :git => "https://github.com/mitchellh/vagrant.git"
11
11
  end
12
12
 
13
13
  # This group is read by Vagrant for plugin development
data/README.md CHANGED
@@ -21,14 +21,33 @@ end
21
21
 
22
22
  The plugin will automatically configure the following Vagrant chef-client provisioner attributes from your knife.rb.
23
23
 
24
- Vagrant chef-client attribute -> knife config attribute
25
- --------------------------------------------------------
26
- * `chef_server_url` - same
27
- * `log_level` - same
28
- * `validation_key_path` - maps to `validation_key`
29
- * `validation_client_name` - same
30
- * `environment` - maps to `vagrant_environment`, this is a non-standard knife config key.
31
- * `encrypted_data_bag_secret_key_path` - maps to `encrypted_data_bag_secret`
24
+ ## Vagrant chef-client attribute -> knife config attribute
25
+ <table>
26
+ <tr>
27
+ <th>Vagrant attribute name</th>
28
+ <th>Knife attribute name</th>
29
+ </tr>
30
+ <tr>
31
+ <td>chef_server_url</td>
32
+ <td>chef_server_url</td>
33
+ </tr>
34
+ <tr>
35
+ <td>log_level</td>
36
+ <td>log_level</td>
37
+ </tr>
38
+ <tr>
39
+ <td>validation_key_path</td>
40
+ <td>validation_key</td>
41
+ </tr>
42
+ <tr>
43
+ <td>environment</td>
44
+ <td>vagrant_environment</td>
45
+ </tr>
46
+ <tr>
47
+ <td>encrypted_data_bag_secret_key_path</td>
48
+ <td>encrypted_data_bag_secret</td>
49
+ </tr>
50
+ </table>
32
51
 
33
52
  Values specified directly in the Vagrantfile override any configured values found in your knife configuration file.
34
53
 
@@ -41,14 +60,26 @@ By default the plugin will be enabled and the path to the knife.rb uses the [sta
41
60
 
42
61
  ## Changelog
43
62
 
63
+ ### 0.1.0
64
+
65
+ - Added support for Vagrant 1.7+.
66
+ - Fixed issue 1. Don't read knife.rb if there are no chef-client provisioner blocks in Vagrantfile.
67
+ - Removed dependency upon Chef gem. Handles loading Knife config directly with mixlib-config
68
+
44
69
  ### 0.0.1
45
70
 
46
- Initial release for Vagrant 1.5
71
+ - Initial release for Vagrant 1.5
47
72
 
48
73
  # Authors
49
74
 
50
75
  * Shawn Neal (<sneal@sneal.net>)
51
76
 
77
+ ## Developing
78
+
79
+ 1. Clone repo
80
+ 2. `bundle install`
81
+ 3. `bundle exec vagrant up`
82
+
52
83
  ## Contributing
53
84
 
54
85
  1. Fork it
data/Rakefile CHANGED
@@ -1 +1,3 @@
1
- require "bundler/gem_tasks"
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ Bundler::GemHelper.install_tasks
@@ -2,7 +2,7 @@
2
2
  # vi: set ft=ruby :
3
3
 
4
4
  Vagrant.configure('2') do |config|
5
- config.vm.box = "opscode_ubuntu-12.04_chef-11.2.0"
5
+ config.vm.box = 'chef/ubuntu-14.04'
6
6
  config.vm.provision :chef_client do |chef|
7
7
  chef.node_name = 'vagrant_chefconfig_test_vm'
8
8
  chef.run_list = [ 'apt' ]
@@ -1,6 +1,6 @@
1
1
  require 'log4r'
2
- require 'chef'
3
- require 'chef/knife'
2
+ require_relative 'knife_config'
3
+ require_relative 'knife_config_locator'
4
4
 
5
5
  module Vagrant
6
6
  module ChefConfig
@@ -12,16 +12,20 @@ module Vagrant
12
12
  end
13
13
 
14
14
  def apply_knife_config()
15
+ provisioners = chef_client_provisioners
16
+ return if provisioners.length == 0
17
+
15
18
  load_knife_config()
16
19
 
17
- chef_client_provisioners.each do |chef_client_provisioner|
18
- chef_config = chef_client_provisioner.config
20
+ provisioners.each do |provisioner|
21
+ chef_config = provisioner.config
19
22
 
20
- set_if_default(chef_config, :chef_server_url, :chef_server_url)
21
- set_if_default(chef_config, :log_level, :log_level)
22
- set_if_default(chef_config, :validation_key_path, :validation_key)
23
- set_if_default(chef_config, :validation_client_name, :validation_client_name)
24
- set_if_default(chef_config, :environment, :vagrant_environment)
23
+ # vagrant config key knife config key
24
+ set_if_default(chef_config, :chef_server_url, :chef_server_url)
25
+ set_if_default(chef_config, :log_level, :log_level)
26
+ set_if_default(chef_config, :validation_key_path, :validation_key)
27
+ set_if_default(chef_config, :validation_client_name, :validation_client_name)
28
+ set_if_default(chef_config, :environment, :vagrant_environment)
25
29
  set_if_default(chef_config, :encrypted_data_bag_secret_key_path, :encrypted_data_bag_secret)
26
30
  end
27
31
  end
@@ -29,45 +33,54 @@ module Vagrant
29
33
 
30
34
  private
31
35
 
32
- def set_if_default(chef_config, config_prop_sym, chef_prop_sym)
36
+ def set_if_default(chef_config, config_prop_sym, knife_prop_sym)
33
37
  config_val = chef_config.send(config_prop_sym)
38
+ knife_val = KnifeConfig[knife_prop_sym]
34
39
 
35
40
  @logger.debug("Vagrantfile config val #{config_prop_sym} = #{config_val}")
36
- @logger.debug("Knife config val #{config_prop_sym} = #{Chef::Config[chef_prop_sym]}")
41
+ @logger.debug("Knife config val #{knife_prop_sym} = #{knife_val}")
37
42
 
38
- if is_default_value(config_prop_sym, config_val)
43
+ if is_default_vagrant_value(config_prop_sym, config_val)
39
44
  @logger.debug("Overwriting '#{config_prop_sym}' in Vagrantfile chef-client " +
40
- "provisioner with '#{Chef::Config[chef_prop_sym]}'")
41
- chef_config.send("#{config_prop_sym}=", Chef::Config[chef_prop_sym])
45
+ "provisioner with '#{knife_val}'")
46
+ chef_config.send("#{config_prop_sym}=", knife_val)
42
47
  end
43
48
  end
44
49
 
45
- def is_default_value(config_prop_sym, config_val)
50
+ def is_default_vagrant_value(config_prop_sym, config_val)
46
51
  case config_prop_sym
47
52
  when :validation_client_name
48
53
  return config_val == 'chef-validator'
49
- when :client_key_path
50
- return config_val == '/etc/chef/client.pem'
54
+ when :log_level
55
+ return config_val == :info
51
56
  else
52
57
  return config_val.nil?
53
58
  end
54
59
  end
55
60
 
56
61
  def chef_client_provisioners()
57
- @env[:machine].config.vm.provisioners.select { |prov| prov.name == :chef_client }
62
+ @env[:machine].config.vm.provisioners.select do |prov|
63
+ begin
64
+ prov.type == :chef_client
65
+ rescue NoMethodError
66
+ prov.name == :chef_client # support for Vagrant <= 1.6.5
67
+ end
68
+ end
58
69
  end
59
70
 
60
71
  def load_knife_config()
61
72
  knife_config_path = locate_knife_config_file()
62
73
  @logger.debug("Using knife config from '#{knife_config_path}'")
63
- Chef::Config.from_file(knife_config_path)
74
+ KnifeConfig.from_file(knife_config_path)
64
75
  end
65
76
 
66
77
  def locate_knife_config_file()
67
- # If the Vagrantfile directly sets the knife.rb path use it, otherwise let
68
- # knife find its configuration file
78
+ # If the Vagrantfile directly sets the knife.rb path use it, otherwise
79
+ # default to the .chef directory under the user's home dir
80
+ # This could be improved to have the same behavior as Chef for finding
81
+ # the knife.rb relative to the current directory
69
82
  knife_config_path = plugin_config().knife_config_path
70
- knife_config_path ? knife_config_path : Chef::Knife.locate_config_file()
83
+ knife_config_path ? knife_config_path : KnifeConfigLocator.new().locate_local_config
71
84
  end
72
85
 
73
86
  def plugin_config()
@@ -76,4 +89,4 @@ module Vagrant
76
89
 
77
90
  end #ChefClientConfigurator
78
91
  end
79
- end
92
+ end
@@ -0,0 +1,28 @@
1
+ require 'mixlib/config'
2
+ require_relative 'path_helper'
3
+
4
+ module Vagrant
5
+ module ChefConfig
6
+ # Subset of Chef Config class functionality
7
+ # Matches Chef 12 default behavior
8
+ class KnifeConfig
9
+
10
+ extend Mixlib::Config
11
+
12
+ default :chef_server_url, "https://localhost:443"
13
+ default :log_level, :auto
14
+ default(:validation_key) { PathHelper.platform_specific_path("/etc/chef/validation.pem") }
15
+ default :validation_client_name, 'chef-validator'
16
+ default :vagrant_environment, :dev
17
+
18
+ default(:encrypted_data_bag_secret) do
19
+ key_path = PathHelper.platform_specific_path("/etc/chef/encrypted_data_bag_secret")
20
+ if File.exist?(key_path)
21
+ key_path
22
+ else
23
+ nil
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,73 @@
1
+ require_relative 'path_helper'
2
+
3
+ module Vagrant
4
+ module ChefConfig
5
+ # Locates the local knife config using the same behavior as Chef 12
6
+ # Borrowed from Chef WorkstationConfigLoader
7
+ # Author:: Daniel DeLeo (<dan@getchef.com>)
8
+ class KnifeConfigLocator
9
+
10
+ def initialize()
11
+ @logger = Log4r::Logger.new("vagrant_chefconfig::knifeconfiglocator")
12
+ end
13
+
14
+ def locate_local_config
15
+ candidate_configs = []
16
+
17
+ # Look for $KNIFE_HOME/knife.rb (allow multiple knives config on same machine)
18
+ if ENV['KNIFE_HOME']
19
+ candidate_configs << File.join(ENV['KNIFE_HOME'], 'config.rb')
20
+ candidate_configs << File.join(ENV['KNIFE_HOME'], 'knife.rb')
21
+ end
22
+ # Look for $PWD/knife.rb
23
+ if Dir.pwd
24
+ candidate_configs << File.join(Dir.pwd, 'config.rb')
25
+ candidate_configs << File.join(Dir.pwd, 'knife.rb')
26
+ end
27
+ # Look for $UPWARD/.chef/knife.rb
28
+ if chef_config_dir
29
+ candidate_configs << File.join(chef_config_dir, 'config.rb')
30
+ candidate_configs << File.join(chef_config_dir, 'knife.rb')
31
+ end
32
+ # Look for $HOME/.chef/knife.rb
33
+ candidate_configs << File.join(home_dot_chef_dir, 'config.rb')
34
+ candidate_configs << File.join(home_dot_chef_dir, 'knife.rb')
35
+
36
+ candidate_configs.find do | candidate_config |
37
+ have_config?(candidate_config)
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ def chef_config_dir
44
+ if @chef_config_dir.nil?
45
+ @chef_config_dir = false
46
+ full_path = Dir.pwd.split(File::SEPARATOR)
47
+ (full_path.length - 1).downto(0) do |i|
48
+ candidate_directory = File.join(full_path[0..i] + [".chef" ])
49
+ if File.exist?(candidate_directory) && File.directory?(candidate_directory)
50
+ @chef_config_dir = candidate_directory
51
+ break
52
+ end
53
+ end
54
+ end
55
+ @chef_config_dir
56
+ end
57
+
58
+ def home_dot_chef_dir
59
+ File.join(Dir.home, '.chef')
60
+ end
61
+
62
+ def have_config?(path)
63
+ if File.exist?(path)
64
+ @logger.info("Using config at #{path}")
65
+ true
66
+ else
67
+ @logger.debug("Config not found at #{path}, trying next option")
68
+ false
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,27 @@
1
+ module Vagrant
2
+ module ChefConfig
3
+ # Helper to deal with paths, mainly on Windows
4
+ # Borrowed from Chef 12 PathHelper class
5
+ class PathHelper
6
+ def self.platform_specific_path(path)
7
+ path = cleanpath(path)
8
+ if Gem.win_platform?
9
+ # \etc\chef\client.rb and \var\chef\client.rb -> C:/chef/client.rb
10
+ if env['SYSTEMDRIVE'] && path[0] == '\\' && path.split('\\')[2] == 'chef'
11
+ path = File.join(env['SYSTEMDRIVE'], path.split('\\', 3)[2])
12
+ end
13
+ end
14
+ path
15
+ end
16
+
17
+ def self.cleanpath(path)
18
+ path = Pathname.new(path).cleanpath.to_s
19
+ # ensure all forward slashes are backslashes
20
+ if Gem.win_platform?
21
+ path = path.gsub(File::SEPARATOR, path_separator)
22
+ end
23
+ path
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,5 +1,5 @@
1
1
  module Vagrant
2
2
  module ChefConfig
3
- VERSION = '0.0.2'
3
+ VERSION = '0.1.0'
4
4
  end
5
5
  end
@@ -18,9 +18,8 @@ Gem::Specification.new do |gem|
18
18
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
19
  gem.require_paths = ["lib"]
20
20
 
21
- gem.add_dependency "chef", "~> 11"
21
+ gem.add_runtime_dependency "mixlib-config", "~> 2"
22
22
 
23
23
  gem.add_development_dependency "rake"
24
24
  gem.add_development_dependency "rspec"
25
- gem.add_development_dependency "bundler", ">= 1.3"
26
25
  end
metadata CHANGED
@@ -1,71 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-chefconfig
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shawn Neal
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-18 00:00:00.000000000 Z
11
+ date: 2015-04-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: chef
14
+ name: mixlib-config
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '11'
19
+ version: '2'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '11'
26
+ version: '2'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: bundler
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - '>='
60
- - !ruby/object:Gem::Version
61
- version: '1.3'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - '>='
67
- - !ruby/object:Gem::Version
68
- version: '1.3'
69
55
  description: Load Chef gem client config from knife.rb
70
56
  email:
71
57
  - sneal@sneal.net
@@ -73,8 +59,8 @@ executables: []
73
59
  extensions: []
74
60
  extra_rdoc_files: []
75
61
  files:
76
- - .gitignore
77
- - .travis.yml
62
+ - ".gitignore"
63
+ - ".travis.yml"
78
64
  - Gemfile
79
65
  - LICENSE.txt
80
66
  - README.md
@@ -87,6 +73,9 @@ files:
87
73
  - lib/vagrant-chefconfig/config.rb
88
74
  - lib/vagrant-chefconfig/env.rb
89
75
  - lib/vagrant-chefconfig/errors.rb
76
+ - lib/vagrant-chefconfig/knife_config.rb
77
+ - lib/vagrant-chefconfig/knife_config_locator.rb
78
+ - lib/vagrant-chefconfig/path_helper.rb
90
79
  - lib/vagrant-chefconfig/plugin.rb
91
80
  - lib/vagrant-chefconfig/version.rb
92
81
  - vagrant-chefconfig.gemspec
@@ -100,17 +89,17 @@ require_paths:
100
89
  - lib
101
90
  required_ruby_version: !ruby/object:Gem::Requirement
102
91
  requirements:
103
- - - '>='
92
+ - - ">="
104
93
  - !ruby/object:Gem::Version
105
94
  version: '0'
106
95
  required_rubygems_version: !ruby/object:Gem::Requirement
107
96
  requirements:
108
- - - '>='
97
+ - - ">="
109
98
  - !ruby/object:Gem::Version
110
99
  version: '0'
111
100
  requirements: []
112
101
  rubyforge_project:
113
- rubygems_version: 2.0.14
102
+ rubygems_version: 2.2.2
114
103
  signing_key:
115
104
  specification_version: 4
116
105
  summary: Duplicating Chef client configuration is less than ideal, lets reuse our