vagrant-butcher 1.1.1 → 2.0.0

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.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- ZmE0ZGRlNDJjMmNhMjk3ZTFmMzEyMjI4NjJlNWYzNjc3ODhiMWMyZA==
5
- data.tar.gz: !binary |-
6
- NGIxMmRiMTNlMjhlMmQxMWUwZWU4NDIzMWJjMDljYjU3ODhhNzJjMw==
7
- !binary "U0hBNTEy":
8
- metadata.gz: !binary |-
9
- NGQ4NmRjMTM3YWJhMDgxMDRiODVlMTE0Mzk4MGM5NjhjOWZkZGI3MWQ4ZmIw
10
- MGZkNDA3NWE5OTM4NDY5ZjQ0ZWJmMjFmYzRjMjg4ZWJiYTFlNTkxZjFiNzZj
11
- OGYyNDQwM2Y5M2ZmN2YwYzA4NGNjYWY0MzA2ZWM3ZTU0ZDMxYWY=
12
- data.tar.gz: !binary |-
13
- NTQ2NGYyMDg2N2ZlMjM5MTFkMzRmMDk2MzE4NTg5NjBjMGMzNDQ1ZGUyMGQy
14
- NTg5YmRkZGI0ZWU2ZTc4YzhhMGI4ZjY0NGM3N2I3MjJiODY1MmIxY2I5OTE4
15
- ZDBlZGM3OTAzYmU4MTE0NjIyODhhYjdiNGNlZDE1MDI3NTU0OGY=
2
+ SHA1:
3
+ metadata.gz: ca0c243f1bc78d523af45de51eda02479461c5eb
4
+ data.tar.gz: 7fd4a44a11cb8a079b163ad38485f6828535ddcb
5
+ SHA512:
6
+ metadata.gz: 4bbba48df2d30503688bc49232c54e12c79815165f47e0af1566c1e1cf12fa96e792b03e2f6b51ebcd403f53d584f5132fae0980a3c68b2f6dcc39c72fc4e819
7
+ data.tar.gz: 92fc213d56dc3eaefad1d826ca50a82c23828936b34bec2cf425e713e3a6b2a9400d3fe5ccb627ae248aa7243e7d9f5df85a8cb256169c40bfdb5e181c82de09
data/.gitignore CHANGED
@@ -17,3 +17,4 @@ test/version_tmp
17
17
  tmp
18
18
  .idea/
19
19
  .vagrant/
20
+ .vagrant-butcher/
data/Gemfile CHANGED
@@ -7,5 +7,5 @@ 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", :git => "git://github.com/mitchellh/vagrant.git"
10
+ gem "vagrant", :github => 'mitchellh/vagrant'
11
11
  end
data/README.md CHANGED
@@ -10,7 +10,7 @@ This plugin will automatically get rid of that cruft for you when you destroy th
10
10
 
11
11
  ## <a id="install"></a>Installation
12
12
 
13
- Starting with version 1.0.0, installation is made via Vagrant plugins only:
13
+ Install this plugin using the Vagrant command line:
14
14
 
15
15
  $ vagrant plugin install vagrant-butcher
16
16
 
@@ -18,43 +18,45 @@ Starting with version 1.0.0, installation is made via Vagrant plugins only:
18
18
 
19
19
  The plugin is loaded automatically once installed.
20
20
 
21
- By default, the gem looks for the Chef server settings on `$HOME/.chef/knife.rb`. This can be overridden by setting:
21
+ ## <a id='configuration'></a>Configuration
22
+
23
+ For most cases, the plugin shouldn't need any configuration. However, there are a few options that can be set. The options are all set in the `Vagrantfile` in the format:
22
24
 
23
25
  ```ruby
24
26
  Vagrant.configure("2") do |config|
25
- config.butcher.knife_config_file = '/path/to/knife.rb'
26
- config.vm.provision :chef_client do |chef|
27
- # Chef Client provisioner configuration
28
- end
27
+ ...
28
+ config.butcher.<option> = <value>
29
+ ...
29
30
  end
30
31
  ```
31
32
 
