puppet 6.25.0-universal-darwin → 6.27.0-universal-darwin

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
@@ -694,19 +694,68 @@ describe Puppet::Resource do
694
694
  it "should use the resource type's :new method to create the resource if the resource is of a builtin type" do
695
695
  resource = Puppet::Resource.new("file", basepath+"/my/file")
696
696
  result = resource.to_ral
697
+
697
698
  expect(result).to be_instance_of(Puppet::Type.type(:file))
698
699
  expect(result[:path]).to eq(basepath+"/my/file")
699
700
  end
700
701
 
701
- it "should convert to a component instance if the resource type is not of a builtin type" do
702
+ it "should convert to a component instance if the resource is not a compilable_type" do
702
703
  resource = Puppet::Resource.new("foobar", "somename")
703
704
  result = resource.to_ral
704
705
 
705
706
  expect(result).to be_instance_of(Puppet::Type.type(:component))
706
707
  expect(result.title).to eq("Foobar[somename]")
707
708
  end
708
- end
709
709
 
710
+ it "should convert to a component instance if the resource is a class" do
711
+ resource = Puppet::Resource.new("Class", "somename")
712
+ result = resource.to_ral
713
+
714
+ expect(result).to be_instance_of(Puppet::Type.type(:component))
715
+ expect(result.title).to eq("Class[Somename]")
716
+ end
717
+
718
+ it "should convert to component when the resource is a defined_type" do
719
+ resource = Puppet::Resource.new("Unknown", "type", :kind => 'defined_type')
720
+
721
+ result = resource.to_ral
722
+ expect(result).to be_instance_of(Puppet::Type.type(:component))
723
+ end
724
+
725
+ it "should raise if a resource type is a compilable_type and it wasn't found" do
726
+ resource = Puppet::Resource.new("Unknown", "type", :kind => 'compilable_type')
727
+
728
+ expect { resource.to_ral }.to raise_error(Puppet::Error, "Resource type 'Unknown' was not found")
729
+ end
730
+
731
+ it "should use the old behaviour when the catalog_format is equal to 1" do
732
+ resource = Puppet::Resource.new("Unknown", "type")
733
+ catalog = Puppet::Resource::Catalog.new("mynode")
734
+
735
+ resource.catalog = catalog
736
+ resource.catalog.catalog_format = 1
737
+
738
+ result = resource.to_ral
739
+ expect(result).to be_instance_of(Puppet::Type.type(:component))
740
+ end
741
+
742
+ it "should use the new behaviour and fail when the catalog_format is greater than 1" do
743
+ resource = Puppet::Resource.new("Unknown", "type", :kind => 'compilable_type')
744
+ catalog = Puppet::Resource::Catalog.new("mynode")
745
+
746
+ resource.catalog = catalog
747
+ resource.catalog.catalog_format = 2
748
+
749
+ expect { resource.to_ral }.to raise_error(Puppet::Error, "Resource type 'Unknown' was not found")
750
+ end
751
+
752
+ it "should use the resource type when the resource doesn't respond to kind and the resource type can be found" do
753
+ resource = Puppet::Resource.new("file", basepath+"/my/file")
754
+
755
+ result = resource.to_ral
756
+ expect(result).to be_instance_of(Puppet::Type.type(:file))
757
+ end
758
+ end
710
759
  describe "when converting to puppet code" do
711
760
  before do
