puppet 7.9.0 → 7.10.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.lock +6 -6
- data/{ext → examples/enc}/regexp_nodes/classes/databases +0 -0
- data/{ext → examples/enc}/regexp_nodes/classes/webservers +0 -0
- data/{ext → examples/enc}/regexp_nodes/environment/development +0 -0
- data/{ext → examples/enc}/regexp_nodes/parameters/service/prod +0 -0
- data/{ext → examples/enc}/regexp_nodes/parameters/service/qa +0 -0
- data/{ext → examples/enc}/regexp_nodes/parameters/service/sandbox +0 -0
- data/{ext → examples/enc}/regexp_nodes/regexp_nodes.rb +0 -0
- data/{ext → examples}/nagios/check_puppet.rb +2 -2
- data/ext/README.md +13 -0
- data/lib/puppet/configurer.rb +155 -46
- data/lib/puppet/defaults.rb +51 -26
- data/lib/puppet/environments.rb +66 -26
- data/lib/puppet/file_serving/configuration.rb +2 -0
- data/lib/puppet/file_serving/configuration/parser.rb +2 -0
- data/lib/puppet/file_serving/mount/scripts.rb +24 -0
- data/lib/puppet/functions/find_template.rb +2 -2
- data/lib/puppet/http/service/compiler.rb +6 -1
- data/lib/puppet/indirector/catalog/compiler.rb +21 -3
- data/lib/puppet/indirector/catalog/rest.rb +1 -0
- data/lib/puppet/indirector/terminus.rb +4 -0
- data/lib/puppet/module/plan.rb +0 -1
- data/lib/puppet/module/task.rb +1 -1
- data/lib/puppet/module_tool/applications/installer.rb +8 -4
- data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
- data/lib/puppet/node/environment.rb +10 -11
- data/lib/puppet/pops/serialization/to_data_converter.rb +18 -6
- data/lib/puppet/provider/package/pkg.rb +8 -1
- data/lib/puppet/provider/service/launchd.rb +1 -1
- data/lib/puppet/provider/service/systemd.rb +1 -1
- data/lib/puppet/provider/user/useradd.rb +42 -9
- data/lib/puppet/transaction/persistence.rb +11 -1
- data/lib/puppet/transaction/report.rb +15 -1
- data/lib/puppet/type.rb +1 -1
- data/lib/puppet/type/exec.rb +10 -1
- data/lib/puppet/type/file.rb +6 -6
- data/lib/puppet/type/filebucket.rb +2 -2
- data/lib/puppet/version.rb +1 -1
- data/locales/puppet.pot +134 -94
- data/man/man5/puppet.conf.5 +65 -25
- 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-lookup.8 +1 -1
- data/man/man8/puppet-module.8 +3 -3
- 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.8 +2 -2
- data/spec/fixtures/integration/application/agent/lib/facter/agent_spec_role.rb +3 -0
- data/spec/fixtures/integration/l10n/envs/prod/modules/demo/Gemfile +4 -0
- data/spec/fixtures/integration/l10n/envs/prod/modules/demo/Rakefile +3 -0
- data/spec/fixtures/integration/l10n/envs/prod/modules/demo/lib/puppet/functions/l10n.rb +8 -0
- data/spec/fixtures/integration/l10n/envs/prod/modules/demo/locales/config.yaml +25 -0
- data/spec/fixtures/integration/l10n/envs/prod/modules/demo/locales/ja/puppet-l10n.po +19 -0
- data/spec/fixtures/integration/l10n/envs/prod/modules/demo/locales/puppet-l10n.pot +20 -0
- data/spec/fixtures/integration/l10n/envs/prod/modules/demo/metadata.json +8 -0
- data/spec/integration/application/agent_spec.rb +102 -52
- data/spec/integration/application/filebucket_spec.rb +5 -0
- data/spec/integration/configurer_spec.rb +17 -1
- data/spec/integration/l10n/compiler_spec.rb +37 -0
- data/spec/lib/puppet_spec/modules.rb +13 -2
- data/spec/lib/puppet_spec/puppetserver.rb +15 -0
- data/spec/shared_behaviours/documentation_on_faces.rb +0 -2
- data/spec/shared_contexts/l10n.rb +27 -0
- data/spec/spec_helper.rb +1 -10
- data/spec/unit/configurer_spec.rb +265 -54
- data/spec/unit/environments_spec.rb +150 -1
- data/spec/unit/file_serving/configuration/parser_spec.rb +23 -0
- data/spec/unit/file_serving/configuration_spec.rb +12 -4
- data/spec/unit/file_serving/mount/scripts_spec.rb +69 -0
- data/spec/unit/functions/logging_spec.rb +1 -0
- data/spec/unit/http/service/compiler_spec.rb +8 -0
- data/spec/unit/indirector/catalog/compiler_spec.rb +87 -0
- data/spec/unit/indirector/catalog/rest_spec.rb +8 -0
- data/spec/unit/interface/action_spec.rb +0 -9
- data/spec/unit/module_spec.rb +14 -0
- data/spec/unit/module_tool/applications/installer_spec.rb +39 -12
- data/spec/unit/pops/parser/parse_containers_spec.rb +0 -11
- data/spec/unit/pops/serialization/to_from_hr_spec.rb +58 -0
- data/spec/unit/provider/package/pkg_spec.rb +19 -5
- data/spec/unit/provider/service/launchd_spec.rb +11 -0
- data/spec/unit/provider/service/systemd_spec.rb +1 -1
- data/spec/unit/provider/user/useradd_spec.rb +3 -2
- metadata +34 -94
- data/ext/README.environment +0 -8
- data/ext/dbfix.sql +0 -132
- data/ext/debian/README.Debian +0 -8
- data/ext/debian/README.source +0 -2
- data/ext/debian/TODO.Debian +0 -1
- data/ext/debian/changelog.erb +0 -1122
- data/ext/debian/compat +0 -1
- data/ext/debian/control +0 -144
- data/ext/debian/copyright +0 -339
- data/ext/debian/docs +0 -1
- data/ext/debian/fileserver.conf +0 -41
- data/ext/debian/puppet-common.dirs +0 -13
- data/ext/debian/puppet-common.install +0 -3
- data/ext/debian/puppet-common.lintian-overrides +0 -5
- data/ext/debian/puppet-common.manpages +0 -28
- data/ext/debian/puppet-common.postinst +0 -35
- data/ext/debian/puppet-common.postrm +0 -33
- data/ext/debian/puppet-el.dirs +0 -1
- data/ext/debian/puppet-el.emacsen-install +0 -25
- data/ext/debian/puppet-el.emacsen-remove +0 -11
- data/ext/debian/puppet-el.emacsen-startup +0 -9
- data/ext/debian/puppet-el.install +0 -1
- data/ext/debian/puppet-testsuite.install +0 -2
- data/ext/debian/puppet-testsuite.lintian-overrides +0 -4
- data/ext/debian/puppet.lintian-overrides +0 -3
- data/ext/debian/puppet.logrotate +0 -20
- data/ext/debian/puppet.postinst +0 -20
- data/ext/debian/puppet.postrm +0 -20
- data/ext/debian/puppet.preinst +0 -20
- data/ext/debian/puppetmaster-common.install +0 -2
- data/ext/debian/puppetmaster-common.manpages +0 -2
- data/ext/debian/puppetmaster-common.postinst +0 -6
- data/ext/debian/puppetmaster-passenger.dirs +0 -4
- data/ext/debian/puppetmaster-passenger.postinst +0 -162
- data/ext/debian/puppetmaster-passenger.postrm +0 -61
- data/ext/debian/puppetmaster.README.debian +0 -17
- data/ext/debian/puppetmaster.default +0 -14
- data/ext/debian/puppetmaster.init +0 -137
- data/ext/debian/puppetmaster.lintian-overrides +0 -3
- data/ext/debian/puppetmaster.postinst +0 -20
- data/ext/debian/puppetmaster.postrm +0 -5
- data/ext/debian/puppetmaster.preinst +0 -22
- data/ext/debian/rules +0 -132
- data/ext/debian/source/format +0 -1
- data/ext/debian/source/options +0 -1
- data/ext/debian/vim-puppet.README.Debian +0 -13
- data/ext/debian/vim-puppet.dirs +0 -5
- data/ext/debian/vim-puppet.yaml +0 -7
- data/ext/debian/watch +0 -2
- data/ext/freebsd/puppetd +0 -26
- data/ext/freebsd/puppetmasterd +0 -26
- data/ext/gentoo/conf.d/puppet +0 -5
- data/ext/gentoo/conf.d/puppetmaster +0 -12
- data/ext/gentoo/init.d/puppet +0 -38
- data/ext/gentoo/init.d/puppetmaster +0 -51
- data/ext/gentoo/puppet/fileserver.conf +0 -41
- data/ext/ips/puppet-agent +0 -44
- data/ext/ips/puppet-master +0 -44
- data/ext/ips/puppet.p5m.erb +0 -12
- data/ext/ips/puppetagent.xml +0 -42
- data/ext/ips/puppetmaster.xml +0 -42
- data/ext/ips/rules +0 -19
- data/ext/ips/transforms +0 -34
- data/ext/ldap/puppet.schema +0 -24
- data/ext/logcheck/puppet +0 -23
- data/ext/osx/file_mapping.yaml +0 -28
- data/ext/osx/postflight.erb +0 -109
- data/ext/osx/preflight.erb +0 -52
- data/ext/osx/prototype.plist.erb +0 -38
- data/ext/redhat/fileserver.conf +0 -41
- data/ext/redhat/logrotate +0 -21
- data/ext/redhat/puppet.spec.erb +0 -841
- data/ext/redhat/server.init +0 -128
- data/ext/redhat/server.sysconfig +0 -13
- data/ext/solaris/pkginfo +0 -6
- data/ext/solaris/smf/puppetd.xml +0 -77
- data/ext/solaris/smf/puppetmasterd.xml +0 -77
- data/ext/solaris/smf/svc-puppetd +0 -71
- data/ext/solaris/smf/svc-puppetmasterd +0 -67
- data/ext/suse/puppet.spec +0 -310
- data/ext/suse/server.init +0 -173
- data/ext/yaml_nodes.rb +0 -105
- data/spec/unit/indirector/store_configs_spec.rb +0 -7
data/lib/puppet/environments.rb
CHANGED
@@ -48,6 +48,13 @@ module Puppet::Environments
|
|
48
48
|
root.instance_variable_set(:@rich_data, nil)
|
49
49
|
end
|
50
50
|
end
|
51
|
+
|
52
|
+
# The base implementation is a noop, because `get` returns a new environment
|
53
|
+
# each time.
|
54
|
+
#
|
55
|
+
# @see Puppet::Environments::Cached#guard
|
56
|
+
def guard(name); end
|
57
|
+
def unguard(name); end
|
51
58
|
end
|
52
59
|
|
53
60
|
# @!macro [new] loader_search_paths
|
@@ -188,7 +195,7 @@ module Puppet::Environments
|
|
188
195
|
|
189
196
|
def self.real_path(dir)
|
190
197
|
if Puppet::FileSystem.symlink?(dir) && Puppet[:versioned_environment_dirs]
|
191
|
-
dir = Puppet::FileSystem.expand_path(Puppet::FileSystem.readlink(dir))
|
198
|
+
dir = Pathname.new Puppet::FileSystem.expand_path(Puppet::FileSystem.readlink(dir))
|
192
199
|
end
|
193
200
|
return dir
|
194
201
|
end
|
@@ -241,7 +248,7 @@ module Puppet::Environments
|
|
241
248
|
|
242
249
|
def validated_directory(envdir)
|
243
250
|
env_name = Puppet::FileSystem.basename_string(envdir)
|
244
|
-
envdir = Puppet::Environments::Directories.real_path(envdir)
|
251
|
+
envdir = Puppet::Environments::Directories.real_path(envdir).to_s
|
245
252
|
if Puppet::FileSystem.directory?(envdir) && Puppet::Node::Environment.valid_name?(env_name)
|
246
253
|
envdir
|
247
254
|
else
|
@@ -330,21 +337,13 @@ module Puppet::Environments
|
|
330
337
|
end
|
331
338
|
|
332
339
|
def self.cache_expiration_service=(service)
|
333
|
-
@
|
340
|
+
@cache_expiration_service_singleton = service
|
334
341
|
end
|
335
342
|
|
336
343
|
def self.cache_expiration_service
|
337
|
-
@
|
344
|
+
@cache_expiration_service_singleton || DefaultCacheExpirationService.new
|
338
345
|
end
|
339
346
|
|
340
|
-
# Returns the end of time (the next Mesoamerican Long Count cycle-end after 2012 (5125+2012) = 7137
|
341
|
-
def self.end_of_time
|
342
|
-
Time.gm(7137)
|
343
|
-
end
|
344
|
-
|
345
|
-
END_OF_TIME = end_of_time
|
346
|
-
START_OF_TIME = Time.gm(1)
|
347
|
-
|
348
347
|
def initialize(loader)
|
349
348
|
@loader = loader
|
350
349
|
@cache_expiration_service = Puppet::Environments::Cached.cache_expiration_service
|
@@ -356,7 +355,7 @@ module Puppet::Environments
|
|
356
355
|
# Evict all that have expired, in the same way as `get`
|
357
356
|
clear_all_expired
|
358
357
|
|
359
|
-
# Evict all that was removed from
|
358
|
+
# Evict all that was removed from disk
|
360
359
|
cached_envs = @cache.keys.map!(&:to_sym)
|
361
360
|
loader_envs = @loader.list.map!(&:name)
|
362
361
|
removed_envs = cached_envs - loader_envs
|
@@ -385,27 +384,35 @@ module Puppet::Environments
|
|
385
384
|
|
386
385
|
# @!macro loader_get
|
387
386
|
def get(name)
|
387
|
+
entry = get_entry(name)
|
388
|
+
entry ? entry.value : nil
|
389
|
+
end
|
390
|
+
|
391
|
+
# Get a cache entry for an envionment. It returns nil if the
|
392
|
+
# environment doesn't exist.
|
393
|
+
def get_entry(name, check_expired = true)
|
388
394
|
# Aggressively evict all that has expired
|
389
395
|
# This strategy favors smaller memory footprint over environment
|
390
396
|
# retrieval time.
|
391
|
-
clear_all_expired
|
392
|
-
|
393
|
-
|
394
|
-
|
397
|
+
clear_all_expired if check_expired
|
398
|
+
name = name.to_sym
|
399
|
+
entry = @cache[name]
|
400
|
+
if entry
|
401
|
+
Puppet.debug {"Found in cache #{name.inspect} #{entry.label}"}
|
395
402
|
# found in cache
|
396
|
-
|
397
|
-
|
398
|
-
elsif (result = @loader.get(name))
|
403
|
+
entry.touch
|
404
|
+
elsif (env = @loader.get(name))
|
399
405
|
# environment loaded, cache it
|
400
|
-
|
401
|
-
add_entry(name,
|
402
|
-
result
|
406
|
+
entry = entry(env)
|
407
|
+
add_entry(name, entry)
|
403
408
|
end
|
409
|
+
entry
|
404
410
|
end
|
411
|
+
private :get_entry
|
405
412
|
|
406
413
|
# Adds a cache entry to the cache
|
407
414
|
def add_entry(name, cache_entry)
|
408
|
-
Puppet.debug {"Caching environment
|
415
|
+
Puppet.debug {"Caching environment #{name.inspect} #{cache_entry.label}"}
|
409
416
|
@cache[name] = cache_entry
|
410
417
|
@cache_expiration_service.created(cache_entry.value)
|
411
418
|
end
|
@@ -413,7 +420,7 @@ module Puppet::Environments
|
|
413
420
|
|
414
421
|
def clear_entry(name, entry)
|
415
422
|
@cache.delete(name)
|
416
|
-
Puppet.debug {"Evicting cache entry for environment
|
423
|
+
Puppet.debug {"Evicting cache entry for environment #{name.inspect}"}
|
417
424
|
@cache_expiration_service.evicted(name.to_sym)
|
418
425
|
Puppet::GettextConfig.delete_text_domain(name)
|
419
426
|
Puppet.settings.clear_environment_settings(name)
|
@@ -423,6 +430,7 @@ module Puppet::Environments
|
|
423
430
|
# Clears the cache of the environment with the given name.
|
424
431
|
# (The intention is that this could be used from a MANUAL cache eviction command (TBD)
|
425
432
|
def clear(name)
|
433
|
+
name = name.to_sym
|
426
434
|
entry = @cache[name]
|
427
435
|
clear_entry(name, entry) if entry
|
428
436
|
end
|
@@ -443,19 +451,21 @@ module Puppet::Environments
|
|
443
451
|
# Clears all environments that have expired, either by exceeding their time to live, or
|
444
452
|
# through an explicit eviction determined by the cache expiration service.
|
445
453
|
#
|
446
|
-
def clear_all_expired
|
454
|
+
def clear_all_expired
|
447
455
|
t = Time.now
|
448
456
|
|
449
457
|
@cache.each_pair do |name, entry|
|
450
458
|
clear_if_expired(name, entry, t)
|
451
459
|
end
|
452
460
|
end
|
461
|
+
private :clear_all_expired
|
453
462
|
|
454
463
|
# Clear an environment if it is expired, either by exceeding its time to live, or
|
455
464
|
# through an explicit eviction determined by the cache expiration service.
|
456
465
|
#
|
457
466
|
def clear_if_expired(name, entry, t = Time.now)
|
458
467
|
return unless entry
|
468
|
+
return if entry.guarded?
|
459
469
|
|
460
470
|
if entry.expired?(t) || @cache_expiration_service.expired?(name.to_sym)
|
461
471
|
clear_entry(name, entry)
|
@@ -472,10 +482,25 @@ module Puppet::Environments
|
|
472
482
|
#
|
473
483
|
# @!macro loader_get_conf
|
474
484
|
def get_conf(name)
|
485
|
+
name = name.to_sym
|
475
486
|
clear_if_expired(name, @cache[name])
|
476
487
|
@loader.get_conf(name)
|
477
488
|
end
|
478
489
|
|
490
|
+
# Guard an environment so it can't be evicted while it's in use. The method
|
491
|
+
# may be called multiple times, provided it is unguarded the same number of
|
492
|
+
# times. If you call this method, you must call `unguard` in an ensure block.
|
493
|
+
def guard(name)
|
494
|
+
entry = get_entry(name, false)
|
495
|
+
entry.guard if entry
|
496
|
+
end
|
497
|
+
|
498
|
+
# Unguard an environment.
|
499
|
+
def unguard(name)
|
500
|
+
entry = get_entry(name, false)
|
501
|
+
entry.unguard if entry
|
502
|
+
end
|
503
|
+
|
479
504
|
# Creates a suitable cache entry given the time to live for one environment
|
480
505
|
#
|
481
506
|
def entry(env)
|
@@ -501,6 +526,7 @@ module Puppet::Environments
|
|
501
526
|
|
502
527
|
def initialize(value)
|
503
528
|
@value = value
|
529
|
+
@guards = 0
|
504
530
|
end
|
505
531
|
|
506
532
|
def touch
|
@@ -513,6 +539,20 @@ module Puppet::Environments
|
|
513
539
|
def label
|
514
540
|
""
|
515
541
|
end
|
542
|
+
|
543
|
+
# These are not protected with a lock, because all of the Cached
|
544
|
+
# methods are protected.
|
545
|
+
def guarded?
|
546
|
+
@guards > 0
|
547
|
+
end
|
548
|
+
|
549
|
+
def guard
|
550
|
+
@guards += 1
|
551
|
+
end
|
552
|
+
|
553
|
+
def unguard
|
554
|
+
@guards -= 1
|
555
|
+
end
|
516
556
|
end
|
517
557
|
|
518
558
|
# Always evicting entry
|
@@ -6,6 +6,7 @@ require_relative '../../puppet/file_serving/mount/modules'
|
|
6
6
|
require_relative '../../puppet/file_serving/mount/plugins'
|
7
7
|
require_relative '../../puppet/file_serving/mount/locales'
|
8
8
|
require_relative '../../puppet/file_serving/mount/pluginfacts'
|
9
|
+
require_relative '../../puppet/file_serving/mount/scripts'
|
9
10
|
require_relative '../../puppet/file_serving/mount/tasks'
|
10
11
|
|
11
12
|
class Puppet::FileServing::Configuration
|
@@ -83,6 +84,7 @@ class Puppet::FileServing::Configuration
|
|
83
84
|
@mounts["plugins"] ||= Mount::Plugins.new("plugins")
|
84
85
|
@mounts["locales"] ||= Mount::Locales.new("locales")
|
85
86
|
@mounts["pluginfacts"] ||= Mount::PluginFacts.new("pluginfacts")
|
87
|
+
@mounts["scripts"] ||= Mount::Scripts.new("scripts")
|
86
88
|
@mounts["tasks"] ||= Mount::Tasks.new("tasks")
|
87
89
|
end
|
88
90
|
|
@@ -78,6 +78,8 @@ class Puppet::FileServing::Configuration::Parser
|
|
78
78
|
mount = Mount::Modules.new(name)
|
79
79
|
when "plugins"
|
80
80
|
mount = Mount::Plugins.new(name)
|
81
|
+
when "scripts"
|
82
|
+
mount = Mount::Scripts.new(name)
|
81
83
|
when "tasks"
|
82
84
|
mount = Mount::Tasks.new(name)
|
83
85
|
when "locales"
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'puppet/file_serving/mount'
|
2
|
+
|
3
|
+
class Puppet::FileServing::Mount::Scripts < Puppet::FileServing::Mount
|
4
|
+
# Return an instance of the appropriate class.
|
5
|
+
def find(path, request)
|
6
|
+
raise _("No module specified") if path.to_s.empty?
|
7
|
+
module_name, relative_path = path.split("/", 2)
|
8
|
+
mod = request.environment.module(module_name)
|
9
|
+
return nil unless mod
|
10
|
+
|
11
|
+
mod.script(relative_path)
|
12
|
+
end
|
13
|
+
|
14
|
+
def search(path, request)
|
15
|
+
result = find(path, request)
|
16
|
+
if result
|
17
|
+
[result]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def valid?
|
22
|
+
true
|
23
|
+
end
|
24
|
+
end
|
@@ -2,11 +2,11 @@
|
|
2
2
|
#
|
3
3
|
# This function accepts an argument that is a String as a `<MODULE NAME>/<TEMPLATE>`
|
4
4
|
# reference, which searches for `<TEMPLATE>` relative to a module's `templates`
|
5
|
-
# directory on the
|
5
|
+
# directory on the primary server. (For example, the reference `mymod/secret.conf.epp`
|
6
6
|
# will search for the file `<MODULES DIRECTORY>/mymod/templates/secret.conf.epp`.)
|
7
7
|
#
|
8
8
|
# The primary use case is for agent-side template rendering with late-bound variables
|
9
|
-
# resolved, such as from secret stores inaccessible to the
|
9
|
+
# resolved, such as from secret stores inaccessible to the primary server, such as
|
10
10
|
#
|
11
11
|
# ```
|
12
12
|
# $variables = {
|
@@ -60,6 +60,10 @@ class Puppet::HTTP::Service::Compiler < Puppet::HTTP::Service
|
|
60
60
|
# @param [String] environment The name of the environment we are operating in
|
61
61
|
# @param [String] configured_environment Optional, the name of the configured
|
62
62
|
# environment. If unset, `environment` is used.
|
63
|
+
# @param [Boolean] check_environment If true, request that the server check if
|
64
|
+
# our `environment` matches the server-specified environment. If they do not
|
65
|
+
# match, then the server may return an empty catalog in the server-specified
|
66
|
+
# environment.
|
63
67
|
# @param [String] transaction_uuid An agent generated transaction uuid, used
|
64
68
|
# for connecting catalogs and reports.
|
65
69
|
# @param [String] job_uuid A unique job identifier defined when the orchestrator
|
@@ -75,7 +79,7 @@ class Puppet::HTTP::Service::Compiler < Puppet::HTTP::Service
|
|
75
79
|
# the server
|
76
80
|
#
|
77
81
|
# @api public
|
78
|
-
def post_catalog(name, facts:, environment:, configured_environment: nil, transaction_uuid: nil, job_uuid: nil, static_catalog: true, checksum_type: Puppet[:supported_checksum_types])
|
82
|
+
def post_catalog(name, facts:, environment:, configured_environment: nil, check_environment: false, transaction_uuid: nil, job_uuid: nil, static_catalog: true, checksum_type: Puppet[:supported_checksum_types])
|
79
83
|
if Puppet[:preferred_serialization_format] == "pson"
|
80
84
|
formatter = Puppet::Network::FormatHandler.format_for(:pson)
|
81
85
|
# must use 'pson' instead of 'text/pson'
|
@@ -93,6 +97,7 @@ class Puppet::HTTP::Service::Compiler < Puppet::HTTP::Service
|
|
93
97
|
facts: Puppet::Util.uri_query_encode(facts_as_string),
|
94
98
|
environment: environment,
|
95
99
|
configured_environment: configured_environment || environment,
|
100
|
+
check_environment: !!check_environment,
|
96
101
|
transaction_uuid: transaction_uuid,
|
97
102
|
job_uuid: job_uuid,
|
98
103
|
static_catalog: static_catalog,
|
@@ -53,8 +53,22 @@ class Puppet::Resource::Catalog::Compiler < Puppet::Indirector::Code
|
|
53
53
|
node.trusted_data = Puppet.lookup(:trusted_information) { Puppet::Context::TrustedInformation.local(node) }.to_h
|
54
54
|
|
55
55
|
if node.environment
|
56
|
+
# If the requested environment doesn't match the server specified environment,
|
57
|
+
# as determined by the node terminus, and the request wants us to check for an
|
58
|
+
# environment mismatch, then return an empty catalog with the server-specified
|
59
|
+
# enviroment.
|
60
|
+
if request.remote? && request.options[:check_environment] && node.environment != request.environment
|
61
|
+
return Puppet::Resource::Catalog.new(node.name, node.environment)
|
62
|
+
end
|
63
|
+
|
56
64
|
node.environment.with_text_domain do
|
57
|
-
|
65
|
+
envs = Puppet.lookup(:environments)
|
66
|
+
envs.guard(node.environment.name)
|
67
|
+
begin
|
68
|
+
compile(node, request.options)
|
69
|
+
ensure
|
70
|
+
envs.unguard(node.environment.name)
|
71
|
+
end
|
58
72
|
end
|
59
73
|
else
|
60
74
|
compile(node, request.options)
|
@@ -78,6 +92,10 @@ class Puppet::Resource::Catalog::Compiler < Puppet::Indirector::Code
|
|
78
92
|
Puppet.run_mode.server?
|
79
93
|
end
|
80
94
|
|
95
|
+
def require_environment?
|
96
|
+
false
|
97
|
+
end
|
98
|
+
|
81
99
|
private
|
82
100
|
|
83
101
|
# @param facts [String] facts in a wire format for decoding
|
@@ -154,7 +172,7 @@ class Puppet::Resource::Catalog::Compiler < Puppet::Indirector::Code
|
|
154
172
|
location = Puppet::Module::FILETYPES['files']
|
155
173
|
|
156
174
|
!!(source_as_uri.path =~ /^\/modules\// &&
|
157
|
-
metadata.full_path =~ /#{environment_path}[^\/]+\/[^\/]+\/#{location}\/.+/)
|
175
|
+
metadata.full_path =~ /#{environment_path}\/[^\/]+\/[^\/]+\/#{location}\/.+/)
|
158
176
|
end
|
159
177
|
|
160
178
|
# Helper method to log file resources that could not be inlined because they
|
@@ -173,7 +191,7 @@ class Puppet::Resource::Catalog::Compiler < Puppet::Indirector::Code
|
|
173
191
|
# Inline file metadata for static catalogs
|
174
192
|
# Initially restricted to files sourced from codedir via puppet:/// uri.
|
175
193
|
def inline_metadata(catalog, checksum_type)
|
176
|
-
environment_path = Pathname.new File.join(Puppet[:environmentpath], catalog.environment
|
194
|
+
environment_path = Pathname.new File.join(Puppet[:environmentpath], catalog.environment)
|
177
195
|
environment_path = Puppet::Environments::Directories.real_path(environment_path)
|
178
196
|
list_of_resources = catalog.resources.find_all { |res| res.type == "File" }
|
179
197
|
|
@@ -18,6 +18,7 @@ class Puppet::Resource::Catalog::Rest < Puppet::Indirector::REST
|
|
18
18
|
facts: request.options[:facts_for_catalog],
|
19
19
|
environment: request.environment.to_s,
|
20
20
|
configured_environment: request.options[:configured_environment],
|
21
|
+
check_environment: request.options[:check_environment],
|
21
22
|
transaction_uuid: request.options[:transaction_uuid],
|
22
23
|
job_uuid: request.options[:job_id],
|
23
24
|
static_catalog: request.options[:static_catalog],
|
data/lib/puppet/module/plan.rb
CHANGED
@@ -50,7 +50,6 @@ class Puppet::Module
|
|
50
50
|
RESERVED_DATA_TYPES = %w{any array boolean catalogentry class collection
|
51
51
|
callable data default enum float hash integer numeric optional pattern
|
52
52
|
resource runtime scalar string struct tuple type undef variant}
|
53
|
-
MOUNTS = %w[lib files plans]
|
54
53
|
|
55
54
|
def self.is_plan_name?(name)
|
56
55
|
return true if name =~ /^[a-z][a-z0-9_]*$/
|
data/lib/puppet/module/task.rb
CHANGED
@@ -138,7 +138,7 @@ module Puppet::ModuleTool
|
|
138
138
|
rescue SemanticPuppet::Dependency::UnsatisfiableGraph => e
|
139
139
|
unsatisfied = nil
|
140
140
|
|
141
|
-
if e.respond_to?(:unsatisfied)
|
141
|
+
if e.respond_to?(:unsatisfied) && e.unsatisfied
|
142
142
|
constraints = {}
|
143
143
|
# If the module we're installing satisfies all its
|
144
144
|
# dependencies, but would break an already installed
|
@@ -164,8 +164,12 @@ module Puppet::ModuleTool
|
|
164
164
|
# If the module fails to satisfy one of its
|
165
165
|
# dependencies, show the unsatisfiable module
|
166
166
|
else
|
167
|
-
|
168
|
-
|
167
|
+
dep_constraints = graph.dependencies[name].max.constraints
|
168
|
+
|
169
|
+
if dep_constraints.key?(e.unsatisfied)
|
170
|
+
unsatisfied_range = dep_constraints[e.unsatisfied].first[1]
|
171
|
+
constraints[e.unsatisfied] = unsatisfied_range
|
172
|
+
end
|
169
173
|
end
|
170
174
|
|
171
175
|
installed_module = @environment.module_by_forge_name(e.unsatisfied.tr('-', '/'))
|
@@ -175,7 +179,7 @@ module Puppet::ModuleTool
|
|
175
179
|
:name => e.unsatisfied,
|
176
180
|
:constraints => constraints,
|
177
181
|
:current_version => current_version
|
178
|
-
}
|
182
|
+
} if constraints.any?
|
179
183
|
end
|
180
184
|
|
181
185
|
raise NoVersionsSatisfyError, results.merge(
|
@@ -98,7 +98,7 @@ class Puppet::Network::HTTP::API::IndirectedRoutes
|
|
98
98
|
params[:environment] = configured_environment
|
99
99
|
end
|
100
100
|
|
101
|
-
if configured_environment.nil?
|
101
|
+
if configured_environment.nil? && indirection.terminus.require_environment?
|
102
102
|
raise Puppet::Network::HTTP::Error::HTTPNotFoundError.new(
|
103
103
|
_("Could not find environment '%{environment}'") % { environment: environment })
|
104
104
|
end
|
@@ -312,7 +312,9 @@ class Puppet::Node::Environment
|
|
312
312
|
{}
|
313
313
|
end
|
314
314
|
modulepath.each do |path|
|
315
|
-
|
315
|
+
Puppet::FileSystem.children(path).map do |p|
|
316
|
+
Puppet::FileSystem.basename_string(p)
|
317
|
+
end.each do |name|
|
316
318
|
next unless Puppet::Module.is_module_directory?(name, path)
|
317
319
|
warn_about_mistaken_path(path, name)
|
318
320
|
if not seen_modules[name]
|
@@ -357,9 +359,6 @@ class Puppet::Node::Environment
|
|
357
359
|
|
358
360
|
# Modules broken out by directory in the modulepath
|
359
361
|
#
|
360
|
-
# @note This method _changes_ the current working directory while enumerating
|
361
|
-
# the modules. This seems rather dangerous.
|
362
|
-
#
|
363
362
|
# @api public
|
364
363
|
#
|
365
364
|
# @return [Hash<String, Array<Puppet::Module>>] A hash whose keys are file
|
@@ -368,13 +367,13 @@ class Puppet::Node::Environment
|
|
368
367
|
modules_by_path = {}
|
369
368
|
modulepath.each do |path|
|
370
369
|
if Puppet::FileSystem.exist?(path)
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
370
|
+
module_names = Puppet::FileSystem.children(path).map do |p|
|
371
|
+
Puppet::FileSystem.basename_string(p)
|
372
|
+
end.select do |name|
|
373
|
+
Puppet::Module.is_module_directory?(name, path)
|
374
|
+
end
|
375
|
+
modules_by_path[path] = module_names.sort.map do |name|
|
376
|
+
Puppet::Module.new(name, File.join(path, name), self)
|
378
377
|
end
|
379
378
|
else
|
380
379
|
modules_by_path[path] = []
|