32
- _Note that beginning with 1.0, the configuration is done outside of the `chef_client` provisioner._
33
-
34
- This is the output of the plugin when it runs successfully:
35
-
36
- $ vagrant destroy -f
37
- [Butcher] knife.rb location set to '/path/to/knife.rb'
38
- [Butcher] Chef node 'node_name' successfully butchered from the server...
39
- [Butcher] Chef client 'node_name' successfully butchered from the server...
40
- [default] Forcing shutdown of VM...
41
- [default] Destroying VM and associated drives...
42
-
43
- ### <a id='auto_knife'></a>Auto Knife
44
-
45
- Starting with version 1.1.0 you can set the knife_config_file to `:auto` if you'd like it to automatically create a knife.rb for that instance from the chef provisioner values.
46
-
47
- This option has the following two limitations:
48
- - It doesn't work with windows guests.
49
- - The default `.` -> `/vagrant` shared folder should be mounted.
33
+ Option | Default Value | Purpose
34
+ -------|---------|--------
35
+ `enabled` | `true` | Defines whether `node` and `client` should be deleted
36
+ `guest_key_path` | `'/etc/chef/client.pem'` | Location of the client key in the guest VM
37
+ `verify_ssl` | `true` | If set to false, does not verify Chef's host key
38
+ `proxy` | `nil` | Inform the URL of a proxy server between your host and the Chef Server
39
+ `client_name` | Guest's node name | Inform a client name to override the plugin's default behaviour
40
+ `client_key` | Guest's client key | Point to a local `.pem` key file that matches the `client_name`
50
41
 
51
42
  ## <a id='caveats'></a>Caveats
52
43
 
53
- * Version 1.0 has only been tested with Vagrant 1.1+. If you're using an older version, it's probably best to stick to 0.0.3
54
44
  * So far this has only been tested and confirmed to run with the VirtualBox and Rackspace provisioners. It should work with others, but if you run into issues please file a bug.
