puppet 6.25.1 → 6.26.0
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/Gemfile +2 -2
- data/Gemfile.lock +24 -17
- data/lib/puppet/application/lookup.rb +78 -24
- data/lib/puppet/concurrent/thread_local_singleton.rb +5 -3
- data/lib/puppet/configurer.rb +2 -12
- data/lib/puppet/defaults.rb +14 -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/versioncmp.rb +6 -2
- data/lib/puppet/generate/type.rb +9 -0
- data/lib/puppet/node.rb +1 -1
- 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/ssl/verifier.rb +6 -0
- data/lib/puppet/transaction/persistence.rb +22 -12
- 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 -0
- data/lib/puppet/util/package.rb +25 -16
- data/lib/puppet/util/yaml.rb +21 -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/unit/forge/bacula.json +1 -1
- data/spec/integration/application/lookup_spec.rb +32 -6
- 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 +90 -58
- 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/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/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/yaml_spec.rb +54 -29
- metadata +7 -3
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'puppet/concurrent/thread_local_singleton'
|
3
|
+
|
4
|
+
class PuppetSpec::Singleton
|
5
|
+
extend Puppet::Concurrent::ThreadLocalSingleton
|
6
|
+
end
|
7
|
+
|
8
|
+
# Use the `equal?` matcher to ensure we get the same object
|
9
|
+
describe Puppet::Concurrent::ThreadLocalSingleton do
|
10
|
+
it 'returns the same object for a single thread' do
|
11
|
+
expect(PuppetSpec::Singleton.singleton).to equal(PuppetSpec::Singleton.singleton)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'is not inherited for a newly created thread' do
|
15
|
+
main_thread_local = PuppetSpec::Singleton.singleton
|
16
|
+
Thread.new do
|
17
|
+
expect(main_thread_local).to_not equal(PuppetSpec::Singleton.singleton)
|
18
|
+
end.join
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'does not leak outside a thread' do
|
22
|
+
thread_local = nil
|
23
|
+
Thread.new do
|
24
|
+
thread_local = PuppetSpec::Singleton.singleton
|
25
|
+
end.join
|
26
|
+
expect(thread_local).to_not equal(PuppetSpec::Singleton.singleton)
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'is different for each thread' do
|
30
|
+
locals = []
|
31
|
+
Thread.new do
|
32
|
+
locals << PuppetSpec::Singleton.singleton
|
33
|
+
end.join
|
34
|
+
Thread.new do
|
35
|
+
locals << PuppetSpec::Singleton.singleton
|
36
|
+
end.join
|
37
|
+
expect(locals.first).to_not equal(locals.last)
|
38
|
+
end
|
39
|
+
end
|
@@ -1128,88 +1128,120 @@ describe Puppet::Configurer do
|
|
1128
1128
|
converged_environment: #{last_server_specified_environment}
|
1129
1129
|
run_mode: agent
|
1130
1130
|
SUMMARY
|
1131
|
+
end
|
1131
1132
|
|
1132
|
-
|
1133
|
+
describe "when the use_last_environment is set to true" do
|
1134
|
+
before do
|
1135
|
+
expect(Puppet::Node.indirection).not_to receive(:find)
|
1133
1136
|
.with(anything, hash_including(:ignore_cache => true, :fail_on_404 => true))
|
1134
|
-
|
1137
|
+
end
|
1135
1138
|
|
1136
|
-
|
1137
|
-
|
1138
|
-
|
1139
|
+
it "prefers the environment set via cli" do
|
1140
|
+
Puppet.settings.handlearg('--environment', 'usethis')
|
1141
|
+
configurer.run
|
1139
1142
|
|
1140
|
-
|
1141
|
-
|
1143
|
+
expect(configurer.environment).to eq('usethis')
|
1144
|
+
end
|
1142
1145
|
|
1143
|
-
|
1144
|
-
|
1145
|
-
|
1146
|
-
|
1147
|
-
|
1148
|
-
|
1149
|
-
|
1146
|
+
it "prefers the environment set via lastrunfile over config" do
|
1147
|
+
FileUtils.mkdir_p(Puppet[:confdir])
|
1148
|
+
set_puppet_conf(Puppet[:confdir], <<~CONF)
|
1149
|
+
[main]
|
1150
|
+
environment = usethis
|
1151
|
+
lastrunfile = #{Puppet[:lastrunfile]}
|
1152
|
+
CONF
|
1150
1153
|
|
1151
|
-
|
1152
|
-
|
1154
|
+
Puppet.initialize_settings
|
1155
|
+
configurer.run
|
1153
1156
|
|
1154
|
-
|
1155
|
-
|
1157
|
+
expect(configurer.environment).to eq(last_server_specified_environment)
|
1158
|
+
end
|
1156
1159
|
|
1157
|
-
|
1158
|
-
|
1160
|
+
it "uses the environment from Puppet[:environment] if given a catalog" do
|
1161
|
+
configurer.run(catalog: catalog)
|
1159
1162
|
|
1160
|
-
|
1161
|
-
|
1163
|
+
expect(configurer.environment).to eq(Puppet[:environment])
|
1164
|
+
end
|
1162
1165
|
|
1163
|
-
|
1164
|
-
|
1165
|
-
|
1166
|
-
|
1166
|
+
it "uses the environment from Puppet[:environment] if use_cached_catalog = true" do
|
1167
|
+
Puppet[:use_cached_catalog] = true
|
1168
|
+
expects_cached_catalog_only(catalog)
|
1169
|
+
configurer.run
|
1167
1170
|
|
1168
|
-
|
1169
|
-
|
1171
|
+
expect(configurer.environment).to eq(Puppet[:environment])
|
1172
|
+
end
|
1170
1173
|
|
1171
|
-
|
1172
|
-
|
1173
|
-
|
1174
|
+
describe "when the environment is not set via CLI" do
|
1175
|
+
it "uses the environment found in lastrunfile if the key exists" do
|
1176
|
+
configurer.run
|
1174
1177
|
|
1175
|
-
|
1178
|
+
expect(configurer.environment).to eq(last_server_specified_environment)
|
1179
|
+
end
|
1180
|
+
|
1181
|
+
it "pushes the converged environment found in lastrunfile over the existing context" do
|
1182
|
+
initial_env = Puppet::Node::Environment.remote('production')
|
1183
|
+
Puppet.push_context(
|
1184
|
+
current_environment: initial_env,
|
1185
|
+
loaders: Puppet::Pops::Loaders.new(initial_env, true))
|
1186
|
+
|
1187
|
+
expect(Puppet).to receive(:push_context).with(
|
1188
|
+
hash_including(:current_environment, :loaders),
|
1189
|
+
"Local node environment #{last_server_specified_environment} for configurer transaction"
|
1190
|
+
).once.and_call_original
|
1191
|
+
|
1192
|
+
configurer.run
|
1193
|
+
end
|
1194
|
+
|
1195
|
+
it "uses the environment from Puppet[:environment] if strict_environment_mode is set" do
|
1196
|
+
Puppet[:strict_environment_mode] = true
|
1197
|
+
configurer.run
|
1198
|
+
|
1199
|
+
expect(configurer.environment).to eq(Puppet[:environment])
|
1200
|
+
end
|
1201
|
+
|
1202
|
+
it "uses the environment from Puppet[:environment] if initial_environment is the same as converged_environment" do
|
1203
|
+
Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', <<~SUMMARY)
|
1204
|
+
---
|
1205
|
+
version:
|
1206
|
+
config: 1624882680
|
1207
|
+
puppet: 6.24.0
|
1208
|
+
application:
|
1209
|
+
initial_environment: development
|
1210
|
+
converged_environment: development
|
1211
|
+
run_mode: agent
|
1212
|
+
SUMMARY
|
1213
|
+
configurer.run
|
1214
|
+
|
1215
|
+
expect(configurer.environment).to eq(Puppet[:environment])
|
1216
|
+
end
|
1176
1217
|
end
|
1218
|
+
end
|
1177
1219
|
|
1178
|
-
|
1179
|
-
|
1180
|
-
|
1181
|
-
current_environment: initial_env,
|
1182
|
-
loaders: Puppet::Pops::Loaders.new(initial_env, true))
|
1220
|
+
describe "when the use_last_environment setting is set to false" do
|
1221
|
+
let(:node_environment) { Puppet::Node::Environment.remote(:salam) }
|
1222
|
+
let(:node) { Puppet::Node.new(Puppet[:node_name_value]) }
|
1183
1223
|
|
1184
|
-
|
1185
|
-
|
1186
|
-
|
1187
|
-
).once.and_call_original
|
1224
|
+
before do
|
1225
|
+
Puppet[:use_last_environment] = false
|
1226
|
+
node.environment = node_environment
|
1188
1227
|
|
1189
|
-
|
1228
|
+
allow(Puppet::Node.indirection).to receive(:find)
|
1229
|
+
allow(Puppet::Node.indirection).to receive(:find)
|
1230
|
+
.with(anything, hash_including(:ignore_cache => true, :fail_on_404 => true))
|
1231
|
+
.and_return(node)
|
1190
1232
|
end
|
1191
1233
|
|
1192
|
-
it "
|
1193
|
-
Puppet
|
1194
|
-
|
1234
|
+
it "does a node request" do
|
1235
|
+
expect(Puppet::Node.indirection).to receive(:find)
|
1236
|
+
.with(anything, hash_including(:ignore_cache => true, :fail_on_404 => true))
|
1195
1237
|
|
1196
|
-
|
1238
|
+
configurer.run
|
1197
1239
|
end
|
1198
1240
|
|
1199
|
-
it "uses the environment from
|
1200
|
-
Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', <<~SUMMARY)
|
1201
|
-
---
|
1202
|
-
version:
|
1203
|
-
config: 1624882680
|
1204
|
-
puppet: 6.24.0
|
1205
|
-
application:
|
1206
|
-
initial_environment: development
|
1207
|
-
converged_environment: development
|
1208
|
-
run_mode: agent
|
1209
|
-
SUMMARY
|
1241
|
+
it "uses the node environment from the node request" do
|
1210
1242
|
configurer.run
|
1211
1243
|
|
1212
|
-
expect(configurer.environment).to eq(
|
1244
|
+
expect(configurer.environment).to eq(node_environment.name.to_s)
|
1213
1245
|
end
|
1214
1246
|
end
|
1215
1247
|
end
|
@@ -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
|
-
|
988
|
-
|
989
|
-
|
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
|
-
|
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": "
|
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": "
|
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": "
|
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
|
26
|
-
expect { versioncmp('a,b','foo', 'bar') }.to raise_error(/expects 2 arguments, got
|
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
|
data/spec/unit/node_spec.rb
CHANGED
@@ -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(
|
14
|
-
allow(
|
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
|
-
|
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(
|
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(
|
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
|
-
|
89
|
-
allow(
|
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(
|
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(
|
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(
|
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(
|
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(
|
195
|
-
allow(
|
196
|
-
allow(
|
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
|
|