puppet 6.25.0-x64-mingw32 → 6.27.0-x64-mingw32

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puppet might be problematic. Click here for more details.

Files changed (106) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +1 -1
  3. data/Gemfile +2 -2
  4. data/Gemfile.lock +39 -32
  5. data/lib/puppet/application/lookup.rb +74 -24
  6. data/lib/puppet/concurrent/thread_local_singleton.rb +5 -3
  7. data/lib/puppet/configurer.rb +65 -11
  8. data/lib/puppet/defaults.rb +19 -3
  9. data/lib/puppet/face/generate.rb +2 -0
  10. data/lib/puppet/file_serving/metadata.rb +3 -0
  11. data/lib/puppet/file_system/file_impl.rb +7 -7
  12. data/lib/puppet/file_system/jruby.rb +1 -1
  13. data/lib/puppet/file_system/windows.rb +4 -4
  14. data/lib/puppet/file_system.rb +1 -1
  15. data/lib/puppet/functions/next.rb +18 -1
  16. data/lib/puppet/functions/tree_each.rb +0 -1
  17. data/lib/puppet/functions/versioncmp.rb +6 -2
  18. data/lib/puppet/generate/type.rb +9 -0
  19. data/lib/puppet/http/client.rb +1 -1
  20. data/lib/puppet/http/redirector.rb +5 -0
  21. data/lib/puppet/node.rb +1 -1
  22. data/lib/puppet/parser/resource.rb +1 -1
  23. data/lib/puppet/pops/evaluator/closure.rb +7 -5
  24. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +1 -0
  25. data/lib/puppet/pops/parser/code_merger.rb +4 -4
  26. data/lib/puppet/pops/parser/egrammar.ra +2 -0
  27. data/lib/puppet/pops/parser/eparser.rb +813 -794
  28. data/lib/puppet/pops/serialization/to_data_converter.rb +6 -18
  29. data/lib/puppet/provider/service/init.rb +5 -4
  30. data/lib/puppet/resource/catalog.rb +1 -1
  31. data/lib/puppet/resource.rb +38 -5
  32. data/lib/puppet/ssl/ssl_provider.rb +10 -7
  33. data/lib/puppet/ssl/verifier.rb +6 -0
  34. data/lib/puppet/transaction/persistence.rb +22 -12
  35. data/lib/puppet/type/exec.rb +1 -1
  36. data/lib/puppet/type/file/data_sync.rb +1 -1
  37. data/lib/puppet/type/user.rb +40 -38
  38. data/lib/puppet/util/json.rb +17 -0
  39. data/lib/puppet/util/log.rb +7 -2
  40. data/lib/puppet/util/monkey_patches.rb +6 -2
  41. data/lib/puppet/util/package.rb +25 -16
  42. data/lib/puppet/util/windows/service.rb +0 -5
  43. data/lib/puppet/util/windows.rb +3 -0
  44. data/lib/puppet/util/yaml.rb +21 -2
  45. data/lib/puppet/util.rb +1 -2
  46. data/lib/puppet/version.rb +1 -1
  47. data/lib/puppet.rb +1 -0
  48. data/locales/puppet.pot +5 -10454
  49. data/man/man5/puppet.conf.5 +21 -2
  50. data/man/man8/puppet-agent.8 +1 -1
  51. data/man/man8/puppet-apply.8 +1 -1
  52. data/man/man8/puppet-catalog.8 +1 -1
  53. data/man/man8/puppet-config.8 +1 -1
  54. data/man/man8/puppet-describe.8 +1 -1
  55. data/man/man8/puppet-device.8 +1 -1
  56. data/man/man8/puppet-doc.8 +1 -1
  57. data/man/man8/puppet-epp.8 +1 -1
  58. data/man/man8/puppet-facts.8 +1 -1
  59. data/man/man8/puppet-filebucket.8 +1 -1
  60. data/man/man8/puppet-generate.8 +1 -1
  61. data/man/man8/puppet-help.8 +1 -1
  62. data/man/man8/puppet-key.8 +1 -1
  63. data/man/man8/puppet-lookup.8 +9 -6
  64. data/man/man8/puppet-man.8 +1 -1
  65. data/man/man8/puppet-module.8 +1 -1
  66. data/man/man8/puppet-node.8 +1 -1
  67. data/man/man8/puppet-parser.8 +1 -1
  68. data/man/man8/puppet-plugin.8 +1 -1
  69. data/man/man8/puppet-report.8 +1 -1
  70. data/man/man8/puppet-resource.8 +1 -1
  71. data/man/man8/puppet-script.8 +1 -1
  72. data/man/man8/puppet-ssl.8 +1 -1
  73. data/man/man8/puppet-status.8 +1 -1
  74. data/man/man8/puppet.8 +2 -2
  75. data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +2 -1
  76. data/spec/fixtures/unit/forge/bacula.json +1 -1
  77. data/spec/integration/application/agent_spec.rb +28 -0
  78. data/spec/integration/application/lookup_spec.rb +81 -50
  79. data/spec/integration/application/resource_spec.rb +6 -2
  80. data/spec/integration/http/client_spec.rb +30 -0
  81. data/spec/integration/parser/pcore_resource_spec.rb +10 -0
  82. data/spec/shared_contexts/l10n.rb +5 -0
  83. data/spec/unit/application/lookup_spec.rb +131 -10
  84. data/spec/unit/concurrent/thread_local_singleton_spec.rb +39 -0
  85. data/spec/unit/configurer_spec.rb +197 -73
  86. data/spec/unit/face/generate_spec.rb +64 -0
  87. data/spec/unit/file_system_spec.rb +34 -4
  88. data/spec/unit/forge/module_release_spec.rb +3 -3
  89. data/spec/unit/functions/versioncmp_spec.rb +40 -4
  90. data/spec/unit/http/client_spec.rb +58 -1
  91. data/spec/unit/node_spec.rb +6 -0
  92. data/spec/unit/pops/parser/parse_containers_spec.rb +2 -2
  93. data/spec/unit/pops/serialization/to_from_hr_spec.rb +0 -58
  94. data/spec/unit/pops/validator/validator_spec.rb +5 -0
  95. data/spec/unit/provider/service/gentoo_spec.rb +6 -5
  96. data/spec/unit/provider/service/init_spec.rb +15 -9
  97. data/spec/unit/provider/service/openwrt_spec.rb +21 -29
  98. data/spec/unit/provider/service/redhat_spec.rb +3 -2
  99. data/spec/unit/resource/catalog_spec.rb +14 -1
  100. data/spec/unit/resource_spec.rb +58 -2
  101. data/spec/unit/transaction/persistence_spec.rb +51 -0
  102. data/spec/unit/type/user_spec.rb +0 -45
  103. data/spec/unit/util/json_spec.rb +126 -0
  104. data/spec/unit/util/windows_spec.rb +23 -0
  105. data/spec/unit/util/yaml_spec.rb +54 -29
  106. metadata +9 -3
