puppet 4.5.3-x86-mingw32 → 4.6.1-x86-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.
- checksums.yaml +7 -0
- data/Gemfile +10 -1
- data/ext/debian/control +2 -4
- data/ext/project_data.yaml +4 -4
- data/install.rb +6 -2
- data/lib/puppet.rb +3 -1
- data/lib/puppet/agent/locker.rb +1 -1
- data/lib/puppet/application.rb +6 -4
- data/lib/puppet/application/agent.rb +2 -1
- data/lib/puppet/application/cert.rb +35 -2
- data/lib/puppet/application/device.rb +1 -1
- data/lib/puppet/application/generate.rb +5 -0
- data/lib/puppet/application/lookup.rb +3 -3
- data/lib/puppet/application_support.rb +1 -1
- data/lib/puppet/compilable_resource_type.rb +15 -0
- data/lib/puppet/configurer.rb +67 -10
- data/lib/puppet/configurer/plugin_handler.rb +2 -4
- data/lib/puppet/data_providers/hiera_config.rb +1 -1
- data/lib/puppet/defaults.rb +34 -7
- data/lib/puppet/environments.rb +4 -2
- data/lib/puppet/error.rb +1 -1
- data/lib/puppet/external/dot.rb +1 -1
- data/lib/puppet/face/ca.rb +4 -1
- data/lib/puppet/face/certificate.rb +7 -1
- data/lib/puppet/face/epp.rb +5 -5
- data/lib/puppet/face/generate.rb +64 -0
- data/lib/puppet/face/help.rb +19 -13
- data/lib/puppet/face/man.rb +1 -1
- data/lib/puppet/feature/external_facts.rb +1 -1
- data/lib/puppet/file_system.rb +16 -0
- data/lib/puppet/file_system/file_impl.rb +5 -0
- data/lib/puppet/file_system/memory_impl.rb +4 -0
- data/lib/puppet/file_system/path_pattern.rb +1 -0
- data/lib/puppet/file_system/windows.rb +19 -0
- data/lib/puppet/functions.rb +3 -5
- data/lib/puppet/functions/assert_type.rb +1 -1
- data/lib/puppet/functions/defined.rb +7 -5
- data/lib/puppet/functions/dig.rb +2 -18
- data/lib/puppet/functions/hiera.rb +1 -1
- data/lib/puppet/functions/lest.rb +1 -37
- data/lib/puppet/functions/new.rb +2 -473
- data/lib/puppet/functions/reverse_each.rb +2 -59
- data/lib/puppet/functions/scanf.rb +4 -4
- data/lib/puppet/functions/step.rb +1 -63
- data/lib/puppet/functions/then.rb +1 -61
- data/lib/puppet/functions/type.rb +1 -40
- data/lib/puppet/functions/unwrap.rb +40 -0
- data/lib/puppet/generate/models/type/property.rb +70 -0
- data/lib/puppet/generate/models/type/type.rb +57 -0
- data/lib/puppet/generate/templates/type/pcore.erb +41 -0
- data/lib/puppet/generate/type.rb +239 -0
- data/lib/puppet/graph/simple_graph.rb +2 -6
- data/lib/puppet/indirector/catalog/static_compiler.rb +5 -2
- data/lib/puppet/indirector/facts/facter.rb +1 -1
- data/lib/puppet/indirector/key/ca.rb +2 -2
- data/lib/puppet/indirector/request.rb +25 -4
- data/lib/puppet/indirector/rest.rb +73 -3
- data/lib/puppet/info_service/class_information_service.rb +1 -2
- data/lib/puppet/interface/documentation.rb +1 -1
- data/lib/puppet/loaders.rb +2 -0
- data/lib/puppet/metatype/manager.rb +6 -6
- data/lib/puppet/module.rb +8 -1
- data/lib/puppet/module_tool.rb +2 -2
- data/lib/puppet/module_tool/checksums.rb +1 -1
- data/lib/puppet/module_tool/errors/installer.rb +2 -2
- data/lib/puppet/module_tool/metadata.rb +1 -1
- data/lib/puppet/network/http/api/indirected_routes.rb +23 -32
- data/lib/puppet/network/http/rack/rest.rb +15 -1
- data/lib/puppet/network/rights.rb +1 -11
- data/lib/puppet/node/environment.rb +7 -3
- data/lib/puppet/node/facts.rb +1 -1
- data/lib/puppet/parameter.rb +23 -3
- data/lib/puppet/parameter/boolean.rb +1 -1
- data/lib/puppet/parameter/value.rb +1 -1
- data/lib/puppet/parser.rb +0 -1
- data/lib/puppet/parser/ast/pops_bridge.rb +1 -1
- data/lib/puppet/parser/ast/resource.rb +5 -0
- data/lib/puppet/parser/ast/resource_instance.rb +5 -1
- data/lib/puppet/parser/ast/resourceparam.rb +5 -0
- data/lib/puppet/parser/compiler.rb +14 -17
- data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +1 -1
- data/lib/puppet/parser/environment_compiler.rb +10 -0
- data/lib/puppet/parser/functions/create_resources.rb +39 -24
- data/lib/puppet/parser/functions/defined.rb +2 -26
- data/lib/puppet/parser/functions/dig.rb +29 -0
- data/lib/puppet/parser/functions/lest.rb +49 -0
- data/lib/puppet/parser/functions/new.rb +530 -0
- data/lib/puppet/parser/functions/require.rb +1 -1
- data/lib/puppet/parser/functions/reverse_each.rb +83 -0
- data/lib/puppet/parser/functions/scanf.rb +4 -4
- data/lib/puppet/parser/functions/step.rb +84 -0
- data/lib/puppet/parser/functions/then.rb +73 -0
- data/lib/puppet/parser/functions/type.rb +53 -0
- data/lib/puppet/parser/resource.rb +16 -7
- data/lib/puppet/parser/scope.rb +36 -28
- data/lib/puppet/parser/type_loader.rb +1 -1
- data/lib/puppet/plugins/data_providers/data_provider.rb +1 -1
- data/lib/puppet/pops.rb +13 -0
- data/lib/puppet/pops/adapters.rb +49 -49
- data/lib/puppet/pops/binder/scheme_handler/confdir_scheme.rb +1 -1
- data/lib/puppet/pops/evaluator/access_operator.rb +39 -2
- data/lib/puppet/pops/evaluator/closure.rb +39 -13
- data/lib/puppet/pops/evaluator/collector_transformer.rb +10 -1
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +16 -11
- data/lib/puppet/pops/evaluator/external_syntax_support.rb +1 -1
- data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +0 -1
- data/lib/puppet/pops/evaluator/literal_evaluator.rb +0 -1
- data/lib/puppet/pops/evaluator/relationship_operator.rb +1 -2
- data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +119 -0
- data/lib/puppet/pops/evaluator/runtime3_support.rb +19 -45
- data/lib/puppet/pops/functions/function.rb +5 -0
- data/lib/puppet/pops/issues.rb +1 -1
- data/lib/puppet/pops/label_provider.rb +2 -2
- data/lib/puppet/pops/loader/base_loader.rb +12 -15
- data/lib/puppet/pops/loader/loader.rb +15 -50
- data/lib/puppet/pops/loader/loader_paths.rb +28 -2
- data/lib/puppet/pops/loader/module_loaders.rb +16 -1
- data/lib/puppet/pops/loader/null_loader.rb +17 -1
- data/lib/puppet/pops/loader/puppet_function_instantiator.rb +12 -11
- data/lib/puppet/pops/loader/puppet_resource_type_impl_instantiator.rb +80 -0
- data/lib/puppet/pops/loader/ruby_function_instantiator.rb +2 -3
- data/lib/puppet/pops/loader/runtime3_type_loader.rb +52 -13
- data/lib/puppet/pops/loader/static_loader.rb +55 -0
- data/lib/puppet/pops/loader/type_definition_instantiator.rb +30 -14
- data/lib/puppet/pops/loader/typed_name.rb +50 -0
- data/lib/puppet/pops/loaders.rb +64 -19
- data/lib/puppet/pops/merge_strategy.rb +7 -7
- data/lib/puppet/pops/migration/migration_checker.rb +4 -0
- data/lib/puppet/pops/model/model_label_provider.rb +2 -0
- data/lib/puppet/pops/parser/egrammar.ra +8 -5
- data/lib/puppet/pops/parser/eparser.rb +1550 -1498
- data/lib/puppet/pops/parser/evaluating_parser.rb +1 -1
- data/lib/puppet/pops/parser/interpolation_support.rb +7 -0
- data/lib/puppet/pops/parser/lexer2.rb +14 -1
- data/lib/puppet/pops/parser/locator.rb +30 -1
- data/lib/puppet/pops/parser/parser_support.rb +0 -3
- data/lib/puppet/pops/parser/slurp_support.rb +3 -3
- data/lib/puppet/pops/patterns.rb +9 -1
- data/lib/puppet/pops/pcore.rb +67 -11
- data/lib/puppet/pops/puppet_stack.rb +43 -0
- data/lib/puppet/pops/resource/param.rb +51 -0
- data/lib/puppet/pops/resource/resource_type_impl.rb +301 -0
- data/lib/puppet/pops/resource/resource_type_set.pcore +21 -0
- data/lib/puppet/pops/serialization.rb +17 -0
- data/lib/puppet/pops/serialization/abstract_reader.rb +149 -0
- data/lib/puppet/pops/serialization/abstract_writer.rb +179 -0
- data/lib/puppet/pops/serialization/deserializer.rb +60 -0
- data/lib/puppet/pops/serialization/extension.rb +126 -0
- data/lib/puppet/pops/serialization/instance_reader.rb +19 -0
- data/lib/puppet/pops/serialization/instance_writer.rb +14 -0
- data/lib/puppet/pops/serialization/json.rb +247 -0
- data/lib/puppet/pops/serialization/object.rb +63 -0
- data/lib/puppet/pops/serialization/rgen.rb +151 -0
- data/lib/puppet/pops/serialization/serializer.rb +91 -0
- data/lib/puppet/pops/serialization/time_factory.rb +66 -0
- data/lib/puppet/pops/types/annotatable.rb +36 -0
- data/lib/puppet/pops/types/implementation_registry.rb +3 -8
- data/lib/puppet/pops/types/p_meta_type.rb +83 -0
- data/lib/puppet/pops/types/p_object_type.rb +110 -117
- data/lib/puppet/pops/types/p_runtime_type.rb +13 -0
- data/lib/puppet/pops/types/p_sem_ver_range_type.rb +23 -0
- data/lib/puppet/pops/types/p_sem_ver_type.rb +30 -2
- data/lib/puppet/pops/types/p_sensitive_type.rb +69 -0
- data/lib/puppet/pops/types/p_type_set_type.rb +361 -0
- data/lib/puppet/pops/types/puppet_object.rb +0 -5
- data/lib/puppet/pops/types/ruby_generator.rb +9 -2
- data/lib/puppet/pops/types/type_calculator.rb +6 -1
- data/lib/puppet/pops/types/type_factory.rb +14 -12
- data/lib/puppet/pops/types/type_formatter.rb +78 -33
- data/lib/puppet/pops/types/type_mismatch_describer.rb +0 -2
- data/lib/puppet/pops/types/type_parser.rb +27 -2
- data/lib/puppet/pops/types/type_set_reference.rb +59 -0
- data/lib/puppet/pops/types/types.rb +366 -13
- data/lib/puppet/pops/validation.rb +4 -4
- data/lib/puppet/pops/validation/checker4_0.rb +5 -2
- data/lib/puppet/pops/visitor.rb +2 -2
- data/lib/puppet/property.rb +64 -5
- data/lib/puppet/provider.rb +1 -1
- data/lib/puppet/provider/aixobject.rb +3 -3
- data/lib/puppet/provider/group/aix.rb +4 -4
- data/lib/puppet/provider/macauthorization/macauthorization.rb +1 -1
- data/lib/puppet/provider/mailalias/aliases.rb +1 -1
- data/lib/puppet/provider/mcx/mcxcontent.rb +2 -2
- data/lib/puppet/provider/mount/parsed.rb +1 -1
- data/lib/puppet/provider/nameservice/directoryservice.rb +5 -5
- data/lib/puppet/provider/package/appdmg.rb +3 -3
- data/lib/puppet/provider/package/apple.rb +1 -1
- data/lib/puppet/provider/package/dnf.rb +5 -0
- data/lib/puppet/provider/package/nim.rb +1 -1
- data/lib/puppet/provider/package/pacman.rb +2 -2
- data/lib/puppet/provider/package/pip.rb +5 -3
- data/lib/puppet/provider/package/pip3.rb +1 -1
- data/lib/puppet/provider/package/pkg.rb +5 -5
- data/lib/puppet/provider/package/pkgdmg.rb +4 -4
- data/lib/puppet/provider/package/pkgin.rb +1 -1
- data/lib/puppet/provider/package/pkgutil.rb +1 -1
- data/lib/puppet/provider/package/portage.rb +48 -8
- data/lib/puppet/provider/package/sun.rb +1 -1
- data/lib/puppet/provider/package/tdnf.rb +28 -0
- data/lib/puppet/provider/package/yum.rb +22 -4
- data/lib/puppet/provider/parsedfile.rb +2 -2
- data/lib/puppet/provider/service/base.rb +1 -1
- data/lib/puppet/provider/service/bsd.rb +1 -1
- data/lib/puppet/provider/service/daemontools.rb +2 -2
- data/lib/puppet/provider/service/debian.rb +3 -3
- data/lib/puppet/provider/service/init.rb +5 -3
- data/lib/puppet/provider/service/launchd.rb +16 -2
- data/lib/puppet/provider/service/runit.rb +1 -1
- data/lib/puppet/provider/service/smf.rb +8 -1
- data/lib/puppet/provider/service/systemd.rb +39 -6
- data/lib/puppet/provider/ssh_authorized_key/parsed.rb +1 -1
- data/lib/puppet/provider/user/aix.rb +3 -2
- data/lib/puppet/provider/user/directoryservice.rb +4 -3
- data/lib/puppet/provider/user/hpux.rb +1 -1
- data/lib/puppet/provider/user/user_role_add.rb +1 -1
- data/lib/puppet/provider/user/windows_adsi.rb +3 -0
- data/lib/puppet/provider/zfs/zfs.rb +1 -1
- data/lib/puppet/reference/type.rb +1 -1
- data/lib/puppet/resource.rb +33 -7
- data/lib/puppet/resource/capability_finder.rb +74 -54
- data/lib/puppet/resource/status.rb +11 -2
- data/lib/puppet/settings.rb +17 -6
- data/lib/puppet/settings/environment_conf.rb +1 -1
- data/lib/puppet/settings/server_list_setting.rb +20 -0
- data/lib/puppet/ssl/certificate_authority.rb +32 -9
- data/lib/puppet/ssl/certificate_authority/interface.rb +164 -24
- data/lib/puppet/ssl/host.rb +3 -3
- data/lib/puppet/ssl/oids.rb +10 -0
- data/lib/puppet/ssl/validator/default_validator.rb +2 -2
- data/lib/puppet/test/test_helper.rb +2 -2
- data/lib/puppet/transaction.rb +12 -0
- data/lib/puppet/transaction/additional_resource_generator.rb +1 -1
- data/lib/puppet/transaction/event.rb +29 -2
- data/lib/puppet/transaction/event_manager.rb +1 -1
- data/lib/puppet/transaction/persistence.rb +84 -0
- data/lib/puppet/transaction/report.rb +49 -2
- data/lib/puppet/transaction/resource_harness.rb +98 -18
- data/lib/puppet/type.rb +63 -21
- data/lib/puppet/type/augeas.rb +3 -3
- data/lib/puppet/type/cron.rb +1 -1
- data/lib/puppet/type/file.rb +39 -2
- data/lib/puppet/type/file/data_sync.rb +13 -5
- data/lib/puppet/type/host.rb +1 -1
- data/lib/puppet/type/mount.rb +2 -6
- data/lib/puppet/type/notify.rb +1 -1
- data/lib/puppet/type/package.rb +1 -1
- data/lib/puppet/type/resources.rb +1 -1
- data/lib/puppet/type/scheduled_task.rb +1 -1
- data/lib/puppet/type/ssh_authorized_key.rb +2 -2
- data/lib/puppet/type/tidy.rb +1 -1
- data/lib/puppet/type/yumrepo.rb +3 -3
- data/lib/puppet/type/zone.rb +1 -1
- data/lib/puppet/util.rb +2 -2
- data/lib/puppet/util/classgen.rb +1 -1
- data/lib/puppet/util/command_line.rb +6 -2
- data/lib/puppet/util/command_line/trollop.rb +1 -1
- data/lib/puppet/util/execution.rb +2 -2
- data/lib/puppet/util/http_proxy.rb +1 -1
- data/lib/puppet/util/inifile.rb +1 -1
- data/lib/puppet/util/instance_loader.rb +1 -1
- data/lib/puppet/util/logging.rb +1 -1
- data/lib/puppet/util/multi_match.rb +1 -1
- data/lib/puppet/util/plist.rb +15 -5
- data/lib/puppet/util/profiler.rb +1 -1
- data/lib/puppet/util/profiler/around_profiler.rb +1 -1
- data/lib/puppet/util/psych_support.rb +1 -1
- data/lib/puppet/util/rdoc.rb +2 -2
- data/lib/puppet/util/rubygems.rb +1 -1
- data/lib/puppet/util/watcher/periodic_watcher.rb +2 -2
- data/lib/puppet/util/windows/access_control_entry.rb +1 -1
- data/lib/puppet/util/windows/adsi.rb +30 -8
- data/lib/puppet/util/windows/api_types.rb +1 -1
- data/lib/puppet/util/windows/file.rb +59 -0
- data/lib/puppet/util/windows/process.rb +10 -0
- data/lib/puppet/util/windows/security.rb +1 -1
- data/lib/puppet/util/windows/user.rb +22 -4
- data/lib/puppet/util/yaml.rb +15 -3
- data/lib/puppet/vendor/deep_merge/test/test_deep_merge.rb +1 -1
- data/lib/puppet/vendor/rgen_patch.rb +1 -1
- data/lib/puppet/version.rb +2 -2
- data/spec/fixtures/unit/pops/loaders/loaders/no_modules/manifests/site.pp +10 -0
- data/spec/integration/agent/logging_spec.rb +15 -14
- data/spec/integration/application/apply_spec.rb +1 -0
- data/spec/integration/directory_environments_spec.rb +16 -0
- data/spec/integration/environments/settings_spec.rb +32 -4
- data/spec/integration/faces/documentation_spec.rb +1 -1
- data/spec/integration/network/http/api/indirected_routes_spec.rb +33 -0
- data/spec/integration/node/environment_spec.rb +21 -0
- data/spec/integration/parser/collection_spec.rb +10 -0
- data/spec/integration/parser/compiler_spec.rb +76 -840
- data/spec/integration/parser/functions/require_spec.rb +3 -3
- data/spec/integration/parser/parameter_defaults_spec.rb +6 -2
- data/spec/integration/parser/pcore_resource_spec.rb +208 -0
- data/spec/integration/parser/resource_expressions_spec.rb +4 -2
- data/spec/integration/provider/yumrepo_spec.rb +4 -1
- data/spec/integration/transaction/report_spec.rb +666 -0
- data/spec/integration/type/file_spec.rb +11 -12
- data/spec/integration/util/windows/adsi_spec.rb +99 -0
- data/spec/integration/util/windows/principal_spec.rb +109 -60
- data/spec/integration/util/windows/process_spec.rb +4 -2
- data/spec/integration/util/windows/security_spec.rb +34 -8
- data/spec/integration/util/windows/user_spec.rb +26 -4
- data/spec/lib/puppet_spec/files.rb +2 -2
- data/spec/lib/puppet_spec/network.rb +12 -8
- data/spec/shared_examples/rhel_package_provider.rb +341 -0
- data/spec/spec_helper.rb +8 -2
- data/spec/unit/application/cert_spec.rb +20 -0
- data/spec/unit/configurer/plugin_handler_spec.rb +0 -26
- data/spec/unit/configurer_spec.rb +46 -0
- data/spec/unit/defaults_spec.rb +14 -0
- data/spec/unit/face/generate_spec.rb +230 -0
- data/spec/unit/face/help_spec.rb +53 -0
- data/spec/unit/face/parser_spec.rb +6 -0
- data/spec/unit/face/plugin_spec.rb +0 -4
- data/spec/unit/file_system_spec.rb +85 -0
- data/spec/unit/functions/lookup_spec.rb +4 -4
- data/spec/unit/functions/match_spec.rb +2 -2
- data/spec/unit/functions/regsubst_spec.rb +1 -1
- data/spec/unit/functions/split_spec.rb +1 -1
- data/spec/unit/functions/unwrap_spec.rb +29 -0
- data/spec/unit/functions/versioncmp_spec.rb +1 -1
- data/spec/unit/functions4_spec.rb +8 -8
- data/spec/unit/indirector/facts/facter_spec.rb +1 -9
- data/spec/unit/indirector/rest_spec.rb +95 -9
- data/spec/unit/module_spec.rb +43 -7
- data/spec/unit/module_tool/applications/installer_spec.rb +10 -1
- data/spec/unit/module_tool/applications/unpacker_spec.rb +2 -1
- data/spec/unit/module_tool/applications/upgrader_spec.rb +8 -0
- data/spec/unit/module_tool/tar/mini_spec.rb +3 -3
- data/spec/unit/network/http/api/indirected_routes_spec.rb +49 -58
- data/spec/unit/network/http/api/master/v3_spec.rb +7 -4
- data/spec/unit/network/rights_spec.rb +1 -1
- data/spec/unit/parameter_spec.rb +11 -0
- data/spec/unit/parser/compiler_spec.rb +19 -33
- data/spec/unit/{appmgmt_spec.rb → parser/environment_compiler_spec.rb} +12 -1
- data/spec/unit/parser/functions/create_resources_spec.rb +76 -4
- data/spec/unit/parser/functions/require_spec.rb +2 -2
- data/spec/unit/parser/resource_spec.rb +21 -11
- data/spec/unit/parser/scope_spec.rb +1 -5
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +1 -1
- data/spec/unit/pops/loaders/dependency_loader_spec.rb +1 -1
- data/spec/unit/pops/loaders/loader_paths_spec.rb +1 -1
- data/spec/unit/pops/loaders/loaders_spec.rb +63 -5
- data/spec/unit/pops/loaders/module_loaders_spec.rb +2 -2
- data/spec/unit/pops/loaders/static_loader_spec.rb +1 -1
- data/spec/unit/pops/parser/lexer2_spec.rb +27 -3
- data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +8 -0
- data/spec/unit/pops/parser/parse_calls_spec.rb +9 -0
- data/spec/unit/pops/puppet_stack_spec.rb +79 -0
- data/spec/unit/pops/resource/resource_type_impl_spec.rb +37 -0
- data/spec/unit/pops/serialization/packer_spec.rb +153 -0
- data/spec/unit/pops/serialization/rgen_spec.rb +88 -0
- data/spec/unit/pops/serialization/serialization_spec.rb +228 -0
- data/spec/unit/pops/types/p_object_type_spec.rb +44 -2
- data/spec/unit/pops/types/p_sem_ver_type_spec.rb +42 -0
- data/spec/unit/pops/types/p_sensitive_type_spec.rb +139 -0
- data/spec/unit/pops/types/p_type_set_type_spec.rb +424 -0
- data/spec/unit/pops/types/ruby_generator_spec.rb +497 -181
- data/spec/unit/pops/types/type_calculator_spec.rb +10 -4
- data/spec/unit/pops/types/type_formatter_spec.rb +1 -1
- data/spec/unit/pops/types/type_mismatch_describer_spec.rb +2 -2
- data/spec/unit/pops/types/type_parser_spec.rb +1 -1
- data/spec/unit/pops/types/types_spec.rb +1 -1
- data/spec/unit/pops/validator/validator_spec.rb +18 -1
- data/spec/unit/property_spec.rb +48 -11
- data/spec/unit/provider/group/windows_adsi_spec.rb +11 -1
- data/spec/unit/provider/package/dnf_spec.rb +1 -99
- data/spec/unit/provider/package/pacman_spec.rb +4 -4
- data/spec/unit/provider/package/pip_spec.rb +14 -0
- data/spec/unit/provider/package/pkg_spec.rb +6 -0
- data/spec/unit/provider/package/pkgdmg_spec.rb +0 -3
- data/spec/unit/provider/package/portage_spec.rb +64 -8
- data/spec/unit/provider/package/tdnf_spec.rb +18 -0
- data/spec/unit/provider/package/windows/package_spec.rb +4 -1
- data/spec/unit/provider/package/windows_spec.rb +8 -2
- data/spec/unit/provider/package/yum_spec.rb +6 -377
- data/spec/unit/provider/service/base_spec.rb +6 -0
- data/spec/unit/provider/service/debian_spec.rb +16 -7
- data/spec/unit/provider/service/gentoo_spec.rb +6 -0
- data/spec/unit/provider/service/init_spec.rb +7 -0
- data/spec/unit/provider/service/launchd_spec.rb +35 -4
- data/spec/unit/provider/service/openrc_spec.rb +6 -0
- data/spec/unit/provider/service/smf_spec.rb +31 -6
- data/spec/unit/provider/service/src_spec.rb +6 -0
- data/spec/unit/provider/service/systemd_spec.rb +70 -20
- data/spec/unit/provider/service/upstart_spec.rb +6 -0
- data/spec/unit/provider/user/aix_spec.rb +7 -0
- data/spec/unit/provider/user/directoryservice_spec.rb +30 -1
- data/spec/unit/provider/user/windows_adsi_spec.rb +19 -0
- data/spec/unit/resource/capability_finder_spec.rb +51 -3
- data/spec/unit/resource/catalog_spec.rb +5 -0
- data/spec/unit/resource/type_spec.rb +2 -2
- data/spec/unit/resource_spec.rb +19 -0
- data/spec/unit/settings_spec.rb +13 -0
- data/spec/unit/ssl/certificate_authority/interface_spec.rb +176 -10
- data/spec/unit/ssl/certificate_authority_spec.rb +63 -22
- data/spec/unit/ssl/host_spec.rb +1 -1
- data/spec/unit/ssl/oids_spec.rb +24 -21
- data/spec/unit/transaction/event_spec.rb +3 -1
- data/spec/unit/transaction/persistence_spec.rb +173 -0
- data/spec/unit/transaction/report_spec.rb +64 -1
- data/spec/unit/transaction/resource_harness_spec.rb +91 -0
- data/spec/unit/type/file/content_spec.rb +47 -15
- data/spec/unit/type/file_spec.rb +28 -0
- data/spec/unit/type/mount_spec.rb +5 -12
- data/spec/unit/type/yumrepo_spec.rb +1 -5
- data/spec/unit/type_spec.rb +32 -0
- data/spec/unit/util/command_line_spec.rb +11 -0
- data/spec/unit/util/execution_spec.rb +1 -1
- data/spec/unit/util/plist_spec.rb +16 -3
- data/spec/unit/util/storage_spec.rb +4 -1
- data/spec/unit/util/windows/adsi_spec.rb +23 -2
- data/spec/unit/util/windows/file_spec.rb +56 -1
- data/spec/unit/util/windows/sid_spec.rb +31 -7
- data/spec/unit/util/yaml_spec.rb +12 -0
- data/spec/unit/util_spec.rb +87 -20
- metadata +91 -48
- data/ext/puppetlisten/puppetlisten.rb +0 -77
- data/ext/puppetlisten/puppetrun.rb +0 -38
- data/lib/puppet/resource/type_collection_helper.rb +0 -7
- data/spec/unit/parser/functions/defined_spec.rb +0 -120
- data/spec/unit/resource/type_collection_helper_spec.rb +0 -24
@@ -269,6 +269,11 @@ module Puppet::Util::Windows::Process
|
|
269
269
|
end
|
270
270
|
module_function :set_environment_variable
|
271
271
|
|
272
|
+
def get_system_default_ui_language
|
273
|
+
GetSystemDefaultUILanguage()
|
274
|
+
end
|
275
|
+
module_function :get_system_default_ui_language
|
276
|
+
|
272
277
|
# Returns whether or not the OS has the ability to set elevated
|
273
278
|
# token information.
|
274
279
|
#
|
@@ -476,4 +481,9 @@ module Puppet::Util::Windows::Process
|
|
476
481
|
ffi_lib :kernel32
|
477
482
|
attach_function_private :GetVersionExW,
|
478
483
|
[:pointer], :win32_bool
|
484
|
+
|
485
|
+
# https://msdn.microsoft.com/en-us/library/windows/desktop/dd318123(v=vs.85).aspx
|
486
|
+
# LANGID GetSystemDefaultUILanguage(void);
|
487
|
+
ffi_lib :kernel32
|
488
|
+
attach_function_private :GetSystemDefaultUILanguage, [], :word
|
479
489
|
end
|
@@ -262,7 +262,7 @@ module Puppet::Util::Windows::Security
|
|
262
262
|
}
|
263
263
|
|
264
264
|
# Set the mode of the object referenced by +path+ to the specified
|
265
|
-
# +mode+.
|
265
|
+
# +mode+. The mode should be specified as POSIX-style read, write,
|
266
266
|
# and execute modes for the user, group, and other classes,
|
267
267
|
# e.g. 0640. The sticky bit, S_ISVTX, is supported, but is only
|
268
268
|
# meaningful for directories. If set, group and others are not
|
@@ -22,6 +22,14 @@ module Puppet::Util::Windows::User
|
|
22
22
|
# https://msdn.microsoft.com/en-us/library/windows/desktop/ee207397(v=vs.85).aspx
|
23
23
|
SECURITY_MAX_SID_SIZE = 68
|
24
24
|
|
25
|
+
# https://msdn.microsoft.com/en-us/library/windows/desktop/ms681385(v=vs.85).aspx
|
26
|
+
# These error codes indicate successful authentication but failure to
|
27
|
+
# logon for a separate reason
|
28
|
+
ERROR_ACCOUNT_RESTRICTION = 1327
|
29
|
+
ERROR_INVALID_LOGON_HOURS = 1328
|
30
|
+
ERROR_INVALID_WORKSTATION = 1329
|
31
|
+
ERROR_ACCOUNT_DISABLED = 1331
|
32
|
+
|
25
33
|
def check_token_membership
|
26
34
|
is_admin = false
|
27
35
|
FFI::MemoryPointer.new(:byte, SECURITY_MAX_SID_SIZE) do |sid_pointer|
|
@@ -52,9 +60,19 @@ module Puppet::Util::Windows::User
|
|
52
60
|
module_function :check_token_membership
|
53
61
|
|
54
62
|
def password_is?(name, password)
|
55
|
-
|
56
|
-
|
57
|
-
|
63
|
+
begin
|
64
|
+
logon_user(name, password) { |token| }
|
65
|
+
rescue Puppet::Util::Windows::Error => detail
|
66
|
+
|
67
|
+
authenticated_error_codes = Set[
|
68
|
+
ERROR_ACCOUNT_RESTRICTION,
|
69
|
+
ERROR_INVALID_LOGON_HOURS,
|
70
|
+
ERROR_INVALID_WORKSTATION,
|
71
|
+
ERROR_ACCOUNT_DISABLED,
|
72
|
+
]
|
73
|
+
|
74
|
+
return authenticated_error_codes.include?(detail.code)
|
75
|
+
end
|
58
76
|
end
|
59
77
|
module_function :password_is?
|
60
78
|
|
@@ -65,7 +83,7 @@ module Puppet::Util::Windows::User
|
|
65
83
|
token = nil
|
66
84
|
begin
|
67
85
|
FFI::MemoryPointer.new(:handle, 1) do |token_pointer|
|
68
|
-
if LogonUserW(wide_string(name), wide_string('.'), wide_string(password),
|
86
|
+
if LogonUserW(wide_string(name), wide_string('.'), password.nil? ? FFI::Pointer::NULL : wide_string(password),
|
69
87
|
fLOGON32_LOGON_NETWORK, fLOGON32_PROVIDER_DEFAULT, token_pointer) == FFI::WIN32_FALSE
|
70
88
|
raise Puppet::Util::Windows::Error.new("Failed to logon user #{name.inspect}")
|
71
89
|
end
|
data/lib/puppet/util/yaml.rb
CHANGED
@@ -9,9 +9,21 @@ module Puppet::Util::Yaml
|
|
9
9
|
|
10
10
|
class YamlLoadError < Puppet::Error; end
|
11
11
|
|
12
|
-
def self.load_file(filename, default_value = false)
|
13
|
-
|
14
|
-
|
12
|
+
def self.load_file(filename, default_value = false, strip_classes = false)
|
13
|
+
if(strip_classes) then
|
14
|
+
data = YAML::parse_file(filename)
|
15
|
+
data.root.each do |o|
|
16
|
+
if o.respond_to?(:tag=) and
|
17
|
+
o.tag != nil and
|
18
|
+
o.tag.start_with?("!ruby")
|
19
|
+
o.tag = nil
|
20
|
+
end
|
21
|
+
end
|
22
|
+
data.to_ruby || default_value
|
23
|
+
else
|
24
|
+
yaml = YAML.load_file(filename)
|
25
|
+
yaml || default_value
|
26
|
+
end
|
15
27
|
rescue *YamlLoadExceptions => detail
|
16
28
|
raise YamlLoadError.new(detail.message, detail)
|
17
29
|
end
|
@@ -213,7 +213,7 @@ class TestDeepMerge < Test::Unit::TestCase
|
|
213
213
|
DeepMerge::deep_merge!(hash_src, hash_dst)
|
214
214
|
assert_equal({"property" => {"bedroom_count" => {"king_bed" => [nil, 3], "queen_bed" => [4, nil, 1]}, "bathroom_count" => [nil, "2", "1"]}}, hash_dst)
|
215
215
|
|
216
|
-
# test parameter management for knockout_prefix and overwrite
|
216
|
+
# test parameter management for knockout_prefix and overwrite unmergeable
|
217
217
|
assert_raise(DeepMerge::InvalidParameter) {DeepMerge::deep_merge!(hash_src, hash_dst, {:knockout_prefix => ""})}
|
218
218
|
assert_raise(DeepMerge::InvalidParameter) {DeepMerge::deep_merge!(hash_src, hash_dst, {:preserve_unmergeables => true, :knockout_prefix => ""})}
|
219
219
|
assert_raise(DeepMerge::InvalidParameter) {DeepMerge::deep_merge!(hash_src, hash_dst, {:preserve_unmergeables => true, :knockout_prefix => "--"})}
|
@@ -12,7 +12,7 @@
|
|
12
12
|
#
|
13
13
|
# This patch changes the implementation so that the test for MMBase/
|
14
14
|
# MMGeneric is made prior to the iteration, thus avoiding the iteration
|
15
|
-
#
|
15
|
+
# altogether for all non model objects
|
16
16
|
#
|
17
17
|
# The patch also changes the setXXX method to allow it to optimize the way
|
18
18
|
# it ensures that the added elements are unique. Calling the addXXX method
|
data/lib/puppet/version.rb
CHANGED
@@ -2,12 +2,12 @@
|
|
2
2
|
# simple `require 'puppet/version'` allows a rubygems gemspec or bundler
|
3
3
|
# Gemfile to get the Puppet version of the gem install.
|
4
4
|
#
|
5
|
-
# The version
|
5
|
+
# The version can be set programmatically because we want to allow the
|
6
6
|
# Raketasks and such to set the version based on the output of `git describe`
|
7
7
|
|
8
8
|
|
9
9
|
module Puppet
|
10
|
-
PUPPETVERSION = '4.
|
10
|
+
PUPPETVERSION = '4.6.1'
|
11
11
|
|
12
12
|
##
|
13
13
|
# version is a public API method intended to always provide a fast and
|
@@ -86,21 +86,22 @@ describe 'agent logging' do
|
|
86
86
|
end
|
87
87
|
|
88
88
|
else
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
89
|
+
if no_log_dest_set_in(argv)
|
90
|
+
it "when evoked with #{argv}, logs to #{expected[:loggers].inspect} at level #{expected[:level]}" do
|
91
|
+
# This logger is created by the Puppet::Settings object which creates and
|
92
|
+
# applies a catalog to ensure that configuration files and users are in
|
93
|
+
# place.
|
94
|
+
#
|
95
|
+
# It's not something we are specifically testing here since it occurs
|
96
|
+
# regardless of user flags.
|
97
|
+
Puppet::Util::Log.expects(:newdestination).with(instance_of(Puppet::Transaction::Report)).at_least_once
|
98
|
+
expected[:loggers].each do |logclass|
|
99
|
+
Puppet::Util::Log.expects(:newdestination).with(logclass).at_least_once
|
100
|
+
end
|
101
|
+
double_of_bin_puppet_agent_call(argv)
|
102
|
+
|
103
|
+
expect(Puppet::Util::Log.level).to eq(expected[:level])
|
100
104
|
end
|
101
|
-
double_of_bin_puppet_agent_call(argv)
|
102
|
-
|
103
|
-
expect(Puppet::Util::Log.level).to eq(expected[:level])
|
104
105
|
end
|
105
106
|
|
106
107
|
end
|
@@ -29,6 +29,22 @@ describe "directory environments" do
|
|
29
29
|
expect { puppet.run }.to exit_with(0)
|
30
30
|
end.to have_printed('/completely/different')
|
31
31
|
end
|
32
|
+
|
33
|
+
it 'given an 8.3 style path on Windows, will config print an expanded path',
|
34
|
+
:if => Puppet::Util::Platform.windows? do
|
35
|
+
|
36
|
+
# ensure an 8.3 style path is set for environmentpath
|
37
|
+
shortened = Puppet::Util::Windows::File.get_short_pathname(Puppet[:environmentpath])
|
38
|
+
expanded = Puppet::FileSystem.expand_path(shortened)
|
39
|
+
|
40
|
+
Puppet[:environmentpath] = shortened
|
41
|
+
expect(Puppet[:environmentpath]).to match(/~/)
|
42
|
+
|
43
|
+
Puppet.settings.initialize_global_settings(args)
|
44
|
+
expect do
|
45
|
+
expect { puppet.run }.to exit_with(0)
|
46
|
+
end.to have_printed(expanded)
|
47
|
+
end
|
32
48
|
end
|
33
49
|
|
34
50
|
context "with an environmentpath having multiple directories" do
|
@@ -62,15 +62,43 @@ describe "environment settings" do
|
|
62
62
|
end
|
63
63
|
|
64
64
|
it "reads the configured manifest" do
|
65
|
-
expect(Puppet.settings.value(:manifest, :testing)).to eq(
|
65
|
+
expect(Puppet.settings.value(:manifest, :testing)).to eq(Puppet::FileSystem.expand_path('/special/manifest'))
|
66
66
|
end
|
67
67
|
|
68
68
|
it "reads the configured modulepath" do
|
69
|
-
expect(Puppet.settings.value(:modulepath, :testing)).to eq(
|
69
|
+
expect(Puppet.settings.value(:modulepath, :testing)).to eq(Puppet::FileSystem.expand_path('/special/modulepath'))
|
70
70
|
end
|
71
71
|
|
72
72
|
it "reads the configured config_version" do
|
73
|
-
expect(Puppet.settings.value(:config_version, :testing)).to eq(
|
73
|
+
expect(Puppet.settings.value(:config_version, :testing)).to eq(Puppet::FileSystem.expand_path('/special/config_version'))
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context "with an environment.conf containing 8.3 style Windows paths",
|
78
|
+
:if => Puppet::Util::Platform.windows? do
|
79
|
+
|
80
|
+
before(:each) do
|
81
|
+
# set 8.3 style Windows paths
|
82
|
+
@modulepath = Puppet::Util::Windows::File.get_short_pathname(PuppetSpec::Files.tmpdir('fakemodulepath'))
|
83
|
+
|
84
|
+
# for expansion to work, the file must actually exist
|
85
|
+
@manifest = PuppetSpec::Files.tmpfile('foo.pp', @modulepath)
|
86
|
+
# but tmpfile won't create an empty file
|
87
|
+
Puppet::FileSystem.touch(@manifest)
|
88
|
+
@manifest = Puppet::Util::Windows::File.get_short_pathname(@manifest)
|
89
|
+
|
90
|
+
set_environment_conf(environmentpath, 'testing', <<-EOF)
|
91
|
+
manifest=#{@manifest}
|
92
|
+
modulepath=#{@modulepath}
|
93
|
+
EOF
|
94
|
+
end
|
95
|
+
|
96
|
+
it "reads the configured manifest as a fully expanded path" do
|
97
|
+
expect(Puppet.settings.value(:manifest, :testing)).to eq(Puppet::FileSystem.expand_path(@manifest))
|
98
|
+
end
|
99
|
+
|
100
|
+
it "reads the configured modulepath as a fully expanded path" do
|
101
|
+
expect(Puppet.settings.value(:modulepath, :testing)).to eq(Puppet::FileSystem.expand_path(@modulepath))
|
74
102
|
end
|
75
103
|
end
|
76
104
|
|
@@ -91,7 +119,7 @@ describe "environment settings" do
|
|
91
119
|
|
92
120
|
it "reads manifest from environment.conf settings" do
|
93
121
|
expect(Puppet.settings.value(:environmentpath)).to eq(environmentpath)
|
94
|
-
expect(Puppet.settings.value(:manifest, :main)).to eq(
|
122
|
+
expect(Puppet.settings.value(:manifest, :main)).to eq(Puppet::FileSystem.expand_path("/special/manifest"))
|
95
123
|
end
|
96
124
|
end
|
97
125
|
end
|
@@ -46,7 +46,7 @@ describe "documentation of faces" do
|
|
46
46
|
context "licensing of Puppet Labs face '#{face_name}'" do
|
47
47
|
subject { Puppet::Face[face_name, :current] }
|
48
48
|
its :license do should =~ /Apache\s*2/ end
|
49
|
-
its :copyright do should =~ /Puppet Labs
|
49
|
+
its :copyright do should =~ /Puppet Labs|Puppet Inc\./ end
|
50
50
|
|
51
51
|
# REVISIT: This is less that ideal, I think, but right now I am more
|
52
52
|
# comfortable watching us ship with some copyright than without any; we
|
@@ -2,6 +2,8 @@
|
|
2
2
|
require 'spec_helper'
|
3
3
|
require 'puppet/network/http'
|
4
4
|
require 'puppet/network/http/api/indirected_routes'
|
5
|
+
require 'rack/mock' if Puppet.features.rack?
|
6
|
+
require 'puppet/network/http/rack/rest'
|
5
7
|
require 'puppet/indirector_proxy'
|
6
8
|
require 'puppet_spec/files'
|
7
9
|
require 'puppet_spec/network'
|
@@ -52,5 +54,36 @@ describe Puppet::Network::HTTP::API::IndirectedRoutes do
|
|
52
54
|
end
|
53
55
|
end
|
54
56
|
end
|
57
|
+
|
58
|
+
describe "an error from IndirectedRoutes", :if => Puppet.features.rack? do
|
59
|
+
let(:handler) { Puppet::Network::HTTP::RackREST.new }
|
60
|
+
|
61
|
+
describe "returns json" do
|
62
|
+
it "when a standard error" do
|
63
|
+
response = Rack::Response.new
|
64
|
+
request = Rack::Request.new(
|
65
|
+
Rack::MockRequest.env_for("/puppet/v3/invalid-indirector"))
|
66
|
+
|
67
|
+
handler.process(request, response)
|
68
|
+
|
69
|
+
expect(response.header["Content-Type"]).to match(/json/)
|
70
|
+
resp = JSON.parse(response.body.first)
|
71
|
+
expect(resp["message"]).to match(/The indirection name must be purely alphanumeric/)
|
72
|
+
expect(resp["issue_kind"]).to be_a_kind_of(String)
|
73
|
+
end
|
74
|
+
it "when a server error" do
|
75
|
+
response = Rack::Response.new
|
76
|
+
request = Rack::Request.new(
|
77
|
+
Rack::MockRequest.env_for("/puppet/v3/unknown_indirector"))
|
78
|
+
|
79
|
+
handler.process(request, response)
|
80
|
+
|
81
|
+
expect(response.header["Content-Type"]).to match(/json/)
|
82
|
+
resp = JSON.parse(response.body.first)
|
83
|
+
expect(resp["message"]).to match(/Could not find indirection/)
|
84
|
+
expect(resp["issue_kind"]).to be_a_kind_of(String)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
55
88
|
end
|
56
89
|
end
|
@@ -37,6 +37,27 @@ describe Puppet::Node::Environment do
|
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
|
+
it "should expand 8.3 paths on Windows when creating an environment",
|
41
|
+
:if => Puppet::Util::Platform.windows? do
|
42
|
+
|
43
|
+
# asking for short names only works on paths that exist
|
44
|
+
base = Puppet::Util::Windows::File.get_short_pathname(tmpdir("env_modules"))
|
45
|
+
parent_modules_dir = File.join(base, 'testmoduledir')
|
46
|
+
|
47
|
+
# make sure the paths have ~ in them, indicating unexpanded 8.3 paths
|
48
|
+
expect(parent_modules_dir).to match(/~/)
|
49
|
+
|
50
|
+
module_dir = a_module_in('testmodule', parent_modules_dir)
|
51
|
+
|
52
|
+
# create the environment with unexpanded 8.3 paths
|
53
|
+
environment = Puppet::Node::Environment.create(:foo, [parent_modules_dir])
|
54
|
+
|
55
|
+
# and expect fully expanded paths inside the environment
|
56
|
+
# necessary for comparing module paths internally by the parser
|
57
|
+
expect(environment.modulepath).to eq([Puppet::FileSystem.expand_path(parent_modules_dir)])
|
58
|
+
expect(environment.modules.first.path).to eq(Puppet::FileSystem.expand_path(module_dir))
|
59
|
+
end
|
60
|
+
|
40
61
|
it "should not yield the same module from different module paths" do
|
41
62
|
base = tmpfile("env_modules")
|
42
63
|
Dir.mkdir(base)
|
@@ -201,6 +201,16 @@ describe 'collectors' do
|
|
201
201
|
end.to raise_error(/Resource type someresource doesn't exist/)
|
202
202
|
end
|
203
203
|
|
204
|
+
it 'allows query for literal undef' do
|
205
|
+
expect_the_message_to_be(["foo::baz::quux"], <<-MANIFEST)
|
206
|
+
define foo ($x = undef, $y = undef) {
|
207
|
+
notify { 'testing': message => "foo::${x}::${y}" }
|
208
|
+
}
|
209
|
+
foo { 'bar': y => 'quux' }
|
210
|
+
Foo <| x == undef |> { x => 'baz' }
|
211
|
+
MANIFEST
|
212
|
+
end
|
213
|
+
|
204
214
|
context "overrides" do
|
205
215
|
it "modifies an existing array" do
|
206
216
|
expect_the_message_to_be([["original message", "extra message"]], <<-MANIFEST)
|
@@ -2,6 +2,7 @@ require 'spec_helper'
|
|
2
2
|
require 'puppet_spec/compiler'
|
3
3
|
require 'matchers/resource'
|
4
4
|
|
5
|
+
# COPY OF UNIT TEST
|
5
6
|
class CompilerTestResource
|
6
7
|
attr_accessor :builtin, :virtual, :evaluated, :type, :title
|
7
8
|
|
@@ -83,435 +84,8 @@ describe Puppet::Parser::Compiler do
|
|
83
84
|
@scope.resource = @scope_resource
|
84
85
|
end
|
85
86
|
|
86
|
-
|
87
|
-
Puppet::Parser::Compiler.expects(:new).raises ArgumentError
|
88
|
-
expect { Puppet::Parser::Compiler.compile(@node) }.to raise_error(Puppet::Error)
|
89
|
-
end
|
90
|
-
|
91
|
-
it "should use the node's environment as its environment" do
|
92
|
-
expect(@compiler.environment).to equal(@node.environment)
|
93
|
-
end
|
94
|
-
|
95
|
-
it "fails if the node's environment has validation errors" do
|
96
|
-
conflicted_environment = Puppet::Node::Environment.create(:testing, [], '/some/environment.conf/manifest.pp')
|
97
|
-
conflicted_environment.stubs(:validation_errors).returns(['bad environment'])
|
98
|
-
@node.environment = conflicted_environment
|
99
|
-
expect { Puppet::Parser::Compiler.compile(@node) }.to raise_error(Puppet::Error, /Compilation has been halted because.*bad environment/)
|
100
|
-
end
|
101
|
-
|
102
|
-
it "should include the resource type collection helper" do
|
103
|
-
expect(Puppet::Parser::Compiler.ancestors).to be_include(Puppet::Resource::TypeCollectionHelper)
|
104
|
-
end
|
105
|
-
|
106
|
-
it "should be able to return a class list containing all added classes" do
|
107
|
-
@compiler.add_class ""
|
108
|
-
@compiler.add_class "one"
|
109
|
-
@compiler.add_class "two"
|
110
|
-
|
111
|
-
expect(@compiler.classlist.sort).to eq(%w{one two}.sort)
|
112
|
-
end
|
113
|
-
|
114
|
-
describe "when initializing" do
|
115
|
-
|
116
|
-
it "should set its node attribute" do
|
117
|
-
expect(@compiler.node).to equal(@node)
|
118
|
-
end
|
119
|
-
it "should detect when ast nodes are absent" do
|
120
|
-
expect(@compiler.ast_nodes?).to be_falsey
|
121
|
-
end
|
122
|
-
|
123
|
-
it "should detect when ast nodes are present" do
|
124
|
-
@known_resource_types.expects(:nodes?).returns true
|
125
|
-
expect(@compiler.ast_nodes?).to be_truthy
|
126
|
-
end
|
127
|
-
|
128
|
-
it "should copy the known_resource_types version to the catalog" do
|
129
|
-
expect(@compiler.catalog.version).to eq(@known_resource_types.version)
|
130
|
-
end
|
131
|
-
|
132
|
-
it "should copy any node classes into the class list" do
|
133
|
-
node = Puppet::Node.new("mynode")
|
134
|
-
node.classes = %w{foo bar}
|
135
|
-
compiler = Puppet::Parser::Compiler.new(node)
|
136
|
-
|
137
|
-
expect(compiler.classlist).to match_array(['foo', 'bar'])
|
138
|
-
end
|
139
|
-
|
140
|
-
it "should transform node class hashes into a class list" do
|
141
|
-
node = Puppet::Node.new("mynode")
|
142
|
-
node.classes = {'foo'=>{'one'=>'p1'}, 'bar'=>{'two'=>'p2'}}
|
143
|
-
compiler = Puppet::Parser::Compiler.new(node)
|
144
|
-
|
145
|
-
expect(compiler.classlist).to match_array(['foo', 'bar'])
|
146
|
-
end
|
147
|
-
|
148
|
-
it "should add a 'main' stage to the catalog" do
|
149
|
-
expect(@compiler.catalog.resource(:stage, :main)).to be_instance_of(Puppet::Parser::Resource)
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
describe "when managing scopes" do
|
154
|
-
|
155
|
-
it "should create a top scope" do
|
156
|
-
expect(@compiler.topscope).to be_instance_of(Puppet::Parser::Scope)
|
157
|
-
end
|
158
|
-
|
159
|
-
it "should be able to create new scopes" do
|
160
|
-
expect(@compiler.newscope(@compiler.topscope)).to be_instance_of(Puppet::Parser::Scope)
|
161
|
-
end
|
162
|
-
|
163
|
-
it "should set the parent scope of the new scope to be the passed-in parent" do
|
164
|
-
scope = mock 'scope'
|
165
|
-
newscope = @compiler.newscope(scope)
|
166
|
-
|
167
|
-
expect(newscope.parent).to equal(scope)
|
168
|
-
end
|
169
|
-
|
170
|
-
it "should set the parent scope of the new scope to its topscope if the parent passed in is nil" do
|
171
|
-
scope = mock 'scope'
|
172
|
-
newscope = @compiler.newscope(nil)
|
173
|
-
|
174
|
-
expect(newscope.parent).to equal(@compiler.topscope)
|
175
|
-
end
|
176
|
-
end
|
177
|
-
|
178
|
-
describe "when compiling" do
|
179
|
-
|
180
|
-
def compile_methods
|
181
|
-
[:set_node_parameters, :evaluate_main, :evaluate_ast_node, :evaluate_node_classes, :evaluate_generators, :fail_on_unevaluated,
|
182
|
-
:finish, :store, :extract, :evaluate_relationships]
|
183
|
-
end
|
184
|
-
|
185
|
-
# Stub all of the main compile methods except the ones we're specifically interested in.
|
186
|
-
def compile_stub(*except)
|
187
|
-
(compile_methods - except).each { |m| @compiler.stubs(m) }
|
188
|
-
end
|
189
|
-
|
190
|
-
it "should set node parameters as variables in the top scope" do
|
191
|
-
params = {"a" => "b", "c" => "d"}
|
192
|
-
@node.stubs(:parameters).returns(params)
|
193
|
-
compile_stub(:set_node_parameters)
|
194
|
-
@compiler.compile
|
195
|
-
expect(@compiler.topscope['a']).to eq("b")
|
196
|
-
expect(@compiler.topscope['c']).to eq("d")
|
197
|
-
end
|
198
|
-
|
199
|
-
it "should set the client and server versions on the catalog" do
|
200
|
-
params = {"clientversion" => "2", "serverversion" => "3"}
|
201
|
-
@node.stubs(:parameters).returns(params)
|
202
|
-
compile_stub(:set_node_parameters)
|
203
|
-
@compiler.compile
|
204
|
-
expect(@compiler.catalog.client_version).to eq("2")
|
205
|
-
expect(@compiler.catalog.server_version).to eq("3")
|
206
|
-
end
|
207
|
-
|
208
|
-
it "should evaluate the main class if it exists" do
|
209
|
-
compile_stub(:evaluate_main)
|
210
|
-
main_class = @known_resource_types.add Puppet::Resource::Type.new(:hostclass, "")
|
211
|
-
main_class.expects(:evaluate_code).with { |r| r.is_a?(Puppet::Parser::Resource) }
|
212
|
-
@compiler.topscope.expects(:source=).with(main_class)
|
213
|
-
|
214
|
-
@compiler.compile
|
215
|
-
end
|
216
|
-
|
217
|
-
it "should create a new, empty 'main' if no main class exists" do
|
218
|
-
compile_stub(:evaluate_main)
|
219
|
-
@compiler.compile
|
220
|
-
expect(@known_resource_types.find_hostclass("")).to be_instance_of(Puppet::Resource::Type)
|
221
|
-
end
|
222
|
-
|
223
|
-
it "should add an edge between the main stage and main class" do
|
224
|
-
@compiler.compile
|
225
|
-
expect(stage = @compiler.catalog.resource(:stage, "main")).to be_instance_of(Puppet::Parser::Resource)
|
226
|
-
expect(klass = @compiler.catalog.resource(:class, "")).to be_instance_of(Puppet::Parser::Resource)
|
227
|
-
|
228
|
-
expect(@compiler.catalog.edge?(stage, klass)).to be_truthy
|
229
|
-
end
|
230
|
-
|
231
|
-
it "should evaluate all added collections" do
|
232
|
-
colls = []
|
233
|
-
# And when the collections fail to evaluate.
|
234
|
-
colls << mock("coll1-false")
|
235
|
-
colls << mock("coll2-false")
|
236
|
-
colls.each { |c| c.expects(:evaluate).returns(false) }
|
237
|
-
|
238
|
-
@compiler.add_collection(colls[0])
|
239
|
-
@compiler.add_collection(colls[1])
|
240
|
-
|
241
|
-
compile_stub(:evaluate_generators)
|
242
|
-
@compiler.compile
|
243
|
-
end
|
244
|
-
|
245
|
-
it "should ignore builtin resources" do
|
246
|
-
resource = resource(:file, "testing")
|
247
|
-
|
248
|
-
@compiler.add_resource(@scope, resource)
|
249
|
-
resource.expects(:evaluate).never
|
250
|
-
|
251
|
-
@compiler.compile
|
252
|
-
end
|
253
|
-
|
254
|
-
it "should evaluate unevaluated resources" do
|
255
|
-
resource = CompilerTestResource.new(:file, "testing")
|
256
|
-
|
257
|
-
@compiler.add_resource(@scope, resource)
|
258
|
-
|
259
|
-
# We have to now mark the resource as evaluated
|
260
|
-
resource.expects(:evaluate).with { |*whatever| resource.evaluated = true }
|
261
|
-
|
262
|
-
@compiler.compile
|
263
|
-
end
|
264
|
-
|
265
|
-
it "should not evaluate already-evaluated resources" do
|
266
|
-
resource = resource(:file, "testing")
|
267
|
-
resource.stubs(:evaluated?).returns true
|
268
|
-
|
269
|
-
@compiler.add_resource(@scope, resource)
|
270
|
-
resource.expects(:evaluate).never
|
271
|
-
|
272
|
-
@compiler.compile
|
273
|
-
end
|
274
|
-
|
275
|
-
it "should evaluate unevaluated resources created by evaluating other resources" do
|
276
|
-
resource = CompilerTestResource.new(:file, "testing")
|
277
|
-
@compiler.add_resource(@scope, resource)
|
278
|
-
|
279
|
-
resource2 = CompilerTestResource.new(:file, "other")
|
280
|
-
|
281
|
-
# We have to now mark the resource as evaluated
|
282
|
-
resource.expects(:evaluate).with { |*whatever| resource.evaluated = true; @compiler.add_resource(@scope, resource2) }
|
283
|
-
resource2.expects(:evaluate).with { |*whatever| resource2.evaluated = true }
|
284
|
-
|
285
|
-
|
286
|
-
@compiler.compile
|
287
|
-
end
|
288
|
-
|
289
|
-
describe "when finishing" do
|
290
|
-
before do
|
291
|
-
@compiler.send(:evaluate_main)
|
292
|
-
@catalog = @compiler.catalog
|
293
|
-
end
|
294
|
-
|
295
|
-
def add_resource(name, parent = nil)
|
296
|
-
resource = Puppet::Parser::Resource.new "file", name, :scope => @scope
|
297
|
-
@compiler.add_resource(@scope, resource)
|
298
|
-
@catalog.add_edge(parent, resource) if parent
|
299
|
-
resource
|
300
|
-
end
|
301
|
-
|
302
|
-
it "should call finish() on all resources" do
|
303
|
-
# Add a resource that does respond to :finish
|
304
|
-
resource = Puppet::Parser::Resource.new "file", "finish", :scope => @scope
|
305
|
-
resource.expects(:finish)
|
306
|
-
|
307
|
-
@compiler.add_resource(@scope, resource)
|
308
|
-
|
309
|
-
# And one that does not
|
310
|
-
dnf_resource = stub_everything "dnf", :ref => "File[dnf]", :type => "file"
|
311
|
-
|
312
|
-
@compiler.add_resource(@scope, dnf_resource)
|
313
|
-
|
314
|
-
@compiler.send(:finish)
|
315
|
-
end
|
316
|
-
|
317
|
-
it "should call finish() in add_resource order" do
|
318
|
-
resources = sequence('resources')
|
319
|
-
|
320
|
-
resource1 = add_resource("finish1")
|
321
|
-
resource1.expects(:finish).in_sequence(resources)
|
322
|
-
|
323
|
-
resource2 = add_resource("finish2")
|
324
|
-
resource2.expects(:finish).in_sequence(resources)
|
325
|
-
|
326
|
-
@compiler.send(:finish)
|
327
|
-
end
|
328
|
-
|
329
|
-
it "should add each container's metaparams to its contained resources" do
|
330
|
-
main = @catalog.resource(:class, :main)
|
331
|
-
main[:noop] = true
|
332
|
-
|
333
|
-
resource1 = add_resource("meh", main)
|
334
|
-
|
335
|
-
@compiler.send(:finish)
|
336
|
-
expect(resource1[:noop]).to be_truthy
|
337
|
-
end
|
338
|
-
|
339
|
-
it "should add metaparams recursively" do
|
340
|
-
main = @catalog.resource(:class, :main)
|
341
|
-
main[:noop] = true
|
342
|
-
|
343
|
-
resource1 = add_resource("meh", main)
|
344
|
-
resource2 = add_resource("foo", resource1)
|
345
|
-
|
346
|
-
@compiler.send(:finish)
|
347
|
-
expect(resource2[:noop]).to be_truthy
|
348
|
-
end
|
349
|
-
|
350
|
-
it "should prefer metaparams from immediate parents" do
|
351
|
-
main = @catalog.resource(:class, :main)
|
352
|
-
main[:noop] = true
|
353
|
-
|
354
|
-
resource1 = add_resource("meh", main)
|
355
|
-
resource2 = add_resource("foo", resource1)
|
356
|
-
|
357
|
-
resource1[:noop] = false
|
358
|
-
|
359
|
-
@compiler.send(:finish)
|
360
|
-
expect(resource2[:noop]).to be_falsey
|
361
|
-
end
|
362
|
-
|
363
|
-
it "should merge tags downward" do
|
364
|
-
main = @catalog.resource(:class, :main)
|
365
|
-
main.tag("one")
|
366
|
-
|
367
|
-
resource1 = add_resource("meh", main)
|
368
|
-
resource1.tag "two"
|
369
|
-
resource2 = add_resource("foo", resource1)
|
370
|
-
|
371
|
-
@compiler.send(:finish)
|
372
|
-
expect(resource2.tags).to be_include("one")
|
373
|
-
expect(resource2.tags).to be_include("two")
|
374
|
-
end
|
375
|
-
|
376
|
-
it "should work if only middle resources have metaparams set" do
|
377
|
-
main = @catalog.resource(:class, :main)
|
378
|
-
|
379
|
-
resource1 = add_resource("meh", main)
|
380
|
-
resource1[:noop] = true
|
381
|
-
resource2 = add_resource("foo", resource1)
|
382
|
-
|
383
|
-
@compiler.send(:finish)
|
384
|
-
expect(resource2[:noop]).to be_truthy
|
385
|
-
end
|
386
|
-
end
|
387
|
-
|
388
|
-
it "should return added resources in add order" do
|
389
|
-
resource1 = resource(:file, "yay")
|
390
|
-
@compiler.add_resource(@scope, resource1)
|
391
|
-
resource2 = resource(:file, "youpi")
|
392
|
-
@compiler.add_resource(@scope, resource2)
|
393
|
-
|
394
|
-
expect(@compiler.resources).to eq([resource1, resource2])
|
395
|
-
end
|
396
|
-
|
397
|
-
it "should add resources that do not conflict with existing resources" do
|
398
|
-
resource = resource(:file, "yay")
|
399
|
-
@compiler.add_resource(@scope, resource)
|
400
|
-
|
401
|
-
expect(@compiler.catalog).to be_vertex(resource)
|
402
|
-
end
|
403
|
-
|
404
|
-
it "should fail to add resources that conflict with existing resources" do
|
405
|
-
path = make_absolute("/foo")
|
406
|
-
file1 = resource(:file, path)
|
407
|
-
file2 = resource(:file, path)
|
408
|
-
|
409
|
-
@compiler.add_resource(@scope, file1)
|
410
|
-
expect { @compiler.add_resource(@scope, file2) }.to raise_error(Puppet::Resource::Catalog::DuplicateResourceError)
|
411
|
-
end
|
412
|
-
|
413
|
-
it "should add an edge from the scope resource to the added resource" do
|
414
|
-
resource = resource(:file, "yay")
|
415
|
-
@compiler.add_resource(@scope, resource)
|
416
|
-
|
417
|
-
expect(@compiler.catalog).to be_edge(@scope.resource, resource)
|
418
|
-
end
|
419
|
-
|
420
|
-
it "should not add non-class resources that don't specify a stage to the 'main' stage" do
|
421
|
-
main = @compiler.catalog.resource(:stage, :main)
|
422
|
-
resource = resource(:file, "foo")
|
423
|
-
@compiler.add_resource(@scope, resource)
|
424
|
-
|
425
|
-
expect(@compiler.catalog).not_to be_edge(main, resource)
|
426
|
-
end
|
427
|
-
|
428
|
-
it "should not add any parent-edges to stages" do
|
429
|
-
stage = resource(:stage, "other")
|
430
|
-
@compiler.add_resource(@scope, stage)
|
431
|
-
|
432
|
-
@scope.resource = resource(:class, "foo")
|
433
|
-
|
434
|
-
expect(@compiler.catalog.edge?(@scope.resource, stage)).to be_falsey
|
435
|
-
end
|
436
|
-
|
437
|
-
it "should not attempt to add stages to other stages" do
|
438
|
-
other_stage = resource(:stage, "other")
|
439
|
-
second_stage = resource(:stage, "second")
|
440
|
-
@compiler.add_resource(@scope, other_stage)
|
441
|
-
@compiler.add_resource(@scope, second_stage)
|
442
|
-
|
443
|
-
second_stage[:stage] = "other"
|
444
|
-
|
445
|
-
expect(@compiler.catalog.edge?(other_stage, second_stage)).to be_falsey
|
446
|
-
end
|
447
|
-
|
448
|
-
it "should have a method for looking up resources" do
|
449
|
-
resource = resource(:yay, "foo")
|
450
|
-
@compiler.add_resource(@scope, resource)
|
451
|
-
expect(@compiler.findresource("Yay[foo]")).to equal(resource)
|
452
|
-
end
|
453
|
-
|
454
|
-
it "should be able to look resources up by type and title" do
|
455
|
-
resource = resource(:yay, "foo")
|
456
|
-
@compiler.add_resource(@scope, resource)
|
457
|
-
expect(@compiler.findresource("Yay", "foo")).to equal(resource)
|
458
|
-
end
|
459
|
-
|
460
|
-
it "should not evaluate virtual defined resources" do
|
461
|
-
resource = resource(:file, "testing")
|
462
|
-
resource.virtual = true
|
463
|
-
@compiler.add_resource(@scope, resource)
|
464
|
-
|
465
|
-
resource.expects(:evaluate).never
|
466
|
-
|
467
|
-
@compiler.compile
|
468
|
-
end
|
469
|
-
end
|
470
|
-
|
87
|
+
# NEW INTEGRATION TEST
|
471
88
|
describe "when evaluating collections" do
|
472
|
-
|
473
|
-
it "should evaluate each collection" do
|
474
|
-
2.times { |i|
|
475
|
-
coll = mock 'coll%s' % i
|
476
|
-
@compiler.add_collection(coll)
|
477
|
-
|
478
|
-
# This is the hard part -- we have to emulate the fact that
|
479
|
-
# collections delete themselves if they are done evaluating.
|
480
|
-
coll.expects(:evaluate).with do
|
481
|
-
@compiler.delete_collection(coll)
|
482
|
-
end
|
483
|
-
}
|
484
|
-
|
485
|
-
@compiler.compile
|
486
|
-
end
|
487
|
-
|
488
|
-
it "should not fail when there are unevaluated resource collections that do not refer to specific resources" do
|
489
|
-
coll = stub 'coll', :evaluate => false
|
490
|
-
coll.expects(:unresolved_resources).returns(nil)
|
491
|
-
|
492
|
-
@compiler.add_collection(coll)
|
493
|
-
|
494
|
-
expect { @compiler.compile }.not_to raise_error
|
495
|
-
end
|
496
|
-
|
497
|
-
it "should fail when there are unevaluated resource collections that refer to a specific resource" do
|
498
|
-
coll = stub 'coll', :evaluate => false
|
499
|
-
coll.expects(:unresolved_resources).returns(:something)
|
500
|
-
|
501
|
-
@compiler.add_collection(coll)
|
502
|
-
|
503
|
-
expect { @compiler.compile }.to raise_error(Puppet::ParseError, 'Failed to realize virtual resources something')
|
504
|
-
end
|
505
|
-
|
506
|
-
it "should fail when there are unevaluated resource collections that refer to multiple specific resources" do
|
507
|
-
coll = stub 'coll', :evaluate => false
|
508
|
-
coll.expects(:unresolved_resources).returns([:one, :two])
|
509
|
-
|
510
|
-
@compiler.add_collection(coll)
|
511
|
-
|
512
|
-
expect { @compiler.compile }.to raise_error(Puppet::ParseError, 'Failed to realize virtual resources one, two')
|
513
|
-
end
|
514
|
-
|
515
89
|
it 'matches on container inherited tags' do
|
516
90
|
Puppet[:code] = <<-MANIFEST
|
517
91
|
class xport_test {
|
@@ -539,364 +113,10 @@ describe Puppet::Parser::Compiler do
|
|
539
113
|
end
|
540
114
|
end
|
541
115
|
|
542
|
-
describe "when evaluating relationships" do
|
543
|
-
it "should evaluate each relationship with its catalog" do
|
544
|
-
dep = stub 'dep'
|
545
|
-
dep.expects(:evaluate).with(@compiler.catalog)
|
546
|
-
@compiler.add_relationship dep
|
547
|
-
@compiler.evaluate_relationships
|
548
|
-
end
|
549
|
-
end
|
550
|
-
|
551
|
-
describe "when told to evaluate missing classes" do
|
552
|
-
|
553
|
-
it "should fail if there's no source listed for the scope" do
|
554
|
-
scope = stub 'scope', :source => nil
|
555
|
-
expect { @compiler.evaluate_classes(%w{one two}, scope) }.to raise_error(Puppet::DevError)
|
556
|
-
end
|
557
|
-
|
558
|
-
it "should raise an error if a class is not found" do
|
559
|
-
@scope.expects(:find_hostclass).with("notfound").returns(nil)
|
560
|
-
expect{ @compiler.evaluate_classes(%w{notfound}, @scope) }.to raise_error(Puppet::Error, /Could not find class/)
|
561
|
-
end
|
562
|
-
|
563
|
-
it "should raise an error when it can't find class" do
|
564
|
-
klasses = {'foo'=>nil}
|
565
|
-
@node.classes = klasses
|
566
|
-
@compiler.topscope.expects(:find_hostclass).with('foo').returns(nil)
|
567
|
-
expect{ @compiler.compile }.to raise_error(Puppet::Error, /Could not find class foo for testnode/)
|
568
|
-
end
|
569
|
-
end
|
570
|
-
|
571
|
-
describe "when evaluating found classes" do
|
572
|
-
|
573
|
-
before do
|
574
|
-
Puppet.settings[:data_binding_terminus] = "none"
|
575
|
-
@class = stub 'class', :name => "my::class"
|
576
|
-
@scope.stubs(:find_hostclass).with("myclass").returns(@class)
|
577
|
-
|
578
|
-
@resource = stub 'resource', :ref => "Class[myclass]", :type => "file"
|
579
|
-
end
|
580
|
-
|
581
|
-
around do |example|
|
582
|
-
Puppet.override(
|
583
|
-
:environments => Puppet::Environments::Static.new(environment),
|
584
|
-
:description => "Static loader for specs"
|
585
|
-
) do
|
586
|
-
example.run
|
587
|
-
end
|
588
|
-
end
|
589
|
-
|
590
|
-
it "should evaluate each class" do
|
591
|
-
@compiler.catalog.stubs(:tag)
|
592
|
-
|
593
|
-
@class.expects(:ensure_in_catalog).with(@scope)
|
594
|
-
@scope.stubs(:class_scope).with(@class)
|
595
|
-
|
596
|
-
@compiler.evaluate_classes(%w{myclass}, @scope)
|
597
|
-
end
|
598
|
-
|
599
|
-
describe "and the classes are specified as a hash with parameters" do
|
600
|
-
before do
|
601
|
-
@node.classes = {}
|
602
|
-
@ast_obj = Puppet::Parser::AST::Leaf.new(:value => 'foo')
|
603
|
-
end
|
604
|
-
|
605
|
-
# Define the given class with default parameters
|
606
|
-
def define_class(name, parameters)
|
607
|
-
@node.classes[name] = parameters
|
608
|
-
klass = Puppet::Resource::Type.new(:hostclass, name, :arguments => {'p1' => @ast_obj, 'p2' => @ast_obj})
|
609
|
-
@compiler.topscope.known_resource_types.add klass
|
610
|
-
end
|
611
|
-
|
612
|
-
def compile
|
613
|
-
@catalog = @compiler.compile
|
614
|
-
end
|
615
|
-
|
616
|
-
it "should record which classes are evaluated" do
|
617
|
-
classes = {'foo'=>{}, 'bar::foo'=>{}, 'bar'=>{}}
|
618
|
-
classes.each { |c, params| define_class(c, params) }
|
619
|
-
compile()
|
620
|
-
classes.each { |name, p| expect(@catalog.classes).to include(name) }
|
621
|
-
end
|
622
|
-
|
623
|
-
it "should provide default values for parameters that have no values specified" do
|
624
|
-
define_class('foo', {})
|
625
|
-
compile()
|
626
|
-
expect(@catalog.resource(:class, 'foo')['p1']).to eq("foo")
|
627
|
-
end
|
628
|
-
|
629
|
-
it "should use any provided values" do
|
630
|
-
define_class('foo', {'p1' => 'real_value'})
|
631
|
-
compile()
|
632
|
-
expect(@catalog.resource(:class, 'foo')['p1']).to eq("real_value")
|
633
|
-
end
|
634
|
-
|
635
|
-
it "should support providing some but not all values" do
|
636
|
-
define_class('foo', {'p1' => 'real_value'})
|
637
|
-
compile()
|
638
|
-
expect(@catalog.resource(:class, 'Foo')['p1']).to eq("real_value")
|
639
|
-
expect(@catalog.resource(:class, 'Foo')['p2']).to eq("foo")
|
640
|
-
end
|
641
|
-
|
642
|
-
it "should ensure each node class is in catalog and has appropriate tags" do
|
643
|
-
klasses = ['bar::foo']
|
644
|
-
@node.classes = klasses
|
645
|
-
ast_obj = Puppet::Parser::AST::Leaf.new(:value => 'foo')
|
646
|
-
klasses.each do |name|
|
647
|
-
klass = Puppet::Resource::Type.new(:hostclass, name, :arguments => {'p1' => ast_obj, 'p2' => ast_obj})
|
648
|
-
@compiler.topscope.known_resource_types.add klass
|
649
|
-
end
|
650
|
-
catalog = @compiler.compile
|
651
|
-
|
652
|
-
r2 = catalog.resources.detect {|r| r.title == 'Bar::Foo' }
|
653
|
-
expect(r2.tags).to eq(Puppet::Util::TagSet.new(['bar::foo', 'class', 'bar', 'foo']))
|
654
|
-
end
|
655
|
-
end
|
656
|
-
|
657
|
-
it "should fail if required parameters are missing" do
|
658
|
-
klass = {'foo'=>{'a'=>'one'}}
|
659
|
-
@node.classes = klass
|
660
|
-
klass = Puppet::Resource::Type.new(:hostclass, 'foo', :arguments => {'a' => nil, 'b' => nil})
|
661
|
-
@compiler.topscope.known_resource_types.add klass
|
662
|
-
expect { @compiler.compile }.to raise_error(Puppet::PreformattedError, /Class\[Foo\]: expects a value for parameter 'b'/)
|
663
|
-
end
|
664
|
-
|
665
|
-
it "should fail if invalid parameters are passed" do
|
666
|
-
klass = {'foo'=>{'3'=>'one'}}
|
667
|
-
@node.classes = klass
|
668
|
-
klass = Puppet::Resource::Type.new(:hostclass, 'foo', :arguments => {})
|
669
|
-
@compiler.topscope.known_resource_types.add klass
|
670
|
-
expect { @compiler.compile }.to raise_error(Puppet::PreformattedError, /Class\[Foo\]: has no parameter named '3'/)
|
671
|
-
end
|
672
|
-
|
673
|
-
it "should ensure class is in catalog without params" do
|
674
|
-
@node.classes = klasses = {'foo'=>nil}
|
675
|
-
foo = Puppet::Resource::Type.new(:hostclass, 'foo')
|
676
|
-
@compiler.topscope.known_resource_types.add foo
|
677
|
-
catalog = @compiler.compile
|
678
|
-
expect(catalog.classes).to include 'foo'
|
679
|
-
end
|
680
|
-
|
681
|
-
it "should not evaluate the resources created for found classes unless asked" do
|
682
|
-
@compiler.catalog.stubs(:tag)
|
683
|
-
|
684
|
-
@resource.expects(:evaluate).never
|
685
|
-
|
686
|
-
@class.expects(:ensure_in_catalog).returns(@resource)
|
687
|
-
@scope.stubs(:class_scope).with(@class)
|
688
|
-
|
689
|
-
@compiler.evaluate_classes(%w{myclass}, @scope)
|
690
|
-
end
|
691
|
-
|
692
|
-
it "should immediately evaluate the resources created for found classes when asked" do
|
693
|
-
@compiler.catalog.stubs(:tag)
|
694
|
-
|
695
|
-
@resource.expects(:evaluate)
|
696
|
-
@class.expects(:ensure_in_catalog).returns(@resource)
|
697
|
-
@scope.stubs(:class_scope).with(@class)
|
698
|
-
|
699
|
-
@compiler.evaluate_classes(%w{myclass}, @scope, false)
|
700
|
-
end
|
701
|
-
|
702
|
-
it "should skip classes that have already been evaluated" do
|
703
|
-
@compiler.catalog.stubs(:tag)
|
704
|
-
|
705
|
-
@scope.stubs(:class_scope).with(@class).returns(@scope)
|
706
|
-
|
707
|
-
@compiler.expects(:add_resource).never
|
708
|
-
|
709
|
-
@resource.expects(:evaluate).never
|
710
|
-
|
711
|
-
Puppet::Parser::Resource.expects(:new).never
|
712
|
-
@compiler.evaluate_classes(%w{myclass}, @scope, false)
|
713
|
-
end
|
714
|
-
|
715
|
-
it "should skip classes previously evaluated with different capitalization" do
|
716
|
-
@compiler.catalog.stubs(:tag)
|
717
|
-
@scope.stubs(:find_hostclass).with("MyClass").returns(@class)
|
718
|
-
@scope.stubs(:class_scope).with(@class).returns(@scope)
|
719
|
-
@compiler.expects(:add_resource).never
|
720
|
-
@resource.expects(:evaluate).never
|
721
|
-
Puppet::Parser::Resource.expects(:new).never
|
722
|
-
@compiler.evaluate_classes(%w{MyClass}, @scope, false)
|
723
|
-
end
|
724
|
-
end
|
725
|
-
|
726
|
-
describe "when evaluating AST nodes with no AST nodes present" do
|
727
|
-
|
728
|
-
it "should do nothing" do
|
729
|
-
@compiler.expects(:ast_nodes?).returns(false)
|
730
|
-
@compiler.known_resource_types.expects(:nodes).never
|
731
|
-
Puppet::Parser::Resource.expects(:new).never
|
732
|
-
|
733
|
-
@compiler.send(:evaluate_ast_node)
|
734
|
-
end
|
735
|
-
end
|
736
|
-
|
737
|
-
describe "when evaluating AST nodes with AST nodes present" do
|
738
|
-
|
739
|
-
before do
|
740
|
-
@compiler.known_resource_types.stubs(:nodes?).returns true
|
741
|
-
|
742
|
-
# Set some names for our test
|
743
|
-
@node.stubs(:names).returns(%w{a b c})
|
744
|
-
@compiler.known_resource_types.stubs(:node).with("a").returns(nil)
|
745
|
-
@compiler.known_resource_types.stubs(:node).with("b").returns(nil)
|
746
|
-
@compiler.known_resource_types.stubs(:node).with("c").returns(nil)
|
747
|
-
|
748
|
-
# It should check this last, of course.
|
749
|
-
@compiler.known_resource_types.stubs(:node).with("default").returns(nil)
|
750
|
-
end
|
751
|
-
|
752
|
-
it "should fail if the named node cannot be found" do
|
753
|
-
expect { @compiler.send(:evaluate_ast_node) }.to raise_error(Puppet::ParseError)
|
754
|
-
end
|
755
|
-
|
756
|
-
it "should evaluate the first node class matching the node name" do
|
757
|
-
node_class = stub 'node', :name => "c", :evaluate_code => nil
|
758
|
-
@compiler.known_resource_types.stubs(:node).with("c").returns(node_class)
|
759
|
-
|
760
|
-
node_resource = stub 'node resource', :ref => "Node[c]", :evaluate => nil, :type => "node"
|
761
|
-
node_class.expects(:ensure_in_catalog).returns(node_resource)
|
762
|
-
|
763
|
-
@compiler.compile
|
764
|
-
end
|
765
|
-
|
766
|
-
it "should match the default node if no matching node can be found" do
|
767
|
-
node_class = stub 'node', :name => "default", :evaluate_code => nil
|
768
|
-
@compiler.known_resource_types.stubs(:node).with("default").returns(node_class)
|
769
|
-
|
770
|
-
node_resource = stub 'node resource', :ref => "Node[default]", :evaluate => nil, :type => "node"
|
771
|
-
node_class.expects(:ensure_in_catalog).returns(node_resource)
|
772
|
-
|
773
|
-
@compiler.compile
|
774
|
-
end
|
775
|
-
|
776
|
-
it "should evaluate the node resource immediately rather than using lazy evaluation" do
|
777
|
-
node_class = stub 'node', :name => "c"
|
778
|
-
@compiler.known_resource_types.stubs(:node).with("c").returns(node_class)
|
779
|
-
|
780
|
-
node_resource = stub 'node resource', :ref => "Node[c]", :type => "node"
|
781
|
-
node_class.expects(:ensure_in_catalog).returns(node_resource)
|
782
|
-
|
783
|
-
node_resource.expects(:evaluate)
|
784
|
-
|
785
|
-
@compiler.send(:evaluate_ast_node)
|
786
|
-
end
|
787
|
-
end
|
788
|
-
|
789
116
|
describe "when evaluating node classes" do
|
790
117
|
include PuppetSpec::Compiler
|
791
118
|
|
792
|
-
describe "when provided classes in array format" do
|
793
|
-
let(:node) { Puppet::Node.new('someone', :classes => ['something']) }
|
794
|
-
|
795
|
-
describe "when the class exists" do
|
796
|
-
it "should succeed if the class is already included" do
|
797
|
-
manifest = <<-MANIFEST
|
798
|
-
class something {}
|
799
|
-
include something
|
800
|
-
MANIFEST
|
801
|
-
|
802
|
-
catalog = compile_to_catalog(manifest, node)
|
803
|
-
|
804
|
-
expect(catalog.resource('Class', 'Something')).not_to be_nil
|
805
|
-
end
|
806
|
-
|
807
|
-
it "should evaluate the class without parameters if it's not already included" do
|
808
|
-
manifest = "class something {}"
|
809
|
-
|
810
|
-
catalog = compile_to_catalog(manifest, node)
|
811
|
-
|
812
|
-
expect(catalog.resource('Class', 'Something')).not_to be_nil
|
813
|
-
end
|
814
|
-
end
|
815
|
-
|
816
|
-
it "should fail if the class doesn't exist" do
|
817
|
-
expect { compile_to_catalog('', node) }.to raise_error(Puppet::Error, /Could not find class something/)
|
818
|
-
end
|
819
|
-
end
|
820
|
-
|
821
119
|
describe "when provided classes in hash format" do
|
822
|
-
describe "for classes without parameters" do
|
823
|
-
let(:node) { Puppet::Node.new('someone', :classes => {'something' => {}}) }
|
824
|
-
|
825
|
-
describe "when the class exists" do
|
826
|
-
it "should succeed if the class is already included" do
|
827
|
-
manifest = <<-MANIFEST
|
828
|
-
class something {}
|
829
|
-
include something
|
830
|
-
MANIFEST
|
831
|
-
|
832
|
-
catalog = compile_to_catalog(manifest, node)
|
833
|
-
|
834
|
-
expect(catalog.resource('Class', 'Something')).not_to be_nil
|
835
|
-
end
|
836
|
-
|
837
|
-
it "should evaluate the class if it's not already included" do
|
838
|
-
manifest = <<-MANIFEST
|
839
|
-
class something {}
|
840
|
-
MANIFEST
|
841
|
-
|
842
|
-
catalog = compile_to_catalog(manifest, node)
|
843
|
-
|
844
|
-
expect(catalog.resource('Class', 'Something')).not_to be_nil
|
845
|
-
end
|
846
|
-
end
|
847
|
-
|
848
|
-
it "should fail if the class doesn't exist" do
|
849
|
-
expect { compile_to_catalog('', node) }.to raise_error(Puppet::Error, /Could not find class something/)
|
850
|
-
end
|
851
|
-
end
|
852
|
-
|
853
|
-
describe "for classes with parameters" do
|
854
|
-
let(:node) { Puppet::Node.new('someone', :classes => {'something' => {'configuron' => 'defrabulated'}}) }
|
855
|
-
|
856
|
-
describe "when the class exists" do
|
857
|
-
it "should fail if the class is already included" do
|
858
|
-
manifest = <<-MANIFEST
|
859
|
-
class something($configuron=frabulated) {}
|
860
|
-
include something
|
861
|
-
MANIFEST
|
862
|
-
|
863
|
-
expect { compile_to_catalog(manifest, node) }.to raise_error(Puppet::Error, /Class\[Something\] is already declared/)
|
864
|
-
end
|
865
|
-
|
866
|
-
it "should evaluate the class if it's not already included" do
|
867
|
-
manifest = <<-MANIFEST
|
868
|
-
class something($configuron=frabulated) {}
|
869
|
-
MANIFEST
|
870
|
-
|
871
|
-
catalog = compile_to_catalog(manifest, node)
|
872
|
-
|
873
|
-
resource = catalog.resource('Class', 'Something')
|
874
|
-
expect(resource['configuron']).to eq('defrabulated')
|
875
|
-
end
|
876
|
-
end
|
877
|
-
|
878
|
-
it "should fail if the class doesn't exist" do
|
879
|
-
expect { compile_to_catalog('', node) }.to raise_error(Puppet::Error, /Could not find class something/)
|
880
|
-
end
|
881
|
-
|
882
|
-
it 'evaluates classes declared with parameters before unparameterized classes' do
|
883
|
-
node = Puppet::Node.new('someone', :classes => { 'app::web' => {}, 'app' => { 'port' => 8080 } })
|
884
|
-
manifest = <<-MANIFEST
|
885
|
-
class app($port = 80) { }
|
886
|
-
|
887
|
-
class app::web($port = $app::port) inherits app {
|
888
|
-
notify { expected: message => "$port" }
|
889
|
-
}
|
890
|
-
MANIFEST
|
891
|
-
|
892
|
-
catalog = compile_to_catalog(manifest, node)
|
893
|
-
|
894
|
-
expect(catalog).to have_resource("Class[App]").with_parameter(:port, 8080)
|
895
|
-
expect(catalog).to have_resource("Class[App::Web]")
|
896
|
-
expect(catalog).to have_resource("Notify[expected]").with_parameter(:message, "8080")
|
897
|
-
end
|
898
|
-
end
|
899
|
-
|
900
120
|
it 'looks up default parameter values from inherited class (PUP-2532)' do
|
901
121
|
catalog = compile_to_catalog(<<-CODE)
|
902
122
|
class a {
|
@@ -918,47 +138,6 @@ describe Puppet::Parser::Compiler do
|
|
918
138
|
end
|
919
139
|
end
|
920
140
|
|
921
|
-
describe "when managing resource overrides" do
|
922
|
-
|
923
|
-
before do
|
924
|
-
@override = stub 'override', :ref => "File[/foo]", :type => "my"
|
925
|
-
@resource = resource(:file, "/foo")
|
926
|
-
end
|
927
|
-
|
928
|
-
it "should be able to store overrides" do
|
929
|
-
expect { @compiler.add_override(@override) }.not_to raise_error
|
930
|
-
end
|
931
|
-
|
932
|
-
it "should apply overrides to the appropriate resources" do
|
933
|
-
@compiler.add_resource(@scope, @resource)
|
934
|
-
@resource.expects(:merge).with(@override)
|
935
|
-
|
936
|
-
@compiler.add_override(@override)
|
937
|
-
|
938
|
-
@compiler.compile
|
939
|
-
end
|
940
|
-
|
941
|
-
it "should accept overrides before the related resource has been created" do
|
942
|
-
@resource.expects(:merge).with(@override)
|
943
|
-
|
944
|
-
# First store the override
|
945
|
-
@compiler.add_override(@override)
|
946
|
-
|
947
|
-
# Then the resource
|
948
|
-
@compiler.add_resource(@scope, @resource)
|
949
|
-
|
950
|
-
# And compile, so they get resolved
|
951
|
-
@compiler.compile
|
952
|
-
end
|
953
|
-
|
954
|
-
it "should fail if the compile is finished and resource overrides have not been applied" do
|
955
|
-
@compiler.add_override(@override)
|
956
|
-
|
957
|
-
expect { @compiler.compile }.to raise_error Puppet::ParseError, 'Could not find resource(s) File[/foo] for overriding'
|
958
|
-
end
|
959
|
-
end
|
960
|
-
|
961
|
-
|
962
141
|
context "when converting catalog to resource" do
|
963
142
|
it "the same environment is used for compilation as for transformation to resource form" do
|
964
143
|
Puppet[:code] = <<-MANIFEST
|
@@ -1031,7 +210,7 @@ describe Puppet::Parser::Compiler do
|
|
1031
210
|
end
|
1032
211
|
end
|
1033
212
|
end
|
1034
|
-
describe "the compiler when using
|
213
|
+
describe "the compiler when using 4.x language constructs" do
|
1035
214
|
include PuppetSpec::Compiler
|
1036
215
|
|
1037
216
|
if Puppet.features.microsoft_windows?
|
@@ -1169,15 +348,77 @@ describe Puppet::Parser::Compiler do
|
|
1169
348
|
end.to raise_error(/Resource Override can only.*got: Class\[a\].*/)
|
1170
349
|
end
|
1171
350
|
|
1172
|
-
describe
|
351
|
+
describe 'when resolving class references' do
|
1173
352
|
include Matchers::Resource
|
353
|
+
|
354
|
+
{ 'string' => 'myWay',
|
355
|
+
'class reference' => 'Class["myWay"]',
|
356
|
+
'resource reference' => 'Resource["class", "myWay"]'
|
357
|
+
}.each do |label, code|
|
358
|
+
it "allows camel cased class name reference in 'include' using a #{label}" do
|
359
|
+
catalog = compile_to_catalog(<<-"PP")
|
360
|
+
class myWay {
|
361
|
+
notify { 'I did it': message => 'my way'}
|
362
|
+
}
|
363
|
+
include #{code}
|
364
|
+
PP
|
365
|
+
expect(catalog).to have_resource("Notify[I did it]")
|
366
|
+
end
|
367
|
+
end
|
368
|
+
|
369
|
+
describe 'and classname is a Resource Reference and strict == :error' do
|
370
|
+
before(:each) do
|
371
|
+
Puppet[:strict] = :error
|
372
|
+
end
|
373
|
+
|
374
|
+
it 'is reported as an error' do
|
375
|
+
expect {
|
376
|
+
compile_to_catalog(<<-PP)
|
377
|
+
notice Class[ToothFairy]
|
378
|
+
PP
|
379
|
+
}.to raise_error(/Illegal Class name in class reference. A TypeReference\['ToothFairy'\]-Type cannot be used where a String is expected/)
|
380
|
+
end
|
381
|
+
end
|
382
|
+
|
383
|
+
describe 'and classname is a Resource Reference and strict == :warning' do
|
384
|
+
before(:each) do
|
385
|
+
Puppet[:strict] = :warning
|
386
|
+
end
|
387
|
+
|
388
|
+
it 'is reported as a deprecation warning' do
|
389
|
+
expect {
|
390
|
+
compile_to_catalog(<<-PP)
|
391
|
+
notice Class[ToothFairy]
|
392
|
+
PP
|
393
|
+
expect(@logs).to have_matching_log(/Upper cased class-name in a Class\[<class-name>\] is deprecated, class-name should be a lowercase string/)
|
394
|
+
|
395
|
+
}.to_not raise_error()
|
396
|
+
end
|
397
|
+
end
|
398
|
+
|
399
|
+
describe 'and classname is a Resource Reference and strict == :off' do
|
400
|
+
before(:each) do
|
401
|
+
Puppet[:strict] = :off
|
402
|
+
end
|
403
|
+
|
404
|
+
it 'is not reported' do
|
405
|
+
expect {
|
406
|
+
compile_to_catalog(<<-PP)
|
407
|
+
notice Class[ToothFairy]
|
408
|
+
PP
|
409
|
+
expect(@logs).to_not have_matching_log(/Warning: Upper cased class-name in a Class\[<class-name>\] is deprecated, class-name should be a lowercase string/)
|
410
|
+
|
411
|
+
}.to_not raise_error()
|
412
|
+
end
|
413
|
+
end
|
414
|
+
|
1174
415
|
it "should not favor local scope (with class included in topscope)" do
|
1175
416
|
catalog = compile_to_catalog(<<-PP)
|
1176
417
|
class experiment {
|
1177
418
|
class baz {
|
1178
419
|
}
|
1179
|
-
notify {"x" : require => Class[
|
1180
|
-
notify {"y" : require => Class[
|
420
|
+
notify {"x" : require => Class['baz'] }
|
421
|
+
notify {"y" : require => Class['experiment::baz'] }
|
1181
422
|
}
|
1182
423
|
class baz {
|
1183
424
|
}
|
@@ -1195,8 +436,8 @@ describe Puppet::Parser::Compiler do
|
|
1195
436
|
class experiment {
|
1196
437
|
class baz {
|
1197
438
|
}
|
1198
|
-
notify {"x" : require => Class[
|
1199
|
-
notify {"y" : require => Class[
|
439
|
+
notify {"x" : require => Class['baz'] }
|
440
|
+
notify {"y" : require => Class['experiment::baz'] }
|
1200
441
|
}
|
1201
442
|
class baz {
|
1202
443
|
}
|
@@ -1691,17 +932,12 @@ describe Puppet::Parser::Compiler do
|
|
1691
932
|
expect(catalog).to have_resource("Notify[value second]")
|
1692
933
|
end
|
1693
934
|
|
1694
|
-
|
1695
|
-
|
1696
|
-
|
1697
|
-
|
1698
|
-
|
1699
|
-
|
1700
|
-
compile_to_catalog(<<-MANIFEST)
|
1701
|
-
with(1) |$x, $y| { }
|
1702
|
-
MANIFEST
|
1703
|
-
end.to raise_error(/Parameter \$y is required but no value was given/m)
|
1704
|
-
end
|
935
|
+
it 'denies when missing required arguments' do
|
936
|
+
expect do
|
937
|
+
compile_to_catalog(<<-MANIFEST)
|
938
|
+
with(1) |$x, $y| { }
|
939
|
+
MANIFEST
|
940
|
+
end.to raise_error(/Parameter \$y is required but no value was given/m)
|
1705
941
|
end
|
1706
942
|
|
1707
943
|
it 'accepts anything when parameters are untyped' do
|