712
761
  @resource = Puppet::Resource.new("one::two", "/my/file",
@@ -822,6 +871,13 @@ describe Puppet::Resource do
822
871
  expect(Puppet::Resource.from_data_hash(JSON.parse(resource.to_json)).line).to eq(50)
823
872
  end
824
873
 
874
+ it "should include the kind if one is set" do
875
+ resource = Puppet::Resource.new("File", "/foo")
876
+ resource.kind = 'im_a_file'
877
+
878
+ expect(Puppet::Resource.from_data_hash(JSON.parse(resource.to_json)).kind).to eq('im_a_file')
879
+ end
880
+
825
881
  it "should include the 'exported' value if one is set" do
826
882
  resource = Puppet::Resource.new("File", "/foo")
827
883
  resource.exported = true
@@ -138,6 +138,57 @@ describe Puppet::Transaction::Persistence do
138
138
  persistence = Puppet::Transaction::Persistence.new
139
139
  expect(persistence.load.dig("File[/tmp/audit]", "parameters", "mtime", "system_value")).to contain_exactly(be_a(Time))
140
140
  end
141
+
142
+ it 'should load Regexp' do
143
+ write_state_file(<<~END)
144
+ system_value:
145
+ - !ruby/regexp /regexp/
146
+ END
147
+
148
+ persistence = Puppet::Transaction::Persistence.new
149
+ expect(persistence.load.dig("system_value")).to contain_exactly(be_a(Regexp))
150
+ end
151
+
152
+ it 'should load semantic puppet version' do
153
+ write_state_file(<<~END)
154
+ system_value:
155
+ - !ruby/object:SemanticPuppet::Version
156
+ major: 1
157
+ minor: 0
158
+ patch: 0
159
+ prerelease:
160
+ build:
161
+ END
162
+
163
+ persistence = Puppet::Transaction::Persistence.new
164
+ expect(persistence.load.dig("system_value")).to contain_exactly(be_a(SemanticPuppet::Version))
165
+ end
166
+
167
+ it 'should load puppet time related objects' do
168
+ write_state_file(<<~END)
169
+ system_value:
170
+ - !ruby/object:Puppet::Pops::Time::Timestamp
171
+ nsecs: 1638316135955087259
172
+ - !ruby/object:Puppet::Pops::Time::TimeData
173
+ nsecs: 1495789430910161286
174
+ - !ruby/object:Puppet::Pops::Time::Timespan
175
+ nsecs: 1495789430910161286
176
+ END
177
+
178
+ persistence = Puppet::Transaction::Persistence.new
179
+ expect(persistence.load.dig("system_value")).to contain_exactly(be_a(Puppet::Pops::Time::Timestamp), be_a(Puppet::Pops::Time::TimeData), be_a(Puppet::Pops::Time::Timespan))
180
+ end
181
+
182
+ it 'should load binary objects' do
183
+ write_state_file(<<~END)
184
+ system_value:
185
+ - !ruby/object:Puppet::Pops::Types::PBinaryType::Binary
186
+ binary_buffer: ''
187
+ END
188
+
189
+ persistence = Puppet::Transaction::Persistence.new
190
+ expect(persistence.load.dig("system_value")).to contain_exactly(be_a(Puppet::Pops::Types::PBinaryType::Binary))
191
+ end
141
192
  end
142
193
  end
143
194
 
@@ -174,51 +174,6 @@ describe Puppet::Type.type(:user) do
174
174
  end
175
175
  end
176
176
 
177
- describe "when managing the purge_ssh_keys property" do
178
- context "with valid input" do
179
- it "should support a :true value" do
180
- expect { described_class.new(:name => 'foo', :purge_ssh_keys => :true) }.to_not raise_error
181
- end
182
-
183
- it "should support a :false value" do
184
- expect { described_class.new(:name => 'foo', :purge_ssh_keys => :false) }.to_not raise_error
185
- end
186
-
187
- it "should support a String value" do
188
- expect { described_class.new(:name => 'foo', :purge_ssh_keys => File.expand_path('home/foo/.ssh/authorized_keys')) }.to_not raise_error
189
- end
190
-
191
- it "should support an Array value" do
192
- expect { described_class.new(:name => 'foo', :purge_ssh_keys => [File.expand_path('home/foo/.ssh/authorized_keys'),
193
- File.expand_path('custom/authorized_keys')]) }.to_not raise_error
194
- end
195
- end
196
-
197
- context "with faulty input" do
198
- it "should raise error for relative path" do
199
- expect { described_class.new(:name => 'foo', :purge_ssh_keys => 'home/foo/.ssh/authorized_keys') }.to raise_error(Puppet::ResourceError,
200
- /Paths to keyfiles must be absolute/ )
201
- end
202
-
203
- it "should raise error for invalid type" do
204
- expect { described_class.new(:name => 'foo', :purge_ssh_keys => :invalid) }.to raise_error(Puppet::ResourceError,
205
- /purge_ssh_keys must be true, false, or an array of file names/ )
206
- end
207
-
208
- it "should raise error for array with relative path" do
209
- expect { described_class.new(:name => 'foo', :purge_ssh_keys => ['home/foo/.ssh/authorized_keys',
210
- File.expand_path('custom/authorized_keys')]) }.to raise_error(Puppet::ResourceError,
211
- /Paths to keyfiles must be absolute/ )
212
- end
213
-
214
- it "should raise error for array with invalid type" do
215
- expect { described_class.new(:name => 'foo', :purge_ssh_keys => [:invalid,
216
- File.expand_path('custom/authorized_keys')]) }.to raise_error(Puppet::ResourceError,
217
- /Each entry for purge_ssh_keys must be a string/ )
218
- end
219
- end
220
- end
221
-
222
177
  describe "when managing the uid property" do
223
178
  it "should convert number-looking strings into actual numbers" do
224
179
  expect(described_class.new(:name => 'foo', :uid => '50')[:uid]).to eq(50)
@@ -0,0 +1,126 @@
1
+ # coding: utf-8
2
+ require 'spec_helper'
3
+ require 'puppet/util/json'
4
+
5
+ describe Puppet::Util::Json do
6
+ include PuppetSpec::Files
7
+
8
+ shared_examples_for 'json file loader' do |load_method|
9
+ it 'reads a JSON file from disk' do
10
+ file_path = file_containing('input', JSON.dump({ "my" => "data" }))
11
+
12
+ expect(load_method.call(file_path)).to eq({ "my" => "data" })
13
+ end
14
+
15
+ it 'reads JSON as UTF-8' do
16
+ file_path = file_containing('input', JSON.dump({ "my" => "𠜎" }))
17
+
18
+ expect(load_method.call(file_path)).to eq({ "my" => "𠜎" })
19
+ end
20
+ end
21
+
22
+ context "#load" do
23
+ it 'raises an error if JSON is invalid' do
24
+ expect {
25
+ Puppet::Util::Json.load('{ invalid')
26
+ }.to raise_error(Puppet::Util::Json::ParseError, /unexpected token at '{ invalid'/)
27
+ end
28
+
29
+ it 'raises an error if the content is empty' do
30
+ expect {
31
+ Puppet::Util::Json.load('')
32
+ }.to raise_error(Puppet::Util::Json::ParseError)
33
+ end
34
+
35
+ it 'loads true' do
36
+ expect(Puppet::Util::Json.load('true')).to eq(true)
37
+ end
38
+
39
+ it 'loads false' do
40
+ expect(Puppet::Util::Json.load('false')).to eq(false)
41
+ end
42
+
43
+ it 'loads a numeric' do
44
+ expect(Puppet::Util::Json.load('42')).to eq(42)
45
+ end
46
+
47
+ it 'loads a string' do
48
+ expect(Puppet::Util::Json.load('"puppet"')).to eq('puppet')
49
+ end
50
+
51
+ it 'loads an array' do
52
+ expect(Puppet::Util::Json.load(<<~JSON)).to eq([1, 2])
53
+ [1, 2]
54
+ JSON
55
+ end
56
+
57
+ it 'loads a hash' do
58
+ expect(Puppet::Util::Json.load(<<~JSON)).to eq('a' => 1, 'b' => 2)
59
+ {
60
+ "a": 1,
61
+ "b": 2
62
+ }
63
+ JSON
64
+ end
65
+ end
66
+
67
+ context "load_file_if_valid" do
68
+ before do
69
+ Puppet[:log_level] = 'debug'
70
+ end
71
+
72
+ it_should_behave_like 'json file loader', Puppet::Util::Json.method(:load_file_if_valid)
73
+
74
+ it 'returns nil when the file is invalid JSON and debug logs about it' do
75
+ file_path = file_containing('input', '{ invalid')
76
+ expect(Puppet).to receive(:debug)
77
+ .with(/Could not retrieve JSON content .+: unexpected token at '{ invalid'/).and_call_original
78
+
79
+ expect(Puppet::Util::Json.load_file_if_valid(file_path)).to eql(nil)
80
+ end
81
+
82
+ it 'returns nil when the filename is illegal and debug logs about it' do
83
+ expect(Puppet).to receive(:debug)
84
+ .with(/Could not retrieve JSON content .+: pathname contains null byte/).and_call_original
85
+
86
+ expect(Puppet::Util::Json.load_file_if_valid("not\0allowed")).to eql(nil)
87
+ end
88
+
89
+ it 'returns nil when the file does not exist and debug logs about it' do
90
+ expect(Puppet).to receive(:debug)
91
+ .with(/Could not retrieve JSON content .+: No such file or directory/).and_call_original
92
+
93
+ expect(Puppet::Util::Json.load_file_if_valid('does/not/exist.json')).to eql(nil)
94
+ end
95
+ end
96
+
97
+ context '#load_file' do
98
+ it_should_behave_like 'json file loader', Puppet::Util::Json.method(:load_file)
99
+
100
+ it 'raises an error when the file is invalid JSON' do
101
+ file_path = file_containing('input', '{ invalid')
102
+
103
+ expect {
104
+ Puppet::Util::Json.load_file(file_path)
105
+ }.to raise_error(Puppet::Util::Json::ParseError, /unexpected token at '{ invalid'/)
106
+ end
107
+
108
+ it 'raises an error when the filename is illegal' do
109
+ expect {
110
+ Puppet::Util::Json.load_file("not\0allowed")
111
+ }.to raise_error(ArgumentError, /null byte/)
112
+ end
113
+
114
+ it 'raises an error when the file does not exist' do
115
+ expect {
116
+ Puppet::Util::Json.load_file('does/not/exist.json')
117
+ }.to raise_error(Errno::ENOENT, /No such file or directory/)
118
+ end
119
+
120
+ it 'writes data formatted as JSON to disk' do
121
+ file_path = file_containing('input', Puppet::Util::Json.dump({ "my" => "data" }))
122
+
123
+ expect(Puppet::Util::Json.load_file(file_path)).to eq({ "my" => "data" })
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Puppet::Util::Windows do
6
+ %w[
7
+ ADSI
8
+ ADSI::ADSIObject
9
+ ADSI::User
10
+ ADSI::UserProfile
11
+ ADSI::Group
12
+ EventLog
13
+ File
14
+ Process
15
+ Registry
16
+ Service
17
+ SID
18
+ ].each do |name|
19
+ it "defines Puppet::Util::Windows::#{name}" do
20
+ expect(described_class.const_get(name)).to be
21
+ end
22
+ end
23
+ end
@@ -1,6 +1,5 @@
1
1
  # coding: utf-8
2
2
  require 'spec_helper'
3
-
4
3
  require 'puppet/util/yaml'
5
4
 
6
5
  describe Puppet::Util::Yaml do
@@ -10,21 +9,21 @@ describe Puppet::Util::Yaml do
10
9
 
11
10
  shared_examples_for 'yaml file loader' do |load_method|
12
11
  it 'returns false when the file is empty' do
13
- Puppet::FileSystem.touch(filename)
12
+ file_path = file_containing('input', '')
14
13
 
15
- expect(load_method.call(filename)).to eq(false)
14
+ expect(load_method.call(file_path)).to eq(false)
16
15
  end
17
16
 
18
17
  it 'reads a YAML file from disk' do
19
- write_file(filename, YAML.dump({ "my" => "data" }))
18
+ file_path = file_containing('input', YAML.dump({ "my" => "data" }))
20
19
 
21
- expect(load_method.call(filename)).to eq({ "my" => "data" })
20
+ expect(load_method.call(file_path)).to eq({ "my" => "data" })
22
21
  end
23
22
 
24
23
  it 'reads YAML as UTF-8' do
25
- write_file(filename, YAML.dump({ "my" => "𠜎" }))
24
+ file_path = file_containing('input', YAML.dump({ "my" => "𠜎" }))
26
25
 
27
- expect(load_method.call(filename)).to eq({ "my" => "𠜎" })
26
+ expect(load_method.call(file_path)).to eq({ "my" => "𠜎" })
28
27
  end
29
28
  end
30
29
 
@@ -119,11 +118,11 @@ FACTS
119
118
  it_should_behave_like 'yaml file loader', Puppet::Util::Yaml.method(:safe_load_file)
120
119
 
121
120
  it 'raises an error when the file is invalid YAML' do
122
- write_file(filename, '{ invalid')
121
+ file_path = file_containing('input', '{ invalid')
123
122
 
124
123
  expect {
125
- Puppet::Util::Yaml.safe_load_file(filename)
126
- }.to raise_error(Puppet::Util::Yaml::YamlLoadError, %r[\(#{filename}\): .* at line \d+ column \d+])
124
+ Puppet::Util::Yaml.safe_load_file(file_path)
125
+ }.to raise_error(Puppet::Util::Yaml::YamlLoadError, %r[\(#{file_path}\): .* at line \d+ column \d+])
127
126
  end
128
127
 
129
128
  it 'raises an error when the filename is illegal' do
@@ -139,15 +138,46 @@ FACTS
139
138
  end
140
139
  end
141
140
 
141
+ context "#safe_load_file_if_valid" do
142
+ before do
143
+ Puppet[:log_level] = 'debug'
144
+ end
145
+
146
+ it_should_behave_like 'yaml file loader', Puppet::Util::Yaml.method(:safe_load_file_if_valid)
147
+
148
+ it 'returns nil when the file is invalid YAML and debug logs about it' do
149
+ file_path = file_containing('input', '{ invalid')
150
+
151
+ expect(Puppet).to receive(:debug)
152
+ .with(/Could not retrieve YAML content .+ expected ',' or '}'/).and_call_original
153
+
154
+ expect(Puppet::Util::Yaml.safe_load_file_if_valid(file_path)).to eql(nil)
155
+ end
156
+
157
+ it 'returns nil when the filename is illegal and debug logs about it' do
158
+ expect(Puppet).to receive(:debug)
159
+ .with(/Could not retrieve YAML content .+: pathname contains null byte/).and_call_original
160
+
161
+ expect(Puppet::Util::Yaml.safe_load_file_if_valid("not\0allowed")).to eql(nil)
162
+ end
163
+
164
+ it 'returns nil when the file does not exist and debug logs about it' do
165
+ expect(Puppet).to receive(:debug)
166
+ .with(/Could not retrieve YAML content .+: No such file or directory/).and_call_original
167
+
168
+ expect(Puppet::Util::Yaml.safe_load_file_if_valid('does/not/exist.yaml')).to eql(nil)
169
+ end
170
+ end
171
+
142
172
  context '#load_file' do
143
173
  it_should_behave_like 'yaml file loader', Puppet::Util::Yaml.method(:load_file)
144
174
 
145
175
  it 'raises an error when the file is invalid YAML' do
146
- write_file(filename, '{ invalid')
176
+ file_path = file_containing('input', '{ invalid')
147
177
 
148
178
  expect {
149
- Puppet::Util::Yaml.load_file(filename)
150
- }.to raise_error(Puppet::Util::Yaml::YamlLoadError, %r{\(#{filename}\): .* at line \d+ column \d+})
179
+ Puppet::Util::Yaml.load_file(file_path)
180
+ }.to raise_error(Puppet::Util::Yaml::YamlLoadError, %r{\(#{file_path}\): .* at line \d+ column \d+})
151
181
  end
152
182
 
153
183
  it 'raises an error when the filename is illegal' do
@@ -163,39 +193,34 @@ FACTS
163
193
  end
164
194
 
165
195
  it 'allows return value to be overridden' do
166
- Puppet::FileSystem.touch(filename)
196
+ file_path = file_containing('input', '')
167
197
 
168
- expect(Puppet::Util::Yaml.load_file(filename, {})).to eq({})
198
+ expect(Puppet::Util::Yaml.load_file(file_path, {})).to eq({})
169
199
  end
170
200
 
171
201
  it 'loads arbitrary objects' do
172
- write_file(filename, "--- !ruby/object {}\n")
202
+ file_path = file_containing('input', "--- !ruby/object {}\n")
173
203
 
174
- expect(Puppet::Util::Yaml.load_file(filename, {})).to be_instance_of(Object)
204
+ expect(Puppet::Util::Yaml.load_file(file_path, {})).to be_instance_of(Object)
175
205
  end
176
206
 
177
207
  it 'should allow one to strip ruby tags that would otherwise not parse' do
178
- write_file(filename, "---\nweirddata: !ruby/hash:Not::A::Valid::Class {}")
208
+ file_path = file_containing('input', "---\nweirddata: !ruby/hash:Not::A::Valid::Class {}")
179
209
 
180
- expect(Puppet::Util::Yaml.load_file(filename, {}, true)).to eq({"weirddata" => {}})
210
+ expect(Puppet::Util::Yaml.load_file(file_path, {}, true)).to eq({"weirddata" => {}})
181
211
  end
182
212
 
183
213
  it 'should not strip non-ruby tags' do
184
- write_file(filename, "---\nweirddata: !binary |-\n e21kNX04MTE4ZGY2NmM5MTc3OTg4ZWE4Y2JiOWEzMjMyNzFkYg==")
214
+ file_path = file_containing('input', "---\nweirddata: !binary |-\n e21kNX04MTE4ZGY2NmM5MTc3OTg4ZWE4Y2JiOWEzMjMyNzFkYg==")
185
215
 
186
- expect(Puppet::Util::Yaml.load_file(filename, {}, true)).to eq({"weirddata" => "{md5}8118df66c9177988ea8cbb9a323271db"})
216
+ expect(Puppet::Util::Yaml.load_file(file_path, {}, true)).to eq({"weirddata" => "{md5}8118df66c9177988ea8cbb9a323271db"})
187
217
  end
188
218
 
189
219
  it 'writes data formatted as YAML to disk' do
190
- Puppet::Util::Yaml.dump({ "my" => "data" }, filename)
191
-
192
- expect(Puppet::Util::Yaml.load_file(filename)).to eq({ "my" => "data" })
193
- end
194
- end
220
+ file_path = file_containing('input', '')
221
+ Puppet::Util::Yaml.dump({ "my" => "data" }, file_path)
195
222
 
196
- def write_file(name, contents)
197
- File.open(name, "w:UTF-8") do |fh|
198
- fh.write(contents)
223
+ expect(Puppet::Util::Yaml.load_file(file_path)).to eq({ "my" => "data" })
199
224
  end
200
225
  end
201
226
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: puppet
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.25.0
4
+ version: 6.27.0
5
5
  platform: universal-darwin
6
6
  authors:
7
7
  - Puppet Labs
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-06 00:00:00.000000000 Z
11
+ date: 2022-04-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: facter
@@ -1901,6 +1901,7 @@ files:
1901
1901
  - spec/unit/capability_spec.rb
1902
1902
  - spec/unit/certificate_factory_spec.rb
1903
1903
  - spec/unit/concurrent/lock_spec.rb
1904
+ - spec/unit/concurrent/thread_local_singleton_spec.rb
1904
1905
  - spec/unit/configurer/downloader_spec.rb
1905
1906
  - spec/unit/configurer/fact_handler_spec.rb
1906
1907
  - spec/unit/configurer/plugin_handler_spec.rb
@@ -2525,6 +2526,7 @@ files:
2525
2526
  - spec/unit/util/http_proxy_spec.rb
2526
2527
  - spec/unit/util/inifile_spec.rb
2527
2528
  - spec/unit/util/json_lockfile_spec.rb
2529
+ - spec/unit/util/json_spec.rb
2528
2530
  - spec/unit/util/ldap/connection_spec.rb
2529
2531
  - spec/unit/util/ldap/generator_spec.rb
2530
2532
  - spec/unit/util/ldap/manager_spec.rb
@@ -2585,6 +2587,7 @@ files:
2585
2587
  - spec/unit/util/windows/service_spec.rb
2586
2588
  - spec/unit/util/windows/sid_spec.rb
2587
2589
  - spec/unit/util/windows/string_spec.rb
2590
+ - spec/unit/util/windows_spec.rb
2588
2591
  - spec/unit/util/yaml_spec.rb
2589
2592
  - spec/unit/util_spec.rb
2590
2593
  - spec/unit/version_spec.rb
@@ -2624,7 +2627,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
2624
2627
  - !ruby/object:Gem::Version
2625
2628
  version: 1.3.1
2626
2629
  requirements: []
2627
- rubygems_version: 3.0.8
2630
+ rubygems_version: 3.1.6
2628
2631
  signing_key:
2629
2632
  specification_version: 4
2630
2633
  summary: Puppet, an automated configuration management tool
@@ -3187,6 +3190,7 @@ test_files:
3187
3190
  - spec/unit/capability_spec.rb
3188
3191
  - spec/unit/certificate_factory_spec.rb
3189
3192
  - spec/unit/concurrent/lock_spec.rb
3193
+ - spec/unit/concurrent/thread_local_singleton_spec.rb
3190
3194
  - spec/unit/configurer/downloader_spec.rb
3191
3195
  - spec/unit/configurer/fact_handler_spec.rb
3192
3196
  - spec/unit/configurer/plugin_handler_spec.rb
@@ -3811,6 +3815,7 @@ test_files:
3811
3815
  - spec/unit/util/http_proxy_spec.rb
3812
3816
  - spec/unit/util/inifile_spec.rb
3813
3817
  - spec/unit/util/json_lockfile_spec.rb
3818
+ - spec/unit/util/json_spec.rb
3814
3819
  - spec/unit/util/ldap/connection_spec.rb
3815
3820
  - spec/unit/util/ldap/generator_spec.rb
3816
3821
  - spec/unit/util/ldap/manager_spec.rb
@@ -3871,6 +3876,7 @@ test_files:
3871
3876
  - spec/unit/util/windows/service_spec.rb
3872
3877
  - spec/unit/util/windows/sid_spec.rb
3873
3878
  - spec/unit/util/windows/string_spec.rb
3879
+ - spec/unit/util/windows_spec.rb
3874
3880
  - spec/unit/util/yaml_spec.rb
3875
3881
  - spec/unit/util_spec.rb
3876
3882
  - spec/unit/version_spec.rb