vagrant-berkshelf 3.0.1 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +36 -17
  3. data/.travis.yml +6 -4
  4. data/CONTRIBUTING.md +4 -4
  5. data/Gemfile +2 -2
  6. data/{LICENSE.txt → LICENSE} +1 -1
  7. data/README.md +67 -24
  8. data/Rakefile +14 -0
  9. data/lib/vagrant-berkshelf.rb +17 -1
  10. data/lib/vagrant-berkshelf/action/base.rb +48 -0
  11. data/lib/vagrant-berkshelf/action/check.rb +44 -0
  12. data/lib/vagrant-berkshelf/action/clean.rb +29 -0
  13. data/lib/vagrant-berkshelf/action/install.rb +35 -0
  14. data/lib/vagrant-berkshelf/action/load.rb +59 -0
  15. data/lib/vagrant-berkshelf/action/share.rb +38 -0
  16. data/lib/vagrant-berkshelf/action/upload.rb +99 -0
  17. data/lib/vagrant-berkshelf/config.rb +87 -0
  18. data/lib/vagrant-berkshelf/env.rb +14 -0
  19. data/lib/vagrant-berkshelf/errors.rb +79 -0
  20. data/lib/vagrant-berkshelf/helpers.rb +180 -0
  21. data/lib/vagrant-berkshelf/plugin.rb +40 -0
  22. data/lib/vagrant-berkshelf/version.rb +5 -0
  23. data/spec/spec_helper.rb +1 -4
  24. data/spec/unit/vagrant-berkshelf/config_spec.rb +119 -0
  25. data/vagrant-berkshelf.gemspec +26 -14
  26. metadata +35 -52
  27. data/Thorfile +0 -59
  28. data/integration/Berksfile +0 -3
  29. data/integration/Gemfile +0 -10
  30. data/integration/Vagrantfile +0 -19
  31. data/lib/berkshelf/vagrant.rb +0 -68
  32. data/lib/berkshelf/vagrant/action.rb +0 -64
  33. data/lib/berkshelf/vagrant/action/clean.rb +0 -27
  34. data/lib/berkshelf/vagrant/action/configure_chef.rb +0 -27
  35. data/lib/berkshelf/vagrant/action/install.rb +0 -69
  36. data/lib/berkshelf/vagrant/action/load_shelf.rb +0 -52
  37. data/lib/berkshelf/vagrant/action/upload.rb +0 -53
  38. data/lib/berkshelf/vagrant/berks_config.rb +0 -48
  39. data/lib/berkshelf/vagrant/chef_config.rb +0 -88
  40. data/lib/berkshelf/vagrant/config.rb +0 -113
  41. data/lib/berkshelf/vagrant/env.rb +0 -16
  42. data/lib/berkshelf/vagrant/env_helpers.rb +0 -160
  43. data/lib/berkshelf/vagrant/errors.rb +0 -71
  44. data/lib/berkshelf/vagrant/plugin.rb +0 -41
  45. data/lib/berkshelf/vagrant/version.rb +0 -5
  46. data/spec/unit/berkshelf/vagrant/config_spec.rb +0 -97
  47. data/spec/unit/berkshelf/vagrant/errors_spec.rb +0 -12
  48. data/spec/unit/berkshelf/vagrant_spec.rb +0 -31
