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.
- checksums.yaml +4 -4
- data/CODEOWNERS +1 -1
- data/Gemfile +2 -2
- data/Gemfile.lock +39 -32
- data/lib/puppet/application/lookup.rb +74 -24
- data/lib/puppet/concurrent/thread_local_singleton.rb +5 -3
- data/lib/puppet/configurer.rb +65 -11
- data/lib/puppet/defaults.rb +19 -3
- data/lib/puppet/face/generate.rb +2 -0
- data/lib/puppet/file_serving/metadata.rb +3 -0
- data/lib/puppet/file_system/file_impl.rb +7 -7
- data/lib/puppet/file_system/jruby.rb +1 -1
- data/lib/puppet/file_system/windows.rb +4 -4
- data/lib/puppet/file_system.rb +1 -1
- data/lib/puppet/functions/next.rb +18 -1
- data/lib/puppet/functions/tree_each.rb +0 -1
- data/lib/puppet/functions/versioncmp.rb +6 -2
- data/lib/puppet/generate/type.rb +9 -0
- data/lib/puppet/http/client.rb +1 -1
- data/lib/puppet/http/redirector.rb +5 -0
- data/lib/puppet/node.rb +1 -1
- data/lib/puppet/parser/resource.rb +1 -1
- data/lib/puppet/pops/evaluator/closure.rb +7 -5
- data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +1 -0
- data/lib/puppet/pops/parser/code_merger.rb +4 -4
- data/lib/puppet/pops/parser/egrammar.ra +2 -0
- data/lib/puppet/pops/parser/eparser.rb +813 -794
- data/lib/puppet/pops/serialization/to_data_converter.rb +6 -18
- data/lib/puppet/provider/service/init.rb +5 -4
- data/lib/puppet/resource/catalog.rb +1 -1
- data/lib/puppet/resource.rb +38 -5
- data/lib/puppet/ssl/ssl_provider.rb +10 -7
- data/lib/puppet/ssl/verifier.rb +6 -0
- data/lib/puppet/transaction/persistence.rb +22 -12
- data/lib/puppet/type/exec.rb +1 -1
- data/lib/puppet/type/file/data_sync.rb +1 -1
- data/lib/puppet/type/user.rb +40 -38
- data/lib/puppet/util/json.rb +17 -0
- data/lib/puppet/util/log.rb +7 -2
- data/lib/puppet/util/monkey_patches.rb +6 -2
- data/lib/puppet/util/package.rb +25 -16
- data/lib/puppet/util/windows/service.rb +0 -5
- data/lib/puppet/util/windows.rb +3 -0
- data/lib/puppet/util/yaml.rb +21 -2
- data/lib/puppet/util.rb +1 -2
- data/lib/puppet/version.rb +1 -1
- data/lib/puppet.rb +1 -0
- data/locales/puppet.pot +5 -10454
- data/man/man5/puppet.conf.5 +21 -2
- data/man/man8/puppet-agent.8 +1 -1
- data/man/man8/puppet-apply.8 +1 -1
- data/man/man8/puppet-catalog.8 +1 -1
- data/man/man8/puppet-config.8 +1 -1
- data/man/man8/puppet-describe.8 +1 -1
- data/man/man8/puppet-device.8 +1 -1
- data/man/man8/puppet-doc.8 +1 -1
- data/man/man8/puppet-epp.8 +1 -1
- data/man/man8/puppet-facts.8 +1 -1
- data/man/man8/puppet-filebucket.8 +1 -1
- data/man/man8/puppet-generate.8 +1 -1
- data/man/man8/puppet-help.8 +1 -1
- data/man/man8/puppet-key.8 +1 -1
- data/man/man8/puppet-lookup.8 +9 -6
- data/man/man8/puppet-man.8 +1 -1
- data/man/man8/puppet-module.8 +1 -1
- data/man/man8/puppet-node.8 +1 -1
- data/man/man8/puppet-parser.8 +1 -1
- data/man/man8/puppet-plugin.8 +1 -1
- data/man/man8/puppet-report.8 +1 -1
- data/man/man8/puppet-resource.8 +1 -1
- data/man/man8/puppet-script.8 +1 -1
- data/man/man8/puppet-ssl.8 +1 -1
- data/man/man8/puppet-status.8 +1 -1
- data/man/man8/puppet.8 +2 -2
- data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +2 -1
- data/spec/fixtures/unit/forge/bacula.json +1 -1
- data/spec/integration/application/agent_spec.rb +28 -0
- data/spec/integration/application/lookup_spec.rb +81 -50
- data/spec/integration/application/resource_spec.rb +6 -2
- data/spec/integration/http/client_spec.rb +30 -0
- data/spec/integration/parser/pcore_resource_spec.rb +10 -0
- data/spec/shared_contexts/l10n.rb +5 -0
- data/spec/unit/application/lookup_spec.rb +131 -10
- data/spec/unit/concurrent/thread_local_singleton_spec.rb +39 -0
- data/spec/unit/configurer_spec.rb +197 -73
- data/spec/unit/face/generate_spec.rb +64 -0
- data/spec/unit/file_system_spec.rb +34 -4
- data/spec/unit/forge/module_release_spec.rb +3 -3
- data/spec/unit/functions/versioncmp_spec.rb +40 -4
- data/spec/unit/http/client_spec.rb +58 -1
- data/spec/unit/node_spec.rb +6 -0
- data/spec/unit/pops/parser/parse_containers_spec.rb +2 -2
- data/spec/unit/pops/serialization/to_from_hr_spec.rb +0 -58
- data/spec/unit/pops/validator/validator_spec.rb +5 -0
- data/spec/unit/provider/service/gentoo_spec.rb +6 -5
- data/spec/unit/provider/service/init_spec.rb +15 -9
- data/spec/unit/provider/service/openwrt_spec.rb +21 -29
- data/spec/unit/provider/service/redhat_spec.rb +3 -2
- data/spec/unit/resource/catalog_spec.rb +14 -1
- data/spec/unit/resource_spec.rb +58 -2
- data/spec/unit/transaction/persistence_spec.rb +51 -0
- data/spec/unit/type/user_spec.rb +0 -45
- data/spec/unit/util/json_spec.rb +126 -0
- data/spec/unit/util/windows_spec.rb +23 -0
- data/spec/unit/util/yaml_spec.rb +54 -29
- metadata +9 -3
data/spec/unit/resource_spec.rb
CHANGED
@@ -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
|
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
|
|
data/spec/unit/type/user_spec.rb
CHANGED
@@ -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
|
data/spec/unit/util/yaml_spec.rb
CHANGED
@@ -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
|
-
|
12
|
+
file_path = file_containing('input', '')
|
14
13
|
|
15
|
-
expect(load_method.call(
|
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
|
-
|
18
|
+
file_path = file_containing('input', YAML.dump({ "my" => "data" }))
|
20
19
|
|
21
|
-
expect(load_method.call(
|
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
|
-
|
24
|
+
file_path = file_containing('input', YAML.dump({ "my" => "𠜎" }))
|
26
25
|
|
27
|
-
expect(load_method.call(
|
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
|
-
|
121
|
+
file_path = file_containing('input', '{ invalid')
|
123
122
|
|
124
123
|
expect {
|
125
|
-
Puppet::Util::Yaml.safe_load_file(
|
126
|
-
}.to raise_error(Puppet::Util::Yaml::YamlLoadError, %r[\(#{
|
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
|
-
|
176
|
+
file_path = file_containing('input', '{ invalid')
|
147
177
|
|
148
178
|
expect {
|
149
|
-
Puppet::Util::Yaml.load_file(
|
150
|
-
}.to raise_error(Puppet::Util::Yaml::YamlLoadError, %r{\(#{
|
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
|
-
|
196
|
+
file_path = file_containing('input', '')
|
167
197
|
|
168
|
-
expect(Puppet::Util::Yaml.load_file(
|
198
|
+
expect(Puppet::Util::Yaml.load_file(file_path, {})).to eq({})
|
169
199
|
end
|
170
200
|
|
171
201
|
it 'loads arbitrary objects' do
|
172
|
-
|
202
|
+
file_path = file_containing('input', "--- !ruby/object {}\n")
|
173
203
|
|
174
|
-
expect(Puppet::Util::Yaml.load_file(
|
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
|
-
|
208
|
+
file_path = file_containing('input', "---\nweirddata: !ruby/hash:Not::A::Valid::Class {}")
|
179
209
|
|
180
|
-
expect(Puppet::Util::Yaml.load_file(
|
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
|
-
|
214
|
+
file_path = file_containing('input', "---\nweirddata: !binary |-\n e21kNX04MTE4ZGY2NmM5MTc3OTg4ZWE4Y2JiOWEzMjMyNzFkYg==")
|
185
215
|
|
186
|
-
expect(Puppet::Util::Yaml.load_file(
|
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
|
-
|
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
|
-
|
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.
|
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:
|
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.
|
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
|