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
@@ -18,6 +18,8 @@ describe Puppet::Type.type(:user).provider(:windows_adsi), :if => Puppet.feature
|
|
18
18
|
before :each do
|
19
19
|
Puppet::Util::Windows::ADSI.stubs(:computer_name).returns('testcomputername')
|
20
20
|
Puppet::Util::Windows::ADSI.stubs(:connect).returns connection
|
21
|
+
# this would normally query the system, but not needed for these tests
|
22
|
+
Puppet::Util::Windows::ADSI::User.stubs(:localized_domains).returns([])
|
21
23
|
end
|
22
24
|
|
23
25
|
describe ".instances" do
|
@@ -34,6 +36,16 @@ describe Puppet::Type.type(:user).provider(:windows_adsi), :if => Puppet.feature
|
|
34
36
|
expect(provider.user).to be_a(Puppet::Util::Windows::ADSI::User)
|
35
37
|
end
|
36
38
|
|
39
|
+
describe "when retrieving the password property" do
|
40
|
+
context "when the resource has a nil password" do
|
41
|
+
it "should never issue a logon attempt" do
|
42
|
+
resource.stubs(:[]).with(any_of(:name, :password)).returns(nil)
|
43
|
+
Puppet::Util::Windows::User.expects(:logon_user).never
|
44
|
+
provider.password
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
37
49
|
describe "when managing groups" do
|
38
50
|
it 'should return the list of groups as an array of strings' do
|
39
51
|
provider.user.stubs(:groups).returns nil
|
@@ -226,6 +238,13 @@ describe Puppet::Type.type(:user).provider(:windows_adsi), :if => Puppet.feature
|
|
226
238
|
expect(provider.password).to be_nil
|
227
239
|
end
|
228
240
|
|
241
|
+
it "should test a blank user password" do
|
242
|
+
resource[:password] = ''
|
243
|
+
provider.user.expects(:password_is?).with('').returns true
|
244
|
+
|
245
|
+
expect(provider.password).to eq('')
|
246
|
+
end
|
247
|
+
|
229
248
|
it 'should not create a user if a group by the same name exists' do
|
230
249
|
Puppet::Util::Windows::ADSI::User.expects(:create).with('testuser').raises( Puppet::Error.new("Cannot create user if group 'testuser' exists.") )
|
231
250
|
expect{ provider.create }.to raise_error( Puppet::Error,
|
@@ -65,13 +65,61 @@ describe Puppet::Resource::CapabilityFinder do
|
|
65
65
|
result = Puppet::Resource::CapabilityFinder.find('production', nil, Puppet::Resource.new('Cap', 'cap'))
|
66
66
|
expect(result['host']).to eq('ahost')
|
67
67
|
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe '#find' do
|
71
|
+
let(:capability) { Puppet::Resource.new('Cap', 'cap') }
|
72
|
+
let(:code_id) { 'b59e5df0578ef411f773ee6c33d8073c50e7b8fe' }
|
73
|
+
|
74
|
+
it 'should search for the resource without including code_id' do
|
75
|
+
resources = [{"type"=>"Cap", "title"=>"cap", "parameters"=>{"host"=>"ahost"}}]
|
76
|
+
Puppet::Resource::CapabilityFinder.stubs(:search).with('production', nil, capability).returns resources
|
68
77
|
|
69
|
-
it 'should include code_id in query' do
|
70
|
-
code_id = 'b59e5df0578ef411f773ee6c33d8073c50e7b8fe'
|
71
|
-
Puppet::Util::Puppetdb::Http.expects(:action).with(regexp_matches(Regexp.new(CGI.escape('"=","code_id","' + code_id + "")))).returns(response)
|
72
78
|
result = Puppet::Resource::CapabilityFinder.find('production', code_id, Puppet::Resource.new('Cap', 'cap'))
|
73
79
|
expect(result['host']).to eq('ahost')
|
74
80
|
end
|
81
|
+
|
82
|
+
it 'should return nil if no resource is found' do
|
83
|
+
Puppet::Resource::CapabilityFinder.stubs(:search).with('production', nil, capability).returns []
|
84
|
+
|
85
|
+
result = Puppet::Resource::CapabilityFinder.find('production', code_id, capability)
|
86
|
+
expect(result).to be_nil
|
87
|
+
end
|
88
|
+
|
89
|
+
describe 'when multiple results are returned' do
|
90
|
+
let(:resources) do
|
91
|
+
[{"type"=>"Cap", "title"=>"cap", "parameters"=>{"host"=>"ahost"}},
|
92
|
+
{"type"=>"Cap", "title"=>"cap", "parameters"=>{"host"=>"bhost"}}]
|
93
|
+
end
|
94
|
+
|
95
|
+
before :each do
|
96
|
+
Puppet::Resource::CapabilityFinder.stubs(:search).with('production', nil, capability).returns resources
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'should return the resource matching code_id' do
|
100
|
+
Puppet::Resource::CapabilityFinder.stubs(:search).with('production', code_id, capability).returns [{"type"=>"Cap", "title"=>"cap", "parameters"=>{"host"=>"chost"}}]
|
101
|
+
|
102
|
+
result = Puppet::Resource::CapabilityFinder.find('production', code_id, capability)
|
103
|
+
expect(result['host']).to eq('chost')
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'should return nil if no resource matches code_id' do
|
107
|
+
Puppet::Resource::CapabilityFinder.stubs(:search).with('production', code_id, capability).returns []
|
108
|
+
|
109
|
+
result = Puppet::Resource::CapabilityFinder.find('production', code_id, capability)
|
110
|
+
expect(result).to be_nil
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'should fail if multiple resources match code_id' do
|
114
|
+
Puppet::Resource::CapabilityFinder.stubs(:search).with('production', code_id, capability).returns resources
|
115
|
+
|
116
|
+
expect { Puppet::Resource::CapabilityFinder.find('production', code_id, capability) }.to raise_error(Puppet::DevError, /expected exactly one resource/)
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'should fail if no code_id was specified' do
|
120
|
+
expect { Puppet::Resource::CapabilityFinder.find('production', nil, capability) }.to raise_error(Puppet::DevError, /expected exactly one resource/)
|
121
|
+
end
|
122
|
+
end
|
75
123
|
end
|
76
124
|
end
|
77
125
|
end
|
@@ -818,6 +818,11 @@ describe Puppet::Resource::Catalog, "when converting a resource catalog to pson"
|
|
818
818
|
expect(catalog.to_pson).to validate_against('api/schemas/catalog.json')
|
819
819
|
end
|
820
820
|
|
821
|
+
it "should validate a single sensitive parameter resource catalog against the schema" do
|
822
|
+
catalog = compile_to_catalog("create_resources('file', {'/etc/foo'=>{'ensure'=>'present','content'=>Sensitive('hunter2')}})")
|
823
|
+
expect(catalog.to_pson).to validate_against('api/schemas/catalog.json')
|
824
|
+
end
|
825
|
+
|
821
826
|
it "should validate a two resource catalog against the schema" do
|
822
827
|
catalog = compile_to_catalog("create_resources('notify', {'foo'=>{'message'=>'one'}, 'bar'=>{'message'=>'two'}})")
|
823
828
|
expect(catalog.to_pson).to validate_against('api/schemas/catalog.json')
|
@@ -656,7 +656,7 @@ describe Puppet::Resource::Type do
|
|
656
656
|
|
657
657
|
@compiler.add_resource @scope, @parent_resource
|
658
658
|
|
659
|
-
@type.resource_type_collection = @scope.known_resource_types
|
659
|
+
@type.resource_type_collection = @scope.environment.known_resource_types
|
660
660
|
@type.resource_type_collection.add @parent_type
|
661
661
|
end
|
662
662
|
|
@@ -696,7 +696,7 @@ describe Puppet::Resource::Type do
|
|
696
696
|
|
697
697
|
@compiler.add_resource @scope, @parent_resource
|
698
698
|
|
699
|
-
@type.resource_type_collection = @scope.known_resource_types
|
699
|
+
@type.resource_type_collection = @scope.environment.known_resource_types
|
700
700
|
@type.resource_type_collection.add(@parent_type)
|
701
701
|
end
|
702
702
|
|
data/spec/unit/resource_spec.rb
CHANGED
@@ -811,6 +811,12 @@ describe Puppet::Resource do
|
|
811
811
|
expect(result["fee"]).to eq(%w{baz})
|
812
812
|
end
|
813
813
|
|
814
|
+
it "should set sensitive parameters as an array of strings" do
|
815
|
+
resource = Puppet::Resource.new("File", "/foo", :sensitive_parameters => [:foo, :fee])
|
816
|
+
result = PSON.parse(resource.to_pson)
|
817
|
+
expect(result["sensitive_parameters"]).to eq ["foo", "fee"]
|
818
|
+
end
|
819
|
+
|
814
820
|
it "should serialize relationships as reference strings" do
|
815
821
|
resource = Puppet::Resource.new("File", "/foo")
|
816
822
|
resource[:requires] = Puppet::Resource.new("File", "/bar")
|
@@ -894,6 +900,11 @@ describe Puppet::Resource do
|
|
894
900
|
resource = Puppet::Resource.from_data_hash(@data)
|
895
901
|
expect(resource['foo']).to eq(%w{one})
|
896
902
|
end
|
903
|
+
|
904
|
+
it "converts deserialized sensitive parameters as symbols" do
|
905
|
+
@data['sensitive_parameters'] = ['content', 'mode']
|
906
|
+
expect(Puppet::Resource.from_data_hash(@data).sensitive_parameters).to eq [:content, :mode]
|
907
|
+
end
|
897
908
|
end
|
898
909
|
|
899
910
|
it "implements copy_as_resource" do
|
@@ -901,6 +912,14 @@ describe Puppet::Resource do
|
|
901
912
|
expect(resource.copy_as_resource).to eq(resource)
|
902
913
|
end
|
903
914
|
|
915
|
+
describe "when copying resources" do
|
916
|
+
it "deep copies over 'sensitive' values" do
|
917
|
+
rhs = Puppet::Resource.new("file", "/my/file", {:parameters => {:content => "foo"}, :sensitive_parameters => [:content]})
|
918
|
+
lhs = Puppet::Resource.new(rhs)
|
919
|
+
expect(lhs.sensitive_parameters).to eq [:content]
|
920
|
+
end
|
921
|
+
end
|
922
|
+
|
904
923
|
describe "because it is an indirector model" do
|
905
924
|
it "should include Puppet::Indirector" do
|
906
925
|
expect(Puppet::Resource).to be_is_a(Puppet::Indirector)
|
data/spec/unit/settings_spec.rb
CHANGED
@@ -1375,8 +1375,21 @@ describe Puppet::Settings do
|
|
1375
1375
|
end
|
1376
1376
|
|
1377
1377
|
describe "when adding users and groups to the catalog" do
|
1378
|
+
before :all do
|
1379
|
+
# when this spec is run in isolation to build a settings catalog
|
1380
|
+
# it will not be able to autorequire and load types for the first time
|
1381
|
+
# on Windows with microsoft_windows? stubbed to false, because
|
1382
|
+
# Puppet::Util.path_to_uri is called to generate a URI to load code
|
1383
|
+
# and it manipulates the path based on OS
|
1384
|
+
# so instead we forcefully "prime" the cached types
|
1385
|
+
Puppet::Type.type(:user).new(:name => 'foo')
|
1386
|
+
Puppet::Type.type(:group).new(:name => 'bar')
|
1387
|
+
Puppet::Type.type(:file).new(:name => Dir.pwd) # appropriate for OS
|
1388
|
+
end
|
1389
|
+
|
1378
1390
|
before do
|
1379
1391
|
Puppet.features.stubs(:root?).returns true
|
1392
|
+
# stubbed to false, as Windows catalogs don't add users / groups
|
1380
1393
|
Puppet.features.stubs(:microsoft_windows?).returns false
|
1381
1394
|
|
1382
1395
|
@settings.define_settings :foo,
|
@@ -125,8 +125,8 @@ describe Puppet::SSL::CertificateAuthority::Interface do
|
|
125
125
|
it "should call :generate on the CA for each host specified" do
|
126
126
|
@applier = @class.new(:generate, :to => %w{host1 host2})
|
127
127
|
|
128
|
-
@ca.expects(:generate).with("host1"
|
129
|
-
@ca.expects(:generate).with("host2"
|
128
|
+
@ca.expects(:generate).with() {|*args| args.first == "host1" }
|
129
|
+
@ca.expects(:generate).with() {|*args| args.first == "host2" }
|
130
130
|
|
131
131
|
@applier.apply(@ca)
|
132
132
|
end
|
@@ -156,23 +156,79 @@ describe Puppet::SSL::CertificateAuthority::Interface do
|
|
156
156
|
end
|
157
157
|
|
158
158
|
describe ":sign" do
|
159
|
+
before do
|
160
|
+
@csr1 = Puppet::SSL::CertificateRequest.new 'baz'
|
161
|
+
end
|
162
|
+
|
163
|
+
describe "when run in interactive mode" do
|
164
|
+
before do
|
165
|
+
Puppet::SSL::CertificateRequest.indirection.stubs(:find).with("csr1").returns @csr1
|
166
|
+
|
167
|
+
@ca.stubs(:waiting?).returns(%w{csr1})
|
168
|
+
@ca.stubs(:check_internal_signing_policies).returns(true)
|
169
|
+
end
|
170
|
+
|
171
|
+
it "should prompt before signing cert" do
|
172
|
+
@applier = @class.new(:sign, :to => :all, :interactive => true)
|
173
|
+
@applier.stubs(:format_host).returns("(host info)")
|
174
|
+
|
175
|
+
@applier.expects(:puts).
|
176
|
+
with("Signing Certificate Request for:\n(host info)")
|
177
|
+
|
178
|
+
STDOUT.expects(:print).with("Sign Certificate Request? [y/N] ")
|
179
|
+
|
180
|
+
STDIN.stubs(:gets).returns('y')
|
181
|
+
@ca.expects(:sign).with("csr1", {})
|
182
|
+
|
183
|
+
@applier.apply(@ca)
|
184
|
+
end
|
185
|
+
|
186
|
+
it "a yes answer can be assumed via options" do
|
187
|
+
@applier = @class.new(:sign, :to => :all, :interactive => true, :yes => true)
|
188
|
+
@applier.stubs(:format_host).returns("(host info)")
|
189
|
+
|
190
|
+
@applier.expects(:puts).
|
191
|
+
with("Signing Certificate Request for:\n(host info)")
|
192
|
+
|
193
|
+
STDOUT.expects(:print).with("Sign Certificate Request? [y/N] ")
|
194
|
+
|
195
|
+
@applier.expects(:puts).
|
196
|
+
with("Assuming YES from `-y' or `--assume-yes' flag")
|
197
|
+
|
198
|
+
@ca.expects(:sign).with("csr1", {})
|
199
|
+
|
200
|
+
@applier.apply(@ca)
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
159
204
|
describe "and an array of names was provided" do
|
205
|
+
before do
|
206
|
+
Puppet::SSL::CertificateRequest.indirection.stubs(:find).with("host1").returns @csr1
|
207
|
+
Puppet::SSL::CertificateRequest.indirection.stubs(:find).with("host2").returns @csr1
|
208
|
+
end
|
209
|
+
|
160
210
|
let(:applier) { @class.new(:sign, @options.merge(:to => %w{host1 host2})) }
|
161
211
|
|
162
212
|
it "should sign the specified waiting certificate requests" do
|
163
213
|
@options = {:allow_dns_alt_names => false}
|
214
|
+
applier.stubs(:format_host).returns("")
|
215
|
+
applier.stubs(:puts)
|
216
|
+
@ca.stubs(:check_internal_signing_policies).returns(true)
|
164
217
|
|
165
|
-
@ca.expects(:sign).with("host1",
|
166
|
-
@ca.expects(:sign).with("host2",
|
218
|
+
@ca.expects(:sign).with("host1", @options)
|
219
|
+
@ca.expects(:sign).with("host2", @options)
|
167
220
|
|
168
221
|
applier.apply(@ca)
|
169
222
|
end
|
170
223
|
|
171
224
|
it "should sign the certificate requests with alt names if specified" do
|
172
225
|
@options = {:allow_dns_alt_names => true}
|
226
|
+
applier.stubs(:format_host).returns("")
|
227
|
+
applier.stubs(:puts)
|
228
|
+
@ca.stubs(:check_internal_signing_policies).returns(true)
|
173
229
|
|
174
|
-
@ca.expects(:sign).with("host1",
|
175
|
-
@ca.expects(:sign).with("host2",
|
230
|
+
@ca.expects(:sign).with("host1", @options)
|
231
|
+
@ca.expects(:sign).with("host2", @options)
|
176
232
|
|
177
233
|
applier.apply(@ca)
|
178
234
|
end
|
@@ -181,11 +237,16 @@ describe Puppet::SSL::CertificateAuthority::Interface do
|
|
181
237
|
describe "and :all was provided" do
|
182
238
|
it "should sign all waiting certificate requests" do
|
183
239
|
@ca.stubs(:waiting?).returns(%w{cert1 cert2})
|
240
|
+
Puppet::SSL::CertificateRequest.indirection.stubs(:find).with("cert1").returns @csr1
|
241
|
+
Puppet::SSL::CertificateRequest.indirection.stubs(:find).with("cert2").returns @csr1
|
242
|
+
@ca.stubs(:check_internal_signing_policies).returns(true)
|
184
243
|
|
185
|
-
@ca.expects(:sign).with("cert1",
|
186
|
-
@ca.expects(:sign).with("cert2",
|
244
|
+
@ca.expects(:sign).with("cert1", {})
|
245
|
+
@ca.expects(:sign).with("cert2", {})
|
187
246
|
|
188
247
|
@applier = @class.new(:sign, :to => :all)
|
248
|
+
@applier.stubs(:format_host).returns("")
|
249
|
+
@applier.stubs(:puts)
|
189
250
|
@applier.apply(@ca)
|
190
251
|
end
|
191
252
|
|
@@ -199,18 +260,33 @@ describe Puppet::SSL::CertificateAuthority::Interface do
|
|
199
260
|
end
|
200
261
|
|
201
262
|
describe ":list" do
|
263
|
+
let(:signed_alt_names) { [] }
|
264
|
+
let(:request_alt_names) { [] }
|
265
|
+
let(:custom_attrs) { [] }
|
266
|
+
let(:ext_requests) { [] }
|
267
|
+
let(:custom_exts) { [] }
|
268
|
+
|
202
269
|
before :each do
|
203
270
|
@cert = Puppet::SSL::Certificate.new 'foo'
|
204
271
|
@csr = Puppet::SSL::CertificateRequest.new 'bar'
|
205
272
|
|
206
|
-
@cert.stubs(:subject_alt_names).returns
|
207
|
-
@
|
273
|
+
@cert.stubs(:subject_alt_names).returns signed_alt_names
|
274
|
+
@cert.stubs(:custom_extensions).returns custom_exts
|
275
|
+
|
276
|
+
@csr.stubs(:subject_alt_names).returns request_alt_names
|
277
|
+
@csr.stubs(:custom_attributes).returns custom_attrs
|
278
|
+
@csr.stubs(:request_extensions).returns ext_requests
|
208
279
|
|
209
280
|
Puppet::SSL::Certificate.indirection.stubs(:find).returns @cert
|
210
281
|
Puppet::SSL::CertificateRequest.indirection.stubs(:find).returns @csr
|
211
282
|
|
212
283
|
@digest = mock("digest")
|
213
284
|
@digest.stubs(:to_s).returns("(fingerprint)")
|
285
|
+
|
286
|
+
@expiration = mock('time')
|
287
|
+
@expiration.stubs(:iso8601).returns("(expiration)")
|
288
|
+
@cert.stubs(:expiration).returns(@expiration)
|
289
|
+
|
214
290
|
@ca.expects(:waiting?).returns %w{host1 host2 host3}
|
215
291
|
@ca.expects(:list).returns(%w{host4 host5 host6}).at_most(1)
|
216
292
|
@csr.stubs(:digest).returns @digest
|
@@ -293,6 +369,96 @@ describe Puppet::SSL::CertificateAuthority::Interface do
|
|
293
369
|
applier.apply(@ca)
|
294
370
|
end
|
295
371
|
end
|
372
|
+
|
373
|
+
describe "with custom attrbutes and extensions" do
|
374
|
+
let(:custom_attrs) { [{'oid' => 'customAttr', 'value' => 'attrValue'}] }
|
375
|
+
let(:ext_requests) { [{'oid' => 'customExt', 'value' => 'reqExtValue'}] }
|
376
|
+
let(:custom_exts) { [{'oid' => 'extName', 'value' => 'extValue'}] }
|
377
|
+
let(:signed_alt_names) { ["DNS:puppet", "DNS:puppet.example.com"] }
|
378
|
+
|
379
|
+
before do
|
380
|
+
@ca.unstub(:waiting?)
|
381
|
+
@ca.unstub(:list)
|
382
|
+
@ca.expects(:waiting?).returns %w{ext3}
|
383
|
+
@ca.expects(:list).returns(%w{ext1 ext2}).at_most(1)
|
384
|
+
|
385
|
+
@ca.stubs(:verify).with("ext2").
|
386
|
+
raises(Puppet::SSL::CertificateAuthority::CertificateVerificationError.new(23),
|
387
|
+
"certificate revoked")
|
388
|
+
|
389
|
+
Puppet::SSL::Certificate.indirection.stubs(:find).returns @cert
|
390
|
+
Puppet::SSL::CertificateRequest.indirection.stubs(:find).returns @csr
|
391
|
+
end
|
392
|
+
|
393
|
+
describe "using legacy format" do
|
394
|
+
it "should append astrisks to end of line to denote additional information available" do
|
395
|
+
applier = @class.new(:list, :to => %w{ext1 ext2 ext3})
|
396
|
+
|
397
|
+
applier.expects(:puts).with(<<-OUTPUT.chomp)
|
398
|
+
"ext3" (fingerprint) **
|
399
|
+
+ "ext1" (fingerprint) (alt names: "DNS:puppet", "DNS:puppet.example.com") **
|
400
|
+
- "ext2" (fingerprint) (certificate revoked)
|
401
|
+
OUTPUT
|
402
|
+
|
403
|
+
applier.apply(@ca)
|
404
|
+
end
|
405
|
+
|
406
|
+
it "should append attributes and extensions to end of line when running :verbose" do
|
407
|
+
applier = @class.new(:list, :to => %w{ext1 ext2 ext3}, :verbose => true)
|
408
|
+
|
409
|
+
applier.expects(:puts).with(<<-OUTPUT.chomp)
|
410
|
+
"ext3" (fingerprint) (customAttr: "attrValue", customExt: "reqExtValue")
|
411
|
+
+ "ext1" (fingerprint) (expiration) (alt names: "DNS:puppet", "DNS:puppet.example.com", extName: "extValue")
|
412
|
+
- "ext2" (fingerprint) (certificate revoked)
|
413
|
+
OUTPUT
|
414
|
+
|
415
|
+
applier.apply(@ca)
|
416
|
+
end
|
417
|
+
end
|
418
|
+
|
419
|
+
describe "using line-wise format" do
|
420
|
+
it "use the same format as :verbose legacy format" do
|
421
|
+
applier = @class.new(:list, :to => %w{ext1 ext2 ext3}, :format => :machine)
|
422
|
+
|
423
|
+
applier.expects(:puts).with(<<-OUTPUT.chomp)
|
424
|
+
"ext3" (fingerprint) (customAttr: "attrValue", customExt: "reqExtValue")
|
425
|
+
+ "ext1" (fingerprint) (expiration) (alt names: "DNS:puppet", "DNS:puppet.example.com", extName: "extValue")
|
426
|
+
- "ext2" (fingerprint) (certificate revoked)
|
427
|
+
OUTPUT
|
428
|
+
|
429
|
+
applier.apply(@ca)
|
430
|
+
end
|
431
|
+
end
|
432
|
+
|
433
|
+
describe "using human friendly format" do
|
434
|
+
it "should break attributes and extensions to separate lines" do
|
435
|
+
applier = @class.new(:list, :to => %w{ext1 ext2 ext3}, :format => :human)
|
436
|
+
|
437
|
+
applier.expects(:puts).with(<<-OUTPUT)
|
438
|
+
"ext3"
|
439
|
+
(fingerprint)
|
440
|
+
Status: Request Pending
|
441
|
+
Extensions:
|
442
|
+
customAttr: "attrValue"
|
443
|
+
customExt: "reqExtValue"
|
444
|
+
|
445
|
+
+ "ext1"
|
446
|
+
(fingerprint)
|
447
|
+
Status: Signed
|
448
|
+
Expiration: (expiration)
|
449
|
+
Extensions:
|
450
|
+
alt names: "DNS:puppet", "DNS:puppet.example.com"
|
451
|
+
extName: "extValue"
|
452
|
+
|
453
|
+
- "ext2"
|
454
|
+
(fingerprint)
|
455
|
+
Status: Invalid - (certificate revoked)
|
456
|
+
OUTPUT
|
457
|
+
|
458
|
+
applier.apply(@ca)
|
459
|
+
end
|
460
|
+
end
|
461
|
+
end
|
296
462
|
end
|
297
463
|
|
298
464
|
describe ":print" do
|
@@ -192,7 +192,8 @@ describe Puppet::SSL::CertificateAuthority do
|
|
192
192
|
request.expects(:generate).with(@ca.host.key)
|
193
193
|
request.stubs(:request_extensions => [])
|
194
194
|
|
195
|
-
@ca.expects(:sign).with(@host.name, false,
|
195
|
+
@ca.expects(:sign).with(@host.name, {allow_dns_alt_names: false,
|
196
|
+
self_signing_csr: request})
|
196
197
|
|
197
198
|
@ca.stubs :generate_password
|
198
199
|
|
@@ -256,49 +257,56 @@ describe Puppet::SSL::CertificateAuthority do
|
|
256
257
|
it "should not look up a certificate request for the host" do
|
257
258
|
Puppet::SSL::CertificateRequest.indirection.expects(:find).never
|
258
259
|
|
259
|
-
@ca.sign(@name, true,
|
260
|
+
@ca.sign(@name, {allow_dns_alt_names: true,
|
261
|
+
self_signing_csr: @request})
|
260
262
|
end
|
261
263
|
|
262
264
|
it "should use a certificate type of :ca" do
|
263
265
|
Puppet::SSL::CertificateFactory.expects(:build).with do |*args|
|
264
266
|
expect(args[0]).to eq(:ca)
|
265
267
|
end.returns @cert.content
|
266
|
-
@ca.sign(@name, :
|
268
|
+
@ca.sign(@name, {allow_dns_alt_names: true,
|
269
|
+
self_signing_csr: @request})
|
267
270
|
end
|
268
271
|
|
269
272
|
it "should pass the provided CSR as the CSR" do
|
270
273
|
Puppet::SSL::CertificateFactory.expects(:build).with do |*args|
|
271
274
|
expect(args[1]).to eq(@request)
|
272
275
|
end.returns @cert.content
|
273
|
-
@ca.sign(@name, :
|
276
|
+
@ca.sign(@name, {allow_dns_alt_names: true,
|
277
|
+
self_signing_csr: @request})
|
274
278
|
end
|
275
279
|
|
276
280
|
it "should use the provided CSR's content as the issuer" do
|
277
281
|
Puppet::SSL::CertificateFactory.expects(:build).with do |*args|
|
278
282
|
expect(args[2].subject.to_s).to eq("/CN=myhost")
|
279
283
|
end.returns @cert.content
|
280
|
-
@ca.sign(@name, :
|
284
|
+
@ca.sign(@name, {allow_dns_alt_names: true,
|
285
|
+
self_signing_csr: @request})
|
281
286
|
end
|
282
287
|
|
283
288
|
it "should pass the next serial as the serial number" do
|
284
289
|
Puppet::SSL::CertificateFactory.expects(:build).with do |*args|
|
285
290
|
expect(args[3]).to eq(@serial)
|
286
291
|
end.returns @cert.content
|
287
|
-
@ca.sign(@name, :
|
292
|
+
@ca.sign(@name, {allow_dns_alt_names: true,
|
293
|
+
self_signing_csr: @request})
|
288
294
|
end
|
289
295
|
|
290
296
|
it "should sign the certificate request even if it contains alt names" do
|
291
297
|
@request.stubs(:subject_alt_names).returns %w[DNS:foo DNS:bar DNS:baz]
|
292
298
|
|
293
299
|
expect do
|
294
|
-
@ca.sign(@name, false,
|
300
|
+
@ca.sign(@name, {allow_dns_alt_names: false,
|
301
|
+
self_signing_csr: @request})
|
295
302
|
end.not_to raise_error
|
296
303
|
end
|
297
304
|
|
298
305
|
it "should save the resulting certificate" do
|
299
306
|
Puppet::SSL::Certificate.indirection.expects(:save).with(@cert)
|
300
307
|
|
301
|
-
@ca.sign(@name, :
|
308
|
+
@ca.sign(@name, {allow_dns_alt_names: true,
|
309
|
+
self_signing_csr: @request})
|
302
310
|
end
|
303
311
|
end
|
304
312
|
|
@@ -339,17 +347,37 @@ describe Puppet::SSL::CertificateAuthority do
|
|
339
347
|
}.to raise_error(/CSR has request extensions that are not permitted/)
|
340
348
|
end
|
341
349
|
|
350
|
+
it "should reject auth extensions" do
|
351
|
+
@request.stubs :request_extensions => [{"oid" => "1.3.6.1.4.1.34380.1.3.1",
|
352
|
+
"value" => "true"},
|
353
|
+
{"oid" => "1.3.6.1.4.1.34380.1.3.13",
|
354
|
+
"value" => "com"}]
|
355
|
+
|
356
|
+
expect {
|
357
|
+
@ca.sign(@name)
|
358
|
+
}.to raise_error(Puppet::SSL::CertificateAuthority::CertificateSigningError,
|
359
|
+
/CSR '#{@name}' contains authorization extensions (.*?, .*?).*/)
|
360
|
+
end
|
361
|
+
|
362
|
+
it "should not fail if the CSR contains auth extensions and they're allowed" do
|
363
|
+
@request.stubs :request_extensions => [{"oid" => "1.3.6.1.4.1.34380.1.3.1",
|
364
|
+
"value" => "true"},
|
365
|
+
{"oid" => "1.3.6.1.4.1.34380.1.3.13",
|
366
|
+
"value" => "com"}]
|
367
|
+
expect { @ca.sign(@name, {allow_authorization_extensions: true})}.to_not raise_error
|
368
|
+
end
|
369
|
+
|
342
370
|
it "should fail if the CSR contains alt names and they are not expected" do
|
343
371
|
@request.stubs(:subject_alt_names).returns %w[DNS:foo DNS:bar DNS:baz]
|
344
372
|
|
345
373
|
expect do
|
346
|
-
@ca.sign(@name, false)
|
374
|
+
@ca.sign(@name, {allow_dns_alt_names: false})
|
347
375
|
end.to raise_error(Puppet::SSL::CertificateAuthority::CertificateSigningError, /CSR '#{@name}' contains subject alternative names \(.*?\), which are disallowed. Use `puppet cert --allow-dns-alt-names sign #{@name}` to sign this request./)
|
348
376
|
end
|
349
377
|
|
350
378
|
it "should not fail if the CSR does not contain alt names and they are expected" do
|
351
379
|
@request.stubs(:subject_alt_names).returns []
|
352
|
-
expect { @ca.sign(@name, true) }.to_not raise_error
|
380
|
+
expect { @ca.sign(@name, {allow_dns_alt_names: true}) }.to_not raise_error
|
353
381
|
end
|
354
382
|
|
355
383
|
it "should reject alt names by default" do
|
@@ -421,7 +449,7 @@ describe Puppet::SSL::CertificateAuthority do
|
|
421
449
|
csr.generate(key)
|
422
450
|
|
423
451
|
expect do
|
424
|
-
@ca.check_internal_signing_policies('not_the_certname', csr
|
452
|
+
@ca.check_internal_signing_policies('not_the_certname', csr)
|
425
453
|
end.to raise_error(
|
426
454
|
Puppet::SSL::CertificateAuthority::CertificateSigningError,
|
427
455
|
/common name "the_certname" does not match expected certname "not_the_certname"/
|
@@ -449,7 +477,7 @@ describe Puppet::SSL::CertificateAuthority do
|
|
449
477
|
csr = Puppet::SSL::CertificateRequest.new(name)
|
450
478
|
csr.generate(@signing_key)
|
451
479
|
|
452
|
-
@ca.check_internal_signing_policies(name, csr
|
480
|
+
@ca.check_internal_signing_policies(name, csr)
|
453
481
|
end
|
454
482
|
end
|
455
483
|
|
@@ -468,7 +496,7 @@ describe Puppet::SSL::CertificateAuthority do
|
|
468
496
|
csr.generate(@signing_key)
|
469
497
|
|
470
498
|
expect do
|
471
|
-
@ca.check_internal_signing_policies(name, csr
|
499
|
+
@ca.check_internal_signing_policies(name, csr)
|
472
500
|
end.to raise_error(
|
473
501
|
Puppet::SSL::CertificateAuthority::CertificateSigningError,
|
474
502
|
/subject contains unprintable or non-ASCII characters/
|
@@ -484,7 +512,7 @@ describe Puppet::SSL::CertificateAuthority do
|
|
484
512
|
@request.stubs(:request_extensions).returns exts
|
485
513
|
|
486
514
|
expect {
|
487
|
-
@ca.check_internal_signing_policies(@name, @request
|
515
|
+
@ca.check_internal_signing_policies(@name, @request)
|
488
516
|
}.to_not raise_error
|
489
517
|
end
|
490
518
|
|
@@ -495,7 +523,7 @@ describe Puppet::SSL::CertificateAuthority do
|
|
495
523
|
@request.stubs(:request_extensions).returns exts
|
496
524
|
|
497
525
|
expect {
|
498
|
-
@ca.check_internal_signing_policies(@name, @request
|
526
|
+
@ca.check_internal_signing_policies(@name, @request)
|
499
527
|
}.to_not raise_error
|
500
528
|
end
|
501
529
|
|
@@ -506,7 +534,7 @@ describe Puppet::SSL::CertificateAuthority do
|
|
506
534
|
@request.stubs(:request_extensions).returns exts
|
507
535
|
|
508
536
|
expect {
|
509
|
-
@ca.check_internal_signing_policies(@name, @request
|
537
|
+
@ca.check_internal_signing_policies(@name, @request)
|
510
538
|
}.to_not raise_error
|
511
539
|
end
|
512
540
|
|
@@ -515,7 +543,7 @@ describe Puppet::SSL::CertificateAuthority do
|
|
515
543
|
@request.stubs(:request_extensions).returns [{ "oid" => "banana",
|
516
544
|
"value" => "yumm",
|
517
545
|
"critical" => true }]
|
518
|
-
expect { @ca.check_internal_signing_policies(@name, @request
|
546
|
+
expect { @ca.check_internal_signing_policies(@name, @request) }.to raise_error(
|
519
547
|
Puppet::SSL::CertificateAuthority::CertificateSigningError,
|
520
548
|
/request extensions that are not permitted/
|
521
549
|
)
|
@@ -525,7 +553,7 @@ describe Puppet::SSL::CertificateAuthority do
|
|
525
553
|
@request.stubs(:request_extensions).returns [{ "oid" => "peach",
|
526
554
|
"value" => "meh",
|
527
555
|
"critical" => false }]
|
528
|
-
expect { @ca.check_internal_signing_policies(@name, @request
|
556
|
+
expect { @ca.check_internal_signing_policies(@name, @request) }.to raise_error(
|
529
557
|
Puppet::SSL::CertificateAuthority::CertificateSigningError,
|
530
558
|
/request extensions that are not permitted/
|
531
559
|
)
|
@@ -538,7 +566,7 @@ describe Puppet::SSL::CertificateAuthority do
|
|
538
566
|
{ "oid" => "subjectAltName",
|
539
567
|
"value" => "DNS:foo",
|
540
568
|
"critical" => true }]
|
541
|
-
expect { @ca.check_internal_signing_policies(@name, @request
|
569
|
+
expect { @ca.check_internal_signing_policies(@name, @request) }.to raise_error(
|
542
570
|
Puppet::SSL::CertificateAuthority::CertificateSigningError,
|
543
571
|
/request extensions that are not permitted/
|
544
572
|
)
|
@@ -546,17 +574,28 @@ describe Puppet::SSL::CertificateAuthority do
|
|
546
574
|
|
547
575
|
it "should reject a subjectAltName for a non-DNS value" do
|
548
576
|
@request.stubs(:subject_alt_names).returns ['DNS:foo', 'email:bar@example.com']
|
549
|
-
expect {
|
577
|
+
expect {
|
578
|
+
@ca.check_internal_signing_policies(@name, @request, {allow_dns_alt_names: true})
|
579
|
+
}.to raise_error(
|
550
580
|
Puppet::SSL::CertificateAuthority::CertificateSigningError,
|
551
581
|
/subjectAltName outside the DNS label space/
|
552
582
|
)
|
553
583
|
end
|
554
584
|
|
585
|
+
it "should allow a subjectAltName if subject matches CA's certname" do
|
586
|
+
@request.stubs(:subject_alt_names).returns ['DNS:foo']
|
587
|
+
Puppet[:certname] = @name
|
588
|
+
|
589
|
+
expect {
|
590
|
+
@ca.check_internal_signing_policies(@name, @request, {allow_dns_alt_names: false})
|
591
|
+
}.to_not raise_error
|
592
|
+
end
|
593
|
+
|
555
594
|
it "should reject a wildcard subject" do
|
556
595
|
@request.content.stubs(:subject).
|
557
596
|
returns(OpenSSL::X509::Name.new([["CN", "*.local"]]))
|
558
597
|
|
559
|
-
expect { @ca.check_internal_signing_policies('*.local', @request
|
598
|
+
expect { @ca.check_internal_signing_policies('*.local', @request) }.to raise_error(
|
560
599
|
Puppet::SSL::CertificateAuthority::CertificateSigningError,
|
561
600
|
/subject contains a wildcard/
|
562
601
|
)
|
@@ -564,7 +603,9 @@ describe Puppet::SSL::CertificateAuthority do
|
|
564
603
|
|
565
604
|
it "should reject a wildcard subjectAltName" do
|
566
605
|
@request.stubs(:subject_alt_names).returns ['DNS:foo', 'DNS:*.bar']
|
567
|
-
expect {
|
606
|
+
expect {
|
607
|
+
@ca.check_internal_signing_policies(@name, @request, {allow_dns_alt_names: true})
|
608
|
+
}.to raise_error(
|
568
609
|
Puppet::SSL::CertificateAuthority::CertificateSigningError,
|
569
610
|
/subjectAltName contains a wildcard/
|
570
611
|
)
|