@@ -221,6 +221,70 @@ describe Puppet::Face[:generate, :current] do
221
221
  end
222
222
 
223
223
  end
224
+
225
+ context "in an environment with a faulty type" do
226
+ let(:dir) do
227
+ dir_containing('environments', { 'testing_generate2' => {
228
+ 'environment.conf' => "modulepath = modules",
229
+ 'manifests' => { 'site.pp' => "" },
230
+ 'modules' => {
231
+ 'm3' => {
232
+ 'lib' => { 'puppet' => { 'type' => {
233
+ 'test3.rb' => <<-EOF
234
+ module Puppet
235
+ Type.newtype(:test3) do
236
+ @doc = "Docs for resource"
237
+ def self.title_patterns
238
+ identity = lambda {|x| x}
239
+ [
240
+ [
241
+ /^(.*)_(.*)$/,
242
+ [
243
+ [:name, identity ]
244
+ ]
245
+ ]
246
+ ]
247
+ end
248
+ newproperty(:message) do
249
+ desc "Docs for 'message' property"
250
+ end
251
+ newparam(:name) do
252
+ desc "Docs for 'name' parameter"
253
+ isnamevar
254
+ end
255
+ end; end
256
+ EOF
257
+ } }
258
+ }
259
+ }
260
+ }}})
261
+ end
262
+
263
+ let(:modulepath) do
264
+ File.join(dir, 'testing_generate2', 'modules')
265
+ end
266
+
267
+ let(:m3) do
268
+ File.join(modulepath, 'm3')
269
+ end
270
+
271
+ around(:each) do |example|
272
+ Puppet.settings.initialize_global_settings
273
+ Puppet[:manifest] = ''
274
+ loader = Puppet::Environments::Directories.new(dir, [])
275
+ Puppet.override(:environments => loader) do
276
+ Puppet.override(:current_environment => loader.get('testing_generate2')) do
277
+ example.run
278
+ end
279
+ end
280
+ end
281
+
282
+ it 'fails when using procs for title patterns' do
283
+ expect {
284
+ genface.types(:format => 'pcore')
285
+ }.to exit_with(1)
286
+ end
287
+ end
224
288
  end
225
289
 
226
290
  def from_an_interactive_terminal
@@ -984,11 +984,12 @@ describe "Puppet::FileSystem" do
984
984
  end
985
985
 
986
986
  it 'preserves file ownership' do
987
- allow(Puppet::FileSystem).to receive(:lstat)
988
- .with(Puppet::FileSystem.pathname(dest))
989
- .and_return(double(uid: 1, gid: 2))
987
+ FileUtils.touch(dest)
988
+ allow(File).to receive(:lstat).and_call_original
989
+ allow(File).to receive(:lstat).with(Pathname.new(dest)).and_return(double(uid: 1, gid: 2, 'directory?': false))
990
990
 
