puppet 4.4.2 → 4.5.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.
- data/CONTRIBUTING.md +5 -5
- data/Gemfile +2 -2
- data/LICENSE +2 -2
- data/README.md +5 -0
- data/ext/project_data.yaml +2 -0
- data/lib/hiera_puppet.rb +6 -14
- data/lib/puppet/application/agent.rb +2 -3
- data/lib/puppet/data_providers/hiera_config.rb +2 -4
- data/lib/puppet/data_providers/hiera_interpolate.rb +12 -154
- data/lib/puppet/data_providers/json_data_provider_factory.rb +0 -7
- data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -8
- data/lib/puppet/defaults.rb +70 -7
- data/lib/puppet/functions.rb +69 -0
- data/lib/puppet/functions/dig.rb +39 -0
- data/lib/puppet/functions/lest.rb +53 -0
- data/lib/puppet/functions/lookup.rb +40 -27
- data/lib/puppet/functions/new.rb +502 -0
- data/lib/puppet/functions/regsubst.rb +11 -10
- data/lib/puppet/functions/then.rb +74 -0
- data/lib/puppet/functions/type.rb +4 -4
- data/lib/puppet/functions/with.rb +1 -1
- data/lib/puppet/indirector/catalog/compiler.rb +2 -0
- data/lib/puppet/indirector/resource_type/parser.rb +5 -0
- data/lib/puppet/indirector/rest.rb +5 -1
- data/lib/puppet/loaders.rb +2 -0
- data/lib/puppet/metatype/manager.rb +19 -2
- data/lib/puppet/module_tool/applications/application.rb +1 -1
- data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +6 -2
- data/lib/puppet/module_tool/skeleton/templates/generator/Rakefile +19 -4
- data/lib/puppet/module_tool/skeleton/templates/generator/{tests → examples}/init.pp.erb +1 -1
- data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +0 -1
- data/lib/puppet/network/http/api/master/v3/environment.rb +6 -2
- data/lib/puppet/parser/ast/pops_bridge.rb +20 -3
- data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +24 -2
- data/lib/puppet/parser/e4_parser_adapter.rb +13 -12
- data/lib/puppet/parser/environment_compiler.rb +2 -2
- data/lib/puppet/parser/resource.rb +14 -5
- data/lib/puppet/parser/scope.rb +18 -15
- data/lib/puppet/plugins/data_providers/data_provider.rb +19 -8
- data/lib/puppet/pops.rb +6 -0
- data/lib/puppet/pops/adapters.rb +5 -1
- data/lib/puppet/pops/evaluator/access_operator.rb +52 -14
- data/lib/puppet/pops/evaluator/compare_operator.rb +34 -4
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +75 -22
- data/lib/puppet/pops/evaluator/literal_evaluator.rb +7 -6
- data/lib/puppet/pops/evaluator/runtime3_converter.rb +13 -1
- data/lib/puppet/pops/evaluator/runtime3_support.rb +14 -4
- data/lib/puppet/pops/functions/dispatcher.rb +1 -1
- data/lib/puppet/pops/issues.rb +18 -2
- data/lib/puppet/pops/loader/base_loader.rb +48 -7
- data/lib/puppet/pops/loader/dependency_loader.rb +27 -2
- data/lib/puppet/pops/loader/loader.rb +12 -0
- data/lib/puppet/pops/loader/predefined_loader.rb +29 -0
- data/lib/puppet/pops/loader/runtime3_type_loader.rb +57 -0
- data/lib/puppet/pops/loader/static_loader.rb +92 -5
- data/lib/puppet/pops/loader/type_definition_instantiator.rb +25 -3
- data/lib/puppet/pops/loaders.rb +84 -14
- data/lib/puppet/pops/lookup/explainer.rb +38 -1
- data/lib/puppet/pops/lookup/interpolation.rb +115 -0
- data/lib/puppet/pops/lookup/sub_lookup.rb +86 -0
- data/lib/puppet/pops/model/ast_transformer.rb +8 -1
- data/lib/puppet/pops/model/factory.rb +31 -8
- data/lib/puppet/pops/model/model.rb +8 -0
- data/lib/puppet/pops/model/model_label_provider.rb +1 -0
- data/lib/puppet/pops/model/model_meta.rb +7 -1
- data/lib/puppet/pops/model/model_tree_dumper.rb +4 -0
- data/lib/puppet/pops/parser/egrammar.ra +24 -7
- data/lib/puppet/pops/parser/eparser.rb +863 -798
- data/lib/puppet/pops/parser/evaluating_parser.rb +4 -0
- data/lib/puppet/pops/parser/locator.rb +8 -4
- data/lib/puppet/pops/pcore.rb +30 -0
- data/lib/puppet/pops/types/class_loader.rb +2 -4
- data/lib/puppet/pops/types/implementation_registry.rb +146 -0
- data/lib/puppet/pops/types/iterable.rb +4 -4
- data/lib/puppet/pops/types/p_object_type.rb +846 -0
- data/lib/puppet/pops/types/p_runtime_type.rb +102 -0
- data/lib/puppet/pops/types/p_sem_ver_range_type.rb +164 -0
- data/lib/puppet/pops/types/p_sem_ver_type.rb +113 -0
- data/lib/puppet/pops/types/puppet_object.rb +21 -0
- data/lib/puppet/pops/types/ruby_generator.rb +258 -0
- data/lib/puppet/pops/types/string_converter.rb +922 -0
- data/lib/puppet/pops/types/type_calculator.rb +29 -5
- data/lib/puppet/pops/types/type_conversion_error.rb +15 -0
- data/lib/puppet/pops/types/type_factory.rb +49 -16
- data/lib/puppet/pops/types/type_formatter.rb +335 -112
- data/lib/puppet/pops/types/type_mismatch_describer.rb +110 -29
- data/lib/puppet/pops/types/type_parser.rb +205 -197
- data/lib/puppet/pops/types/types.rb +481 -103
- data/lib/puppet/pops/validation.rb +1 -1
- data/lib/puppet/pops/validation/checker4_0.rb +66 -4
- data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
- data/lib/puppet/pops/visitor.rb +3 -1
- data/lib/puppet/property.rb +1 -1
- data/lib/puppet/provider/augeas/augeas.rb +1 -1
- data/lib/puppet/provider/package/pip.rb +64 -20
- data/lib/puppet/provider/package/rpm.rb +112 -0
- data/lib/puppet/provider/package/yum.rb +7 -68
- data/lib/puppet/provider/service/daemontools.rb +3 -3
- data/lib/puppet/provider/service/init.rb +4 -2
- data/lib/puppet/provider/service/runit.rb +3 -3
- data/lib/puppet/provider/service/smf.rb +6 -3
- data/lib/puppet/provider/service/systemd.rb +59 -73
- data/lib/puppet/reference/providers.rb +1 -2
- data/lib/puppet/resource.rb +54 -37
- data/lib/puppet/resource/catalog.rb +31 -29
- data/lib/puppet/resource/type_collection.rb +23 -8
- data/lib/puppet/settings.rb +4 -2
- data/lib/puppet/settings/base_setting.rb +9 -3
- data/lib/puppet/settings/symbolic_enum_setting.rb +17 -0
- data/lib/puppet/test/test_helper.rb +0 -1
- data/lib/puppet/type.rb +9 -3
- data/lib/puppet/type/exec.rb +17 -17
- data/lib/puppet/type/file.rb +12 -0
- data/lib/puppet/type/file/content.rb +6 -6
- data/lib/puppet/type/file/ensure.rb +4 -4
- data/lib/puppet/type/file/source.rb +4 -4
- data/lib/puppet/type/file/target.rb +2 -2
- data/lib/puppet/type/mount.rb +18 -1
- data/lib/puppet/type/package.rb +3 -3
- data/lib/puppet/type/schedule.rb +4 -4
- data/lib/puppet/type/service.rb +15 -0
- data/lib/puppet/type/sshkey.rb +5 -3
- data/lib/puppet/type/tidy.rb +3 -3
- data/lib/puppet/type/zone.rb +5 -5
- data/lib/puppet/util/feature.rb +1 -1
- data/lib/puppet/util/monkey_patches.rb +8 -0
- data/lib/puppet/util/network_device/cisco/device.rb +16 -6
- data/lib/puppet/util/network_device/cisco/interface.rb +5 -6
- data/lib/puppet/util/plist.rb +3 -3
- data/lib/puppet/version.rb +1 -1
- data/spec/fixtures/unit/application/environments/production/data/common.yaml +13 -0
- data/spec/fixtures/unit/data_providers/environments/production/modules/abc/lib/puppet/functions/abc/data.rb +2 -1
- data/spec/fixtures/unit/data_providers/environments/production/modules/abc/manifests/init.pp +2 -1
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_json/data/empty_key.json +1 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_json/hiera.yaml +5 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_json/manifests/init.pp +2 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_json/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_yaml/data/empty_key.yaml +1 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_yaml/hiera.yaml +5 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_yaml/manifests/init.pp +2 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_yaml/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +1 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/lib/puppet/type/usee_type.rb +5 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/manifests/init.pp +6 -0
- data/spec/fixtures/unit/provider/service/smf/svcs.out +4 -3
- data/spec/integration/module_tool/tar/mini_spec.rb +27 -27
- data/spec/integration/parser/catalog_spec.rb +14 -2
- data/spec/integration/parser/compiler_spec.rb +94 -3
- data/spec/integration/parser/resource_expressions_spec.rb +1 -1
- data/spec/integration/resource/type_collection_spec.rb +8 -0
- data/spec/lib/puppet_spec/compiler.rb +11 -4
- data/spec/shared_contexts/types_setup.rb +4 -0
- data/spec/unit/application/lookup_spec.rb +91 -9
- data/spec/unit/appmgmt_spec.rb +44 -35
- data/spec/unit/capability_spec.rb +33 -53
- data/spec/unit/data_providers/function_data_provider_spec.rb +19 -1
- data/spec/unit/data_providers/hiera_data_provider_spec.rb +1 -1
- data/spec/unit/defaults_spec.rb +18 -0
- data/spec/unit/functions/assert_type_spec.rb +1 -1
- data/spec/unit/functions/dig_spec.rb +58 -0
- data/spec/unit/functions/lest_spec.rb +34 -0
- data/spec/unit/functions/lookup_spec.rb +108 -2
- data/spec/unit/functions/new_spec.rb +543 -0
- data/spec/unit/functions/regsubst_spec.rb +8 -0
- data/spec/unit/functions/then_spec.rb +40 -0
- data/spec/unit/functions4_spec.rb +78 -10
- data/spec/unit/hiera_puppet_spec.rb +49 -8
- data/spec/unit/indirector/resource_type/parser_spec.rb +5 -0
- data/spec/unit/indirector/rest_spec.rb +12 -0
- data/spec/unit/network/http/api/master/v3/environment_spec.rb +60 -0
- data/spec/unit/node/environment_spec.rb +10 -0
- data/spec/unit/parser/compiler_spec.rb +20 -1
- data/spec/unit/parser/functions/create_resources_spec.rb +2 -2
- data/spec/unit/parser/functions/shared.rb +1 -1
- data/spec/unit/parser/resource_spec.rb +8 -1
- data/spec/unit/parser/scope_spec.rb +45 -0
- data/spec/unit/pops/evaluator/access_ops_spec.rb +14 -0
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +13 -5
- data/spec/unit/pops/loaders/static_loader_spec.rb +92 -1
- data/spec/unit/{data_providers/hiera_interpolation_spec.rb → pops/lookup/interpolation_spec.rb} +7 -5
- data/spec/unit/pops/parser/lexer2_spec.rb +2 -9
- data/spec/unit/pops/parser/parse_application_spec.rb +3 -8
- data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +19 -0
- data/spec/unit/pops/parser/parse_capabilities_spec.rb +3 -10
- data/spec/unit/pops/parser/parse_site_spec.rb +19 -10
- data/spec/unit/pops/parser/parser_rspec_helper.rb +0 -4
- data/spec/unit/pops/types/enumeration_spec.rb +13 -12
- data/spec/unit/pops/types/iterable_spec.rb +2 -2
- data/spec/unit/pops/types/p_object_type_spec.rb +1060 -0
- data/spec/unit/pops/types/p_sem_ver_type_spec.rb +285 -0
- data/spec/unit/pops/types/recursion_guard_spec.rb +19 -17
- data/spec/unit/pops/types/ruby_generator_spec.rb +261 -0
- data/spec/unit/pops/types/string_converter_spec.rb +904 -0
- data/spec/unit/pops/types/type_calculator_spec.rb +430 -406
- data/spec/unit/pops/types/type_factory_spec.rb +119 -104
- data/spec/unit/pops/types/type_formatter_spec.rb +73 -6
- data/spec/unit/pops/types/type_mismatch_describer_spec.rb +2 -2
- data/spec/unit/pops/types/type_parser_spec.rb +54 -15
- data/spec/unit/pops/types/types_spec.rb +113 -8
- data/spec/unit/pops/validator/validator_spec.rb +84 -10
- data/spec/unit/provider/package/pip3_spec.rb +9 -270
- data/spec/unit/provider/package/pip_spec.rb +85 -30
- data/spec/unit/provider/package/rpm_spec.rb +160 -3
- data/spec/unit/provider/package/yum_spec.rb +23 -134
- data/spec/unit/provider/service/smf_spec.rb +14 -2
- data/spec/unit/provider/service/systemd_spec.rb +33 -41
- data/spec/unit/resource/capability_finder_spec.rb +10 -2
- data/spec/unit/settings/file_setting_spec.rb +6 -0
- data/spec/unit/transaction/additional_resource_generator_spec.rb +80 -65
- data/spec/unit/type/mount_spec.rb +51 -10
- data/spec/unit/type/service_spec.rb +16 -0
- data/spec/unit/type_spec.rb +14 -0
- data/spec/unit/util/feature_spec.rb +1 -1
- data/spec/unit/util/monkey_patches_spec.rb +60 -0
- data/spec/unit/util/network_device/cisco/device_spec.rb +1 -1
- metadata +63 -11
- data/lib/puppet/pops/types/types_meta.rb +0 -0
- data/spec/integration/provider/package_spec.rb +0 -35
@@ -19,9 +19,9 @@ Puppet::Type.type(:service).provide :daemontools, :parent => :base do
|
|
19
19
|
|
20
20
|
...or this can be overriden in the resource's attributes:
|
21
21
|
|
22
|
-
service {
|
23
|
-
provider =>
|
24
|
-
path =>
|
22
|
+
service { 'myservice':
|
23
|
+
provider => 'daemontools',
|
24
|
+
path => '/path/to/daemons',
|
25
25
|
}
|
26
26
|
|
27
27
|
This provider supports out of the box:
|
@@ -17,9 +17,11 @@ Puppet::Type.type(:service).provide :init, :parent => :base do
|
|
17
17
|
end
|
18
18
|
|
19
19
|
# Debian and Ubuntu should use the Debian provider.
|
20
|
+
# RedHat systems should use the RedHat provider.
|
20
21
|
confine :true => begin
|
21
|
-
|
22
|
-
|
22
|
+
os = Facter.value(:operatingsystem).downcase
|
23
|
+
family = Facter.value(:osfamily).downcase
|
24
|
+
!(os == 'debian' || os == 'ubuntu' || family == 'redhat')
|
23
25
|
end
|
24
26
|
|
25
27
|
# We can't confine this here, because the init path can be overridden.
|
@@ -19,9 +19,9 @@ Puppet::Type.type(:service).provide :runit, :parent => :daemontools do
|
|
19
19
|
|
20
20
|
or this can be overriden in the service resource parameters::
|
21
21
|
|
22
|
-
service {
|
23
|
-
provider =>
|
24
|
-
path
|
22
|
+
service { 'myservice':
|
23
|
+
provider => 'runit',
|
24
|
+
path => '/path/to/daemons',
|
25
25
|
}
|
26
26
|
|
27
27
|
This provider supports out of the box:
|
@@ -34,11 +34,12 @@ Puppet::Type.type(:service).provide :smf, :parent => :base do
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def self.instances
|
37
|
-
svcs("-H").split("\n").select{|l| l !~ /^legacy_run/ }.collect do |line|
|
38
|
-
state,
|
37
|
+
svcs("-H", "-o", "state,fmri" ).split("\n").select{|l| l !~ /^legacy_run/ }.collect do |line|
|
38
|
+
state,fmri = line.split(/\s+/)
|
39
39
|
status = case state
|
40
40
|
when /online/; :running
|
41
41
|
when /maintenance/; :maintenance
|
42
|
+
when /degraded/; :degraded
|
42
43
|
else :stopped
|
43
44
|
end
|
44
45
|
new({:name => fmri, :ensure => status})
|
@@ -69,7 +70,7 @@ Puppet::Type.type(:service).provide :smf, :parent => :base do
|
|
69
70
|
def startcmd
|
70
71
|
self.setupservice
|
71
72
|
case self.status
|
72
|
-
when :maintenance
|
73
|
+
when :maintenance, :degraded
|
73
74
|
[command(:adm), :clear, @resource[:name]]
|
74
75
|
else
|
75
76
|
[command(:adm), :enable, "-s", @resource[:name]]
|
@@ -140,6 +141,8 @@ Puppet::Type.type(:service).provide :smf, :parent => :base do
|
|
140
141
|
return :stopped
|
141
142
|
when "maintenance"
|
142
143
|
return :maintenance
|
144
|
+
when "degraded"
|
145
|
+
return :degraded
|
143
146
|
when "legacy_run"
|
144
147
|
raise Puppet::Error,
|
145
148
|
"Cannot manage legacy services through SMF"
|
@@ -1,7 +1,11 @@
|
|
1
1
|
# Manage systemd services using systemctl
|
2
2
|
|
3
3
|
Puppet::Type.type(:service).provide :systemd, :parent => :base do
|
4
|
-
desc "Manages `systemd` services using `systemctl`.
|
4
|
+
desc "Manages `systemd` services using `systemctl`.
|
5
|
+
|
6
|
+
Because `systemd` defaults to assuming the `.service` unit type, the suffix
|
7
|
+
may be omitted. Other unit types (such as `.path`) may be managed by
|
8
|
+
providing the proper suffix."
|
5
9
|
|
6
10
|
commands :systemctl => "systemctl"
|
7
11
|
|
@@ -32,10 +36,21 @@ Puppet::Type.type(:service).provide :systemd, :parent => :base do
|
|
32
36
|
return []
|
33
37
|
end
|
34
38
|
|
39
|
+
# This helper ensures that the enable state cache is always reset
|
40
|
+
# after a systemctl enable operation. A particular service state is not guaranteed
|
41
|
+
# after such an operation, so the cache must be emptied to prevent inconsistencies
|
42
|
+
# in the provider's believed state of the service and the actual state.
|
43
|
+
# @param action [String,Symbol] One of 'enable', 'disable', 'mask' or 'unmask'
|
44
|
+
def systemctl_change_enable(action)
|
45
|
+
output = systemctl(action, @resource[:name])
|
46
|
+
rescue
|
47
|
+
raise Puppet::Error, "Could not #{action} #{self.name}: #{output}", $!.backtrace
|
48
|
+
ensure
|
49
|
+
@cached_enabled = nil
|
50
|
+
end
|
51
|
+
|
35
52
|
def disable
|
36
|
-
|
37
|
-
rescue Puppet::ExecutionFailure
|
38
|
-
raise Puppet::Error, "Could not disable #{self.name}: #{output}", $!.backtrace
|
53
|
+
systemctl_change_enable(:disable)
|
39
54
|
end
|
40
55
|
|
41
56
|
def get_start_link_count
|
@@ -49,38 +64,27 @@ Puppet::Type.type(:service).provide :systemd, :parent => :base do
|
|
49
64
|
Dir.glob("/etc/rc*.d/S??#{link_name}").length
|
50
65
|
end
|
51
66
|
|
52
|
-
def
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
'--property', 'LoadState',
|
58
|
-
'--property', 'UnitFileState',
|
59
|
-
'--no-pager'
|
60
|
-
)
|
61
|
-
|
62
|
-
svc_info = Hash.new
|
63
|
-
systemctl_info.split.each do |svc|
|
64
|
-
entry_pair = svc.split('=')
|
65
|
-
svc_info[entry_pair.first.to_sym] = entry_pair.last
|
66
|
-
end
|
67
|
+
def cached_enabled?
|
68
|
+
return @cached_enabled if @cached_enabled
|
69
|
+
cmd = [command(:systemctl), 'is-enabled', @resource[:name]]
|
70
|
+
@cached_enabled = execute(cmd, :failonfail => false).strip
|
71
|
+
end
|
67
72
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
# service is disabled and therefore we simply return :false.
|
73
|
+
def enabled?
|
74
|
+
output = cached_enabled?
|
75
|
+
|
76
|
+
# The masked state is equivalent to the disabled state in terms of
|
77
|
+
# comparison so we only care to check if it is masked if we want to keep
|
78
|
+
# it masked.
|
79
|
+
#
|
80
|
+
# We only return :mask if we're trying to mask the service. This prevents
|
81
|
+
# flapping when simply trying to disable a masked service.
|
82
|
+
return :mask if (@resource[:enable] == :mask) && (output == 'masked')
|
83
|
+
return :true if ['static', 'enabled'].include? output
|
84
|
+
return :false if ['disabled', 'linked', 'indirect', 'masked'].include? output
|
85
|
+
if (output.empty?) && (Facter.value(:osfamily).downcase == 'debian')
|
86
|
+
ret = debian_enabled?
|
87
|
+
return ret if ret
|
84
88
|
end
|
85
89
|
|
86
90
|
return :false
|
@@ -91,60 +95,38 @@ Puppet::Type.type(:service).provide :systemd, :parent => :base do
|
|
91
95
|
# have a Systemd unit file, we need to go through the old init script to determine
|
92
96
|
# whether it is enabled or not. See PUP-5016 for more details.
|
93
97
|
#
|
94
|
-
def debian_enabled?
|
95
|
-
|
96
|
-
if
|
97
|
-
|
98
|
-
|
98
|
+
def debian_enabled?
|
99
|
+
system("/usr/sbin/invoke-rc.d", "--quiet", "--query", @resource[:name], "start")
|
100
|
+
if [104, 106].include?($CHILD_STATUS.exitstatus)
|
101
|
+
return :true
|
102
|
+
elsif [101, 105].include?($CHILD_STATUS.exitstatus)
|
103
|
+
# 101 is action not allowed, which means we have to do the check manually.
|
104
|
+
# 105 is unknown, which generally means the iniscript does not support query
|
105
|
+
# The debian policy states that the initscript should support methods of query
|
106
|
+
# For those that do not, peform the checks manually
|
107
|
+
# http://www.debian.org/doc/debian-policy/ch-opersys.html
|
108
|
+
if get_start_link_count >= 4
|
99
109
|
return :true
|
100
|
-
elsif [101, 105].include?($CHILD_STATUS.exitstatus)
|
101
|
-
# 101 is action not allowed, which means we have to do the check manually.
|
102
|
-
# 105 is unknown, which generally means the iniscript does not support query
|
103
|
-
# The debian policy states that the initscript should support methods of query
|
104
|
-
# For those that do not, peform the checks manually
|
105
|
-
# http://www.debian.org/doc/debian-policy/ch-opersys.html
|
106
|
-
if get_start_link_count >= 4
|
107
|
-
return :true
|
108
|
-
else
|
109
|
-
return :false
|
110
|
-
end
|
111
110
|
else
|
112
111
|
return :false
|
113
112
|
end
|
113
|
+
else
|
114
|
+
return :false
|
114
115
|
end
|
115
116
|
end
|
116
117
|
|
117
|
-
def status
|
118
|
-
begin
|
119
|
-
systemctl("is-active", @resource[:name])
|
120
|
-
rescue Puppet::ExecutionFailure
|
121
|
-
return :stopped
|
122
|
-
end
|
123
|
-
return :running
|
124
|
-
end
|
125
|
-
|
126
118
|
def enable
|
127
119
|
self.unmask
|
128
|
-
|
129
|
-
rescue Puppet::ExecutionFailure
|
130
|
-
raise Puppet::Error, "Could not enable #{self.name}: #{output}", $!.backtrace
|
120
|
+
systemctl_change_enable(:enable)
|
131
121
|
end
|
132
122
|
|
133
123
|
def mask
|
134
124
|
self.disable
|
135
|
-
|
136
|
-
output = systemctl("mask", @resource[:name])
|
137
|
-
rescue Puppet::ExecutionFailure
|
138
|
-
raise Puppet::Error, "Could not mask #{self.name}: #{output}", $!.backtrace
|
139
|
-
end
|
125
|
+
systemctl_change_enable(:mask)
|
140
126
|
end
|
141
127
|
|
142
128
|
def unmask
|
143
|
-
|
144
|
-
output = systemctl("unmask", @resource[:name])
|
145
|
-
rescue Puppet::ExecutionFailure
|
146
|
-
raise Puppet::Error, "Could not unmask #{self.name}: #{output}", $!.backtrace
|
147
|
-
end
|
129
|
+
systemctl_change_enable(:unmask)
|
148
130
|
end
|
149
131
|
|
150
132
|
def restartcmd
|
@@ -159,5 +141,9 @@ Puppet::Type.type(:service).provide :systemd, :parent => :base do
|
|
159
141
|
def stopcmd
|
160
142
|
[command(:systemctl), "stop", @resource[:name]]
|
161
143
|
end
|
144
|
+
|
145
|
+
def statuscmd
|
146
|
+
[command(:systemctl), "is-active", @resource[:name]]
|
147
|
+
end
|
162
148
|
end
|
163
149
|
|
@@ -1,9 +1,8 @@
|
|
1
|
-
# This doesn't get stored in trac, since it changes every time.
|
2
1
|
providers = Puppet::Util::Reference.newreference :providers, :title => "Provider Suitability Report", :depth => 1, :dynamic => true, :doc => "Which providers are valid for this machine" do
|
3
2
|
types = []
|
4
3
|
Puppet::Type.loadall
|
5
4
|
Puppet::Type.eachtype do |klass|
|
6
|
-
next unless klass.providers.length > 0
|
5
|
+
next unless klass && klass.providers.length > 0
|
7
6
|
types << klass
|
8
7
|
end
|
9
8
|
types.sort! { |a,b| a.name.to_s <=> b.name.to_s }
|
data/lib/puppet/resource.rb
CHANGED
@@ -21,7 +21,10 @@ class Puppet::Resource
|
|
21
21
|
extend Puppet::Indirector
|
22
22
|
indirects :resource, :terminus_class => :ral
|
23
23
|
|
24
|
-
ATTRIBUTES = [:file, :line, :exported]
|
24
|
+
ATTRIBUTES = [:file, :line, :exported].freeze
|
25
|
+
TYPE_CLASS = 'Class'.freeze
|
26
|
+
TYPE_NODE = 'Node'.freeze
|
27
|
+
TYPE_SITE = 'Site'.freeze
|
25
28
|
|
26
29
|
def self.from_data_hash(data)
|
27
30
|
raise ArgumentError, "No resource type provided in serialized data" unless type = data['type']
|
@@ -162,7 +165,7 @@ class Puppet::Resource
|
|
162
165
|
end
|
163
166
|
|
164
167
|
def class?
|
165
|
-
@is_class ||= @type ==
|
168
|
+
@is_class ||= @type == TYPE_CLASS
|
166
169
|
end
|
167
170
|
|
168
171
|
def stage?
|
@@ -222,6 +225,11 @@ class Puppet::Resource
|
|
222
225
|
self[p] = v
|
223
226
|
end
|
224
227
|
else
|
228
|
+
if type.is_a?(Hash)
|
229
|
+
raise ArgumentError, "Puppet::Resource.new does not take a hash as the first argument. "+
|
230
|
+
"Did you mean (#{(type[:type] || type["type"]).inspect}, #{(type[:title] || type["title"]).inspect }) ?"
|
231
|
+
end
|
232
|
+
|
225
233
|
environment = attributes[:environment]
|
226
234
|
if type.is_a?(Class) && type < Puppet::Type
|
227
235
|
# Set the resource type to avoid an expensive `known_resource_types`
|
@@ -238,22 +246,15 @@ class Puppet::Resource
|
|
238
246
|
send(attr.to_s + "=", value)
|
239
247
|
end
|
240
248
|
|
241
|
-
@type, @title =
|
242
|
-
|
243
|
-
@type = munge_type_name(@type)
|
244
|
-
|
245
|
-
if self.class?
|
246
|
-
@title = :main if @title == ""
|
247
|
-
@title = munge_type_name(@title)
|
248
|
-
end
|
249
|
+
@type, @title = self.class.type_and_title(type, title)
|
249
250
|
|
250
251
|
if params = attributes[:parameters]
|
251
252
|
extract_parameters(params)
|
252
253
|
end
|
253
254
|
|
254
|
-
|
255
|
+
if resource_type && resource_type.respond_to?(:deprecate_params)
|
255
256
|
resource_type.deprecate_params(title, attributes[:parameters])
|
256
|
-
|
257
|
+
end
|
257
258
|
|
258
259
|
tag(self.type)
|
259
260
|
tag_if_valid(self.title)
|
@@ -304,10 +305,17 @@ class Puppet::Resource
|
|
304
305
|
# @return [Puppet::Type, Puppet::Resource::Type]
|
305
306
|
# @api private
|
306
307
|
def resource_type
|
307
|
-
@rstype ||=
|
308
|
-
|
309
|
-
|
310
|
-
|
308
|
+
@rstype ||= self.class.resource_type(type, title, environment)
|
309
|
+
end
|
310
|
+
|
311
|
+
# The resource's type implementation
|
312
|
+
# @return [Puppet::Type, Puppet::Resource::Type]
|
313
|
+
# @api private
|
314
|
+
def self.resource_type(type, title, environment)
|
315
|
+
case type
|
316
|
+
when TYPE_CLASS; environment.known_resource_types.hostclass(title == :main ? "" : title)
|
317
|
+
when TYPE_NODE; environment.known_resource_types.node(title)
|
318
|
+
when TYPE_SITE; environment.known_resource_types.site(nil)
|
311
319
|
else
|
312
320
|
result = Puppet::Type.type(type)
|
313
321
|
if !result
|
@@ -516,6 +524,35 @@ class Puppet::Resource
|
|
516
524
|
self
|
517
525
|
end
|
518
526
|
|
527
|
+
# @api private
|
528
|
+
def self.type_and_title(type, title)
|
529
|
+
type, title = extract_type_and_title(type, title)
|
530
|
+
type = munge_type_name(type)
|
531
|
+
if type == TYPE_CLASS
|
532
|
+
title = title == '' ? :main : munge_type_name(title)
|
533
|
+
end
|
534
|
+
[type, title]
|
535
|
+
end
|
536
|
+
|
537
|
+
|
538
|
+
def self.extract_type_and_title(argtype, argtitle)
|
539
|
+
if (argtype.nil? || argtype == :component || argtype == :whit) &&
|
540
|
+
argtitle =~ /^([^\[\]]+)\[(.+)\]$/m then [ $1, $2 ]
|
541
|
+
elsif argtitle.nil? && argtype =~ /^([^\[\]]+)\[(.+)\]$/m then [ $1, $2 ]
|
542
|
+
elsif argtitle then [ argtype, argtitle ]
|
543
|
+
elsif argtype.is_a?(Puppet::Type) then [ argtype.class.name, argtype.title ]
|
544
|
+
else raise ArgumentError, "No title provided and #{argtype.inspect} is not a valid resource reference"
|
545
|
+
end
|
546
|
+
end
|
547
|
+
private_class_method :extract_type_and_title
|
548
|
+
|
549
|
+
def self.munge_type_name(value)
|
550
|
+
return :main if value == :main
|
551
|
+
return TYPE_CLASS if value == '' || value.nil? || value.to_s.casecmp('component') == 0
|
552
|
+
Puppet::Pops::Types::TypeFormatter.singleton.capitalize_segments(value.to_s)
|
553
|
+
end
|
554
|
+
private_class_method :munge_type_name
|
555
|
+
|
519
556
|
private
|
520
557
|
|
521
558
|
# Produce a canonical method name.
|
@@ -530,7 +567,7 @@ class Puppet::Resource
|
|
530
567
|
# The namevar for our resource type. If the type doesn't exist,
|
531
568
|
# always use :name.
|
532
569
|
def namevar
|
533
|
-
if builtin_type?
|
570
|
+
if builtin_type? && !(t = resource_type).nil? && t.key_attributes.length == 1
|
534
571
|
t.key_attributes.first
|
535
572
|
else
|
536
573
|
:name
|
@@ -544,26 +581,6 @@ class Puppet::Resource
|
|
544
581
|
end
|
545
582
|
end
|
546
583
|
|
547
|
-
def extract_type_and_title(argtype, argtitle)
|
548
|
-
if (argtype.nil? || argtype == :component || argtype == :whit) &&
|
549
|
-
argtitle =~ /^([^\[\]]+)\[(.+)\]$/m then [ $1, $2 ]
|
550
|
-
elsif argtitle.nil? && argtype =~ /^([^\[\]]+)\[(.+)\]$/m then [ $1, $2 ]
|
551
|
-
elsif argtitle then [ argtype, argtitle ]
|
552
|
-
elsif argtype.is_a?(Puppet::Type) then [ argtype.class.name, argtype.title ]
|
553
|
-
elsif argtype.is_a?(Hash) then
|
554
|
-
raise ArgumentError, "Puppet::Resource.new does not take a hash as the first argument. "+
|
555
|
-
"Did you mean (#{(argtype[:type] || argtype["type"]).inspect}, #{(argtype[:title] || argtype["title"]).inspect }) ?"
|
556
|
-
else raise ArgumentError, "No title provided and #{argtype.inspect} is not a valid resource reference"
|
557
|
-
end
|
558
|
-
end
|
559
|
-
|
560
|
-
def munge_type_name(value)
|
561
|
-
return :main if value == :main
|
562
|
-
return "Class" if value == "" or value.nil? or value.to_s.downcase == "component"
|
563
|
-
|
564
|
-
value.to_s.split("::").collect { |s| s.capitalize }.join("::")
|
565
|
-
end
|
566
|
-
|
567
584
|
def parse_title
|
568
585
|
h = {}
|
569
586
|
type = resource_type
|
@@ -167,14 +167,15 @@ class Puppet::Resource::Catalog < Puppet::Graph::SimpleGraph
|
|
167
167
|
|
168
168
|
# Create an alias for a resource.
|
169
169
|
def alias(resource, key)
|
170
|
-
resource.ref
|
170
|
+
ref = resource.ref
|
171
|
+
ref =~ /^(.+)\[/
|
171
172
|
class_name = $1 || resource.class.name
|
172
173
|
|
173
174
|
newref = [class_name, key].flatten
|
174
175
|
|
175
176
|
if key.is_a? String
|
176
177
|
ref_string = "#{class_name}[#{key}]"
|
177
|
-
return if ref_string ==
|
178
|
+
return if ref_string == ref
|
178
179
|
end
|
179
180
|
|
180
181
|
# LAK:NOTE It's important that we directly compare the references,
|
@@ -185,12 +186,12 @@ class Puppet::Resource::Catalog < Puppet::Graph::SimpleGraph
|
|
185
186
|
return if existing == resource
|
186
187
|
resource_declaration = " at #{resource.file}:#{resource.line}" if resource.file and resource.line
|
187
188
|
existing_declaration = " at #{existing.file}:#{existing.line}" if existing.file and existing.line
|
188
|
-
msg = "Cannot alias #{
|
189
|
+
msg = "Cannot alias #{ref} to #{key.inspect}#{resource_declaration}; resource #{newref.inspect} already declared#{existing_declaration}"
|
189
190
|
raise ArgumentError, msg
|
190
191
|
end
|
191
192
|
@resource_table[newref] = resource
|
192
|
-
@aliases[
|
193
|
-
@aliases[
|
193
|
+
@aliases[ref] ||= []
|
194
|
+
@aliases[ref] << newref
|
194
195
|
end
|
195
196
|
|
196
197
|
# Apply our catalog to the local host.
|
@@ -332,11 +333,12 @@ class Puppet::Resource::Catalog < Puppet::Graph::SimpleGraph
|
|
332
333
|
# references to the resource instances.
|
333
334
|
def remove_resource(*resources)
|
334
335
|
resources.each do |resource|
|
335
|
-
|
336
|
+
ref = resource.ref
|
337
|
+
title_key = title_key_for_ref(ref)
|
336
338
|
@resource_table.delete(title_key)
|
337
|
-
if aliases = @aliases[
|
339
|
+
if aliases = @aliases[ref]
|
338
340
|
aliases.each { |res_alias| @resource_table.delete(res_alias) }
|
339
|
-
@aliases.delete(
|
341
|
+
@aliases.delete(ref)
|
340
342
|
end
|
341
343
|
remove_vertex!(resource) if vertex?(resource)
|
342
344
|
@relationship_graph.remove_vertex!(resource) if @relationship_graph and @relationship_graph.vertex?(resource)
|
@@ -348,27 +350,27 @@ class Puppet::Resource::Catalog < Puppet::Graph::SimpleGraph
|
|
348
350
|
|
349
351
|
# Look a resource up by its reference (e.g., File[/etc/passwd]).
|
350
352
|
def resource(type, title = nil)
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
if
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
353
|
+
type, title = Puppet::Resource.type_and_title(type, title)
|
354
|
+
title_key = [type, title.to_s]
|
355
|
+
result = @resource_table[title_key]
|
356
|
+
if result.nil?
|
357
|
+
# an instance has to be created in order to construct the unique key used when
|
358
|
+
# searching for aliases.
|
359
|
+
unless @aliases.empty? && !Puppet[:app_management]
|
360
|
+
res = Puppet::Resource.new(type, title, { :environment => @environment_instance })
|
361
|
+
result = @resource_table[[type, res.uniqueness_key].flatten]
|
362
|
+
end
|
363
|
+
|
364
|
+
if result.nil? && Puppet[:app_management]
|
365
|
+
resource_type = res.resource_type
|
366
|
+
if resource_type && resource_type.is_capability?
|
367
|
+
# @todo lutter 2015-03-10: this assumes that it is legal to just
|
368
|
+
# mention a capability resource in code and have it automatically
|
369
|
+
# made available, even if the current component does not require it
|
370
|
+
result = Puppet::Resource::CapabilityFinder.find(environment, code_id, res)
|
371
|
+
add_resource(result) if result
|
372
|
+
end
|
373
|
+
end
|
372
374
|
end
|
373
375
|
result
|
374
376
|
end
|