@@ -1,3 +0,0 @@
1
- source "https://supermarket.getchef.com"
2
-
3
- cookbook "apt"
data/integration/Gemfile DELETED
@@ -1,10 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- group :development do
4
- gem "vagrant", git: "https://github.com/mitchellh/vagrant.git"
5
- end
6
-
7
- group :plugins do
8
- gem "vagrant-berkshelf", path: "../"
9
- gem "vagrant-omnibus"
10
- end
@@ -1,19 +0,0 @@
1
- # -*- mode: ruby -*-
2
- # vi: set ft=ruby :
3
- Vagrant.require_version ">= 1.5.0"
4
-
5
- Vagrant.configure("2") do |config|
6
- config.vm.hostname = "vagrant-builder-int"
7
- config.vm.box = "opscode-ubuntu-14.04"
8
- config.vm.box_url = "https://vagrantcloud.com/chef/ubuntu-14.04/version/1/provider/virtualbox.box"
9
-
10
- config.vm.network :private_network, type: "dhcp"
11
-
12
- config.omnibus.chef_version = :latest
13
-
14
- config.vm.provision :chef_client do |chef|
15
- chef.chef_server_url = "https://api.opscode.com/organizations/undeadlabs"
16
- chef.validation_key_path = File.expand_path("~/.chef/undeadlabs-validator.pem")
17
- chef.run_list = ["apt::default"]
18
- end
19
- end
@@ -1,68 +0,0 @@
1
- begin
2
- require 'vagrant'
3
- rescue LoadError
4
- raise 'The Vagrant Berkshelf plugin must be run within Vagrant.'
5
- end
6
-
7
- require 'fileutils'
8
- require 'json'
9
- require 'tmpdir'
10
-
11
- require_relative 'vagrant/errors'
12
- require_relative 'vagrant/version'
13
-
14
- module Berkshelf
15
- class << self
16
- # Returns the filepath to the location Berkshelf will use for
17
- # storage; temp files will go here, Cookbooks will be downloaded
18
- # to or uploaded from here. By default this is '~/.berkshelf' but
19
- # can be overridden by specifying a value for the ENV variable
20
- # 'BERKSHELF_PATH'.
21
- #
22
- # @return [String]
23
- def berkshelf_path
24
- ENV['BERKSHELF_PATH'] || File.expand_path('~/.berkshelf')
25
- end
26
- end
27
-
28
- module Vagrant
29
- require_relative 'vagrant/chef_config'
30
- require_relative 'vagrant/berks_config'
31
- require_relative 'vagrant/action'
32
- require_relative 'vagrant/config'
33
- require_relative 'vagrant/env'
34
- require_relative 'vagrant/env_helpers'
35
-
36
- TESTED_REQUIREMENTS = [">= 1.1", "< 1.5.0"]
37
-
38
- class << self
39
- # The path to where shelfs are created on the host machine to be mounted in
40
- # Vagrant guests
41
- #
42
- # @return [String]
43
- def shelf_path
44
- File.join(Berkshelf.berkshelf_path, 'vagrant')
45
- end
46
-
47
- # Generate a new shelf to be mounted in a Vagrant guest
48
- #
49
- # @return [String]
50
- # path to the generated shelf
51
- def mkshelf(machine_name = nil)
52
- unless File.exist?(shelf_path)
53
- FileUtils.mkdir_p(shelf_path)
54
- end
55
-
56
- if machine_name.nil?
57
- prefix_suffix = 'berkshelf-'
58
- else
59
- prefix_suffix = ['berkshelf-', "-#{machine_name}"]
60
- end
61
-
62
- Dir.mktmpdir(prefix_suffix, shelf_path)
63
- end
64
- end
65
- end
66
- end
67
-
68
- require_relative 'vagrant/plugin'
@@ -1,64 +0,0 @@
1
- module Berkshelf
2
- module Vagrant
3
- module Action
4
- require_relative 'env'
5
- require_relative 'env_helpers'
6
-
7
- require_relative 'action/clean'
8
- require_relative 'action/configure_chef'
9
- require_relative 'action/install'
10
- require_relative 'action/load_shelf'
11
- require_relative 'action/upload'
12
-
13
- class << self
14
- # Return the Berkshelf install middleware stack. When placed in the action chain
15
- # this stack will find retrieve and resolve the cookbook dependencies describe
16
- # in your configured Berksfile.
17
- #
18
- # Cookbooks will install into a temporary directory, called a Shelf, and be mounted
19
- # into the VM. This mounted path will be appended to the chef_solo.cookbooks_path value.
20
- #
21
- # @return [::Vagrant::Action::Builder]
22
- def install
23
- @install ||= ::Vagrant::Action::Builder.new.tap do |b|
24
- b.use Berkshelf::Vagrant::Action::Install
25
- end
26
- end
27
-
28
- # Return the Berkshelf upload middleware stack. When placed in the action chain
29
- # this stack will upload cookbooks to a Chef Server if the Chef-Client provisioner
30
- # is used. The Chef Server where the cookbooks will be uploaded to is the same Chef
31
- # Server used in the Chef-Client provisioner.
32
- #
33
- # Nothing will be done if the Chef-Solo provisioner is used.
34
- #
35
- # @return [::Vagrant::Action::Builder]
36
- def upload
37
- @upload ||= ::Vagrant::Action::Builder.new.tap do |b|
38
- b.use Berkshelf::Vagrant::Action::Upload
39
- end
40
- end
41
-
42
- # Return the Berkshelf clean middleware stack. When placed in the action chain
43
- # this stack will clean up any temporary directories or files created by the other
44
- # middleware stacks.
45
- #
46
- # @return [::Vagrant::Action::Builder]
47
- def clean
48
- @clean ||= ::Vagrant::Action::Builder.new.tap do |b|
49
- b.use setup
50
- b.use Berkshelf::Vagrant::Action::Clean
51
- end
52
- end
53
-
54
- def setup
55
- @setup ||= ::Vagrant::Action::Builder.new.tap do |b|
56
- b.use ::Vagrant::Action::Builtin::EnvSet, berkshelf: Berkshelf::Vagrant::Env.new
57
- b.use Berkshelf::Vagrant::Action::LoadShelf
58
- b.use Berkshelf::Vagrant::Action::ConfigureChef
59
- end
60
- end
61
- end
62
- end
63
- end
64
- end
@@ -1,27 +0,0 @@
1
- module Berkshelf
2
- module Vagrant
3
- module Action
4
- class Clean
5
- include Berkshelf::Vagrant::EnvHelpers
6
-
7
- def initialize(app, env)
8
- @app = app
9
- end
10
-
11
- def call(env)
12
- if env[:berkshelf].shelf && File.exist?(env[:berkshelf].shelf)
13
- env[:berkshelf].ui.info "Cleaning Vagrant's berkshelf"
14
-
15
- FileUtils.remove_dir(env[:berkshelf].shelf, force: true)
16
- FileUtils.rm_f(cache_file(env))
17
- env[:berkshelf].shelf = nil
18
- end
19
-
20
- @app.call(env)
21
- rescue Berkshelf::BerkshelfError => e
22
- raise Berkshelf::VagrantWrapperError.new(e)
23
- end
24
- end
25
- end
26
- end
27
- end
@@ -1,27 +0,0 @@
1
- module Berkshelf
2
- module Vagrant
3
- module Action
4
- class ConfigureChef
5
- include Berkshelf::Vagrant::EnvHelpers
6
-
7
- def initialize(app, env)
8
- @app = app
9
- end
10
-
11
- def call(env)
12
- unless berkshelf_enabled?(env)
13
- return @app.call(env)
14
- end
15
-
16
- if chef_solo?(env) && shelf = env[:berkshelf].shelf
17
- provisioners(:chef_solo, env).each do |provisioner|
18
- provisioner.config.cookbooks_path = provisioner.config.send(:prepare_folders_config, shelf)
19
- end
20
- end
21
-
22
- @app.call(env)
23
- end
24
- end
25
- end
26
- end
27
- end
@@ -1,69 +0,0 @@
1
- module Berkshelf
2
- module Vagrant
3
- module Action
4
- class Install
5
- include Berkshelf::Vagrant::EnvHelpers
6
-
7
- def initialize(app, env)
8
- @app = app
9
- end
10
-
11
- def call(env)
12
- if provision_disabled?(env)
13
- env[:berkshelf].ui.info "Skipping Berkshelf with --no-provision"
14
-
15
- return @app.call(env)
16
- end
17
-
18
- unless berkshelf_enabled?(env)
19
- if File.exist?(berksfile_path(env))
20
- warn_disabled_but_berksfile_exists(env)
21
- end
22
-
23
- return @app.call(env)
24
- end
25
-
26
- if chef_solo?(env)
27
- vendor(env)
28
- end
29
-
30
- @app.call(env)
31
- rescue => ex
32
- raise Berkshelf::VagrantWrapperError.new(ex)
33
- end
34
-
35
- private
36
-
37
- def vendor(env)
38
- check_vagrant_version(env)
39
- env[:berkshelf].ui.info "Updating Vagrant's berkshelf: '#{env[:berkshelf].shelf}'"
40
- FileUtils.rm_rf(env[:berkshelf].shelf)
41
-
42
- opts = env[:machine].config.berkshelf.to_hash
43
- berks_opts = { berksfile: opts[:berksfile_path] }
44
- berks_opts[:except] = opts[:except] if opts.has_key?(:except) && !opts[:except].empty?
45
- berks_opts[:only] = opts[:only] if opts.has_key?(:only) && !opts[:only].empty?
46
-
47
- env[:berkshelf].ui.info berks("vendor", env[:berkshelf].shelf, berks_opts)
48
- end
49
-
50
- def warn_disabled_but_berksfile_exists(env)
51
- env[:berkshelf].ui.warn "Berkshelf plugin is disabled but a Berksfile was found at" +
52
- " your configured path: #{berksfile_path(env)}"
53
- env[:berkshelf].ui.warn "Enable the Berkshelf plugin by setting 'config.berkshelf.enabled = true'" +
54
- " in your vagrant config"
55
- end
56
-
57
- def check_vagrant_version(env)
58
- unless vagrant_version_satisfies?(">= 1.5")
59
- raise UnsupportedVagrantVersion.new(">= 1.5")
60
- end
61
- end
62
-
63
- def vagrant_version_satisfies?(requirements)
64
- Gem::Requirement.new(requirements).satisfied_by? Gem::Version.new(::Vagrant::VERSION)
65
- end
66
- end
67
- end
68
- end
69
- end
@@ -1,52 +0,0 @@
1
- module Berkshelf
2
- module Vagrant
3
- module Action
4
- class LoadShelf
5
- include Berkshelf::Vagrant::EnvHelpers
6
-
7
- def initialize(app, env)
8
- @app = app
9
- end
10
-
11
- def call(env)
12
- unless berkshelf_enabled?(env)
13
- return @app.call(env)
14
- end
15
-
16
- # Make sure that Berkshelf itself uses distinct directories for each vagrant run.
17
- ENV['BERKSHELF_PATH'] ||= File.join(Berkshelf.berkshelf_path, env[:machine].name.to_s)
18
-
19
- shelf = load_shelf(env)
20
-
21
- if shelf.nil?
22
- shelf = cache_shelf(Berkshelf::Vagrant.mkshelf(env[:machine].name), env)
23
- end
24
-
25
- env[:berkshelf].shelf = shelf
26
-
27
- @app.call(env)
28
- end
29
-
30
- # @param [String] path
31
- #
32
- # @return [String]
33
- def cache_shelf(path, env)
34
- FileUtils.mkdir_p(File.dirname(path))
35
-
36
- File.open((cache_file(env)), 'w+') do |f|
37
- f.write(path)
38
- end
39
-
40
- path
41
- end
42
-
43
- # @return [String, nil]
44
- def load_shelf(env)
45
- return nil unless File.exist?(cache_file(env))
46
-
47
- File.read(cache_file(env)).chomp
48
- end
49
- end
50
- end
51
- end
52
- end
@@ -1,53 +0,0 @@
1
- require 'tempfile'
2
-
3
- module Berkshelf
4
- module Vagrant
5
- module Action
6
- class Upload
7
- include Berkshelf::Vagrant::EnvHelpers
8
-
9
- def initialize(app, env)
10
- @app = app
11
- end
12
-
13
- def call(env)
14
- if provision_disabled?(env)
15
- return @app.call(env)
16
- end
17
-
18
- unless berkshelf_enabled?(env)
19
- return @app.call(env)
20
- end
21
-
22
- if chef_client?(env)
23
- upload(env)
24
- end
25
-
26
- @app.call(env)
27
- end
28
-
29
- private
30
-
31
- def upload(env)
32
- provisioners(:chef_client, env).each do |provisioner|
33
- begin
34
- # Temporarily generate a berkshelf configuration to pass to the CLI since not all versions
35
- # of the CLI allow overriding all options needed for upload.
36
- tmp_config = Tempfile.new("berks-config")
37
- config = BerksConfig.instance.dup
38
- config[:chef][:chef_server_url] = provisioner.config.chef_server_url
39
- tmp_config.write(config.to_json)
40
- tmp_config.flush
41
-
42
- env[:berkshelf].ui.info "Uploading cookbooks to '#{provisioner.config.chef_server_url}'"
43
- berks("upload", config: tmp_config.path, berksfile: berksfile_path(env), force: true,
44
- freeze: false)
45
- ensure
46
- tmp_config.close! unless tmp_config.nil?
47
- end
48
- end
49
- end
50
- end
51
- end
52
- end
53
- end
@@ -1,48 +0,0 @@
1
- require 'vagrant/util/hash_with_indifferent_access'
2
-
3
- module Berkshelf::Vagrant
4
- class BerksConfig < ::Vagrant::Util::HashWithIndifferentAccess
5
- class << self
6
- # @return [String]
7
- def store_location
8
- File.join(Berkshelf.berkshelf_path, 'config.json')
9
- end
10
-
11
- # @return [String]
12
- def local_location
13
- ENV['BERKSHELF_CONFIG'] || File.join('.', '.berkshelf', 'config.json')
14
- end
15
-
16
- # @return [String]
17
- def path
18
- path = File.exists?(local_location) ? local_location : store_location
19
- File.expand_path(path)
20
- end
21
-
22
- # Instantiate and return or just return the currently instantiated Berkshelf
23
- # configuration
24
- #
25
- # @return [Config]
26
- def instance
27
- @instance ||= if File.exists?(path) && File.readable?(path)
28
- new(JSON.parse(File.read(path)))
29
- else
30
- new
31
- end
32
- end
33
- end
34
-
35
- def initialize(attributes = {})
36
- attributes.merge!(chef: ChefConfig.instance, ssl: ::Vagrant::Util::HashWithIndifferentAccess.new(verify: false))
37
- super(attributes)
38
- end
39
-
40
- def chef
41
- self[:chef]
42
- end
43
-
44
- def ssl
45
- self[:ssl]
46
- end
47
- end
48
- end