vagrant-r10k 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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