vagrant-r10k 0.2.0 → 0.3.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.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -2
  3. data/.pullreview.yml +4 -0
  4. data/.rspec +5 -0
  5. data/.ruby-version +1 -1
  6. data/.travis.yml +3 -1
  7. data/CHANGES.md +26 -0
  8. data/Gemfile +7 -2
  9. data/Gemfile.lock +181 -0
  10. data/README.md +122 -7
  11. data/Rakefile +111 -0
  12. data/lib/vagrant-r10k/action/base.rb +44 -0
  13. data/lib/vagrant-r10k/action/deploy.rb +91 -0
  14. data/lib/vagrant-r10k/action/validate.rb +46 -0
  15. data/lib/vagrant-r10k/config.rb +13 -4
  16. data/lib/vagrant-r10k/helpers.rb +174 -0
  17. data/lib/vagrant-r10k/plugin.rb +11 -5
  18. data/lib/vagrant-r10k/version.rb +2 -1
  19. data/spec/acceptance/skeletons/correct/Vagrantfile +21 -0
  20. data/spec/acceptance/skeletons/correct/gitcheck.sh +20 -0
  21. data/spec/acceptance/skeletons/correct/puppet/NOTmodules/.gitkeep +0 -0
  22. data/spec/acceptance/skeletons/correct/puppet/Puppetfile +12 -0
  23. data/spec/acceptance/skeletons/correct/puppet/manifests/default.pp +1 -0
  24. data/spec/acceptance/skeletons/correct/puppet/modules/.gitkeep +0 -0
  25. data/spec/acceptance/skeletons/could_not_resolve_host/Vagrantfile +21 -0
  26. data/spec/acceptance/skeletons/could_not_resolve_host/gitcheck.sh +20 -0
  27. data/spec/acceptance/skeletons/could_not_resolve_host/puppet/NOTmodules/.gitkeep +0 -0
  28. data/spec/acceptance/skeletons/could_not_resolve_host/puppet/Puppetfile +7 -0
  29. data/spec/acceptance/skeletons/could_not_resolve_host/puppet/manifests/default.pp +1 -0
  30. data/spec/acceptance/skeletons/could_not_resolve_host/puppet/modules/.gitkeep +0 -0
  31. data/spec/acceptance/skeletons/different_mod_path/Vagrantfile +19 -0
  32. data/spec/acceptance/skeletons/different_mod_path/gitcheck.sh +20 -0
  33. data/spec/acceptance/skeletons/different_mod_path/puppet/NOTmodules/.gitkeep +0 -0
  34. data/spec/acceptance/skeletons/different_mod_path/puppet/Puppetfile +12 -0
  35. data/spec/acceptance/skeletons/different_mod_path/puppet/manifests/default.pp +1 -0
  36. data/spec/acceptance/skeletons/different_mod_path/puppet/modules/.gitkeep +0 -0
  37. data/spec/acceptance/skeletons/no_mod_path/Vagrantfile +17 -0
  38. data/spec/acceptance/skeletons/no_mod_path/gitcheck.sh +20 -0
  39. data/spec/acceptance/skeletons/no_mod_path/puppet/NOTmodules/.gitkeep +0 -0
  40. data/spec/acceptance/skeletons/no_mod_path/puppet/Puppetfile +12 -0
  41. data/spec/acceptance/skeletons/no_mod_path/puppet/manifests/default.pp +1 -0
  42. data/spec/acceptance/skeletons/no_mod_path/puppet/modules/.gitkeep +0 -0
  43. data/spec/acceptance/skeletons/no_puppet_dir/Vagrantfile +18 -0
  44. data/spec/acceptance/skeletons/no_puppet_dir/gitcheck.sh +20 -0
  45. data/spec/acceptance/skeletons/no_vagrant_r10k/Vagrantfile +14 -0
  46. data/spec/acceptance/skeletons/no_vagrant_r10k/gitcheck.sh +20 -0
  47. data/spec/acceptance/skeletons/no_vagrant_r10k/puppet/NOTmodules/.gitkeep +0 -0
  48. data/spec/acceptance/skeletons/no_vagrant_r10k/puppet/Puppetfile +12 -0
  49. data/spec/acceptance/skeletons/no_vagrant_r10k/puppet/manifests/default.pp +1 -0
  50. data/spec/acceptance/skeletons/no_vagrant_r10k/puppet/modules/.gitkeep +0 -0
  51. data/spec/acceptance/skeletons/puppetfile_syntax_error/Vagrantfile +18 -0
  52. data/spec/acceptance/skeletons/puppetfile_syntax_error/gitcheck.sh +20 -0
  53. data/spec/acceptance/skeletons/puppetfile_syntax_error/puppet/Puppetfile +1 -0
  54. data/spec/acceptance/skeletons/puppetfile_syntax_error/puppet/manifests/default.pp +1 -0
  55. data/spec/acceptance/skeletons/puppetfile_syntax_error/puppet/modules/.gitkeep +0 -0
  56. data/spec/acceptance/vagrant-r10k/vagrant-r10k_spec.rb +255 -0
  57. data/spec/spec_helper.rb +10 -7
  58. data/spec/unit/action_base_spec.rb +57 -0
  59. data/spec/unit/action_deploy_spec.rb +550 -0
  60. data/spec/unit/action_validate_spec.rb +240 -0
  61. data/spec/unit/helpers_spec.rb +307 -0
  62. data/spec/unit/plugin_spec.rb +49 -0
  63. data/support/testrunner.py +189 -0
  64. data/vagrant-r10k.gemspec +1 -1
  65. data/vagrant-spec.config.rb +18 -0
  66. metadata +111 -19
  67. data/lib/vagrant-r10k/modulegetter.rb +0 -145
  68. data/spec/unit/modulegetter_spec.rb +0 -369
