puppet 4.4.2-x64-mingw32 → 4.5.0-x64-mingw32
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
@@ -16,9 +16,10 @@
|
|
16
16
|
# @param regexp [String|Regexp|Type[Regexp]]
|
17
17
|
# The regular expression matching the target string. If you want it anchored at the start
|
18
18
|
# and or end of the string, you must do that with ^ and $ yourself.
|
19
|
-
# @param replacement [String]
|
19
|
+
# @param replacement [String|Hash[String, String]]
|
20
20
|
# Replacement string. Can contain backreferences to what was matched using \\0 (whole match),
|
21
21
|
# \\1 (first set of parentheses), and so on.
|
22
|
+
# If the second argument is a Hash, and the matched text is one of its keys, the corresponding value is the replacement string.
|
22
23
|
# @param flags [String]
|
23
24
|
# Optional. String of single letter flags for how the regexp is interpreted (E, I, and M cannot be used
|
24
25
|
# if pattern is a precompiled regexp):
|
@@ -37,18 +38,18 @@
|
|
37
38
|
#
|
38
39
|
Puppet::Functions.create_function(:regsubst) do
|
39
40
|
dispatch :regsubst_string do
|
40
|
-
param 'Variant[Array[String],String]',
|
41
|
-
param 'String',
|
42
|
-
param 'String',
|
43
|
-
optional_param 'Optional[Pattern[/^[GEIM]*$/]]',
|
44
|
-
optional_param "Enum['N','E','S','U']",
|
41
|
+
param 'Variant[Array[String],String]', :target
|
42
|
+
param 'String', :pattern
|
43
|
+
param 'Variant[String,Hash[String,String]]', :replacement
|
44
|
+
optional_param 'Optional[Pattern[/^[GEIM]*$/]]', :flags
|
45
|
+
optional_param "Enum['N','E','S','U']", :encoding
|
45
46
|
end
|
46
47
|
|
47
48
|
dispatch :regsubst_regexp do
|
48
|
-
param 'Variant[Array[String],String]',
|
49
|
-
param 'Variant[Regexp,Type[Regexp]]',
|
50
|
-
param 'String',
|
51
|
-
optional_param 'Pattern[/^G?$/]',
|
49
|
+
param 'Variant[Array[String],String]', :target
|
50
|
+
param 'Variant[Regexp,Type[Regexp]]', :pattern
|
51
|
+
param 'Variant[String,Hash[String,String]]', :replacement
|
52
|
+
optional_param 'Pattern[/^G?$/]', :flags
|
52
53
|
end
|
53
54
|
|
54
55
|
def regsubst_string(target, pattern, replacement, flags = nil, encoding = nil)
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# Call a [lambda](https://docs.puppet.com/puppet/latest/reference/lang_lambdas.html)
|
2
|
+
# with the given argument unless the argument is undef. Return undef if argument is
|
3
|
+
# undef, and otherwise the result of giving the argument to the lambda.
|
4
|
+
#
|
5
|
+
# This is useful to process a sequence of operations where an intermediate
|
6
|
+
# result may be undef (which makes the entire sequence undef).
|
7
|
+
# The `then` function is especially useful with the function `dig` which
|
8
|
+
# performs in a similar way "digging out" a value in a complex structure.
|
9
|
+
#
|
10
|
+
# @example Using `then`
|
11
|
+
#
|
12
|
+
# ~~~ puppet
|
13
|
+
# $data = {a => { b => [{x => 10, y => 20}, {x => 100, y => 200}]}}
|
14
|
+
# notice $data.dig(a, b, 1, x).then |$x| { $x * 2 }
|
15
|
+
# ~~~
|
16
|
+
#
|
17
|
+
# Would notice the value 200
|
18
|
+
#
|
19
|
+
# Contrast this with:
|
20
|
+
#
|
21
|
+
# ~~~ puppet
|
22
|
+
# $data = {a => { b => [{x => 10, y => 20}, {ex => 100, why => 200}]}}
|
23
|
+
# notice $data.dig(a, b, 1, x).then |$x| { $x * 2 }
|
24
|
+
# ~~~
|
25
|
+
#
|
26
|
+
# Which would notice undef since the last lookup of 'x' results in `undef` which
|
27
|
+
# is returned (without calling the block).
|
28
|
+
#
|
29
|
+
# As a result there was no need for conditional logic or a temporary (non local)
|
30
|
+
# variable as the result is now either the wanted value (x) multiplied
|
31
|
+
# by 2 or `undef`.
|
32
|
+
#
|
33
|
+
# Calls to `then` can be chained. In the next example, a structure is using an offset that
|
34
|
+
# is using 1 as the index to the first element (instead of 0 which is used in the language).
|
35
|
+
# We are not sure if user input actually contains an index at all, or if it is
|
36
|
+
# outside the range of available names.
|
37
|
+
#
|
38
|
+
# ~~~ puppet
|
39
|
+
# # Names to choose from
|
40
|
+
# $names = ['Ringo', 'Paul', 'George', 'John']
|
41
|
+
#
|
42
|
+
# # structure where 'beatle 2' is wanted (but where the number refers
|
43
|
+
# # to 'Paul' because input comes from a source using 1 for the first
|
44
|
+
# # element).
|
45
|
+
#
|
46
|
+
# $data = [202, { beatle => 2 }]
|
47
|
+
# $picked = assert_type(String,
|
48
|
+
# # the data we are interested in is the second in the array,
|
49
|
+
# # a hash, where we want the value of the key 'beatle'
|
50
|
+
# $data.dig(1, 'beatle')
|
51
|
+
# # and we want the index in $names before the given index
|
52
|
+
# .then |$x| { $names[$x-1] }
|
53
|
+
# # so we can construct a string with that beatle's name
|
54
|
+
# .then |$x| { "Picked Beatle '${x}'" }
|
55
|
+
# )
|
56
|
+
#
|
57
|
+
# ~~~ puppet
|
58
|
+
#
|
59
|
+
# Would notice "Picked Beatle 'Paul'", and would raise an error if the result
|
60
|
+
# was not a String.
|
61
|
+
#
|
62
|
+
# @since 4.5.0
|
63
|
+
#
|
64
|
+
Puppet::Functions.create_function(:then) do
|
65
|
+
dispatch :then do
|
66
|
+
param 'Any', :arg
|
67
|
+
block_param 'Callable[1,1]', :block
|
68
|
+
end
|
69
|
+
|
70
|
+
def then(arg)
|
71
|
+
return nil if arg.nil?
|
72
|
+
yield(arg)
|
73
|
+
end
|
74
|
+
end
|
@@ -9,14 +9,14 @@
|
|
9
9
|
# Would notice true
|
10
10
|
#
|
11
11
|
# By default, the best possible inference is made where all details are retained.
|
12
|
-
# This is good when the type is used for
|
13
|
-
# rich
|
12
|
+
# This is good when the type is used for further type calculations but is overwhelmingly
|
13
|
+
# rich in information if it is used in a error message.
|
14
14
|
#
|
15
15
|
# The optional argument `inference_method` may be given as (from lowest to highest fidelity):
|
16
16
|
#
|
17
|
-
# *
|
17
|
+
# * `generalized` - reduces to common type and drops size constraints
|
18
18
|
# * `reduced` - reduces to common type in collections
|
19
|
-
# * `detailed` - (
|
19
|
+
# * `detailed` - (default) all details about inferred types is retained
|
20
20
|
#
|
21
21
|
# @example Using `type()` with different qualities:
|
22
22
|
#
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Call a [lambda](https://docs.
|
1
|
+
# Call a [lambda](https://docs.puppet.com/puppet/latest/reference/lang_lambdas.html)
|
2
2
|
# with the given arguments and return the result. Since a lambda's scope is
|
3
3
|
# [local](https://docs.puppetlabs.com/puppet/latest/reference/lang_lambdas.html#lambda-scope)
|
4
4
|
# to the lambda, you can use the `with` function to create private blocks of code within a
|
@@ -267,6 +267,8 @@ class Puppet::Resource::Catalog::Compiler < Puppet::Indirector::Code
|
|
267
267
|
rescue Puppet::Error => detail
|
268
268
|
Puppet.err(detail.to_s) if networked?
|
269
269
|
raise
|
270
|
+
ensure
|
271
|
+
Puppet::Type.clear_misses unless Puppet[:always_retry_plugins]
|
270
272
|
end
|
271
273
|
|
272
274
|
if checksum_type && config.is_a?(model)
|
@@ -100,4 +100,9 @@ class Puppet::Indirector::ResourceType::Parser < Puppet::Indirector::Code
|
|
100
100
|
environment.check_for_reparse
|
101
101
|
environment.known_resource_types
|
102
102
|
end
|
103
|
+
|
104
|
+
def allow_remote_requests?
|
105
|
+
Puppet.deprecation_warning("The resource_type endpoint is deprecated in favor of the environment_classes endpoint. See https://docs.puppet.com/puppetserver/latest/puppet-api/v3/environment_classes.html")
|
106
|
+
super
|
107
|
+
end
|
103
108
|
end
|
@@ -43,8 +43,12 @@ class Puppet::Indirector::REST < Puppet::Indirector::Terminus
|
|
43
43
|
|
44
44
|
# Provide appropriate headers.
|
45
45
|
def headers
|
46
|
+
# yaml is not allowed on the network
|
47
|
+
network_formats = model.supported_formats.reject do |format|
|
48
|
+
[:yaml, :b64_zlib_yaml].include?(format)
|
49
|
+
end
|
46
50
|
common_headers = {
|
47
|
-
"Accept" =>
|
51
|
+
"Accept" => network_formats.join(", "),
|
48
52
|
Puppet::Network::HTTP::HEADER_PUPPET_VERSION => Puppet.version
|
49
53
|
}
|
50
54
|
|
data/lib/puppet/loaders.rb
CHANGED
@@ -10,11 +10,13 @@ module Puppet
|
|
10
10
|
require 'puppet/pops/loader/dependency_loader'
|
11
11
|
require 'puppet/pops/loader/null_loader'
|
12
12
|
require 'puppet/pops/loader/static_loader'
|
13
|
+
require 'puppet/pops/loader/runtime3_type_loader'
|
13
14
|
require 'puppet/pops/loader/ruby_function_instantiator'
|
14
15
|
require 'puppet/pops/loader/puppet_function_instantiator'
|
15
16
|
require 'puppet/pops/loader/type_definition_instantiator'
|
16
17
|
require 'puppet/pops/loader/loader_paths'
|
17
18
|
require 'puppet/pops/loader/simple_environment_loader'
|
19
|
+
require 'puppet/pops/loader/predefined_loader'
|
18
20
|
end
|
19
21
|
end
|
20
22
|
|
@@ -20,6 +20,16 @@ module Manager
|
|
20
20
|
}
|
21
21
|
end
|
22
22
|
|
23
|
+
# Clears any types that were used but absent when types were last loaded.
|
24
|
+
# @note Used after each catalog compile when always_retry_plugins is false
|
25
|
+
# @api private
|
26
|
+
#
|
27
|
+
def clear_misses
|
28
|
+
unless @types.nil?
|
29
|
+
@types.delete_if {|_, v| v.nil? }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
23
33
|
# Iterates over all already loaded Type subclasses.
|
24
34
|
# @yield [t] a block receiving each type
|
25
35
|
# @yieldparam t [Puppet::Type] each defined type
|
@@ -116,6 +126,10 @@ module Manager
|
|
116
126
|
klass.providerloader.loadall Puppet.lookup(:current_environment)
|
117
127
|
klass.providify unless klass.providers.empty?
|
118
128
|
|
129
|
+
loc = block_given? ? block.source_location : nil
|
130
|
+
uri = loc.nil? ? nil : URI("#{Puppet::Util.path_to_uri(loc[0])}?line=#{loc[1]}")
|
131
|
+
Puppet::Pops::Loaders.register_runtime3_type(name, uri)
|
132
|
+
|
119
133
|
klass
|
120
134
|
end
|
121
135
|
|
@@ -146,16 +160,19 @@ module Manager
|
|
146
160
|
# We are overwhelmingly symbols here, which usually match, so it is worth
|
147
161
|
# having this special-case to return quickly. Like, 25K symbols vs. 300
|
148
162
|
# strings in this method. --daniel 2012-07-17
|
149
|
-
return @types[name] if @types
|
163
|
+
return @types[name] if @types.include? name
|
150
164
|
|
151
165
|
# Try mangling the name, if it is a string.
|
152
166
|
if name.is_a? String
|
153
167
|
name = name.downcase.intern
|
154
|
-
return @types[name] if @types
|
168
|
+
return @types[name] if @types.include? name
|
155
169
|
end
|
156
170
|
# Try loading the type.
|
157
171
|
if typeloader.load(name, Puppet.lookup(:current_environment))
|
158
172
|
Puppet.warning "Loaded puppet/type/#{name} but no class was created" unless @types.include? name
|
173
|
+
elsif !Puppet[:always_retry_plugins]
|
174
|
+
# PUP-5482 - Only look for a type once if plugin retry is disabled
|
175
|
+
@types[name] = nil
|
159
176
|
end
|
160
177
|
|
161
178
|
# ...and I guess that is that, eh.
|
@@ -41,7 +41,7 @@ module Puppet::ModuleTool
|
|
41
41
|
end
|
42
42
|
|
43
43
|
if require_metadata && !Puppet::ModuleTool.is_module_root?(@path)
|
44
|
-
raise ArgumentError, "Unable to find metadata.json in module root at #{@path} See https://docs.
|
44
|
+
raise ArgumentError, "Unable to find metadata.json in module root at #{@path} See https://docs.puppet.com/puppet/latest/reference/modules_publishing.html for required file format."
|
45
45
|
end
|
46
46
|
|
47
47
|
metadata_path = File.join(@path, 'metadata.json')
|
@@ -1,6 +1,6 @@
|
|
1
1
|
source ENV['GEM_SOURCE'] || 'https://rubygems.org'
|
2
2
|
|
3
|
-
puppetversion = ENV.key?('PUPPET_VERSION') ?
|
3
|
+
puppetversion = ENV.key?('PUPPET_VERSION') ? ENV['PUPPET_VERSION'] : ['>= 3.3']
|
4
4
|
gem 'metadata-json-lint'
|
5
5
|
gem 'puppet', puppetversion
|
6
6
|
gem 'puppetlabs_spec_helper', '>= 1.0.0'
|
@@ -9,6 +9,10 @@ gem 'facter', '>= 1.7.0'
|
|
9
9
|
gem 'rspec-puppet'
|
10
10
|
|
11
11
|
# rspec must be v2 for ruby 1.8.7
|
12
|
-
if RUBY_VERSION >= '1.8.7'
|
12
|
+
if RUBY_VERSION >= '1.8.7' && RUBY_VERSION < '1.9'
|
13
13
|
gem 'rspec', '~> 2.0'
|
14
|
+
gem 'rake', '~> 10.0'
|
15
|
+
else
|
16
|
+
# rubocop requires ruby >= 1.9
|
17
|
+
gem 'rubocop'
|
14
18
|
end
|
@@ -1,17 +1,32 @@
|
|
1
1
|
require 'puppetlabs_spec_helper/rake_tasks'
|
2
2
|
require 'puppet-lint/tasks/puppet-lint'
|
3
|
+
require 'metadata-json-lint/rake_task'
|
4
|
+
|
5
|
+
if RUBY_VERSION >= '1.9'
|
6
|
+
require 'rubocop/rake_task'
|
7
|
+
RuboCop::RakeTask.new
|
8
|
+
end
|
9
|
+
|
3
10
|
PuppetLint.configuration.send('disable_80chars')
|
4
|
-
PuppetLint.configuration.
|
11
|
+
PuppetLint.configuration.relative = true
|
12
|
+
PuppetLint.configuration.ignore_paths = ['spec/**/*.pp', 'pkg/**/*.pp']
|
5
13
|
|
6
|
-
desc
|
14
|
+
desc 'Validate manifests, templates, and ruby files'
|
7
15
|
task :validate do
|
8
16
|
Dir['manifests/**/*.pp'].each do |manifest|
|
9
17
|
sh "puppet parser validate --noop #{manifest}"
|
10
18
|
end
|
11
|
-
Dir['spec/**/*.rb','lib/**/*.rb'].each do |ruby_file|
|
12
|
-
sh "ruby -c #{ruby_file}" unless ruby_file =~ /
|
19
|
+
Dir['spec/**/*.rb', 'lib/**/*.rb'].each do |ruby_file|
|
20
|
+
sh "ruby -c #{ruby_file}" unless ruby_file =~ %r{spec/fixtures}
|
13
21
|
end
|
14
22
|
Dir['templates/**/*.erb'].each do |template|
|
15
23
|
sh "erb -P -x -T '-' #{template} | ruby -c"
|
16
24
|
end
|
17
25
|
end
|
26
|
+
|
27
|
+
desc 'Run metadata_lint, lint, validate, and spec tests.'
|
28
|
+
task :test do
|
29
|
+
[:metadata_lint, :lint, :validate, :spec].each do |test|
|
30
|
+
Rake::Task[test].invoke
|
31
|
+
end
|
32
|
+
end
|
@@ -7,6 +7,6 @@
|
|
7
7
|
# environment (to compare the resulting system state to the desired state).
|
8
8
|
#
|
9
9
|
# Learn more about module testing here:
|
10
|
-
# https://docs.
|
10
|
+
# https://docs.puppet.com/guides/tests_smoke.html
|
11
11
|
#
|
12
12
|
include ::<%= metadata.name %>
|
@@ -5,14 +5,18 @@ class Puppet::Network::HTTP::API::Master::V3::Environment
|
|
5
5
|
def call(request, response)
|
6
6
|
env_name = request.routing_path.split('/').last
|
7
7
|
env = Puppet.lookup(:environments).get(env_name)
|
8
|
+
code_id = request.params[:code_id]
|
8
9
|
|
9
10
|
if env.nil?
|
10
11
|
raise Puppet::Network::HTTP::Error::HTTPNotFoundError.new("#{env_name} is not a known environment", Puppet::Network::HTTP::Issues::RESOURCE_NOT_FOUND)
|
11
12
|
end
|
12
13
|
|
13
|
-
catalog = Puppet::Parser::EnvironmentCompiler.compile(env).to_resource
|
14
|
+
catalog = Puppet::Parser::EnvironmentCompiler.compile(env, code_id).to_resource
|
14
15
|
|
15
|
-
|
16
|
+
# This reads code_id off the catalog rather than using the one from the
|
17
|
+
# request. There shouldn't really be a case where the two differ, but if
|
18
|
+
# they do, the one from the catalog itself is authoritative.
|
19
|
+
env_graph = {:environment => env.name, :applications => {}, :code_id => catalog.code_id}
|
16
20
|
applications = catalog.resources.select do |res|
|
17
21
|
type = res.resource_type
|
18
22
|
type.is_a?(Puppet::Resource::Type) && type.application?
|
@@ -102,6 +102,10 @@ class Puppet::Parser::AST::PopsBridge
|
|
102
102
|
# The 3x logic calling this will not know what to do with the result, it is compacted away at the end
|
103
103
|
instantiate_TypeAlias(d, modname)
|
104
104
|
next
|
105
|
+
when Puppet::Pops::Model::TypeMapping
|
106
|
+
# The 3x logic calling this will not know what to do with the result, it is compacted away at the end
|
107
|
+
instantiate_TypeMapping(d, modname)
|
108
|
+
next
|
105
109
|
when Puppet::Pops::Model::Application
|
106
110
|
instantiate_ApplicationDefinition(d, modname)
|
107
111
|
else
|
@@ -189,7 +193,9 @@ class Puppet::Parser::AST::PopsBridge
|
|
189
193
|
end
|
190
194
|
|
191
195
|
def instantiate_ResourceTypeDefinition(o, modname)
|
192
|
-
Puppet::Resource::Type.new(:definition, o.name, @context.merge(args_from_definition(o, modname)))
|
196
|
+
instance = Puppet::Resource::Type.new(:definition, o.name, @context.merge(args_from_definition(o, modname)))
|
197
|
+
Puppet::Pops::Loaders.register_runtime3_type(instance.name, Puppet::Pops::Adapters::SourcePosAdapter.adapt(o).to_uri)
|
198
|
+
instance
|
193
199
|
end
|
194
200
|
|
195
201
|
def instantiate_CapabilityMapping(o, modname)
|
@@ -262,12 +268,23 @@ class Puppet::Parser::AST::PopsBridge
|
|
262
268
|
loader = Puppet::Pops::Loaders.find_loader(modname)
|
263
269
|
|
264
270
|
# Bind the type alias to the loader using the alias
|
265
|
-
|
266
|
-
loader.set_entry(typed_name, t, Puppet::Pops::Adapters::SourcePosAdapter.adapt(type_alias).to_uri)
|
271
|
+
Puppet::Pops::Loader::TypeDefinitionInstantiator.create_from_model(type_alias, loader)
|
267
272
|
|
268
273
|
nil # do not want the type alias to inadvertently leak into 3x
|
269
274
|
end
|
270
275
|
|
276
|
+
# Adds the TypeMapping to the ImplementationRegistry
|
277
|
+
# This is for 4x evaluator/loader
|
278
|
+
#
|
279
|
+
def instantiate_TypeMapping(type_mapping, modname)
|
280
|
+
loader = Puppet::Pops::Loaders.find_loader(modname)
|
281
|
+
tf = Puppet::Pops::Types::TypeParser.new
|
282
|
+
lhs = tf.interpret(type_mapping.type_expr, loader)
|
283
|
+
rhs = tf.interpret_any(type_mapping.mapping_expr, loader)
|
284
|
+
Puppet::Pops::Loaders.implementation_registry.register_type_mapping(lhs, rhs, loader)
|
285
|
+
nil
|
286
|
+
end
|
287
|
+
|
271
288
|
def code()
|
272
289
|
Expression.new(:value => @value)
|
273
290
|
end
|
@@ -15,9 +15,31 @@ class Puppet::Parser::Compiler
|
|
15
15
|
|
16
16
|
private
|
17
17
|
|
18
|
+
# A hash lookup is 6x avg times faster than find among 3 values.
|
19
|
+
CAPABILITY_ACCEPTED_METAPARAMS = {:require => true, :consume => true, :export => true}.freeze
|
20
|
+
|
18
21
|
def validate_relationship(param)
|
19
|
-
|
20
|
-
|
22
|
+
# when relationship is to a capability
|
23
|
+
if has_capability?(param.value)
|
24
|
+
unless CAPABILITY_ACCEPTED_METAPARAMS[param.name]
|
25
|
+
raise CatalogValidationError.new(
|
26
|
+
"'#{param.name}' is not a valid relationship to a capability",
|
27
|
+
param.file, param.line)
|
28
|
+
end
|
29
|
+
elsif Puppet[:strict] != :off
|
30
|
+
# all other relationships requires the referenced resource to exist when mode is strict
|
31
|
+
refs = param.value.is_a?(Array) ? param.value.flatten : [param.value]
|
32
|
+
refs.each do |r|
|
33
|
+
next if r.nil?
|
34
|
+
unless catalog.resource(r.to_s)
|
35
|
+
msg = "Could not find resource '#{r.to_s}' in parameter '#{param.name.to_s}'"
|
36
|
+
if Puppet[:strict] == :error
|
37
|
+
raise CatalogValidationError.new(msg, param.file, param.line)
|
38
|
+
else
|
39
|
+
Puppet.warn_once(:undefined_resources, r.to_s, msg, param.file, param.line)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
21
43
|
end
|
22
44
|
end
|
23
45
|
|
@@ -1,16 +1,16 @@
|
|
1
1
|
require 'puppet/pops'
|
2
2
|
|
3
|
-
module Puppet
|
3
|
+
module Puppet
|
4
|
+
module Parser
|
4
5
|
# Adapts an egrammar/eparser to respond to the public API of the classic parser
|
5
6
|
# and makes use of the new evaluator.
|
6
7
|
#
|
7
|
-
class
|
8
|
+
class E4ParserAdapter
|
8
9
|
|
9
10
|
def initialize
|
10
11
|
@file = ''
|
11
12
|
@string = ''
|
12
13
|
@use = :unspecified
|
13
|
-
@@evaluating_parser ||= Puppet::Pops::Parser::EvaluatingParser.new()
|
14
14
|
end
|
15
15
|
|
16
16
|
def file=(file)
|
@@ -20,15 +20,15 @@ class Puppet::Parser::E4ParserAdapter
|
|
20
20
|
|
21
21
|
def parse(string = nil)
|
22
22
|
self.string= string if string
|
23
|
-
|
23
|
+
parser = Pops::Parser::EvaluatingParser.singleton
|
24
24
|
parse_result =
|
25
25
|
if @use == :string
|
26
26
|
# Parse with a source_file to set in created AST objects (it was either given, or it may be unknown
|
27
27
|
# if caller did not set a file and the present a string.
|
28
28
|
#
|
29
|
-
|
29
|
+
parser.parse_string(@string, @file || "unknown-source-location")
|
30
30
|
else
|
31
|
-
|
31
|
+
parser.parse_file(@file)
|
32
32
|
end
|
33
33
|
|
34
34
|
# the parse_result may be
|
@@ -38,19 +38,18 @@ class Puppet::Parser::E4ParserAdapter
|
|
38
38
|
#
|
39
39
|
model = parse_result.nil? ? nil : parse_result.current
|
40
40
|
args = {}
|
41
|
-
|
41
|
+
Pops::Model::AstTransformer.new(@file).merge_location(args, model)
|
42
42
|
|
43
43
|
ast_code =
|
44
|
-
if model.is_a?
|
45
|
-
|
44
|
+
if model.is_a? Pops::Model::Program
|
45
|
+
AST::PopsBridge::Program.new(model, args)
|
46
46
|
else
|
47
47
|
args[:value] = model
|
48
|
-
|
48
|
+
AST::PopsBridge::Expression.new(args)
|
49
49
|
end
|
50
50
|
|
51
51
|
# Create the "main" class for the content - this content will get merged with all other "main" content
|
52
|
-
|
53
|
-
|
52
|
+
AST::Hostclass.new('', :code => ast_code)
|
54
53
|
end
|
55
54
|
|
56
55
|
def string=(string)
|
@@ -58,3 +57,5 @@ class Puppet::Parser::E4ParserAdapter
|
|
58
57
|
@use = :string
|
59
58
|
end
|
60
59
|
end
|
60
|
+
end
|
61
|
+
end
|