991
- expect(FileUtils).to receive(:chown).with(1, 2, /#{dest}/)
991
+ allow(File).to receive(:chown).and_call_original
992
+ expect(FileUtils).to receive(:chown).with(1, 2, any_args)
992
993
 
993
994
  Puppet::FileSystem.replace_file(dest, 0644) { |f| f.write(content) }
994
995
  end
@@ -1163,4 +1164,33 @@ describe "Puppet::FileSystem" do
1163
1164
  expect(File.mtime(dest)).to be_within(1).of(tomorrow)
1164
1165
  end
1165
1166
  end
1167
+
1168
+ context '#chmod' do
1169
+ let(:dest) { tmpfile('abs_file') }
1170
+
1171
+ it "changes the mode given an absolute string" do
1172
+ Puppet::FileSystem.touch(dest)
1173
+ Puppet::FileSystem.chmod(0644, dest)
1174
+ expect(File.stat(dest).mode & 0777).to eq(0644)
1175
+ end
1176
+
1177
+ it "returns true if given an absolute pathname" do
1178
+ Puppet::FileSystem.touch(dest)
1179
+ Puppet::FileSystem.chmod(0644, Pathname.new(dest))
1180
+ expect(File.stat(dest).mode & 0777).to eq(0644)
1181
+ end
1182
+
1183
+ it "raises if the file doesn't exist" do
1184
+ klass = Puppet::Util::Platform.windows? ? Puppet::Error : Errno::ENOENT
1185
+ expect {
1186
+ Puppet::FileSystem.chmod(0644, dest)
1187
+ }.to raise_error(klass)
1188
+ end
1189
+
1190
+ it "raises ArgumentError if dest is invalid" do
1191
+ expect {
1192
+ Puppet::FileSystem.chmod(0644, nil)
1193
+ }.to raise_error(ArgumentError, /expected Pathname, got: 'NilClass'/)
1194
+ end
1195
+ end
1166
1196
  end
@@ -90,7 +90,7 @@ describe Puppet::Forge::ModuleRelease do
90
90
  "checksums": { },
91
91
  "version": "#{module_version}",
92
92
  "description": "Standard Library for Puppet Modules",
93
- "source": "git://github.com/puppetlabs/puppetlabs-stdlib.git",
93
+ "source": "https://github.com/puppetlabs/puppetlabs-stdlib",
94
94
  "project_page": "https://github.com/puppetlabs/puppetlabs-stdlib",
95
95
  "summary": "Puppet Module Standard Library",
96
96
  "dependencies": [
@@ -204,7 +204,7 @@ describe Puppet::Forge::ModuleRelease do
204
204
  "checksums": { },
205
205
  "version": "#{module_version}",
206
206
  "description": "Standard Library for Puppet Modules",
207
- "source": "git://github.com/puppetlabs/puppetlabs-stdlib.git",
207
+ "source": "https://github.com/puppetlabs/puppetlabs-stdlib",
208
208
  "project_page": "https://github.com/puppetlabs/puppetlabs-stdlib",
209
209
  "summary": "Puppet Module Standard Library",
210
210
  "author": "#{module_author}",
@@ -279,7 +279,7 @@ describe Puppet::Forge::ModuleRelease do
279
279
  "checksums": { },
280
280
  "version": "#{module_version}",
281
281
  "description": "Standard Library for Puppet Modules",
282
- "source": "git://github.com/puppetlabs/puppetlabs-stdlib.git",
282
+ "source": "https://github.com/puppetlabs/puppetlabs-stdlib",
283
283
  "project_page": "https://github.com/puppetlabs/puppetlabs-stdlib",
284
284
  "summary": "Puppet Module Standard Library",
285
285
  "dependencies": [
@@ -19,16 +19,52 @@ describe "the versioncmp function" do
19
19
  let(:type_parser) { Puppet::Pops::Types::TypeParser.singleton }
20
20
 
21
21
  it 'should raise an Error if there is less than 2 arguments' do
22
- expect { versioncmp('a,b') }.to raise_error(/expects 2 arguments, got 1/)
22
+ expect { versioncmp('a,b') }.to raise_error(/expects between 2 and 3 arguments, got 1/)
23
23
  end
24
24
 
25
- it 'should raise an Error if there is more than 2 arguments' do
26
- expect { versioncmp('a,b','foo', 'bar') }.to raise_error(/expects 2 arguments, got 3/)
25
+ it 'should raise an Error if there is more than 3 arguments' do
26
+ expect { versioncmp('a,b','foo', false, 'bar') }.to raise_error(/expects between 2 and 3 arguments, got 4/)
27
27
  end
28
28
 
29
29
  it "should call Puppet::Util::Package.versioncmp (included in scope)" do
30
- expect(Puppet::Util::Package).to receive(:versioncmp).with('1.2', '1.3').and_return(-1)
30
+ expect(Puppet::Util::Package).to receive(:versioncmp).with('1.2', '1.3', false).and_return(-1)
31
31
 
32
32
  expect(versioncmp('1.2', '1.3')).to eq(-1)
33
33
  end
34
+
35
+ context "when ignore_trailing_zeroes is true" do
36
+ it "should equate versions with 2 elements and dots but with unnecessary zero" do
37
+ expect(versioncmp("10.1.0", "10.1", true)).to eq(0)
38
+ end
39
+
40
+ it "should equate versions with 1 element and dot but with unnecessary zero" do
41
+ expect(versioncmp("11.0", "11", true)).to eq(0)
42
+ end
43
+
44
+ it "should equate versions with 1 element and dot but with unnecessary zeros" do
45
+ expect(versioncmp("11.00", "11", true)).to eq(0)
46
+ end
47
+
48
+ it "should equate versions with dots and iregular zeroes" do
49
+ expect(versioncmp("11.0.00", "11", true)).to eq(0)
50
+ end
51
+
52
+ it "should equate versions with dashes" do
53
+ expect(versioncmp("10.1-0", "10.1.0-0", true)).to eq(0)
54
+ end
55
+
56
+ it "should compare versions with dashes after normalization" do
57
+ expect(versioncmp("10.1-1", "10.1.0-0", true)).to eq(1)
58
+ end
59
+
60
+ it "should not normalize versions if zeros are not trailing" do
61
+ expect(versioncmp("1.1", "1.0.1", true)).to eq(1)
62
+ end
63
+ end
64
+
65
+ context "when ignore_trailing_zeroes is false" do
66
+ it "should not equate versions if zeros are not trailing" do
67
+ expect(versioncmp("1.1", "1.0.1")).to eq(1)
68
+ end
69
+ end
34
70
  end
@@ -597,11 +597,68 @@ describe Puppet::HTTP::Client do
597
597
  expect(response).to be_success
598
598
  end
599
599
 
600
- it "preserves basic authorization" do
600
+ it "does not preserve basic authorization when redirecting to different hosts" do
601
+ stub_request(:get, start_url).with(basic_auth: credentials).to_return(redirect_to(url: other_host))
602
+ stub_request(:get, other_host).to_return(status: 200)
603
+
604
+ client.get(start_url, options: {basic_auth: {user: 'user', password: 'pass'}})
605
+ expect(a_request(:get, other_host).
606
+ with{ |req| !req.headers.key?('Authorization')}).to have_been_made
607
+ end
608
+
609
+ it "does preserve basic authorization when redirecting to the same hosts" do
610
+ stub_request(:get, start_url).with(basic_auth: credentials).to_return(redirect_to(url: bar_url))
611
+ stub_request(:get, bar_url).with(basic_auth: credentials).to_return(status: 200)
612
+
613
+ client.get(start_url, options: {basic_auth: {user: 'user', password: 'pass'}})
614
+ expect(a_request(:get, bar_url).
615
+ with{ |req| req.headers.key?('Authorization')}).to have_been_made
616
+ end
617
+
618
+ it "does not preserve cookie header when redirecting to different hosts" do
619
+ headers = { 'Cookie' => 'TEST_COOKIE'}
620
+
621
+ stub_request(:get, start_url).with(headers: headers).to_return(redirect_to(url: other_host))
622
+ stub_request(:get, other_host).to_return(status: 200)
623
+
624
+ client.get(start_url, headers: headers)
625
+ expect(a_request(:get, other_host).
626
+ with{ |req| !req.headers.key?('Cookie')}).to have_been_made
627
+ end
628
+
629
+ it "does preserve cookie header when redirecting to the same hosts" do
630
+ headers = { 'Cookie' => 'TEST_COOKIE'}
631
+
632
+ stub_request(:get, start_url).with(headers: headers).to_return(redirect_to(url: bar_url))
633
+ stub_request(:get, bar_url).with(headers: headers).to_return(status: 200)
634
+
635
+ client.get(start_url, headers: headers)
636
+ expect(a_request(:get, bar_url).
637
+ with{ |req| req.headers.key?('Cookie')}).to have_been_made
638
+ end
639
+
640
+ it "does preserves cookie header and basic authentication when Puppet[:location_trusted] is true redirecting to different hosts" do
641
+ headers = { 'cookie' => 'TEST_COOKIE'}
642
+ Puppet[:location_trusted] = true
643
+
644
+ stub_request(:get, start_url).with(headers: headers, basic_auth: credentials).to_return(redirect_to(url: other_host))
645
+ stub_request(:get, other_host).with(headers: headers, basic_auth: credentials).to_return(status: 200)
646
+
647
+ client.get(start_url, headers: headers, options: {basic_auth: {user: 'user', password: 'pass'}})
648
+ expect(a_request(:get, other_host).
649
+ with{ |req| req.headers.key?('Authorization') && req.headers.key?('Cookie')}).to have_been_made
650
+ end
651
+
652
+ it "treats hosts as case-insensitive" do
653
+ start_url = URI("https://www.EXAmple.com:8140/Start")
654
+ bar_url = "https://www.example.com:8140/bar"
655
+
601
656
  stub_request(:get, start_url).with(basic_auth: credentials).to_return(redirect_to(url: bar_url))
602
657
  stub_request(:get, bar_url).with(basic_auth: credentials).to_return(status: 200)
603
658
 
604
659
  client.get(start_url, options: {basic_auth: {user: 'user', password: 'pass'}})
660
+ expect(a_request(:get, bar_url).
661
+ with{ |req| req.headers.key?('Authorization')}).to have_been_made
605
662
  end
606
663
 
607
664
  it "redirects given a relative location" do
@@ -40,6 +40,12 @@ describe Puppet::Node do
40
40
  expect(node.environment.name).to eq(:bar)
41
41
  end
42
42
 
43
+ it "sets environment_name with the correct environment name" do
44
+ node = Puppet::Node.new("foo")
45
+ node.environment = Puppet::Node::Environment.remote('www123')
46
+ expect(node.environment_name).to eq(:www123)
47
+ end
48
+
43
49
  it "allows its environment to be set by parameters after initialization" do
44
50
  node = Puppet::Node.new("foo")
45
51
  node.parameters["environment"] = :bar
@@ -106,7 +106,7 @@ describe "egrammar parsing containers" do
106
106
 
107
107
  context 'it should allow keywords as attribute names' do
108
108
  ['and', 'case', 'class', 'default', 'define', 'else', 'elsif', 'if', 'in', 'inherits', 'node', 'or',
109
- 'undef', 'unless', 'type', 'attr', 'function', 'private'].each do |keyword|
109
+ 'undef', 'unless', 'type', 'attr', 'function', 'private', 'plan', 'apply'].each do |keyword|
110
110
  it "such as #{keyword}" do
111
111
  expect { parse("class x ($#{keyword}){} class { x: #{keyword} => 1 }") }.to_not raise_error
112
112
  end
@@ -178,7 +178,7 @@ describe "egrammar parsing containers" do
178
178
 
179
179
  context 'it should allow keywords as attribute names' do
180
180
  ['and', 'case', 'class', 'default', 'define', 'else', 'elsif', 'if', 'in', 'inherits', 'node', 'or',
181
- 'undef', 'unless', 'type', 'attr', 'function', 'private'].each do |keyword|
181
+ 'undef', 'unless', 'type', 'attr', 'function', 'private', 'plan', 'apply'].each do |keyword|
182
182
  it "such as #{keyword}" do
183
183
  expect {parse("define x ($#{keyword}){} x { y: #{keyword} => 1 }")}.to_not raise_error
184
184
  end
@@ -559,29 +559,6 @@ module Serialization
559
559
  expect(warnings).to eql(["['key'] contains the special value default. It will be converted to the String 'default'"])
560
560
  end
561
561
  end
562
- context 'and force_symbol set to true' do
563
- let(:to_converter) { ToDataConverter.new(:rich_data => false, :force_symbol => true) }
564
-
565
- it 'A Hash with Symbol values is converted to hash with Symbol values' do
566
- val = { 'one' => :one, 'two' => :two }
567
- Puppet::Util::Log.with_destination(Puppet::Test::LogCollector.new(logs)) do
568
-
569
- # write and read methods does not work here as we cannot force Symbols in Json.
570
- # and a hash with symbol values cannot be an instance of Types::TypeFactory.data.
571
- # Using YAML for this instead
572
- io.reopen
573
- value = to_converter.convert(val)
574
- io << [value].to_yaml
575
- io.rewind
576
-
577
- val2 = from_converter.convert(YAML::load(io.read)[0])
578
-
579
- expect(val2).to be_a(Hash)
580
- expect(val2).to eql({ 'one' => :one, 'two' => :two })
581
- end
582
- expect(warnings).to be_empty
583
- end
584
- end
585
562
  end
586
563
 
587
564
  context 'with rich_data is set to true' do
@@ -655,41 +632,6 @@ module Serialization
655
632
  end.to raise_error(/Cannot create a Pcore::TimestampType from a (Fixnum|Integer)/)
656
633
  end
657
634
  end
658
-
659
- context 'when data is unknown' do
660
- let(:to_converter) { ToDataConverter.new(:message_prefix => 'Test Hash') }
661
- let(:logs) { [] }
662
- let(:warnings) { logs.select { |log| log.level == :warning }.map { |log| log.message } }
663
- let(:val) { Class.new }
664
-
665
- context 'and :silence_warnings undefined or set to false' do
666
- it 'convert the unknown data to string with warnings' do
667
- Puppet::Util::Log.with_destination(Puppet::Test::LogCollector.new(logs)) do
668
- write(val)
669
- val2 = read
670
- expect(val2).to be_a(String)
671
- expect(val2).to match(/Class/)
672
- end
673
- expect(warnings).to eql([
674
- "Test Hash contains a #{val.class} value. It will be converted to the String '#{val.to_s}'"])
675
- end
676
- end
677
-
678
- context 'and :silence_warnings undefined or set to true' do
679
- let(:to_converter) { ToDataConverter.new(:message_prefix => 'Test Hash', :silence_warnings => true) }
680
-
681
- it 'convert the unknown data to string without warnings if silence_warnings set to true' do
682
- val = Class.new
683
- Puppet::Util::Log.with_destination(Puppet::Test::LogCollector.new(logs)) do
684
- write(val)
685
- val2 = read
686
- expect(val2).to be_a(String)
687
- expect(val2).to match(/Class/)
688
- end
689
- expect(warnings).to be_empty
690
- end
691
- end
692
- end
693
635
  end
694
636
  end
695
637
  end
@@ -432,6 +432,11 @@ describe "validating 4x" do
432
432
  expect(acceptor.error_count).to eql(0)
433
433
  end
434
434
 
435
+ it 'allows apply to be used as a resource attribute name' do
436
+ acceptor = validate(parse('apply("foo.example.com") { sometype { "resourcetitle": apply => "applyvalue" } }'))
437
+ expect(acceptor.error_count).to eql(0)
438
+ end
439
+
435
440
  it 'accepts multiple arguments' do
436
441
  acceptor = validate(parse('apply(["foo.example.com"], { "other" => "args" }) { }'))
437
442
  expect(acceptor.error_count).to eql(0)
@@ -10,8 +10,8 @@ describe 'Puppet::Type::Service::Provider::Gentoo',
10
10
 
11
11
  before :each do
12
12
  allow(Puppet::Type.type(:service)).to receive(:defaultprovider).and_return(provider_class)
13
- allow(FileTest).to receive(:file?).with('/sbin/rc-update').and_return(true)
14
- allow(FileTest).to receive(:executable?).with('/sbin/rc-update').and_return(true)
13
+ allow(Puppet::FileSystem).to receive(:file?).with('/sbin/rc-update').and_return(true)
14
+ allow(Puppet::FileSystem).to receive(:executable?).with('/sbin/rc-update').and_return(true)
15
15
  allow(Facter).to receive(:value).with(:operatingsystem).and_return('Gentoo')
16
16
  allow(Facter).to receive(:value).with(:osfamily).and_return('Gentoo')
17
17
 
@@ -52,13 +52,14 @@ describe 'Puppet::Type::Service::Provider::Gentoo',
52
52
  end
53
53
 
54
54
  it "should get a list of services from /etc/init.d but exclude helper scripts" do
55
- expect(FileTest).to receive(:directory?).with('/etc/init.d').and_return(true)
55
+ allow(Puppet::FileSystem).to receive(:directory?).and_call_original
56
+ allow(Puppet::FileSystem).to receive(:directory?).with('/etc/init.d').and_return(true)
56
57
  expect(Dir).to receive(:entries).with('/etc/init.d').and_return(initscripts)
57
58
  (initscripts - helperscripts).each do |script|
58
- expect(FileTest).to receive(:executable?).with("/etc/init.d/#{script}").and_return(true)
59
+ expect(Puppet::FileSystem).to receive(:executable?).with("/etc/init.d/#{script}").and_return(true)
59
60
  end
60
61
  helperscripts.each do |script|
61
- expect(FileTest).not_to receive(:executable?).with("/etc/init.d/#{script}")
62
+ expect(Puppet::FileSystem).not_to receive(:executable?).with("/etc/init.d/#{script}")
62
63
  end
63
64
 
64
65
  allow(Puppet::FileSystem).to receive(:symlink?).and_return(false)
@@ -85,14 +85,20 @@ describe 'Puppet::Type::Service::Provider::Init',
85
85
  @services = ['one', 'two', 'three', 'four', 'umountfs']
86
86
  allow(Dir).to receive(:entries).and_call_original
87
87
  allow(Dir).to receive(:entries).with('tmp').and_return(@services)
88
- expect(FileTest).to receive(:directory?).with('tmp').and_return(true)
89
- allow(FileTest).to receive(:executable?).and_return(true)
88
+ allow(Puppet::FileSystem).to receive(:directory?).and_call_original
89
+ allow(Puppet::FileSystem).to receive(:directory?).with('tmp').and_return(true)
90
+ allow(Puppet::FileSystem).to receive(:executable?).and_return(true)
90
91
  end
91
92
 
92
93
  it "should return instances for all services" do
93
94
  expect(provider_class.instances.map(&:name)).to eq(@services)
94
95
  end
95
96
 
97
+ it "should omit directories from the service list" do
98
+ expect(Puppet::FileSystem).to receive(:directory?).with('tmp/four').and_return(true)
99
+ expect(provider_class.instances.map(&:name)).to eq(@services - ['four'])
100
+ end
101
+
96
102
  it "should omit an array of services from exclude list" do
97
103
  exclude = ['two', 'four']
98
104
  expect(provider_class.get_services(provider_class.defpath, exclude).map(&:name)).to eq(@services - exclude)
@@ -140,9 +146,9 @@ describe 'Puppet::Type::Service::Provider::Init',
140
146
 
141
147
  describe "when checking valid paths" do
142
148
  it "should discard paths that do not exist" do
143
- expect(File).to receive(:directory?).with(paths[0]).and_return(false)
149
+ expect(Puppet::FileSystem).to receive(:directory?).with(paths[0]).and_return(false)
144
150
  expect(Puppet::FileSystem).to receive(:exist?).with(paths[0]).and_return(false)
145
- expect(File).to receive(:directory?).with(paths[1]).and_return(true)
151
+ expect(Puppet::FileSystem).to receive(:directory?).with(paths[1]).and_return(true)
146
152
 
147
153
  expect(provider.paths).to eq([paths[1]])
148
154
  end
@@ -150,7 +156,7 @@ describe 'Puppet::Type::Service::Provider::Init',
150
156
  it "should discard paths that are not directories" do
151
157
  paths.each do |path|
152
158
  expect(Puppet::FileSystem).to receive(:exist?).with(path).and_return(true)
153
- expect(File).to receive(:directory?).with(path).and_return(false)
159
+ expect(Puppet::FileSystem).to receive(:directory?).with(path).and_return(false)
154
160
  end
155
161
  expect(provider.paths).to be_empty
156
162
  end
@@ -158,7 +164,7 @@ describe 'Puppet::Type::Service::Provider::Init',
158
164
 
159
165
  describe "when searching for the init script" do
160
166
  before :each do
161
- paths.each {|path| expect(File).to receive(:directory?).with(path).and_return(true) }
167
+ paths.each {|path| expect(Puppet::FileSystem).to receive(:directory?).with(path).and_return(true) }
162
168
  end
163
169
 
164
170
  it "should be able to find the init script in the service path" do
@@ -191,9 +197,9 @@ describe 'Puppet::Type::Service::Provider::Init',
191
197
 
192
198
  describe "if the init script is present" do
193
199
  before :each do
194
- allow(File).to receive(:directory?).and_call_original
195
- allow(File).to receive(:directory?).with("/service/path").and_return(true)
196
- allow(File).to receive(:directory?).with("/alt/service/path").and_return(true)
200
+ allow(Puppet::FileSystem).to receive(:directory?).and_call_original
201
+ allow(Puppet::FileSystem).to receive(:directory?).with("/service/path").and_return(true)
202
+ allow(Puppet::FileSystem).to receive(:directory?).with("/alt/service/path").and_return(true)
197
203
  allow(Puppet::FileSystem).to receive(:exist?).with("/service/path/myservice").and_return(true)
198
204
  end
199
205
 
@@ -2,63 +2,56 @@ require 'spec_helper'
2
2
 
3
3
  describe 'Puppet::Type::Service::Provider::Openwrt',
4
4
  unless: Puppet::Util::Platform.windows? || Puppet::Util::Platform.jruby? do
5
+
5
6
  let(:provider_class) { Puppet::Type.type(:service).provider(:openwrt) }
6
7
 
7
8
  let(:resource) do
8
- resource = double('resource')
9
- allow(resource).to receive(:[]).and_return(nil)
10
- allow(resource).to receive(:[]).with(:name).and_return("myservice")
11
- allow(resource).to receive(:[]).with(:path).and_return(["/etc/init.d"])
12
-
13
- resource
9
+ Puppet::Type.type(:service).new(
10
+ :name => 'myservice',
11
+ :path => '/etc/init.d',
12
+ :hasrestart => true,
13
+ )
14
14
  end
15
15
 
16
16
  let(:provider) do
17
17
  provider = provider_class.new
18
- allow(provider).to receive(:get).with(:hasstatus).and_return(false)
19
-
18
+ provider.resource = resource
20
19
  provider
21
20
  end
22
21
 
23
22
  before :each do
24
- allow(resource).to receive(:provider).and_return(provider)
25
- provider.resource = resource
26
-
27
- allow(FileTest).to receive(:file?).with('/etc/rc.common').and_return(true)
28
- allow(FileTest).to receive(:executable?).with('/etc/rc.common').and_return(true)
23
+ resource.provider = provider
29
24
 
30
25
  # All OpenWrt tests operate on the init script directly. It must exist.
31
- allow(File).to receive(:directory?).and_call_original
32
- allow(File).to receive(:directory?).with('/etc/init.d').and_return(true)
26
+ allow(Puppet::FileSystem).to receive(:directory?).and_call_original
27
+ allow(Puppet::FileSystem).to receive(:directory?).with('/etc/init.d').and_return(true)
33
28
 
34
29
  allow(Puppet::FileSystem).to receive(:exist?).with('/etc/init.d/myservice').and_return(true)
35
- allow(FileTest).to receive(:file?).and_call_original
36
- allow(FileTest).to receive(:file?).with('/etc/init.d/myservice').and_return(true)
37
- allow(FileTest).to receive(:executable?).with('/etc/init.d/myservice').and_return(true)
30
+ allow(Puppet::FileSystem).to receive(:file?).and_call_original
31
+ allow(Puppet::FileSystem).to receive(:file?).with('/etc/init.d/myservice').and_return(true)
32
+ allow(Puppet::FileSystem).to receive(:executable?).with('/etc/init.d/myservice').and_return(true)
38
33
  end
39
34
 
40
- operatingsystem = 'openwrt'
41
- it "should be the default provider on #{operatingsystem}" do
42
- expect(Facter).to receive(:value).with(:operatingsystem).and_return(operatingsystem)
35
+ it "should be the default provider on 'openwrt'" do
36
+ expect(Facter).to receive(:value).with(:operatingsystem).and_return('openwrt')
43
37
  expect(provider_class.default?).to be_truthy
44
38
  end
45
39
 
46
40
  # test self.instances
47
41
  describe "when getting all service instances" do
48
- let(:services) {['dnsmasq', 'dropbear', 'firewall', 'led', 'puppet', 'uhttpd' ]}
42
+ let(:services) { ['dnsmasq', 'dropbear', 'firewall', 'led', 'puppet', 'uhttpd' ] }
49
43
 
50
44
  before :each do
51
45
  allow(Dir).to receive(:entries).and_call_original
52
46
  allow(Dir).to receive(:entries).with('/etc/init.d').and_return(services)
53
- allow(FileTest).to receive(:directory?).and_return(true)
54
- allow(FileTest).to receive(:executable?).and_return(true)
47
+ allow(Puppet::FileSystem).to receive(:executable?).and_return(true)
55
48
  end
56
49
 
57
50
  it "should return instances for all services" do
58
51
  services.each do |inst|
59
52
  expect(provider_class).to receive(:new).with(hash_including(:name => inst, :path => '/etc/init.d')).and_return("#{inst}_instance")
60
53
  end
61
- results = services.collect {|x| "#{x}_instance"}
54
+ results = services.collect { |x| "#{x}_instance"}
62
55
  expect(provider_class.instances).to eq(results)
63
56
  end
64
57
  end
@@ -82,14 +75,13 @@ describe 'Puppet::Type::Service::Provider::Openwrt',
82
75
 
83
76
  describe "when running #{method}" do
84
77
  it "should use any provided explicit command" do
85
- allow(resource).to receive(:[]).with(method).and_return("/user/specified/command")
86
- expect(provider).to receive(:execute).with(["/user/specified/command"], any_args)
78
+ resource[method] = '/user/specified/command'
79
+ expect(provider).to receive(:execute).with(['/user/specified/command'], any_args)
87
80
  provider.send(method)
88
81
  end
89
82
 
90
83
  it "should execute the init script with #{method} when no explicit command is provided" do
91
- allow(resource).to receive(:[]).with("has#{method}".intern).and_return(:true)
92
- expect(provider).to receive(:execute).with(['/etc/init.d/myservice', method ], any_args)
84
+ expect(provider).to receive(:execute).with(['/etc/init.d/myservice', method], any_args)
93
85
  provider.send(method)
94
86
  end
95
87
  end
@@ -50,8 +50,9 @@ describe 'Puppet::Type::Service::Provider::Redhat',
50
50
  @services = ['one', 'two', 'three', 'four', 'kudzu', 'functions', 'halt', 'killall', 'single', 'linuxconf', 'boot', 'reboot']
51
51
  @not_services = ['functions', 'halt', 'killall', 'single', 'linuxconf', 'reboot', 'boot']
52
52
  allow(Dir).to receive(:entries).and_return(@services)
53
- allow(FileTest).to receive(:directory?).and_return(true)
54
- allow(FileTest).to receive(:executable?).and_return(true)
53
+ allow(Puppet::FileSystem).to receive(:directory?).and_call_original
54
+ allow(Puppet::FileSystem).to receive(:directory?).with('/etc/init.d').and_return(true)
55
+ allow(Puppet::FileSystem).to receive(:executable?).and_return(true)
55
56
  end
56
57
 
57
58
  it "should return instances for all services" do
@@ -104,7 +104,7 @@ describe Puppet::Resource::Catalog, "when compiling" do
104
104
 
105
105
  it "should include the current catalog_format" do
106
106
  catalog = Puppet::Resource::Catalog.new("host")
107
- expect(catalog.catalog_format).to eq(1)
107
+ expect(catalog.catalog_format).to eq(2)
108
108
  end
109
109
 
110
110
  describe "when compiling" do
@@ -178,6 +178,7 @@ describe Puppet::Resource::Catalog, "when compiling" do
178
178
  @original.add_edge(@middle, @bottom)
179
179
  @original.add_edge(@bottom, @bottomobject)
180
180
 
181
+ @original.catalog_format = 1
181
182
  @catalog = @original.to_ral
182
183
  end
183
184
 
@@ -190,6 +191,18 @@ describe Puppet::Resource::Catalog, "when compiling" do
190
191
  end
191
192
  end
192
193
 
194
+ it "should raise if an unknown resource is being converted" do
195
+ @new_res = Puppet::Resource.new "Unknown", "type", :kind => 'compilable_type'
196
+ @resource_array = [@new_res]
197
+
198
+ @original.add_resource(*@resource_array)
199
+ @original.add_edge(@bottomobject, @new_res)
200
+
201
+ @original.catalog_format = 2
202
+
203
+ expect { @original.to_ral }.to raise_error(Puppet::Error, "Resource type 'Unknown' was not found")
204
+ end
205
+
193
206
  it "should copy the tag list to the new catalog" do
194
207
  expect(@catalog.tags.sort).to eq(@original.tags.sort)
195
208
  end