@@ -0,0 +1,240 @@
1
+ require 'spec_helper'
2
+ require_relative 'sharedcontext'
3
+ require_relative 'shared_expectations'
4
+ require 'vagrant-r10k/action/base'
5
+ require 'vagrant-r10k/action/validate'
6
+
7
+ include SharedExpectations
8
+
9
+ describe VagrantPlugins::R10k::Action::Validate do
10
+
11
+ subject { described_class.new(app, env) }
12
+
13
+ include_context 'vagrant-unit'
14
+
15
+ describe '#call' do
16
+ describe 'r10k not enabled' do
17
+ let(:pf_dbl) { double }
18
+ before do
19
+ allow_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:r10k_enabled?).and_return(false)
20
+ allow_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:provision_enabled?).and_return(true)
21
+ allow_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:r10k_config).with(env).and_return({:puppetfile_path => 'p'})
22
+ allow_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:get_puppetfile).and_return(pf_dbl)
23
+ end
24
+ include_context 'unit' do
25
+ let(:vagrantfile) { <<-EOF
26
+ Vagrant.configure('2') do |config|
27
+ config.vm.define :test
28
+ # r10k plugin to deploy puppet modules
29
+ # config.r10k.puppet_dir = 'puppet'
30
+ # config.r10k.puppetfile_path = 'puppet/Puppetfile'
31
+
32
+ # Provision the machine with the appliction
33
+ config.vm.provision "puppet" do |puppet|
34
+ puppet.manifests_path = "puppet/manifests"
35
+ puppet.manifest_file = "default.pp"
36
+ puppet.module_path = "puppet/modules"
37
+ end
38
+ end
39
+ EOF
40
+ }
41
+ end
42
+ it 'should send ui info and return' do
43
+ # positive assertions
44
+ expect_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:r10k_enabled?).with(env).once
45
+ expect(ui).to receive(:info).with("vagrant-r10k not configured; skipping").once
46
+ expect(app).to receive(:call).once.with(env)
47
+ # negative assetions
48
+ expect_any_instance_of(VagrantPlugins::R10k::Helpers).to_not receive(:provision_enabled?)
49
+ expect(ui).to_not receive(:info).with(/Beginning r10k deploy/)
50
+ expect(subject).to receive(:deploy).exactly(0).times
51
+ # run
52
+ expect(subject.call(env)).to be_nil
53
+ end
54
+ end
55
+
56
+ describe 'provisioning not enabled' do
57
+ let(:pf_dbl) { double }
58
+ before do
59
+ allow_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:r10k_enabled?).and_return(true)
60
+ allow_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:provision_enabled?).and_return(false)
61
+ allow_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:r10k_config).with(env).and_return({:puppetfile_path => 'p'})
62
+ allow_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:get_puppetfile).and_return(pf_dbl)
63
+ end
64
+ include_context 'unit' do
65
+ let(:vagrantfile) { <<-EOF
66
+ Vagrant.configure('2') do |config|
67
+ config.vm.define :test
68
+ # r10k plugin to deploy puppet modules
69
+ config.r10k.puppet_dir = 'puppet'
70
+ config.r10k.puppetfile_path = 'puppet/Puppetfile'
71
+
72
+ # Provision the machine with the appliction
73
+ config.vm.provision "puppet" do |puppet|
74
+ puppet.manifests_path = "puppet/manifests"
75
+ puppet.manifest_file = "default.pp"
76
+ puppet.module_path = "puppet/modules"
77
+ end
78
+ end
79
+ EOF
80
+ }
81
+ end
82
+ it 'should send ui info and return' do
83
+ # positive assertions
84
+ expect_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:r10k_enabled?).with(env).once
85
+ expect_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:provision_enabled?).with(env).once
86
+ expect(ui).to receive(:info).with("provisioning disabled; skipping vagrant-r10k").once
87
+ expect(app).to receive(:call).once.with(env)
88
+ # negative assetions
89
+ expect_any_instance_of(VagrantPlugins::R10k::Helpers).to_not receive(:r10k_config)
90
+ expect(ui).to_not receive(:info).with(/Beginning r10k deploy/)
91
+ expect(subject).to receive(:deploy).exactly(0).times
92
+ # run
93
+ expect(subject.call(env)).to be_nil
94
+ end
95
+ end
96
+
97
+ describe 'config is nil' do
98
+ let(:pf_dbl) { double }
99
+ before do
100
+ allow_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:r10k_enabled?).and_return(true)
101
+ allow_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:provision_enabled?).and_return(true)
102
+ allow_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:r10k_config).with(env).and_return(nil)
103
+ allow_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:get_puppetfile).and_return(pf_dbl)
104
+ end
105
+ include_context 'unit' do
106
+ let(:vagrantfile) { <<-EOF
107
+ Vagrant.configure('2') do |config|
108
+ config.vm.define :test
109
+ # r10k plugin to deploy puppet modules
110
+ config.r10k.puppet_dir = 'puppet'
111
+ config.r10k.puppetfile_path = 'puppet/Puppetfile'
112
+
113
+ # Provision the machine with the appliction
114
+ config.vm.provision "puppet" do |puppet|
115
+ puppet.manifests_path = "puppet/manifests"
116
+ puppet.manifest_file = "default.pp"
117
+ puppet.module_path = "puppet/modules"
118
+ end
119
+ end
120
+ EOF
121
+ }
122
+ end
123
+ it 'should raise exception' do
124
+ # positive assertions
125
+ expect_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:r10k_enabled?).with(env).once
126
+ expect_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:provision_enabled?).with(env).once
127
+ expect_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:r10k_config).with(env).once
128
+ logger = subject.instance_variable_get(:@logger)
129
+ expect(logger).to receive(:info).once.with("vagrant::r10k::deploy got nil configuration")
130
+ expect(app).to_not receive(:call)
131
+ # negative assetions
132
+ expect_any_instance_of(VagrantPlugins::R10k::Helpers).to_not receive(:r10k_config)
133
+ expect(ui).to_not receive(:info).with(/Beginning r10k deploy/)
134
+ expect(subject).to receive(:deploy).exactly(0).times
135
+ # run
136
+ expect { subject.call(env) }.to raise_error(VagrantPlugins::R10k::Helpers::ErrorWrapper, /vagrant-r10k configuration error; cannot continue/)
137
+ end
138
+ end
139
+
140
+ describe 'puppetfile passes validation' do
141
+ let(:config) {{
142
+ :env_dir_path => 'env/dir/path',
143
+ :puppetfile_path => 'puppetfile/path',
144
+ :module_path => 'module/path',
145
+ :manifests => 'manifests',
146
+ :manifest_file => 'manifest/file',
147
+ :puppet_dir => 'puppet/dir',
148
+ }}
149
+ let(:pf_dbl) { double }
150
+ before do
151
+ allow_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:r10k_enabled?).and_return(true)
152
+ allow_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:provision_enabled?).and_return(true)
153
+ allow_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:r10k_config).with(env).and_return(config)
154
+ allow_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:get_puppetfile).and_return(pf_dbl)
155
+ end
156
+ include_context 'unit' do
157
+ let(:vagrantfile) { <<-EOF
158
+ Vagrant.configure('2') do |config|
159
+ config.vm.define :test
160
+ # r10k plugin to deploy puppet modules
161
+ config.r10k.puppet_dir = 'puppet'
162
+ config.r10k.puppetfile_path = 'puppet/Puppetfile'
163
+
164
+ # Provision the machine with the appliction
165
+ config.vm.provision "puppet" do |puppet|
166
+ puppet.manifests_path = "puppet/manifests"
167
+ puppet.manifest_file = "default.pp"
168
+ puppet.module_path = "puppet/modules"
169
+ end
170
+ end
171
+ EOF
172
+ }
173
+ end
174
+ it 'should call app.call' do
175
+ # positive assertions
176
+ allow(pf_dbl).to receive(:load).exactly(1).times.and_return(true)
177
+ expect_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:r10k_enabled?).with(env).once
178
+ expect_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:provision_enabled?).with(env).once
179
+ expect_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:r10k_config).with(env).once
180
+ logger = subject.instance_variable_get(:@logger)
181
+ expect(logger).to receive(:debug).once.ordered.with("vagrant::r10k::validate called")
182
+ expect(logger).to receive(:debug).once.ordered.with("vagrant::r10k::validate: validating Puppetfile at puppetfile/path")
183
+ expect(pf_dbl).to receive(:load).once
184
+ expect(app).to receive(:call).once.with(env)
185
+ expect(subject.call(env)).to be_nil
186
+ end
187
+ end
188
+
189
+ describe 'puppetfile fails validation' do
190
+ let(:config) {{
191
+ :env_dir_path => 'env/dir/path',
192
+ :puppetfile_path => 'puppetfile/path',
193
+ :module_path => 'module/path',
194
+ :manifests => 'manifests',
195
+ :manifest_file => 'manifest/file',
196
+ :puppet_dir => 'puppet/dir',
197
+ }}
198
+ let(:pf_dbl) { double }
199
+ before do
200
+ allow_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:r10k_enabled?).and_return(true)
201
+ allow_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:provision_enabled?).and_return(true)
202
+ allow_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:r10k_config).with(env).and_return(config)
203
+ allow_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:get_puppetfile).and_return(pf_dbl)
204
+ end
205
+ include_context 'unit' do
206
+ let(:vagrantfile) { <<-EOF
207
+ Vagrant.configure('2') do |config|
208
+ config.vm.define :test
209
+ # r10k plugin to deploy puppet modules
210
+ config.r10k.puppet_dir = 'puppet'
211
+ config.r10k.puppetfile_path = 'puppet/Puppetfile'
212
+
213
+ # Provision the machine with the appliction
214
+ config.vm.provision "puppet" do |puppet|
215
+ puppet.manifests_path = "puppet/manifests"
216
+ puppet.manifest_file = "default.pp"
217
+ puppet.module_path = "puppet/modules"
218
+ end
219
+ end
220
+ EOF
221
+ }
222
+ end
223
+ it 'should call app.call' do
224
+ # positive assertions
225
+ allow(pf_dbl).to receive(:load).and_raise(RuntimeError)
226
+ expect_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:r10k_enabled?).with(env).once
227
+ expect_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:provision_enabled?).with(env).once
228
+ expect_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:r10k_config).with(env).once
229
+ logger = subject.instance_variable_get(:@logger)
230
+ expect(logger).to receive(:debug).once.ordered.with("vagrant::r10k::validate called")
231
+ expect(logger).to receive(:debug).once.ordered.with("vagrant::r10k::validate: validating Puppetfile at puppetfile/path")
232
+ expect(pf_dbl).to receive(:load).once
233
+ # negative assertions
234
+ expect(app).to_not receive(:call)
235
+ # run
236
+ expect { subject.call(env) }.to raise_error(VagrantPlugins::R10k::Helpers::ErrorWrapper)
237
+ end
238
+ end
239
+ end
240
+ end
@@ -0,0 +1,307 @@
1
+ require 'spec_helper'
2
+
3
+ require 'vagrant-r10k/helpers'
4
+
5
+ describe Log4r::Logger do
6
+ subject { described_class.new('testlogger') }
7
+ describe '#debug1' do
8
+ it 'should pass through to debug' do
9
+ expect(subject).to receive(:debug).with('a message').once
10
+ subject.debug1('a message')
11
+ end
12
+ end
13
+ describe '#debug2' do
14
+ it 'should pass through to debug' do
15
+ expect(subject).to receive(:debug).with('different message').once
16
+ subject.debug2('different message')
17
+ end
18
+ end
19
+ end
20
+
21
+ describe R10K::TaskRunner do
22
+ subject { described_class.new([]) }
23
+ describe '#get_errors' do
24
+ it 'returns @errors' do
25
+ subject.instance_variable_set(:@errors, ['foo'])
26
+ expect(subject).to receive(:get_errors).once.and_call_original
27
+ foo = subject.get_errors
28
+ expect(foo).to eq(['foo'])
29
+ end
30
+ end
31
+ end
32
+
33
+ describe VagrantPlugins::R10k::Helpers::ErrorWrapper do
34
+ describe '#initialize' do
35
+ it 'sets instance variable' do
36
+ foo = double
37
+ klass = described_class.new(foo)
38
+ expect(klass.instance_variable_get(:@original)).to eq(foo)
39
+ end
40
+ it 'has attr_reader' do
41
+ foo = double
42
+ klass = described_class.new(foo)
43
+ expect(klass.original).to eq(foo)
44
+ end
45
+ end
46
+ describe '#to_s' do
47
+ it 'returns the proper string' do
48
+ foo = double
49
+ allow(foo).to receive(:class).and_return('foo')
50
+ allow(foo).to receive(:to_s).and_return('foostr')
51
+ klass = described_class.new(foo)
52
+ expect(klass.to_s).to eq('foo: foostr')
53
+ end
54
+ end
55
+ describe '#method_missind' do
56
+ it 'sends to foo' do
57
+ foo = double
58
+ allow(foo).to receive(:bar).and_return('baz')
59
+ foo.should_receive(:bar).once
60
+ klass = described_class.new(foo)
61
+ expect(klass.bar).to eq('baz')
62
+ end
63
+ end
64
+ end
65
+
66
+ describe VagrantPlugins::R10k::Helpers do
67
+ include VagrantPlugins::R10k::Helpers
68
+
69
+ describe '#r10k_enabled?' do
70
+ context 'puppet_dir unset' do
71
+ it 'returns false' do
72
+ env = {:machine => double}
73
+ env[:machine].stub_chain(:config, :r10k, :puppet_dir).and_return(Vagrant::Plugin::V2::Config::UNSET_VALUE)
74
+ env[:machine].stub_chain(:config, :r10k, :puppetfile_path).and_return('/puppetfile/path')
75
+ expect(r10k_enabled?(env)).to be_falsey
76
+ end
77
+ end
78
+ context 'puppetfile_path unset' do
79
+ it 'returns false' do
80
+ env = {:machine => double}
81
+ env[:machine].stub_chain(:config, :r10k, :puppet_dir).and_return('/puppet/dir')
82
+ env[:machine].stub_chain(:config, :r10k, :puppetfile_path).and_return(Vagrant::Plugin::V2::Config::UNSET_VALUE)
83
+ expect(r10k_enabled?(env)).to be_falsey
84
+ end
85
+ end
86
+ context 'puppet_dir unset' do
87
+ it 'returns false' do
88
+ env = {:machine => double}
89
+ env[:machine].stub_chain(:config, :r10k, :puppet_dir).and_return('/puppet/dir')
90
+ env[:machine].stub_chain(:config, :r10k, :puppetfile_path).and_return('/puppetfile/path')
91
+ expect(r10k_enabled?(env)).to be_truthy
92
+ end
93
+ end
94
+ end
95
+
96
+ describe '#provision_enabled?' do
97
+ context 'env not set' do
98
+ it 'returns true' do
99
+ env = {}
100
+ expect(provision_enabled?(env)).to be_truthy
101
+ end
102
+ end
103
+ context 'env set to true' do
104
+ it 'returns true' do
105
+ env = {:provision_enabled => true}
106
+ expect(provision_enabled?(env)).to be_truthy
107
+ end
108
+ end
109
+ context 'env set to false' do
110
+ it 'returns false' do
111
+ env = {:provision_enabled => false}
112
+ expect(provision_enabled?(env)).to be_falsey
113
+ end
114
+ end
115
+ end
116
+
117
+ describe '#env_dir' do
118
+ it 'returns root_path' do
119
+ env = {:root_path => '/foo'}
120
+ expect(env_dir(env)).to eq('/foo')
121
+ end
122
+ end
123
+
124
+ describe '#puppetfile_path' do
125
+ before { allow_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:env_dir).and_return('/my/env/dir') }
126
+ it 'returns joined path' do
127
+ env = {:machine => double}
128
+ env[:machine].stub_chain(:config, :r10k, :puppetfile_path).and_return('path/to/puppetfile')
129
+ expect(puppetfile_path(env)).to eq('/my/env/dir/path/to/puppetfile')
130
+ end
131
+ end
132
+
133
+ describe '#puppet_provisioner' do
134
+ context 'one puppet provisioner with :type' do
135
+ it 'returns that provisioner' do
136
+ # double for puppet provisioner
137
+ prov_dbl = double
138
+ allow(prov_dbl).to receive(:type).and_return(:puppet)
139
+ provisioners = [prov_dbl]
140
+ # double for env
141
+ env = {:machine => double}
142
+ env[:machine].stub_chain(:config, :vm, :provisioners).and_return(provisioners)
143
+ expect(puppet_provisioner(env)).to eq(prov_dbl)
144
+ end
145
+ end
146
+ context 'one puppet provisioner with :name' do
147
+ it 'returns that provisioner' do
148
+ # double for puppet provisioner
149
+ prov_dbl = double
150
+ allow(prov_dbl).to receive(:name).and_return(:puppet)
151
+ provisioners = [prov_dbl]
152
+ # double for env
153
+ env = {:machine => double}
154
+ env[:machine].stub_chain(:config, :vm, :provisioners).and_return(provisioners)
155
+ expect(puppet_provisioner(env)).to eq(prov_dbl)
156
+ end
157
+ end
158
+ context 'no puppet provisioners' do
159
+ it 'returns nil' do
160
+ # double for chef provisioner
161
+ prov_dbl = double
162
+ allow(prov_dbl).to receive(:name).and_return(:chef)
163
+ # double for 'soemthing' provisioner
164
+ prov2_dbl = double
165
+ allow(prov2_dbl).to receive(:name).and_return(:something)
166
+ provisioners = [prov_dbl, prov2_dbl]
167
+ # double for env
168
+ env = {:machine => double}
169
+ env[:machine].stub_chain(:config, :vm, :provisioners).and_return(provisioners)
170
+ expect(puppet_provisioner(env)).to be_nil
171
+ end
172
+ end
173
+ context 'two puppet provisioners' do
174
+ it 'returns last provisioner' do
175
+ # double for puppet provisioner
176
+ prov_dbl = double
177
+ allow(prov_dbl).to receive(:type).and_return(:puppet)
178
+ # double for other puppet provisioner
179
+ prov2_dbl = double
180
+ allow(prov2_dbl).to receive(:name).and_return(:puppet)
181
+ provisioners = [prov_dbl, prov2_dbl]
182
+ # double for env
183
+ env = {:machine => double}
184
+ env[:machine].stub_chain(:config, :vm, :provisioners).and_return(provisioners)
185
+ expect(puppet_provisioner(env)).to eq(prov2_dbl)
186
+ end
187
+ end
188
+ end
189
+
190
+ describe '#r10k_config' do
191
+ context 'puppet_provisioner is nil' do
192
+ before do
193
+ allow_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:env_dir).and_return('/my/env/dir')
194
+ allow_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:puppetfile_path).and_return('puppet/file/path')
195
+ allow_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:puppet_provisioner).and_return(nil)
196
+ end
197
+ it 'returns nil' do
198
+ env = double
199
+ expect(r10k_config(env)).to be_nil
200
+ end
201
+ end
202
+ context 'module_path is nil' do
203
+ before do
204
+ allow_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:env_dir).and_return('/my/env/dir')
205
+ allow_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:puppetfile_path).and_return('puppet/file/path')
206
+ allow_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:puppet_provisioner).and_return(:pup_prov)
207
+ allow_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:module_path).and_return(nil)
208
+ end
209
+ it 'returns nil' do
210
+ env = double
211
+ expect(r10k_config(env)).to be_nil
212
+ end
213
+ end
214
+ context 'no methods return nil' do
215
+ before do
216
+ prov_dbl = double
217
+ prov_dbl.stub_chain(:config, :manifest_file).and_return('manifest/file')
218
+ prov_dbl.stub_chain(:config, :manifests_path).and_return([0, 'manifests/path'])
219
+ allow_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:env_dir).and_return('/my/env/dir')
220
+ allow_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:puppetfile_path).and_return('puppet/file/path')
221
+ allow_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:puppet_provisioner).and_return(prov_dbl)
222
+ allow_any_instance_of(VagrantPlugins::R10k::Helpers).to receive(:module_path).and_return('module/path')
223
+ end
224
+ it 'returns config' do
225
+ env = {:machine => double}
226
+ env[:machine].stub_chain(:config, :r10k, :puppet_dir).and_return('puppet/dir')
227
+ expect(r10k_config(env)).to eq({
228
+ :env_dir_path => '/my/env/dir',
229
+ :puppetfile_path => 'puppet/file/path',
230
+ :module_path => 'module/path',
231
+ :manifest_file => '/my/env/dir/manifest/file',
232
+ :manifests => '/my/env/dir/manifests/path',
233
+ :puppet_dir => '/my/env/dir/puppet/dir',
234
+ })
235
+ end
236
+ end
237
+ end
238
+
239
+ describe '#module_path' do
240
+ context 'config.r10k.module_path unset and provisioner module_path nil' do
241
+ it 'returns nil' do
242
+ prov_dbl = double
243
+ prov_dbl.stub_chain(:config, :module_path).and_return(nil)
244
+ env = {:machine => double, :ui => double}
245
+ allow(env[:ui]).to receive(:info).with("vagrant-r10k: Building the r10k module path with puppet provisioner module_path \"\". (if module_path is an array, first element is used)")
246
+ env[:machine].stub_chain(:config, :r10k, :module_path).and_return(Vagrant::Plugin::V2::Config::UNSET_VALUE)
247
+ expect(module_path(env, prov_dbl, '/env/dir/path')).to be_nil
248
+ end
249
+ end
250
+ context 'config.r10k.module_path unset and provisioner module_path string' do
251
+ it 'returns the joined module_path' do
252
+ prov_dbl = double
253
+ prov_dbl.stub_chain(:config, :module_path).and_return('module/path')
254
+ env = {:machine => double, :ui => double}
255
+ allow(env[:ui]).to receive(:info).with("vagrant-r10k: Building the r10k module path with puppet provisioner module_path \"module/path\". (if module_path is an array, first element is used)")
256
+ env[:machine].stub_chain(:config, :r10k, :module_path).and_return('module/path')
257
+ expect(module_path(env, prov_dbl, '/env/dir/path')).to eq('/env/dir/path/module/path')
258
+ end
259
+ end
260
+ context 'config.r10k.module_path unset and provisioner module_path array' do
261
+ it 'returns the joined first module_path' do
262
+ prov_dbl = double
263
+ prov_dbl.stub_chain(:config, :module_path).and_return(['module/path', 'foo'])
264
+ env = {:machine => double, :ui => double}
265
+ allow(env[:ui]).to receive(:info).with("vagrant-r10k: Building the r10k module path with puppet provisioner module_path \"module/path\". (if module_path is an array, first element is used)")
266
+ env[:machine].stub_chain(:config, :r10k, :module_path).and_return('module/path')
267
+ expect(module_path(env, prov_dbl, '/env/dir/path')).to eq('/env/dir/path/module/path')
268
+ end
269
+ end
270
+ context 'provisioner module_path array doesnt include r10k module_path' do
271
+ it 'raises ErrorWrapper' do
272
+ prov_dbl = double
273
+ prov_dbl.stub_chain(:config, :module_path).and_return(['module/path', 'foo'])
274
+ env = {:machine => double, :ui => double}
275
+ allow(env[:ui]).to receive(:info).with("vagrant-r10k: Building the r10k module path with puppet provisioner module_path \"\". (if module_path is an array, first element is used)")
276
+ env[:machine].stub_chain(:config, :r10k, :module_path).and_return('r10kmodule/path')
277
+ expect { module_path(env, prov_dbl, '/env/dir/path') }.to raise_error(VagrantPlugins::R10k::Helpers::ErrorWrapper, /module_path "r10kmodule\/path" is not within the ones defined in puppet provisioner; please correct this condition/)
278
+ end
279
+ end
280
+ context 'provisioner module_path string doesnt match r10k module_path' do
281
+ it 'raises ErrorWrapper' do
282
+ prov_dbl = double
283
+ prov_dbl.stub_chain(:config, :module_path).and_return('module/path')
284
+ env = {:machine => double, :ui => double}
285
+ allow(env[:ui]).to receive(:info).with("vagrant-r10k: Building the r10k module path with puppet provisioner module_path \"\". (if module_path is an array, first element is used)")
286
+ env[:machine].stub_chain(:config, :r10k, :module_path).and_return('r10kmodule/path')
287
+ expect { module_path(env, prov_dbl, '/env/dir/path') }.to raise_error(VagrantPlugins::R10k::Helpers::ErrorWrapper, /module_path "r10kmodule\/path" is not the same as in puppet provisioner; please correct this condition/)
288
+ end
289
+ end
290
+ end
291
+
292
+ describe '#get_puppetfile' do
293
+ it 'returns a Puppetfile' do
294
+ config = {
295
+ :puppet_dir => 'puppet/dir',
296
+ :module_path => 'module/path',
297
+ :puppetfile_path => 'puppetfile/path',
298
+ }
299
+ res = get_puppetfile(config)
300
+ expect(res).to be_a_kind_of(R10K::Puppetfile)
301
+ expect(res.instance_variable_get(:@basedir)).to eq('puppet/dir')
302
+ expect(res.instance_variable_get(:@moduledir)).to eq('module/path')
303
+ expect(res.instance_variable_get(:@puppetfile_path)).to eq('puppetfile/path')
304
+ end
305
+ end
306
+
307
+ end
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+ require_relative 'sharedcontext'
3
+ require_relative 'shared_expectations'
4
+ require 'vagrant-r10k/plugin'
5
+ require 'vagrant-r10k/action/base'
6
+
7
+ include SharedExpectations
8
+
9
+ describe VagrantPlugins::R10k::Plugin do
10
+ include_context 'vagrant-unit'
11
+ context 'action hooks' do
12
+ let(:hook) { double(append: true, prepend: true) }
13
+ it 'should set hooks' do
14
+ # I had lots of problems with this, but found an example at:
15
+ # https://github.com/petems/vagrant-puppet-install/blob/60b26f8d4f4d82b687bc527b239cba2baaf95731/test/unit/vagrant-puppet-install/plugin_spec.rb
16
+ [:machine_action_up, :machine_action_reload, :machine_action_provision].each do |action|
17
+ hook_proc = described_class.components.action_hooks[action][0]
18
+ hook = double
19
+ VagrantPlugins::R10k::Action::Base.stub(:validate => 'foo', :deploy => 'bar')
20
+ expect(hook).to receive(:after).with(Vagrant::Action::Builtin::ConfigValidate, 'foo')
21
+ expect(hook).to receive(:before).with(Vagrant::Action::Builtin::Provision, 'bar')
22
+ hook_proc.call(hook)
23
+ end
24
+ end
25
+ end
26
+ context 'config' do
27
+ it 'registers itself' do
28
+ expect(described_class.components.configs[:top].get(:r10k)).to_not be_nil
29
+ end
30
+ it 'uses the Config class' do
31
+ cfg = described_class.components.configs[:top].get(:r10k)
32
+ expect(cfg).to eq(VagrantPlugins::R10k::Config)
33
+ end
34
+ end
35
+ context 'attributes' do
36
+ it 'should have the proper name' do
37
+ expect(described_class.name).to eq('vagrant-r10k')
38
+ end
39
+ it 'should have the proper description' do
40
+ expect(described_class.description).to eq('Retrieve puppet modules based on a Puppetfile')
41
+ end
42
+ end
43
+ context 'instantiation' do
44
+ it 'is a vagrant v2 plugin' do
45
+ x = described_class.new
46
+ expect(x).to be_a_kind_of(Vagrant::Plugin::V2::Plugin)
47
+ end
48
+ end
49
+ end