45
+ * It doesn't work with windows guests. If this is your case, either stick to version 1.x or (better) file bug reports with the errors you get.
46
+ * The default `.` -> `/vagrant` shared folder should be mounted.
47
+ * `verify_ssl` is enabled by default. You might want to disable that if, for example, you run your own Chef server with a self-signed cert. Check [here](#configuration) to see how.
55
48
 
56
49
  ## Changelog
57
50
 
51
+ ### 2.0.0
52
+
53
+ * No more option to point to `knife.rb`. Data is retrieved from the `Vagrantfile`'s `chef_client` provisioner
54
+ * `chef` is no longer a requirement (no more `json` conflicts)
55
+ * [Configuration](#configuration) items were added to point to custom client name and key
56
+ * It's possible to disable the plugin by setting the `enabled` flag to `false` in the Vagrantfile.
57
+
58
+ See [Configuration](#configuration) for all possible customisations.
59
+
58
60
  ### 1.1.0
59
61
 
60
62
  * :auto was added as an optional value for knife_config_file
@@ -74,6 +76,11 @@ This option has the following two limitations:
74
76
 
75
77
  * Uses chef.node_name if set. Otherwise, fall back to vm.host_name (as before), or vm.box. -- _Kudos to [pikesley](https://github.com/pikesley)_.
76
78
 
79
+ # Authors
80
+
81
+ * Cassiano Leal (<cassianoleal@gmail.com>)
82
+ * Daniel Searles ([https://github.com/squaresurf]())
83
+
77
84
  ## Contributing
78
85
 
79
86
  1. Fork it
data/Vagrantfile ADDED
@@ -0,0 +1,25 @@
1
+ # -*- mode: ruby -*-
2
+ # vi: set ft=ruby :
3
+
4
+ # Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
5
+ VAGRANTFILE_API_VERSION = "2"
6
+
7
+ Vagrant.require_plugin "vagrant-butcher"
8
+
9
+ orgname = ENV['CHEF_ORGNAME']
10
+
11
+ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
12
+ config.vm.box = "precise64"
13
+ # config.vm.network :private_network, ip: "192.168.33.10"
14
+ # config.vm.network :public_network
15
+
16
+ config.butcher.verify_ssl = true
17
+
18
+ config.vm.provision :chef_client do |chef|
19
+ chef.node_name = 'vagrant_butcher_test_vm'
20
+ chef.chef_server_url = "https://api.opscode.com/organizations/#{orgname}"
21
+ chef.validation_key_path = "~/.chef/#{orgname}-validator.pem"
22
+ chef.validation_client_name = "#{orgname}-validator"
23
+ # chef.run_list = [ 'recipe[dummy::fail]' ]
24
+ end
25
+ end
@@ -1,7 +1,3 @@
1
- require 'chef/config'
2
- require 'chef/rest'
3
- require 'chef/api_client'
4
-
5
1
  module Vagrant
6
2
  module Butcher
7
3
  module Action
@@ -15,39 +11,37 @@ module Vagrant
15
11
 
16
12
  def delete_resource(resource, env)
17
13
  begin
18
- chef_api(env).delete_rest("#{resource}s/#{victim(env)}")
14
+ @conn.send(resource.to_sym).delete(victim(env))
19
15
  env[:butcher].ui.success "Chef #{resource} '#{victim(env)}' successfully butchered from the server..."
20
16
  rescue Exception => e
21
- env[:butcher].ui.warn "Could not remove #{resource} #{victim(env)}: #{e.message}"
17
+ env[:butcher].ui.warn "Could not butcher #{resource} #{victim(env)}: #{e.message}"
22
18
  @delete_all_success = false
23
19
  end
24
20
  end
25
21
 
26
- def delete_auto_knife(env)
22
+ def cleanup_cache_dir(env)
27
23
  if @delete_all_success
28
- File.delete(auto_knife_config_file(env))
29
- File.delete(auto_knife_key_path(env))
24
+ File.delete(host_key_path(env))
30
25
  begin
31
26
  Dir.delete(cache_dir(env))
32
27
  rescue
33
28
  # The dir wasn't empty.
34
29
  end
30
+ else
31
+ env[:butcher].ui.warn "Client and/or node not butchered from the Chef Server. Client key was left at #{host_key_path(env)}"
35
32
  end
36
33
  end
37
34
 
38
35
  def call(env)
39
- if chef_client?(env) && knife_config_file(env)
40
- begin
41
- ::Chef::Config.from_file knife_config_file(env)
42
- rescue Errno::ENOENT => e
43
- raise ::Vagrant::Butcher::VagrantWrapperError.new(e)
44
- end
45
-
46
- %w(node client).each { |resource| delete_resource(resource, env) }
36
+ setup_connection(env)
47
37
 
48
- if auto_knife?(env)
49
- delete_auto_knife(env)
38
+ if butcher_config(env).enabled
39
+ if chef_client?(env)
40
+ %w(node client).each { |resource| delete_resource(resource, env) }
41
+ cleanup_cache_dir(env)
50
42
  end
43
+ else
44
+ env[:butcher].ui.warn "Vagrant::Butcher disabled, not cleaning up Chef server!"
51
45
  end
52
46
 
53
47
  @app.call(env)
@@ -0,0 +1,47 @@
1
+ module Vagrant
2
+ module Butcher
3
+ module Action
4
+ class CopyGuestKey
5
+ include ::Vagrant::Butcher::EnvHelpers
6
+
7
+ def initialize(app, env)
8
+ @app = app
9
+ end
10
+
11
+ def create_cache_dir(env)
12
+ unless File.exists?(cache_dir(env))
13
+ env[:butcher].ui.info "Creating #{cache_dir(env)}"
14
+ Dir.mkdir(cache_dir(env))
15
+ end
16
+ end
17
+
18
+ def copy_key_from_guest(env)
19
+ create_cache_dir(env)
20
+
21
+ begin
22
+ env[:machine].communicate.execute "cp #{guest_key_path(env)} #{guest_cache_key_path(env)}", :sudo => true
23
+ env[:butcher].ui.info "Copied #{guest_key_path(env)} to #{guest_cache_key_path(env)}"
24
+ rescue Exception => e
25
+ env[:butcher].ui.error "Failed to copy #{guest_key_path(env)} to #{guest_cache_key_path(env)}"
26
+ env[:butcher].ui.error e
27
+ return false
28
+ end
29
+
30
+ return true
31
+ end
32
+
33
+ def call(env)
34
+ begin
35
+ @app.call(env)
36
+ ensure
37
+ if chef_client?(env)
38
+ unless guest_cache_dir(env) && copy_key_from_guest(env)
39
+ env[:butcher].ui.error "Failed to copy Chef client key from the guest."
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -2,8 +2,8 @@ module Vagrant
2
2
  module Butcher
3
3
  module Action
4
4
  autoload :Cleanup, 'vagrant-butcher/action/cleanup'
5
- autoload :AutoKnife, 'vagrant-butcher/action/auto_knife'
6
-
5
+ autoload :CopyGuestKey, 'vagrant-butcher/action/copy_guest_key'
6
+
7
7
  def self.cleanup
8
8
  ::Vagrant::Action::Builder.new.tap do |b|
9
9
  b.use setup
@@ -11,10 +11,10 @@ module Vagrant
11
11
  end
12
12
  end
13
13
 
14
- def self.auto_knife
14
+ def self.copy_guest_key
15
15
  ::Vagrant::Action::Builder.new.tap do |b|
16
16
  b.use setup
17
- b.use Vagrant::Butcher::Action::AutoKnife
17
+ b.use Vagrant::Butcher::Action::CopyGuestKey
18
18
  end
19
19
  end
20
20
 
@@ -1,46 +1,43 @@
1
1
  module Vagrant
2
2
  module Butcher
3
3
  class Config < ::Vagrant.plugin('2', :config)
4
+ attr_accessor :enabled
4
5
  attr_accessor :guest_key_path
5
6
  attr_accessor :cache_dir
6
- attr_accessor :guest_cache_dir
7
- attr_accessor :knife_config_file
8
-
7
+ attr_accessor :verify_ssl
8
+ attr_accessor :retries
9
+ attr_accessor :retry_interval
10
+ attr_accessor :proxy
11
+ attr_accessor :client_name
12
+ attr_accessor :client_key
13
+
9
14
  def initialize
10
15
  super
16
+ @enabled = UNSET_VALUE
11
17
  @guest_key_path = UNSET_VALUE
12
18
  @cache_dir = UNSET_VALUE
13
- @guest_cache_dir = UNSET_VALUE
14
- @knife_config_file = UNSET_VALUE
19
+ @verify_ssl = UNSET_VALUE
20
+ @retries = UNSET_VALUE
21
+ @retry_interval = UNSET_VALUE
22
+ @proxy = UNSET_VALUE
23
+ @client_name = UNSET_VALUE
24
+ @client_key = UNSET_VALUE
15
25
  end
16
26
 
17
27
  def cache_dir=(value)
18
28
  @cache_dir = File.expand_path(value)
19
29
  end
20
30
 
21
- def knife_config_file=(value)
22
- unless value == :auto
23
- value = File.expand_path(value)
24
- end
25
-
26
- @knife_config_file = value
27
- end
28
-
29
- def validate(machine)
30
- errors = []
31
-
32
- if @knife_config_file != :auto && !File.exists?(@knife_config_file)
33
- errors << "Knife configuration not found at #{@knife_config_file}."
34
- end
35
-
36
- { "butcher configuration" => errors }
37
- end
38
-
39
31
  def finalize!
32
+ @enabled = true if @enabled == UNSET_VALUE
40
33
  @guest_key_path = '/etc/chef/client.pem' if @guest_key_path == UNSET_VALUE
41
- @cache_dir = File.expand_path ".vagrant-butcher" if @cache_dir == UNSET_VALUE
42
- @guest_cache_dir = "/vagrant/" + File.basename(@cache_dir) if @guest_cache_dir == UNSET_VALUE
43
- @knife_config_file = File.expand_path "#{ENV['HOME']}/.chef/knife.rb" if @knife_config_file == UNSET_VALUE
34
+ @cache_dir = File.expand_path ".vagrant/butcher" if @cache_dir == UNSET_VALUE
35
+ @verify_ssl = true if @verify_ssl == UNSET_VALUE
36
+ @retries = 0 if @retries == UNSET_VALUE
37
+ @retry_interval = 0 if @retry_interval == UNSET_VALUE
38
+ @proxy = nil if @proxy == UNSET_VALUE
39
+ @client_name = nil if @client_name == UNSET_VALUE
40
+ @client_key = nil if @client_key == UNSET_VALUE
44
41
  end
45
42
  end
46
43
  end
@@ -2,7 +2,7 @@ module Vagrant
2
2
  module Butcher
3
3
  class Env
4
4
  attr_accessor :ui
5
-
5
+
6
6
  def initialize
7
7
  if Gem::Version.new(::Vagrant::VERSION) >= Gem::Version.new("1.2")
8
8
  @ui = ::Vagrant::UI::Colored.new.scope('Butcher')
@@ -1,3 +1,8 @@
1
+ require 'ridley'
2
+
3
+ # Silence celluloid warnings and errors: https://github.com/RiotGames/ridley/issues/220
4
+ ::Ridley::Logging.logger.level = Logger.const_get 'FATAL'
5
+
1
6
  module Vagrant
2
7
  module Butcher
3
8
  module EnvHelpers
@@ -5,8 +10,27 @@ module Vagrant
5
10
  @vm_config ||= env[:machine].config.vm
6
11
  end
7
12
 
8
- def chef_api(env)
9
- ::Chef::REST.new(chef_provisioner(env).chef_server_url)
13
+ def setup_connection(env)
14
+ unless @conn
15
+ begin
16
+ @conn = ::Ridley.new(
17
+ server_url: chef_provisioner(env).chef_server_url,
18
+ client_name: client_name(env),
19
+ client_key: client_key(env),
20
+ ssl: {
21
+ verify: butcher_config(env).verify_ssl
22
+ },
23
+ retries: butcher_config(env).retries,
24
+ retry_interval: butcher_config(env).retry_interval,
25
+ proxy: butcher_config(env).proxy
26
+ )
27
+ rescue Ridley::Errors::ClientKeyFileNotFoundOrInvalid
28
+ env[:butcher].ui.error "Chef client key not found at #{host_key_path(env)}"
29
+ rescue Exception => e
30
+ env[:butcher].ui.error "Could not connect to Chef Server: #{e}"
31
+ end
32
+ end
33
+ @conn
10
34
  end
11
35
 
12
36
  def chef_provisioner(env)
@@ -19,88 +43,66 @@ module Vagrant
19
43
  vm_config(env).provisioners.select { |p| p.name == :chef_client }.any?
20
44
  end
21
45
 
22
- def auto_knife?(env)
23
- butcher_config(env).knife_config_file == :auto
24
- end
25
-
26
46
  def butcher_config(env)
27
47
  @butcher_config ||= env[:machine].config.butcher
28
48
  end
29
49
 
30
50
  def cache_dir(env)
31
- unless @cache_dir
32
- env[:butcher].ui.info "cache dir is set to '#{butcher_config(env).cache_dir}'"
33
- end
34
-
35
51
  @cache_dir ||= butcher_config(env).cache_dir
36
52
  end
37
53
 
38
- def guest_cache_dir(env)
39
- unless @guest_cache_dir
40
- @guest_cache_dir = butcher_config(env).guest_cache_dir
41
- env[:butcher].ui.info "guest cache dir is set to '#{@guest_cache_dir}'"
42
- end
54
+ def cache_dir_mapping(env)
55
+ unless @cache_dir_mapping
56
+ # Grab all enabled synced_folders
57
+ synced_folders = vm_config(env).synced_folders.values.find_all { |f| !f[:disabled] }
43
58
 
44
- @guest_cache_dir
45
- end
59
+ # Expand the hostpath of each folder
60
+ synced_folders.each { |f| f[:hostpath] = File.expand_path(f[:hostpath]) }
46
61
 
47
- def guest_key_path(env)
48
- unless @guest_key_path
49
- @guest_key_path = butcher_config(env).guest_key_path
50
- env[:butcher].ui.info "guest key path is set to '#{@guest_key_path}'"
62
+ # Select the folder wherein the cache_dir is contained
63
+ cache_dir_mappings = synced_folders.select { |f| cache_dir(env) =~ /^#{f[:hostpath]}/ }
64
+ @cache_dir_mapping = cache_dir_mappings.first if cache_dir_mappings.any?
51
65
  end
52
-
53
- @guest_key_path
66
+ @cache_dir_mapping
54
67
  end
55
68
 
56
- def auto_knife_config_file(env)
57
- @auto_knife_config_file ||= "#{cache_dir(env)}/#{env[:machine].name}-knife.rb"
58
- end
59
-
60
- def knife_config_file(env)
61
- unless @knife_config_file
62
- if auto_knife?(env)
63
- file = "#{cache_dir(env)}/#{env[:machine].name}-knife.rb"
64
- unless File.exists?(file)
65
- file = false
66
- end
69
+ def guest_cache_dir(env)
70
+ unless @guest_cache_dir
71
+ if cache_dir_mapping(env)
72
+ # Return the path to the cache dir inside the VM
73
+ @guest_cache_dir = cache_dir(env).gsub(cache_dir_mapping(env)[:hostpath], cache_dir_mapping(env)[:guestpath])
74
+ env[:butcher].ui.info "Guest cache dir at #{@guest_cache_dir}"
67
75
  else
68
- file = butcher_config(env).knife_config_file
76
+ @guest_cache_dir = false
77
+ env[:butcher].ui.error "We couldn't find a synced folder to access the cache dir on the guest."
78
+ env[:butcher].ui.error "Did you disable the /vagrant folder or set a butcher.cache_path that isn't shared with the guest?"
69
79
  end
70
-
71
- env[:butcher].ui.info "knife.rb location set to '#{file}'"
72
-
73
- @knife_config_file = file
74
80
  end
75
-
76
- @knife_config_file
81
+ @guest_cache_dir
77
82
  end
78
83
 
79
- def auto_knife_key(env)
80
- unless @auto_knife_key
81
- @auto_knife_key = "#{env[:machine].name}-client.pem"
82
- env[:butcher].ui.info "auto client key name is #{@auto_knife_key}"
83
- end
84
+ def guest_key_path(env)
85
+ @guest_key_path ||= butcher_config(env).guest_key_path
86
+ end
84
87
 
85
- @auto_knife_key
88
+ def guest_key_filename(env)
89
+ @guest_key ||= "#{env[:machine].name}-client.pem"
86
90
  end
87
91
 
88
- def auto_knife_key_path(env)
89
- unless @auto_knife_key_path
90
- @auto_knife_key_path = "#{cache_dir(env)}/#{auto_knife_key(env)}"
91
- env[:butcher].ui.info "auto client key path is #{@auto_knife_key_path}"
92
- end
92
+ def host_key_path(env)
93
+ @host_key_path ||= "#{cache_dir(env)}/#{guest_key_filename(env)}"
94
+ end
93
95
 
94
- @auto_knife_key_path
96
+ def guest_cache_key_path(env)
97
+ @guest_cache_key_path ||= "#{guest_cache_dir(env)}/#{guest_key_filename(env)}"
95
98
  end
96
99
 
97
- def auto_knife_guest_key_path(env)
98
- unless @auto_knife_guest_key_path
99
- @auto_knife_guest_key_path = "#{guest_cache_dir(env)}/#{auto_knife_key(env)}"
100
- env[:butcher].ui.info "auto client guest key path is #{@auto_knife_guest_key_path}"
101
- end
100
+ def client_key(env)
101
+ @client_key ||= butcher_config(env).client_key || host_key_path(env)
102
+ end
102
103
 
103
- @auto_knife_guest_key_path
104
+ def client_name(env)
105
+ @client_name ||= butcher_config(env).client_name || victim(env)
104
106
  end
105
107
 
106
108
  def victim(env)
@@ -4,7 +4,7 @@ module Vagrant
4
4
  module Butcher
5
5
  # This is a copy/adaptation of the VagrantWrapperError class of berkshelf-vagrant
6
6
  # The original can be found on https://github.com/RiotGames/berkshelf-vagrant
7
-
7
+
8
8
  # @author Jamie Winsor <reset@riotgames.com>
9
9
  #
10
10
  # A wrapper for a BerkshelfError for Vagrant. All Berkshelf exceptions should be
@@ -9,13 +9,13 @@ module Vagrant
9
9
  class << self
10
10
  def provision(hook)
11
11
  # This should be at the end so that it can copy the chef client pem.
12
- hook.append(::Vagrant::Butcher::Action.auto_knife)
12
+ hook.before(::Vagrant::Action::Builtin::Provision, Vagrant::Butcher::Action.copy_guest_key)
13
13
  end
14
14
  end
15
15
 
16
- action_hook(:vagrant_butcher_auto_knife, :machine_action_up, &method(:provision))
17
- action_hook(:vagrant_butcher_auto_knife, :machine_action_reload, &method(:provision))
18
- action_hook(:vagrant_butcher_auto_knife, :machine_action_provision, &method(:provision))
16
+ action_hook(:vagrant_butcher_copy_guest_key, :machine_action_up, &method(:provision))
17
+ action_hook(:vagrant_butcher_copy_guest_key, :machine_action_reload, &method(:provision))
18
+ action_hook(:vagrant_butcher_copy_guest_key, :machine_action_provision, &method(:provision))
19
19
 
20
20
  action_hook(:vagrant_butcher_cleanup, :machine_action_destroy) do |hook|
21
21
  hook.after(::Vagrant::Action::Builtin::ConfigValidate, Vagrant::Butcher::Action.cleanup)
@@ -1,5 +1,5 @@
1
1
  module Vagrant
2
2
  module Butcher
3
- VERSION = "1.1.1"
3
+ VERSION = "2.0.0"
4
4
  end
5
5
  end
@@ -1,4 +1,8 @@
1
- require 'vagrant'
1
+ begin
2
+ require "vagrant"
3
+ rescue LoadError
4
+ raise "This plugin must run within Vagrant."
5
+ end
2
6
  require 'vagrant-butcher/version'
3
7
  require 'vagrant-butcher/errors'
4
8
 
@@ -2,68 +2,26 @@ require 'spec_helper.rb'
2
2
 
3
3
  describe Vagrant::Butcher::Config do
4
4
  subject { described_class.new }
5
-
6
- it "has the option to set knife.rb path" do
7
- subject.should respond_to(:knife_config_file)
5
+
6
+ it "does not have the option to set knife.rb path" do
7
+ subject.should_not respond_to(:knife_config_file)
8
8
  end
9
-
9
+
10
10
  it "has the option to set guest chef client pem path" do
11
11
  subject.should respond_to(:guest_key_path)
12
12
  end
13
-
13
+
14
14
  it "has the option to set cache dir path" do
15
15
  subject.should respond_to(:cache_dir)
16
16
  end
17
-
18
- it "has the option to set guest cache dir path" do
19
- subject.should respond_to(:guest_cache_dir)
20
- end
21
-
22
- it "sets knife.rb default path" do
23
- subject.finalize!.should eql(File.expand_path("#{ENV['HOME']}/.chef/knife.rb"))
24
- end
25
-
17
+
26
18
  it "sets guest chef client pem default path" do
27
19
  subject.finalize!
28
20
  subject.guest_key_path.should eql('/etc/chef/client.pem')
29
21
  end
30
-
22
+
31
23
  it "sets cache dir default path" do
32
24
  subject.finalize!
33
- subject.cache_dir.should eql(File.expand_path(".vagrant-butcher"))
34
- end
35
-
36
- it "sets guest cache dir default path" do
37
- subject.finalize!
38
- subject.guest_cache_dir.should eql("/vagrant/" + File.basename(subject.cache_dir))
39
- end
40
-
41
- describe "#validate" do
42
- let(:env) { double('env') }
43
- let(:config) { double('config', butcher: subject) }
44
- let(:machine) { double('machine', config: config, env: env) }
45
- let(:result) { subject.validate(machine) }
46
-
47
- context "when validations pass" do
48
- before(:each) do
49
- File.should_receive(:exists?).with(subject.knife_config_file).and_return(true)
50
- end
51
-
52
- it "contains an empty Array for the 'butcher configuration' key" do
53
- result["butcher configuration"].should be_a(Array)
54
- result["butcher configuration"].should be_empty
55
- end
56
- end
57
-
58
- context "when validations fail" do
59
- before(:each) do
60
- File.should_receive(:exists?).with(subject.knife_config_file).and_return(false)
61
- end
62
-
63
- it "contains an empty Array for the 'butcher configuration' key" do
64
- result["butcher configuration"].should be_a(Array)
65
- result["butcher configuration"].should_not be_empty
66
- end
67
- end
25
+ subject.cache_dir.should eql(File.expand_path(".vagrant/butcher"))
68
26
  end
69
27
  end
@@ -11,15 +11,16 @@ Gem::Specification.new do |gem|
11
11
  gem.description = %q{Delete Chef client and node when destroying Vagrant VM}
12
12
  gem.summary = %q{When a Vagrant VM that was spun up using Chef-Client is destroyed, it leaves behind a client and a node on the Chef server. What butcher does is to clean up those during the destroy operation.}
13
13
  gem.homepage = "https://github.com/cassianoleal/vagrant-butcher"
14
+ gem.license = 'MIT'
14
15
 
15
16
  gem.files = `git ls-files`.split($/)
16
17
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
18
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
19
  gem.require_paths = ["lib"]
19
-
20
- gem.add_dependency "chef", ">= 11.2.0"
21
-
20
+
21
+ gem.add_dependency "ridley", ">= 1.5.3"
22
+
22
23
  gem.add_development_dependency "rspec"
23
24
  gem.add_development_dependency "pry-debugger"
24
- gem.add_development_dependency "bundler", "~> 1.3"
25
+ gem.add_development_dependency "bundler", ">= 1.3"
25
26
  end
metadata CHANGED
@@ -1,69 +1,69 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-butcher
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cassiano Leal
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-19 00:00:00.000000000 Z
11
+ date: 2013-12-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: chef
14
+ name: ridley
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ! '>='
17
+ - - '>='
18
18
  - !ruby/object:Gem::Version
19
- version: 11.2.0
19
+ version: 1.5.3
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.2.0
26
+ version: 1.5.3
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rspec
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: pry-debugger
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
55
  - !ruby/object:Gem::Dependency
56
56
  name: bundler
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ~>
59
+ - - '>='
60
60
  - !ruby/object:Gem::Version
61
61
  version: '1.3'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ~>
66
+ - - '>='
67
67
  - !ruby/object:Gem::Version
68
68
  version: '1.3'
69
69
  description: Delete Chef client and node when destroying Vagrant VM
@@ -79,10 +79,11 @@ files:
79
79
  - LICENSE.txt
80
80
  - README.md
81
81
  - Rakefile
82
+ - Vagrantfile
82
83
  - lib/vagrant-butcher.rb
83
84
  - lib/vagrant-butcher/action.rb
84
- - lib/vagrant-butcher/action/auto_knife.rb
85
85
  - lib/vagrant-butcher/action/cleanup.rb
86
+ - lib/vagrant-butcher/action/copy_guest_key.rb
86
87
  - lib/vagrant-butcher/config.rb
87
88
  - lib/vagrant-butcher/env.rb
88
89
  - lib/vagrant-butcher/env_helpers.rb
@@ -95,7 +96,8 @@ files:
95
96
  - spec/unit/vagrant_butcher_spec.rb
96
97
  - vagrant-butcher.gemspec
97
98
  homepage: https://github.com/cassianoleal/vagrant-butcher
98
- licenses: []
99
+ licenses:
100
+ - MIT
99
101
  metadata: {}
100
102
  post_install_message:
101
103
  rdoc_options: []
@@ -103,17 +105,17 @@ require_paths:
103
105
  - lib
104
106
  required_ruby_version: !ruby/object:Gem::Requirement
105
107
  requirements:
106
- - - ! '>='
108
+ - - '>='
107
109
  - !ruby/object:Gem::Version
108
110
  version: '0'
109
111
  required_rubygems_version: !ruby/object:Gem::Requirement
110
112
  requirements:
111
- - - ! '>='
113
+ - - '>='
112
114
  - !ruby/object:Gem::Version
113
115
  version: '0'
114
116
  requirements: []
115
117
  rubyforge_project:
116
- rubygems_version: 2.0.6
118
+ rubygems_version: 2.0.3
117
119
  signing_key:
118
120
  specification_version: 4
119
121
  summary: When a Vagrant VM that was spun up using Chef-Client is destroyed, it leaves
@@ -1,66 +0,0 @@
1
- require 'chef/config'
2
- require 'chef/rest'
3
- require 'chef/api_client'
4
-
5
- module Vagrant
6
- module Butcher
7
- module Action
8
- class AutoKnife
9
- include ::Vagrant::Butcher::EnvHelpers
10
-
11
- def initialize(app, env)
12
- @app = app
13
- end
14
-
15
- def victim(env)
16
- @victim ||= chef_provisioner(env).node_name || vm_config(env).hostname || vm_config(env).box
17
- end
18
-
19
- def auto_create_knife(env)
20
- folders = vm_config(env).synced_folders
21
- if !folders.has_key?("/vagrant") || folders["/vagrant"][:disabled] == TRUE
22
- env[:butcher].ui.warn "/vagrant folder not set to be mounted."
23
- end
24
-
25
- unless File.exists?(cache_dir(env))
26
- env[:butcher].ui.info "Creating #{cache_dir(env)}"
27
- Dir.mkdir(cache_dir(env))
28
- end
29
-
30
- begin
31
- env[:machine].communicate.execute "cp #{guest_key_path(env)} #{auto_knife_guest_key_path(env)}", :sudo => true
32
- rescue Exception => e
33
- env[:butcher].ui.error "Failed to copy #{guest_key_path(env)} to #{auto_knife_key_path(env)}"
34
- env[:butcher].ui.error e
35
- return false
36
- end
37
-
38
- env[:butcher].ui.info "Copied #{guest_key_path(env)} to #{auto_knife_key_path(env)}"
39
-
40
- env[:butcher].ui.info "Creating #{auto_knife_config_file(env)}"
41
-
42
- knife_rb = <<-END.gsub(/^ */, '')
43
- log_level :info
44
- log_location STDOUT
45
- client_key '#{auto_knife_key_path(env)}'
46
- node_name '#{victim(env)}'
47
- END
48
-
49
- File.new(auto_knife_config_file(env), 'w+').write(knife_rb)
50
-
51
- return true
52
- end
53
-
54
- def call(env)
55
- if chef_client?(env) && auto_knife?(env) && !File.exists?(auto_knife_config_file(env))
56
- unless auto_create_knife(env)
57
- env[:butcher].ui.error "Failed to auto create knife.rb."
58
- end
59
- end
60
-
61
- @app.call(env)
62
- end
63
- end
64
- end
65
- end
66
- end