puppet 3.1.1 → 3.2.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- data/CONTRIBUTING.md +2 -2
- data/Gemfile +32 -19
- data/README_DEVELOPER.md +332 -14
- data/Rakefile +9 -5
- data/ext/build_defaults.yaml +2 -3
- data/ext/debian/changelog.erb +6 -0
- data/ext/debian/control +6 -6
- data/ext/envpuppet +4 -4
- data/ext/project_data.yaml +1 -0
- data/ext/puppet-nm-dispatcher +13 -0
- data/ext/redhat/puppet.spec.erb +17 -0
- data/ext/suse/client.init +1 -1
- data/ext/systemd/puppetagent.service +2 -2
- data/ext/systemd/puppetmaster.service +2 -2
- data/lib/hiera/scope.rb +29 -11
- data/lib/hiera_puppet.rb +1 -3
- data/lib/puppet/agent.rb +3 -3
- data/lib/puppet/application.rb +2 -2
- data/lib/puppet/application/agent.rb +27 -12
- data/lib/puppet/application/apply.rb +11 -1
- data/lib/puppet/application/describe.rb +1 -1
- data/lib/puppet/application/doc.rb +13 -9
- data/lib/puppet/application/filebucket.rb +0 -1
- data/lib/puppet/application/kick.rb +1 -0
- data/lib/puppet/application/master.rb +16 -8
- data/lib/puppet/daemon.rb +19 -64
- data/lib/puppet/defaults.rb +61 -5
- data/lib/puppet/error.rb +15 -4
- data/lib/puppet/external/nagios/grammar.ry +1 -1
- data/lib/puppet/external/nagios/makefile +1 -1
- data/lib/puppet/external/nagios/parser.rb +185 -618
- data/lib/puppet/external/pson/pure/parser.rb +47 -1
- data/lib/puppet/face/certificate.rb +3 -3
- data/lib/puppet/face/module.rb +1 -1
- data/lib/puppet/face/module/changes.rb +3 -1
- data/lib/puppet/face/module/uninstall.rb +1 -1
- data/lib/puppet/face/node/clean.rb +5 -5
- data/lib/puppet/feature/base.rb +3 -1
- data/lib/puppet/feature/libuser.rb +8 -0
- data/lib/puppet/file_serving/fileset.rb +9 -1
- data/lib/puppet/forge.rb +28 -5
- data/lib/puppet/forge/errors.rb +34 -0
- data/lib/puppet/forge/repository.rb +1 -1
- data/lib/puppet/indirector.rb +4 -1
- data/lib/puppet/indirector/catalog/compiler.rb +37 -30
- data/lib/puppet/indirector/facts/inventory_active_record.rb +1 -0
- data/lib/puppet/indirector/indirection.rb +28 -15
- data/lib/puppet/indirector/rest.rb +18 -10
- data/lib/puppet/interface.rb +11 -4
- data/lib/puppet/interface/action.rb +1 -3
- data/lib/puppet/interface/action_builder.rb +0 -3
- data/lib/puppet/interface/action_manager.rb +0 -3
- data/lib/puppet/interface/face_collection.rb +0 -2
- data/lib/puppet/interface/option.rb +0 -2
- data/lib/puppet/interface/option_builder.rb +0 -2
- data/lib/puppet/interface/option_manager.rb +0 -2
- data/lib/puppet/metatype/manager.rb +1 -1
- data/lib/puppet/module_tool.rb +1 -0
- data/lib/puppet/module_tool/applications/application.rb +0 -3
- data/lib/puppet/module_tool/applications/builder.rb +8 -20
- data/lib/puppet/module_tool/applications/checksummer.rb +1 -1
- data/lib/puppet/module_tool/applications/installer.rb +1 -0
- data/lib/puppet/module_tool/applications/unpacker.rb +3 -11
- data/lib/puppet/module_tool/checksums.rb +1 -1
- data/lib/puppet/module_tool/errors/installer.rb +18 -1
- data/lib/puppet/module_tool/modulefile.rb +2 -2
- data/lib/puppet/module_tool/skeleton/templates/generator/Modulefile.erb +1 -1
- data/lib/puppet/module_tool/tar.rb +17 -0
- data/lib/puppet/module_tool/tar/gnu.rb +9 -0
- data/lib/puppet/module_tool/tar/mini.rb +39 -0
- data/lib/puppet/module_tool/tar/solaris.rb +5 -0
- data/lib/puppet/network/http.rb +1 -0
- data/lib/puppet/network/http/connection.rb +9 -23
- data/lib/puppet/network/http/handler.rb +38 -7
- data/lib/puppet/network/http/rack/rest.rb +14 -3
- data/lib/puppet/network/http/webrick.rb +3 -1
- data/lib/puppet/network/http/webrick/rest.rb +11 -2
- data/lib/puppet/node/environment.rb +3 -1
- data/lib/puppet/parameter.rb +32 -29
- data/lib/puppet/parameter/package_options.rb +1 -1
- data/lib/puppet/parameter/path.rb +1 -1
- data/lib/puppet/parameter/value.rb +1 -1
- data/lib/puppet/parameter/value_collection.rb +7 -3
- data/lib/puppet/parser/ast.rb +3 -1
- data/lib/puppet/parser/ast/arithmetic_operator.rb +56 -12
- data/lib/puppet/parser/ast/astarray.rb +1 -1
- data/lib/puppet/parser/ast/block_expression.rb +41 -0
- data/lib/puppet/parser/ast/function.rb +13 -2
- data/lib/puppet/parser/ast/lambda.rb +107 -0
- data/lib/puppet/parser/ast/leaf.rb +1 -2
- data/lib/puppet/parser/ast/method_call.rb +77 -0
- data/lib/puppet/parser/ast/vardef.rb +7 -0
- data/lib/puppet/parser/compiler.rb +27 -16
- data/lib/puppet/parser/e_parser_adapter.rb +120 -0
- data/lib/puppet/parser/files.rb +7 -6
- data/lib/puppet/parser/functions.rb +10 -8
- data/lib/puppet/parser/functions/collect.rb +43 -0
- data/lib/puppet/parser/functions/each.rb +96 -0
- data/lib/puppet/parser/functions/foreach.rb +96 -0
- data/lib/puppet/parser/functions/fqdn_rand.rb +2 -2
- data/lib/puppet/parser/functions/hiera.rb +20 -2
- data/lib/puppet/parser/functions/hiera_array.rb +21 -2
- data/lib/puppet/parser/functions/hiera_hash.rb +23 -2
- data/lib/puppet/parser/functions/hiera_include.rb +33 -2
- data/lib/puppet/parser/functions/inline_template.rb +4 -4
- data/lib/puppet/parser/functions/reduce.rb +74 -0
- data/lib/puppet/parser/functions/reject.rb +46 -0
- data/lib/puppet/parser/functions/select.rb +46 -0
- data/lib/puppet/parser/functions/slice.rb +96 -0
- data/lib/puppet/parser/functions/template.rb +2 -2
- data/lib/puppet/parser/grammar.ra +7 -4
- data/lib/puppet/parser/lexer.rb +10 -0
- data/lib/puppet/parser/methods.rb +69 -0
- data/lib/puppet/parser/parser.rb +855 -808
- data/lib/puppet/parser/parser_factory.rb +62 -0
- data/lib/puppet/parser/parser_support.rb +8 -2
- data/lib/puppet/parser/scope.rb +153 -47
- data/lib/puppet/parser/templatewrapper.rb +28 -21
- data/lib/puppet/parser/type_loader.rb +3 -1
- data/lib/puppet/pops.rb +40 -0
- data/lib/puppet/pops/adaptable.rb +190 -0
- data/lib/puppet/pops/adapters.rb +65 -0
- data/lib/puppet/pops/containment.rb +37 -0
- data/lib/puppet/pops/issues.rb +258 -0
- data/lib/puppet/pops/label_provider.rb +71 -0
- data/lib/puppet/pops/model/ast_transformer.rb +636 -0
- data/lib/puppet/pops/model/ast_tree_dumper.rb +378 -0
- data/lib/puppet/pops/model/factory.rb +804 -0
- data/lib/puppet/pops/model/model.rb +567 -0
- data/lib/puppet/pops/model/model_label_provider.rb +75 -0
- data/lib/puppet/pops/model/model_tree_dumper.rb +352 -0
- data/lib/puppet/pops/model/tree_dumper.rb +59 -0
- data/lib/puppet/pops/parser/egrammar.ra +723 -0
- data/lib/puppet/pops/parser/eparser.rb +2300 -0
- data/lib/puppet/pops/parser/grammar.ra +746 -0
- data/lib/puppet/pops/parser/lexer.rb +842 -0
- data/lib/puppet/pops/parser/makefile +13 -0
- data/lib/puppet/pops/parser/parser_support.rb +203 -0
- data/lib/puppet/pops/patterns.rb +35 -0
- data/lib/puppet/pops/utils.rb +104 -0
- data/lib/puppet/pops/validation.rb +297 -0
- data/lib/puppet/pops/validation/checker3_1.rb +551 -0
- data/lib/puppet/pops/validation/validator_factory_3_1.rb +41 -0
- data/lib/puppet/pops/visitable.rb +6 -0
- data/lib/puppet/pops/visitor.rb +50 -0
- data/lib/puppet/property.rb +37 -28
- data/lib/puppet/property/ensure.rb +2 -2
- data/lib/puppet/property/ordered_list.rb +1 -1
- data/lib/puppet/provider.rb +26 -30
- data/lib/puppet/provider/aixobject.rb +45 -44
- data/lib/puppet/provider/augeas/augeas.rb +0 -1
- data/lib/puppet/provider/confiner.rb +1 -1
- data/lib/puppet/provider/cron/crontab.rb +107 -67
- data/lib/puppet/provider/group/groupadd.rb +59 -3
- data/lib/puppet/provider/interface/cisco.rb +4 -4
- data/lib/puppet/provider/mount/parsed.rb +1 -1
- data/lib/puppet/provider/nameservice.rb +22 -6
- data/lib/puppet/provider/nameservice/pw.rb +1 -1
- data/lib/puppet/provider/package/aix.rb +28 -4
- data/lib/puppet/provider/package/gem.rb +0 -2
- data/lib/puppet/provider/package/macports.rb +1 -1
- data/lib/puppet/provider/package/nim.rb +249 -4
- data/lib/puppet/provider/package/opkg.rb +77 -0
- data/lib/puppet/provider/package/pacman.rb +2 -2
- data/lib/puppet/provider/package/rpm.rb +30 -16
- data/lib/puppet/provider/package/yum.rb +3 -3
- data/lib/puppet/provider/parsedfile.rb +80 -3
- data/lib/puppet/provider/selmodule/semodule.rb +2 -2
- data/lib/puppet/provider/service/debian.rb +0 -4
- data/lib/puppet/provider/service/freebsd.rb +2 -2
- data/lib/puppet/provider/service/gentoo.rb +0 -9
- data/lib/puppet/provider/service/init.rb +27 -2
- data/lib/puppet/provider/service/launchd.rb +1 -1
- data/lib/puppet/provider/service/openwrt.rb +36 -0
- data/lib/puppet/provider/service/redhat.rb +0 -9
- data/lib/puppet/provider/service/src.rb +38 -4
- data/lib/puppet/provider/service/systemd.rb +2 -2
- data/lib/puppet/provider/service/upstart.rb +1 -8
- data/lib/puppet/provider/user/aix.rb +4 -10
- data/lib/puppet/provider/user/pw.rb +6 -10
- data/lib/puppet/provider/user/useradd.rb +129 -31
- data/lib/puppet/provider/vlan/cisco.rb +4 -4
- data/lib/puppet/reference/function.rb +2 -2
- data/lib/puppet/reference/indirection.rb +46 -5
- data/lib/puppet/reference/metaparameter.rb +2 -2
- data/lib/puppet/reports.rb +5 -5
- data/lib/puppet/reports/rrdgraph.rb +4 -4
- data/lib/puppet/reports/tagmail.rb +1 -1
- data/lib/puppet/resource.rb +1 -1
- data/lib/puppet/resource/type.rb +13 -11
- data/lib/puppet/scheduler.rb +16 -0
- data/lib/puppet/scheduler/job.rb +53 -0
- data/lib/puppet/scheduler/scheduler.rb +45 -0
- data/lib/puppet/scheduler/splay_job.rb +32 -0
- data/lib/puppet/scheduler/timer.rb +13 -0
- data/lib/puppet/settings/base_setting.rb +1 -1
- data/lib/puppet/simple_graph.rb +4 -4
- data/lib/puppet/ssl/base.rb +12 -2
- data/lib/puppet/ssl/certificate.rb +4 -1
- data/lib/puppet/ssl/certificate_request.rb +4 -1
- data/lib/puppet/ssl/certificate_revocation_list.rb +4 -1
- data/lib/puppet/ssl/configuration.rb +32 -0
- data/lib/puppet/ssl/host.rb +18 -21
- data/lib/puppet/ssl/key.rb +4 -1
- data/lib/puppet/ssl/validator.rb +116 -0
- data/lib/puppet/transaction.rb +1 -1
- data/lib/puppet/transaction/event.rb +3 -10
- data/lib/puppet/transaction/event_manager.rb +8 -1
- data/lib/puppet/transaction/report.rb +17 -16
- data/lib/puppet/type.rb +77 -69
- data/lib/puppet/type/cron.rb +20 -8
- data/lib/puppet/type/exec.rb +9 -3
- data/lib/puppet/type/file.rb +95 -21
- data/lib/puppet/type/file/content.rb +1 -1
- data/lib/puppet/type/file/mode.rb +7 -1
- data/lib/puppet/type/file/source.rb +2 -2
- data/lib/puppet/type/group.rb +11 -0
- data/lib/puppet/type/scheduled_task.rb +5 -1
- data/lib/puppet/type/service.rb +1 -1
- data/lib/puppet/type/ssh_authorized_key.rb +2 -2
- data/lib/puppet/type/user.rb +24 -6
- data/lib/puppet/util.rb +12 -2
- data/lib/puppet/util/classgen.rb +4 -4
- data/lib/puppet/util/colors.rb +55 -0
- data/lib/puppet/util/command_line/trollop.rb +4 -4
- data/lib/puppet/util/errors.rb +39 -3
- data/lib/puppet/util/fileparsing.rb +5 -0
- data/lib/puppet/util/filetype.rb +11 -9
- data/lib/puppet/util/instrumentation/instrumentable.rb +2 -2
- data/lib/puppet/util/libuser.conf +15 -0
- data/lib/puppet/util/libuser.rb +12 -0
- data/lib/puppet/util/monkey_patches.rb +48 -0
- data/lib/puppet/util/network_device.rb +1 -1
- data/lib/puppet/util/network_device/base.rb +2 -2
- data/lib/puppet/util/network_device/cisco/device.rb +29 -19
- data/lib/puppet/util/network_device/config.rb +5 -2
- data/lib/puppet/util/network_device/ipcalc.rb +1 -1
- data/lib/puppet/util/network_device/transport/ssh.rb +4 -3
- data/lib/puppet/util/network_device/transport/telnet.rb +4 -2
- data/lib/puppet/util/plugins.rb +4 -4
- data/lib/puppet/util/posix.rb +1 -1
- data/lib/puppet/util/profiler.rb +28 -0
- data/lib/puppet/util/profiler/logging.rb +47 -0
- data/lib/puppet/util/profiler/none.rb +8 -0
- data/lib/puppet/util/profiler/object_counts.rb +17 -0
- data/lib/puppet/util/profiler/wall_clock.rb +34 -0
- data/lib/puppet/util/provider_features.rb +1 -1
- data/lib/puppet/util/rdoc/parser.rb +5 -5
- data/lib/puppet/util/ssl.rb +38 -0
- data/lib/puppet/util/subclass_loader.rb +1 -5
- data/lib/puppet/util/windows.rb +1 -0
- data/lib/puppet/util/windows/process.rb +3 -0
- data/lib/puppet/util/windows/root_certs.rb +86 -0
- data/lib/puppet/util/windows/security.rb +1 -0
- data/lib/puppet/version.rb +1 -1
- data/spec/fixtures/integration/provider/cron/crontab/create_normal_entry +19 -0
- data/spec/fixtures/integration/provider/cron/crontab/create_special_entry +18 -0
- data/spec/fixtures/integration/provider/cron/crontab/crontab_user1 +15 -0
- data/spec/fixtures/integration/provider/cron/crontab/crontab_user2 +4 -0
- data/spec/fixtures/integration/provider/cron/crontab/modify_entry +13 -0
- data/spec/fixtures/integration/provider/cron/crontab/moved_cronjob_input1 +15 -0
- data/spec/fixtures/integration/provider/cron/crontab/moved_cronjob_input2 +6 -0
- data/spec/fixtures/integration/provider/cron/crontab/remove_named_resource +12 -0
- data/spec/fixtures/integration/provider/cron/crontab/remove_unnamed_resource +14 -0
- data/spec/fixtures/unit/pops/parser/lexer/aliastest.pp +16 -0
- data/spec/fixtures/unit/pops/parser/lexer/append.pp +11 -0
- data/spec/fixtures/unit/pops/parser/lexer/argumentdefaults.pp +14 -0
- data/spec/fixtures/unit/pops/parser/lexer/arithmetic_expression.pp +8 -0
- data/spec/fixtures/unit/pops/parser/lexer/arraytrailingcomma.pp +3 -0
- data/spec/fixtures/unit/pops/parser/lexer/casestatement.pp +65 -0
- data/spec/fixtures/unit/pops/parser/lexer/classheirarchy.pp +15 -0
- data/spec/fixtures/unit/pops/parser/lexer/classincludes.pp +17 -0
- data/spec/fixtures/unit/pops/parser/lexer/classpathtest.pp +11 -0
- data/spec/fixtures/unit/pops/parser/lexer/collection.pp +10 -0
- data/spec/fixtures/unit/pops/parser/lexer/collection_override.pp +8 -0
- data/spec/fixtures/unit/pops/parser/lexer/collection_within_virtual_definitions.pp +20 -0
- data/spec/fixtures/unit/pops/parser/lexer/componentmetaparams.pp +11 -0
- data/spec/fixtures/unit/pops/parser/lexer/componentrequire.pp +8 -0
- data/spec/fixtures/unit/pops/parser/lexer/deepclassheirarchy.pp +23 -0
- data/spec/fixtures/unit/pops/parser/lexer/defineoverrides.pp +17 -0
- data/spec/fixtures/unit/pops/parser/lexer/emptyclass.pp +9 -0
- data/spec/fixtures/unit/pops/parser/lexer/emptyexec.pp +3 -0
- data/spec/fixtures/unit/pops/parser/lexer/emptyifelse.pp +9 -0
- data/spec/fixtures/unit/pops/parser/lexer/falsevalues.pp +3 -0
- data/spec/fixtures/unit/pops/parser/lexer/filecreate.pp +11 -0
- data/spec/fixtures/unit/pops/parser/lexer/fqdefinition.pp +5 -0
- data/spec/fixtures/unit/pops/parser/lexer/fqparents.pp +11 -0
- data/spec/fixtures/unit/pops/parser/lexer/funccomma.pp +5 -0
- data/spec/fixtures/unit/pops/parser/lexer/hash.pp +33 -0
- data/spec/fixtures/unit/pops/parser/lexer/ifexpression.pp +12 -0
- data/spec/fixtures/unit/pops/parser/lexer/implicititeration.pp +15 -0
- data/spec/fixtures/unit/pops/parser/lexer/multilinecomments.pp +10 -0
- data/spec/fixtures/unit/pops/parser/lexer/multipleclass.pp +9 -0
- data/spec/fixtures/unit/pops/parser/lexer/multipleinstances.pp +7 -0
- data/spec/fixtures/unit/pops/parser/lexer/multisubs.pp +13 -0
- data/spec/fixtures/unit/pops/parser/lexer/namevartest.pp +9 -0
- data/spec/fixtures/unit/pops/parser/lexer/scopetest.pp +13 -0
- data/spec/fixtures/unit/pops/parser/lexer/selectorvalues.pp +49 -0
- data/spec/fixtures/unit/pops/parser/lexer/simpledefaults.pp +5 -0
- data/spec/fixtures/unit/pops/parser/lexer/simpleselector.pp +38 -0
- data/spec/fixtures/unit/pops/parser/lexer/singleary.pp +19 -0
- data/spec/fixtures/unit/pops/parser/lexer/singlequote.pp +11 -0
- data/spec/fixtures/unit/pops/parser/lexer/singleselector.pp +22 -0
- data/spec/fixtures/unit/pops/parser/lexer/subclass_name_duplication.pp +11 -0
- data/spec/fixtures/unit/pops/parser/lexer/tag.pp +9 -0
- data/spec/fixtures/unit/pops/parser/lexer/tagged.pp +35 -0
- data/spec/fixtures/unit/pops/parser/lexer/virtualresources.pp +14 -0
- data/spec/fixtures/unit/provider/cron/crontab/single_line.yaml +4 -4
- data/spec/fixtures/unit/provider/cron/crontab/vixie_header.txt +3 -0
- data/spec/fixtures/unit/provider/cron/parsed/managed +6 -0
- data/spec/fixtures/unit/provider/cron/parsed/simple +9 -0
- data/spec/fixtures/unit/provider/parsedfile/simple.txt +4 -0
- data/spec/fixtures/unit/provider/service/systemd/list_units +18 -0
- data/spec/integration/parser/collector_spec.rb +1 -1
- data/spec/integration/parser/compiler_spec.rb +252 -227
- data/spec/integration/parser/parser_spec.rb +171 -53
- data/spec/integration/parser/scope_spec.rb +1 -1
- data/spec/integration/provider/cron/crontab_spec.rb +187 -0
- data/spec/integration/provider/service/systemd_spec.rb +20 -0
- data/spec/integration/type/file_spec.rb +21 -21
- data/spec/integration/type/package_spec.rb +1 -1
- data/spec/lib/puppet_spec/database.rb +2 -5
- data/spec/spec_helper.rb +6 -1
- data/spec/unit/application/apply_spec.rb +16 -1
- data/spec/unit/application/describe_spec.rb +1 -1
- data/spec/unit/application/doc_spec.rb +55 -32
- data/spec/unit/application/kick_spec.rb +8 -6
- data/spec/unit/application/master_spec.rb +4 -4
- data/spec/unit/daemon_spec.rb +1 -1
- data/spec/unit/forge/errors_spec.rb +40 -0
- data/spec/unit/forge/repository_spec.rb +11 -1
- data/spec/unit/forge_spec.rb +13 -3
- data/spec/unit/hiera/backend/puppet_backend_spec.rb +1 -0
- data/spec/unit/hiera/scope_spec.rb +48 -25
- data/spec/unit/indirector/catalog/active_record_spec.rb +6 -3
- data/spec/unit/indirector/catalog/compiler_spec.rb +3 -28
- data/spec/unit/indirector/catalog/static_compiler_spec.rb +1 -1
- data/spec/unit/indirector/facts/inventory_active_record_spec.rb +154 -150
- data/spec/unit/indirector/indirection_spec.rb +5 -0
- data/spec/unit/indirector/resource/active_record_spec.rb +5 -22
- data/spec/unit/indirector_spec.rb +7 -1
- data/spec/unit/interface/action_builder_spec.rb +1 -1
- data/spec/unit/interface/action_manager_spec.rb +0 -2
- data/spec/unit/interface/action_spec.rb +1 -1
- data/spec/unit/interface/documentation_spec.rb +0 -2
- data/spec/unit/interface/face_collection_spec.rb +1 -1
- data/spec/unit/interface/option_builder_spec.rb +1 -1
- data/spec/unit/interface/option_spec.rb +0 -1
- data/spec/unit/module_spec.rb +17 -19
- data/spec/unit/module_tool/application_spec.rb +1 -3
- data/spec/unit/module_tool/applications/builder_spec.rb +38 -0
- data/spec/unit/module_tool/applications/checksummer_spec.rb +134 -0
- data/spec/unit/module_tool/applications/installer_spec.rb +71 -91
- data/spec/unit/module_tool/applications/searcher_spec.rb +1 -3
- data/spec/unit/module_tool/applications/uninstaller_spec.rb +18 -26
- data/spec/unit/module_tool/applications/unpacker_spec.rb +19 -52
- data/spec/unit/module_tool/tar/gnu_spec.rb +19 -0
- data/spec/unit/module_tool/tar/mini_spec.rb +59 -0
- data/spec/unit/module_tool/tar/solaris_spec.rb +19 -0
- data/spec/unit/network/http/connection_spec.rb +17 -2
- data/spec/unit/network/http/handler_spec.rb +195 -167
- data/spec/unit/network/http/rack/rest_spec.rb +26 -4
- data/spec/unit/network/http/webrick/rest_spec.rb +28 -1
- data/spec/unit/network/http/webrick_spec.rb +12 -3
- data/spec/unit/node/environment_spec.rb +421 -404
- data/spec/unit/parser/ast/arithmetic_operator_spec.rb +98 -2
- data/spec/unit/parser/collector_spec.rb +4 -4
- data/spec/unit/parser/compiler_spec.rb +13 -13
- data/spec/unit/parser/eparser_adapter_spec.rb +407 -0
- data/spec/unit/parser/functions/extlookup_spec.rb +20 -17
- data/spec/unit/parser/functions/fqdn_rand_spec.rb +5 -0
- data/spec/unit/parser/functions/hiera_include_spec.rb +0 -2
- data/spec/unit/parser/functions/hiera_spec.rb +0 -2
- data/spec/unit/parser/functions_spec.rb +27 -15
- data/spec/unit/parser/methods/collect_spec.rb +110 -0
- data/spec/unit/parser/methods/each_spec.rb +91 -0
- data/spec/unit/parser/methods/foreach_spec.rb +91 -0
- data/spec/unit/parser/methods/reduce_spec.rb +67 -0
- data/spec/unit/parser/methods/reject_spec.rb +73 -0
- data/spec/unit/parser/methods/select_spec.rb +79 -0
- data/spec/unit/parser/methods/shared.rb +61 -0
- data/spec/unit/parser/methods/slice_spec.rb +97 -0
- data/spec/unit/parser/parser_spec.rb +2 -2
- data/spec/unit/parser/scope_spec.rb +39 -16
- data/spec/unit/parser/templatewrapper_spec.rb +6 -5
- data/spec/unit/parser/type_loader_spec.rb +191 -165
- data/spec/unit/pops/adaptable_spec.rb +143 -0
- data/spec/unit/pops/containment_spec.rb +25 -0
- data/spec/unit/pops/factory_rspec_helper.rb +77 -0
- data/spec/unit/pops/factory_spec.rb +329 -0
- data/spec/unit/pops/issues_spec.rb +26 -0
- data/spec/unit/pops/label_provider_spec.rb +42 -0
- data/spec/unit/pops/model/ast_transformer_spec.rb +65 -0
- data/spec/unit/pops/model/model_spec.rb +37 -0
- data/spec/unit/pops/parser/lexer_spec.rb +884 -0
- data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +248 -0
- data/spec/unit/pops/parser/parse_calls_spec.rb +93 -0
- data/spec/unit/pops/parser/parse_conditionals_spec.rb +159 -0
- data/spec/unit/pops/parser/parse_containers_spec.rb +175 -0
- data/spec/unit/pops/parser/parse_resource_spec.rb +228 -0
- data/spec/unit/pops/parser/parser_rspec_helper.rb +11 -0
- data/spec/unit/pops/parser/parser_spec.rb +15 -0
- data/spec/unit/pops/parser/rgen_sanitycheck_spec.rb +16 -0
- data/spec/unit/pops/transformer/transform_basic_expressions_spec.rb +243 -0
- data/spec/unit/pops/transformer/transform_calls_spec.rb +80 -0
- data/spec/unit/pops/transformer/transform_conditionals_spec.rb +132 -0
- data/spec/unit/pops/transformer/transform_containers_spec.rb +182 -0
- data/spec/unit/pops/transformer/transform_resource_spec.rb +185 -0
- data/spec/unit/pops/transformer/transformer_rspec_helper.rb +27 -0
- data/spec/unit/pops/visitor_spec.rb +94 -0
- data/spec/unit/property_spec.rb +11 -0
- data/spec/unit/provider/augeas/augeas_spec.rb +3 -0
- data/spec/unit/provider/cron/crontab_spec.rb +97 -7
- data/spec/unit/provider/cron/parsed_spec.rb +325 -0
- data/spec/unit/provider/exec/posix_spec.rb +1 -1
- data/spec/unit/provider/group/groupadd_spec.rb +33 -3
- data/spec/unit/provider/group/pw_spec.rb +5 -5
- data/spec/unit/provider/nameservice_spec.rb +304 -0
- data/spec/unit/provider/package/aix_spec.rb +53 -11
- data/spec/unit/provider/package/aptrpm_spec.rb +6 -0
- data/spec/unit/provider/package/gem_spec.rb +6 -11
- data/spec/unit/provider/package/nim_spec.rb +216 -7
- data/spec/unit/provider/package/opkg_spec.rb +180 -0
- data/spec/unit/provider/package/rpm_spec.rb +149 -3
- data/spec/unit/provider/package/yum_spec.rb +6 -5
- data/spec/unit/provider/parsedfile_spec.rb +122 -28
- data/spec/unit/provider/service/freebsd_spec.rb +18 -0
- data/spec/unit/provider/service/init_spec.rb +108 -87
- data/spec/unit/provider/service/launchd_spec.rb +2 -2
- data/spec/unit/provider/service/openwrt_spec.rb +109 -0
- data/spec/unit/provider/service/src_spec.rb +117 -41
- data/spec/unit/provider/service/systemd_spec.rb +125 -17
- data/spec/unit/provider/service/upstart_spec.rb +1 -1
- data/spec/unit/provider/user/aix_spec.rb +42 -0
- data/spec/unit/provider/user/directoryservice_spec.rb +1 -0
- data/spec/unit/provider/user/pw_spec.rb +24 -12
- data/spec/unit/provider/user/user_role_add_spec.rb +1 -1
- data/spec/unit/provider/user/useradd_spec.rb +179 -15
- data/spec/unit/resource/type_spec.rb +3 -3
- data/spec/unit/scheduler/job_spec.rb +79 -0
- data/spec/unit/scheduler/scheduler_spec.rb +129 -0
- data/spec/unit/scheduler/splay_job_spec.rb +35 -0
- data/spec/unit/ssl/base_spec.rb +3 -9
- data/spec/unit/ssl/certificate_authority_spec.rb +1 -0
- data/spec/unit/ssl/certificate_request_spec.rb +3 -1
- data/spec/unit/ssl/certificate_spec.rb +3 -1
- data/spec/unit/ssl/configuration_spec.rb +74 -0
- data/spec/unit/ssl/host_spec.rb +28 -7
- data/spec/unit/ssl/validator_spec.rb +311 -0
- data/spec/unit/transaction/event_manager_spec.rb +49 -0
- data/spec/unit/transaction/event_spec.rb +20 -5
- data/spec/unit/transaction/report_spec.rb +8 -0
- data/spec/unit/type/cron_spec.rb +9 -0
- data/spec/unit/type/exec_spec.rb +11 -0
- data/spec/unit/type/file/content_spec.rb +20 -20
- data/spec/unit/type/file/mode_spec.rb +6 -0
- data/spec/unit/type/file/source_spec.rb +9 -7
- data/spec/unit/type/file_spec.rb +22 -3
- data/spec/unit/type/service_spec.rb +34 -21
- data/spec/unit/type_spec.rb +46 -1
- data/spec/unit/util/backups_spec.rb +2 -2
- data/spec/unit/util/execution_spec.rb +4 -1
- data/spec/unit/util/filetype_spec.rb +6 -0
- data/spec/unit/util/monkey_patches_spec.rb +18 -0
- data/spec/unit/util/network_device/cisco/device_spec.rb +37 -0
- data/spec/unit/util/network_device/config_spec.rb +14 -0
- data/spec/unit/util/network_device_spec.rb +3 -3
- data/spec/unit/util/profiler/logging_spec.rb +81 -0
- data/spec/unit/util/profiler/none_spec.rb +12 -0
- data/spec/unit/util/profiler/object_counts_spec.rb +14 -0
- data/spec/unit/util/profiler/wall_clock_spec.rb +13 -0
- data/spec/unit/util/pson_spec.rb +5 -0
- data/spec/unit/util/ssl_spec.rb +51 -0
- data/spec/unit/util/windows/root_certs_spec.rb +15 -0
- data/spec/unit/util_spec.rb +28 -0
- metadata +2593 -2307
- data/spec/unit/module_tool/applications/application_spec.rb +0 -19
@@ -8,9 +8,7 @@ describe Puppet::ModuleTool::Applications::Searcher do
|
|
8
8
|
describe "when searching" do
|
9
9
|
let(:forge) { mock 'forge' }
|
10
10
|
let(:searcher) do
|
11
|
-
|
12
|
-
described_class.new('search_term', forge)
|
13
|
-
end
|
11
|
+
described_class.new('search_term', forge)
|
14
12
|
end
|
15
13
|
|
16
14
|
it "should return results from a forge query when successful" do
|
@@ -64,23 +64,19 @@ describe Puppet::ModuleTool::Applications::Uninstaller do
|
|
64
64
|
context "when the module is installed" do
|
65
65
|
|
66
66
|
it "should uninstall the module" do
|
67
|
-
|
68
|
-
PuppetSpec::Modules.create('foo', modpath1, :metadata => foo_metadata)
|
67
|
+
PuppetSpec::Modules.create('foo', modpath1, :metadata => foo_metadata)
|
69
68
|
|
70
|
-
|
71
|
-
|
72
|
-
end
|
69
|
+
results = @uninstaller.new("puppetlabs-foo", options).run
|
70
|
+
results[:affected_modules].first.forge_name.should == "puppetlabs/foo"
|
73
71
|
end
|
74
72
|
|
75
73
|
it "should only uninstall the requested module" do
|
76
|
-
|
77
|
-
|
78
|
-
PuppetSpec::Modules.create('bar', modpath1, :metadata => bar_metadata)
|
74
|
+
PuppetSpec::Modules.create('foo', modpath1, :metadata => foo_metadata)
|
75
|
+
PuppetSpec::Modules.create('bar', modpath1, :metadata => bar_metadata)
|
79
76
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
end
|
77
|
+
results = @uninstaller.new("puppetlabs-foo", options).run
|
78
|
+
results[:affected_modules].length == 1
|
79
|
+
results[:affected_modules].first.forge_name.should == "puppetlabs/foo"
|
84
80
|
end
|
85
81
|
|
86
82
|
it "should uninstall fail if a module exists twice in the modpath" do
|
@@ -93,16 +89,14 @@ describe Puppet::ModuleTool::Applications::Uninstaller do
|
|
93
89
|
context "when options[:version] is specified" do
|
94
90
|
|
95
91
|
it "should uninstall the module if the version matches" do
|
96
|
-
|
97
|
-
PuppetSpec::Modules.create('foo', modpath1, :metadata => foo_metadata)
|
92
|
+
PuppetSpec::Modules.create('foo', modpath1, :metadata => foo_metadata)
|
98
93
|
|
99
|
-
|
94
|
+
options[:version] = "1.0.0"
|
100
95
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
end
|
96
|
+
results = @uninstaller.new("puppetlabs-foo", options).run
|
97
|
+
results[:affected_modules].length.should == 1
|
98
|
+
results[:affected_modules].first.forge_name.should == "puppetlabs/foo"
|
99
|
+
results[:affected_modules].first.version.should == "1.0.0"
|
106
100
|
end
|
107
101
|
|
108
102
|
it "should not uninstall the module if the version does not match" do
|
@@ -137,13 +131,11 @@ describe Puppet::ModuleTool::Applications::Uninstaller do
|
|
137
131
|
context "when the module does not have local changes" do
|
138
132
|
|
139
133
|
it "should uninstall the module" do
|
140
|
-
|
141
|
-
PuppetSpec::Modules.create('foo', modpath1, :metadata => foo_metadata)
|
134
|
+
PuppetSpec::Modules.create('foo', modpath1, :metadata => foo_metadata)
|
142
135
|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
end
|
136
|
+
results = @uninstaller.new("puppetlabs-foo", options).run
|
137
|
+
results[:affected_modules].length.should == 1
|
138
|
+
results[:affected_modules].first.forge_name.should == "puppetlabs/foo"
|
147
139
|
end
|
148
140
|
end
|
149
141
|
|
@@ -5,63 +5,30 @@ require 'puppet_spec/modules'
|
|
5
5
|
describe Puppet::ModuleTool::Applications::Unpacker do
|
6
6
|
include PuppetSpec::Files
|
7
7
|
|
8
|
-
let(:target)
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
it "should raise ArgumentError when filename is invalid" do
|
18
|
-
expect { Puppet::ModuleTool::Applications::Unpacker.new("invalid.tar.gz", :target_dir => target) }.to raise_error(ArgumentError)
|
19
|
-
end
|
8
|
+
let(:target) { tmpdir("unpacker") }
|
9
|
+
let(:module_name) { 'myusername-mytarball' }
|
10
|
+
let(:filename) { tmpdir("module") + "/#{module_name}-1.0.0.tar.gz" }
|
11
|
+
let(:working_dir) { tmpdir("working_dir") }
|
12
|
+
let(:unpacker) do
|
13
|
+
Puppet::ModuleTool::Applications::Unpacker.new(filename, :target_dir => target)
|
20
14
|
end
|
21
15
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
let(:build_dir) { Pathname.new(tmpdir("build_dir")) }
|
26
|
-
let(:unpacker) do
|
27
|
-
pending("porting to Windows", :if => Puppet.features.microsoft_windows?) do
|
28
|
-
Puppet::ModuleTool::Applications::Unpacker.new(filename, :target_dir => target)
|
29
|
-
end
|
30
|
-
end
|
16
|
+
before :each do
|
17
|
+
Puppet.settings[:module_working_dir] = working_dir
|
18
|
+
end
|
31
19
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
build_dir.stubs(:mkpath => nil, :rmtree => nil, :children => [])
|
36
|
-
unpacker.stubs(:build_dir).at_least_once.returns(build_dir)
|
37
|
-
FileUtils.stubs(:mv)
|
38
|
-
end
|
20
|
+
it "should raise ArgumentError when filename is invalid" do
|
21
|
+
expect { Puppet::ModuleTool::Applications::Unpacker.new("invalid.tar.gz", :target_dir => target) }.to raise_error(ArgumentError)
|
22
|
+
end
|
39
23
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
end
|
46
|
-
end
|
24
|
+
it "should attempt to untar file to temporary location" do
|
25
|
+
untarrer = mock('untarrer')
|
26
|
+
Puppet::ModuleTool::Tar.expects(:instance).with(module_name).returns(untarrer)
|
27
|
+
untarrer.expects(:unpack).with(filename, regexp_matches(/^#{Regexp.escape(working_dir)}/)) do |src, dest|
|
28
|
+
FileUtils.mkdir(File.join(dest, 'extractedmodule'))
|
47
29
|
end
|
48
30
|
|
49
|
-
|
50
|
-
|
51
|
-
Facter.expects(:value).with("osfamily").returns("Solaris")
|
52
|
-
end
|
53
|
-
|
54
|
-
it "should attempt to untar file to temporary location using gnu tar" do
|
55
|
-
Puppet::Util.stubs(:which).with('gtar').returns('/usr/sfw/bin/gtar')
|
56
|
-
Puppet::Util::Execution.expects(:execute).with("gtar xzf #{filename} -C #{build_dir}").returns(true)
|
57
|
-
unpacker.run
|
58
|
-
end
|
59
|
-
|
60
|
-
it "should throw exception if gtar is not in the path exists" do
|
61
|
-
Puppet::Util.stubs(:which).with('gtar').returns(nil)
|
62
|
-
expect { unpacker.run }.to raise_error RuntimeError, "Cannot find the command 'gtar'. Make sure GNU tar is installed, and is in your PATH."
|
63
|
-
end
|
64
|
-
end
|
31
|
+
unpacker.run
|
32
|
+
File.should be_directory(File.join(target, 'mytarball'))
|
65
33
|
end
|
66
|
-
|
67
34
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'puppet/module_tool'
|
3
|
+
|
4
|
+
describe Puppet::ModuleTool::Tar::Gnu do
|
5
|
+
let(:sourcefile) { '/the/module.tar.gz' }
|
6
|
+
let(:destdir) { '/the/dest/dir' }
|
7
|
+
let(:sourcedir) { '/the/src/dir' }
|
8
|
+
let(:destfile) { '/the/dest/file.tar.gz' }
|
9
|
+
|
10
|
+
it "unpacks a tar file" do
|
11
|
+
Puppet::Util::Execution.expects(:execute).with("tar xzf #{sourcefile} -C #{destdir}")
|
12
|
+
subject.unpack(sourcefile, destdir)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "packs a tar file" do
|
16
|
+
Puppet::Util::Execution.expects(:execute).with("tar cf - #{sourcedir} | gzip -c > #{destfile}")
|
17
|
+
subject.pack(sourcedir, destfile)
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'puppet/module_tool'
|
3
|
+
|
4
|
+
describe Puppet::ModuleTool::Tar::Mini, :if => (Puppet.features.minitar? and Puppet.features.zlib?) do
|
5
|
+
let(:sourcefile) { '/the/module.tar.gz' }
|
6
|
+
let(:destdir) { File.expand_path '/the/dest/dir' }
|
7
|
+
let(:sourcedir) { '/the/src/dir' }
|
8
|
+
let(:destfile) { '/the/dest/file.tar.gz' }
|
9
|
+
let(:minitar) { described_class.new('nginx') }
|
10
|
+
|
11
|
+
it "unpacks a tar file" do
|
12
|
+
unpacks_the_entry(:file_start, 'thefile')
|
13
|
+
|
14
|
+
minitar.unpack(sourcefile, destdir)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "does not allow an absolute path" do
|
18
|
+
unpacks_the_entry(:file_start, '/thefile')
|
19
|
+
|
20
|
+
expect {
|
21
|
+
minitar.unpack(sourcefile, destdir)
|
22
|
+
}.to raise_error(Puppet::ModuleTool::Errors::InvalidPathInPackageError,
|
23
|
+
"Attempt to install file into \"/thefile\" under \"#{destdir}\"")
|
24
|
+
end
|
25
|
+
|
26
|
+
it "does not allow a file to be written outside the destination directory" do
|
27
|
+
unpacks_the_entry(:file_start, '../../thefile')
|
28
|
+
|
29
|
+
expect {
|
30
|
+
minitar.unpack(sourcefile, destdir)
|
31
|
+
}.to raise_error(Puppet::ModuleTool::Errors::InvalidPathInPackageError,
|
32
|
+
"Attempt to install file into \"#{File.expand_path('/the/thefile')}\" under \"#{destdir}\"")
|
33
|
+
end
|
34
|
+
|
35
|
+
it "does not allow a directory to be written outside the destination directory" do
|
36
|
+
unpacks_the_entry(:dir, '../../thedir')
|
37
|
+
|
38
|
+
expect {
|
39
|
+
minitar.unpack(sourcefile, destdir)
|
40
|
+
}.to raise_error(Puppet::ModuleTool::Errors::InvalidPathInPackageError,
|
41
|
+
"Attempt to install file into \"#{File.expand_path('/the/thedir')}\" under \"#{destdir}\"")
|
42
|
+
end
|
43
|
+
|
44
|
+
it "packs a tar file" do
|
45
|
+
writer = mock('GzipWriter')
|
46
|
+
|
47
|
+
Zlib::GzipWriter.expects(:open).with(destfile).yields(writer)
|
48
|
+
Archive::Tar::Minitar.expects(:pack).with(sourcedir, writer)
|
49
|
+
|
50
|
+
minitar.pack(sourcedir, destfile)
|
51
|
+
end
|
52
|
+
|
53
|
+
def unpacks_the_entry(type, name)
|
54
|
+
reader = mock('GzipReader')
|
55
|
+
|
56
|
+
Zlib::GzipReader.expects(:open).with(sourcefile).yields(reader)
|
57
|
+
Archive::Tar::Minitar.expects(:unpack).with(reader, destdir).yields(type, name, nil)
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'puppet/module_tool'
|
3
|
+
|
4
|
+
describe Puppet::ModuleTool::Tar::Solaris do
|
5
|
+
let(:sourcefile) { '/the/module.tar.gz' }
|
6
|
+
let(:destdir) { '/the/dest/dir' }
|
7
|
+
let(:sourcedir) { '/the/src/dir' }
|
8
|
+
let(:destfile) { '/the/dest/file.tar.gz' }
|
9
|
+
|
10
|
+
it "unpacks a tar file" do
|
11
|
+
Puppet::Util::Execution.expects(:execute).with("gtar xzf #{sourcefile} -C #{destdir}")
|
12
|
+
subject.unpack(sourcefile, destdir)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "packs a tar file" do
|
16
|
+
Puppet::Util::Execution.expects(:execute).with("tar cf - #{sourcedir} | gzip -c > #{destfile}")
|
17
|
+
subject.pack(sourcedir, destfile)
|
18
|
+
end
|
19
|
+
end
|
@@ -199,9 +199,14 @@ describe Puppet::Network::HTTP::Connection do
|
|
199
199
|
|
200
200
|
def a_store_context(args)
|
201
201
|
Puppet[:confdir] = tmpdir('conf')
|
202
|
-
cert = Puppet::SSL::CertificateAuthority.new.generate(args[:for_server], :dns_alt_names => args[:for_aliases]).content
|
203
202
|
ssl_context = mock('OpenSSL::X509::StoreContext')
|
204
|
-
|
203
|
+
if args[:verify_raises]
|
204
|
+
ssl_context.stubs(:current_cert).raises("oh noes")
|
205
|
+
else
|
206
|
+
cert = Puppet::SSL::CertificateAuthority.new.generate(args[:for_server], :dns_alt_names => args[:for_aliases]).content
|
207
|
+
ssl_context.stubs(:current_cert).returns(cert)
|
208
|
+
end
|
209
|
+
ssl_context.stubs(:chain).returns([])
|
205
210
|
ssl_context.stubs(:error_string).returns(args[:with_error_string])
|
206
211
|
ssl_context
|
207
212
|
end
|
@@ -217,6 +222,16 @@ describe Puppet::Network::HTTP::Connection do
|
|
217
222
|
end.to raise_error(Puppet::Error, "certificate verify failed: [shady looking signature for /CN=not_my_server]")
|
218
223
|
end
|
219
224
|
|
225
|
+
it "should provide a useful error message when verify_callback raises", :unless => Puppet.features.microsoft_windows? do
|
226
|
+
subject.stubs(:create_connection).
|
227
|
+
returns(a_connection_that_verifies(:has_passed_pre_checks => false,
|
228
|
+
:in_context => a_store_context(:verify_raises => true),
|
229
|
+
:fails_with => 'certificate verify failed'))
|
230
|
+
expect do
|
231
|
+
subject.request(:get, stub('request'))
|
232
|
+
end.to raise_error(Puppet::Error, "certificate verify failed: [oh noes]")
|
233
|
+
end
|
234
|
+
|
220
235
|
it "should provide a helpful error message when hostname was not match with server certificate", :unless => Puppet.features.microsoft_windows? do
|
221
236
|
subject.stubs(:create_connection).
|
222
237
|
returns(a_connection_that_verifies(:has_passed_pre_checks => true,
|
@@ -1,17 +1,12 @@
|
|
1
1
|
#! /usr/bin/env ruby
|
2
2
|
require 'spec_helper'
|
3
|
+
require 'puppet/network/http'
|
3
4
|
require 'puppet/network/http/handler'
|
4
5
|
require 'puppet/network/authorization'
|
5
6
|
require 'puppet/network/authentication'
|
6
7
|
|
7
|
-
class HttpHandled
|
8
|
-
include Puppet::Network::HTTP::Handler
|
9
|
-
end
|
10
|
-
|
11
8
|
describe Puppet::Network::HTTP::Handler do
|
12
|
-
|
13
|
-
@handler = HttpHandled.new
|
14
|
-
end
|
9
|
+
let(:handler) { TestingHandler.new }
|
15
10
|
|
16
11
|
it "should include the v1 REST API" do
|
17
12
|
Puppet::Network::HTTP::Handler.ancestors.should be_include(Puppet::Network::HTTP::API::V1)
|
@@ -21,126 +16,134 @@ describe Puppet::Network::HTTP::Handler do
|
|
21
16
|
Puppet::Network::HTTP::Handler.ancestors.should be_include(Puppet::Network::Authorization)
|
22
17
|
end
|
23
18
|
|
24
|
-
it "should have a method for initializing" do
|
25
|
-
@handler.should respond_to(:initialize_for_puppet)
|
26
|
-
end
|
27
|
-
|
28
19
|
describe "when initializing" do
|
29
20
|
it "should fail when no server type has been provided" do
|
30
|
-
lambda {
|
21
|
+
lambda { handler.initialize_for_puppet }.should raise_error(ArgumentError)
|
31
22
|
end
|
32
23
|
|
33
24
|
it "should set server type" do
|
34
|
-
|
35
|
-
|
25
|
+
handler.initialize_for_puppet("foo")
|
26
|
+
handler.server.should == "foo"
|
36
27
|
end
|
37
28
|
end
|
38
29
|
|
39
|
-
it "should be able to process requests" do
|
40
|
-
@handler.should respond_to(:process)
|
41
|
-
end
|
42
|
-
|
43
30
|
describe "when processing a request" do
|
31
|
+
let(:request) do
|
32
|
+
{
|
33
|
+
:accept_header => "format_one,format_two",
|
34
|
+
:content_type_header => "text/yaml",
|
35
|
+
:http_method => "GET",
|
36
|
+
:path => "/my_handler/my_result",
|
37
|
+
:params => {},
|
38
|
+
:client_cert => nil
|
39
|
+
}
|
40
|
+
end
|
41
|
+
|
42
|
+
let(:response) { mock('http response') }
|
43
|
+
|
44
44
|
before do
|
45
|
-
@request = stub('http request')
|
46
|
-
@request.stubs(:[]).returns "foo"
|
47
|
-
@response = stub('http response')
|
48
45
|
@model_class = stub('indirected model class')
|
49
46
|
@indirection = stub('indirection')
|
50
47
|
@model_class.stubs(:indirection).returns(@indirection)
|
51
48
|
|
52
49
|
@result = stub 'result', :render => "mytext"
|
53
50
|
|
54
|
-
|
55
|
-
|
51
|
+
request[:headers] = {
|
52
|
+
"Content-Type" => request[:content_type_header],
|
53
|
+
"Accept" => request[:accept_header]
|
54
|
+
}
|
56
55
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
# Stub out the interface we require our including classes to
|
61
|
-
# implement.
|
62
|
-
def stub_server_interface
|
63
|
-
@handler.stubs(:accept_header ).returns "format_one,format_two"
|
64
|
-
@handler.stubs(:content_type_header).returns "text/yaml"
|
65
|
-
@handler.stubs(:set_content_type ).returns "my_result"
|
66
|
-
@handler.stubs(:set_response ).returns "my_result"
|
67
|
-
@handler.stubs(:path ).returns "/my_handler/my_result"
|
68
|
-
@handler.stubs(:http_method ).returns("GET")
|
69
|
-
@handler.stubs(:params ).returns({})
|
70
|
-
@handler.stubs(:content_type ).returns("text/plain")
|
71
|
-
@handler.stubs(:client_cert ).returns(nil)
|
56
|
+
handler.stubs(:check_authorization)
|
57
|
+
handler.stubs(:warn_if_near_expiration)
|
58
|
+
handler.stubs(:headers).returns(request[:headers])
|
72
59
|
end
|
73
60
|
|
74
61
|
it "should check the client certificate for upcoming expiration" do
|
75
62
|
cert = mock 'cert'
|
76
|
-
|
77
|
-
|
78
|
-
|
63
|
+
handler.stubs(:uri2indirection).returns(["facts", :mymethod, "key", {:node => "name"}])
|
64
|
+
handler.expects(:client_cert).returns(cert).with(request)
|
65
|
+
handler.expects(:warn_if_near_expiration).with(cert)
|
66
|
+
|
67
|
+
handler.process(request, response)
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should setup a profiler when the puppet-profiling header exists" do
|
71
|
+
request[:headers][Puppet::Network::HTTP::HEADER_ENABLE_PROFILING.downcase] = "true"
|
72
|
+
|
73
|
+
handler.process(request, response)
|
74
|
+
|
75
|
+
Puppet::Util::Profiler.current.should be_kind_of(Puppet::Util::Profiler::WallClock)
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should not setup profiler when the profile parameter is missing" do
|
79
|
+
request[:params] = { }
|
80
|
+
|
81
|
+
handler.process(request, response)
|
79
82
|
|
80
|
-
|
83
|
+
Puppet::Util::Profiler.current.should == Puppet::Util::Profiler::NONE
|
81
84
|
end
|
82
85
|
|
83
86
|
it "should create an indirection request from the path, parameters, and http method" do
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
+
request[:path] = "mypath"
|
88
|
+
request[:http_method] = "mymethod"
|
89
|
+
request[:params] = { :params => "mine" }
|
87
90
|
|
88
|
-
|
91
|
+
handler.expects(:uri2indirection).with("mymethod", "mypath", { :params => "mine" }).returns stub("request", :method => :find)
|
89
92
|
|
90
|
-
|
93
|
+
handler.stubs(:do_find)
|
91
94
|
|
92
|
-
|
95
|
+
handler.process(request, response)
|
93
96
|
end
|
94
97
|
|
95
98
|
it "should call the 'do' method and delegate authorization to the authorization layer" do
|
96
|
-
|
99
|
+
handler.expects(:uri2indirection).returns(["facts", :mymethod, "key", {:node => "name"}])
|
97
100
|
|
98
|
-
|
101
|
+
handler.expects(:do_mymethod).with("facts", "key", {:node => "name"}, request, response)
|
99
102
|
|
100
|
-
|
103
|
+
handler.expects(:check_authorization).with("facts", :mymethod, "key", {:node => "name"})
|
101
104
|
|
102
|
-
|
105
|
+
handler.process(request, response)
|
103
106
|
end
|
104
107
|
|
105
108
|
it "should return 403 if the request is not authorized" do
|
106
|
-
|
109
|
+
handler.expects(:uri2indirection).returns(["facts", :mymethod, "key", {:node => "name"}])
|
107
110
|
|
108
|
-
|
111
|
+
handler.expects(:do_mymethod).never
|
109
112
|
|
110
|
-
|
113
|
+
handler.expects(:check_authorization).with("facts", :mymethod, "key", {:node => "name"}).raises(Puppet::Network::AuthorizationError.new("forbidden"))
|
111
114
|
|
112
|
-
|
115
|
+
handler.expects(:set_response).with(anything, anything, 403)
|
113
116
|
|
114
|
-
|
117
|
+
handler.process(request, response)
|
115
118
|
end
|
116
119
|
|
117
120
|
it "should serialize a controller exception when an exception is thrown while finding the model instance" do
|
118
|
-
|
121
|
+
handler.expects(:uri2indirection).returns(["facts", :find, "key", {:node => "name"}])
|
119
122
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
+
handler.expects(:do_find).raises(ArgumentError, "The exception")
|
124
|
+
handler.expects(:set_response).with(anything, "The exception", 400)
|
125
|
+
handler.process(request, response)
|
123
126
|
end
|
124
127
|
|
125
128
|
it "should set the format to text/plain when serializing an exception" do
|
126
|
-
|
127
|
-
|
129
|
+
handler.expects(:set_content_type).with(response, "text/plain")
|
130
|
+
handler.do_exception(response, "A test", 404)
|
128
131
|
end
|
129
132
|
|
130
133
|
it "should raise an error if the request is formatted in an unknown format" do
|
131
|
-
|
132
|
-
lambda {
|
134
|
+
handler.stubs(:content_type_header).returns "unknown format"
|
135
|
+
lambda { handler.request_format(request) }.should raise_error
|
133
136
|
end
|
134
137
|
|
135
138
|
it "should still find the correct format if content type contains charset information" do
|
136
|
-
|
137
|
-
|
139
|
+
handler.stubs(:content_type_header).returns "text/plain; charset=UTF-8"
|
140
|
+
handler.request_format(request).should == "s"
|
138
141
|
end
|
139
142
|
|
140
143
|
it "should deserialize YAML parameters" do
|
141
144
|
params = {'my_param' => [1,2,3].to_yaml}
|
142
145
|
|
143
|
-
decoded_params =
|
146
|
+
decoded_params = handler.send(:decode_params, params)
|
144
147
|
|
145
148
|
decoded_params.should == {:my_param => [1,2,3]}
|
146
149
|
end
|
@@ -148,7 +151,7 @@ describe Puppet::Network::HTTP::Handler do
|
|
148
151
|
it "should accept YAML parameters with !ruby/hash tags on Ruby 1.8", :if => RUBY_VERSION =~ /^1\.8/ do
|
149
152
|
params = {'my_param' => "--- !ruby/hash:Array {}"}
|
150
153
|
|
151
|
-
decoded_params =
|
154
|
+
decoded_params = handler.send(:decode_params, params)
|
152
155
|
|
153
156
|
decoded_params[:my_param].should be_an(Array)
|
154
157
|
end
|
@@ -159,7 +162,7 @@ describe Puppet::Network::HTTP::Handler do
|
|
159
162
|
it "should fail if YAML parameters have !ruby/hash tags on Ruby 1.9", :unless => RUBY_VERSION =~ /^1\.8/ do
|
160
163
|
params = {'my_param' => "--- !ruby/hash:Array {}"}
|
161
164
|
|
162
|
-
expect {
|
165
|
+
expect { handler.send(:decode_params, params) }.to raise_error(ArgumentError, /Illegal YAML mapping found/)
|
163
166
|
end
|
164
167
|
|
165
168
|
describe "when finding a model instance" do
|
@@ -175,84 +178,81 @@ describe Puppet::Network::HTTP::Handler do
|
|
175
178
|
end
|
176
179
|
|
177
180
|
it "should use the indirection request to find the model class" do
|
178
|
-
|
181
|
+
handler.do_find("my_handler", "my_result", {}, request, response)
|
179
182
|
end
|
180
183
|
|
181
184
|
it "should use the escaped request key" do
|
182
|
-
@indirection.expects(:find).with
|
183
|
-
|
184
|
-
end.returns @result
|
185
|
-
@handler.do_find("my_handler", "my_result", {}, @request, @response)
|
185
|
+
@indirection.expects(:find).with("my_result", anything).returns @result
|
186
|
+
handler.do_find("my_handler", "my_result", {}, request, response)
|
186
187
|
end
|
187
188
|
|
188
189
|
it "should use a common method for determining the request parameters" do
|
189
|
-
@indirection.expects(:find).with
|
190
|
-
|
191
|
-
|
192
|
-
@handler.do_find("my_handler", "my_result", {:foo => :baz, :bar => :xyzzy}, @request, @response)
|
190
|
+
@indirection.expects(:find).with(anything, has_entries(:foo => :baz, :bar => :xyzzy)).returns @result
|
191
|
+
|
192
|
+
handler.do_find("my_handler", "my_result", {:foo => :baz, :bar => :xyzzy}, request, response)
|
193
193
|
end
|
194
194
|
|
195
195
|
it "should set the content type to the first format specified in the accept header" do
|
196
|
-
|
197
|
-
|
198
|
-
|
196
|
+
handler.expects(:accept_header).with(request).returns "one,two"
|
197
|
+
handler.expects(:set_content_type).with(response, @oneformat)
|
198
|
+
handler.do_find("my_handler", "my_result", {}, request, response)
|
199
199
|
end
|
200
200
|
|
201
201
|
it "should fail if no accept header is provided" do
|
202
|
-
|
203
|
-
lambda {
|
202
|
+
handler.expects(:accept_header).with(request).returns nil
|
203
|
+
lambda { handler.do_find("my_handler", "my_result", {}, request, response) }.should raise_error(ArgumentError)
|
204
204
|
end
|
205
205
|
|
206
206
|
it "should fail if the accept header does not contain a valid format" do
|
207
|
-
|
208
|
-
lambda {
|
207
|
+
handler.expects(:accept_header).with(request).returns ""
|
208
|
+
lambda { handler.do_find("my_handler", "my_result", {}, request, response) }.should raise_error(RuntimeError)
|
209
209
|
end
|
210
210
|
|
211
211
|
it "should not use an unsuitable format" do
|
212
|
-
|
212
|
+
handler.expects(:accept_header).with(request).returns "foo,bar"
|
213
213
|
foo = mock 'foo', :suitable? => false
|
214
214
|
bar = mock 'bar', :suitable? => true
|
215
215
|
Puppet::Network::FormatHandler.expects(:format).with("foo").returns foo
|
216
216
|
Puppet::Network::FormatHandler.expects(:format).with("bar").returns bar
|
217
217
|
|
218
|
-
|
218
|
+
handler.expects(:set_content_type).with(response, bar) # the suitable one
|
219
219
|
|
220
|
-
|
220
|
+
handler.do_find("my_handler", "my_result", {}, request, response)
|
221
221
|
end
|
222
222
|
|
223
223
|
it "should render the result using the first format specified in the accept header" do
|
224
224
|
|
225
|
-
|
225
|
+
handler.expects(:accept_header).with(request).returns "one,two"
|
226
226
|
@result.expects(:render).with(@oneformat)
|
227
227
|
|
228
|
-
|
228
|
+
handler.do_find("my_handler", "my_result", {}, request, response)
|
229
229
|
end
|
230
230
|
|
231
231
|
it "should pass the result through without rendering it if the result is a string" do
|
232
232
|
@indirection.stubs(:find).returns "foo"
|
233
|
-
|
234
|
-
|
233
|
+
handler.expects(:set_response).with(response, "foo")
|
234
|
+
handler.do_find("my_handler", "my_result", {}, request, response)
|
235
235
|
end
|
236
236
|
|
237
237
|
it "should use the default status when a model find call succeeds" do
|
238
|
-
|
239
|
-
|
238
|
+
handler.expects(:set_response).with(anything, anything, nil)
|
239
|
+
handler.do_find("my_handler", "my_result", {}, request, response)
|
240
240
|
end
|
241
241
|
|
242
242
|
it "should return a serialized object when a model find call succeeds" do
|
243
243
|
@model_instance = stub('model instance')
|
244
244
|
@model_instance.expects(:render).returns "my_rendered_object"
|
245
245
|
|
246
|
-
|
246
|
+
handler.expects(:set_response).with(anything, "my_rendered_object", anything)
|
247
247
|
@indirection.stubs(:find).returns(@model_instance)
|
248
|
-
|
248
|
+
handler.do_find("my_handler", "my_result", {}, request, response)
|
249
249
|
end
|
250
250
|
|
251
251
|
it "should return a 404 when no model instance can be found" do
|
252
252
|
@model_class.stubs(:name).returns "my name"
|
253
|
-
|
253
|
+
handler.expects(:set_response).with(anything, anything, 404)
|
254
254
|
@indirection.stubs(:find).returns(nil)
|
255
|
-
|
255
|
+
handler.do_find("my_handler", "my_result", {}, request, response)
|
256
256
|
end
|
257
257
|
|
258
258
|
it "should write a log message when no model instance can be found" do
|
@@ -261,46 +261,44 @@ describe Puppet::Network::HTTP::Handler do
|
|
261
261
|
|
262
262
|
Puppet.expects(:info).with("Could not find my_handler for 'my_result'")
|
263
263
|
|
264
|
-
|
264
|
+
handler.do_find("my_handler", "my_result", {}, request, response)
|
265
265
|
end
|
266
266
|
|
267
267
|
|
268
268
|
it "should serialize the result in with the appropriate format" do
|
269
269
|
@model_instance = stub('model instance')
|
270
270
|
|
271
|
-
|
271
|
+
handler.expects(:format_to_use).returns(@oneformat)
|
272
272
|
@model_instance.expects(:render).with(@oneformat).returns "my_rendered_object"
|
273
273
|
@indirection.stubs(:find).returns(@model_instance)
|
274
|
-
|
274
|
+
handler.do_find("my_handler", "my_result", {}, request, response)
|
275
275
|
end
|
276
276
|
end
|
277
277
|
|
278
278
|
describe "when performing head operation" do
|
279
279
|
before do
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
280
|
+
handler.stubs(:model).with("my_handler").returns(stub 'model', :indirection => @model_class)
|
281
|
+
request[:http_method] = "HEAD"
|
282
|
+
request[:path] = "/production/my_handler/my_result"
|
283
|
+
request[:params] = {}
|
284
284
|
|
285
285
|
@model_class.stubs(:head).returns true
|
286
286
|
end
|
287
287
|
|
288
288
|
it "should use the escaped request key" do
|
289
|
-
@model_class.expects(:head).with
|
290
|
-
|
291
|
-
end.returns true
|
292
|
-
@handler.process(@request, @response)
|
289
|
+
@model_class.expects(:head).with("my_result", anything).returns true
|
290
|
+
handler.process(request, response)
|
293
291
|
end
|
294
292
|
|
295
293
|
it "should not generate a response when a model head call succeeds" do
|
296
|
-
|
297
|
-
|
294
|
+
handler.expects(:set_response).never
|
295
|
+
handler.process(request, response)
|
298
296
|
end
|
299
297
|
|
300
298
|
it "should return a 404 when the model head call returns false" do
|
301
|
-
|
299
|
+
handler.expects(:set_response).with(anything, anything, 404)
|
302
300
|
@model_class.stubs(:head).returns(false)
|
303
|
-
|
301
|
+
handler.process(request, response)
|
304
302
|
end
|
305
303
|
end
|
306
304
|
|
@@ -308,10 +306,10 @@ describe Puppet::Network::HTTP::Handler do
|
|
308
306
|
before do
|
309
307
|
Puppet::Indirector::Indirection.expects(:instance).with(:my_handler).returns( stub "indirection", :model => @model_class )
|
310
308
|
|
311
|
-
|
312
|
-
|
309
|
+
result1 = mock 'result1'
|
310
|
+
result2 = mock 'results'
|
313
311
|
|
314
|
-
@result = [
|
312
|
+
@result = [result1, result2]
|
315
313
|
@model_class.stubs(:render_multiple).returns "my rendered instances"
|
316
314
|
@indirection.stubs(:search).returns(@result)
|
317
315
|
|
@@ -323,54 +321,52 @@ describe Puppet::Network::HTTP::Handler do
|
|
323
321
|
end
|
324
322
|
|
325
323
|
it "should use the indirection request to find the model" do
|
326
|
-
|
324
|
+
handler.do_search("my_handler", "my_result", {}, request, response)
|
327
325
|
end
|
328
326
|
|
329
327
|
it "should use a common method for determining the request parameters" do
|
330
|
-
@indirection.expects(:search).with
|
331
|
-
|
332
|
-
end.returns @result
|
333
|
-
@handler.do_search("my_handler", "my_result", {:foo => :baz, :bar => :xyzzy}, @request, @response)
|
328
|
+
@indirection.expects(:search).with(anything, has_entries(:foo => :baz, :bar => :xyzzy)).returns @result
|
329
|
+
handler.do_search("my_handler", "my_result", {:foo => :baz, :bar => :xyzzy}, request, response)
|
334
330
|
end
|
335
331
|
|
336
332
|
it "should use the default status when a model search call succeeds" do
|
337
333
|
@indirection.stubs(:search).returns(@result)
|
338
|
-
|
334
|
+
handler.do_search("my_handler", "my_result", {}, request, response)
|
339
335
|
end
|
340
336
|
|
341
337
|
it "should set the content type to the first format returned by the accept header" do
|
342
|
-
|
343
|
-
|
338
|
+
handler.expects(:accept_header).with(request).returns "one,two"
|
339
|
+
handler.expects(:set_content_type).with(response, @oneformat)
|
344
340
|
|
345
|
-
|
341
|
+
handler.do_search("my_handler", "my_result", {}, request, response)
|
346
342
|
end
|
347
343
|
|
348
344
|
it "should return a list of serialized objects when a model search call succeeds" do
|
349
|
-
|
345
|
+
handler.expects(:accept_header).with(request).returns "one,two"
|
350
346
|
|
351
347
|
@indirection.stubs(:search).returns(@result)
|
352
348
|
|
353
349
|
@model_class.expects(:render_multiple).with(@oneformat, @result).returns "my rendered instances"
|
354
350
|
|
355
|
-
|
356
|
-
|
351
|
+
handler.expects(:set_response).with(anything, "my rendered instances")
|
352
|
+
handler.do_search("my_handler", "my_result", {}, request, response)
|
357
353
|
end
|
358
354
|
|
359
355
|
it "should return [] when searching returns an empty array" do
|
360
|
-
|
356
|
+
handler.expects(:accept_header).with(request).returns "one,two"
|
361
357
|
@indirection.stubs(:search).returns([])
|
362
358
|
@model_class.expects(:render_multiple).with(@oneformat, []).returns "[]"
|
363
359
|
|
364
360
|
|
365
|
-
|
366
|
-
|
361
|
+
handler.expects(:set_response).with(anything, "[]")
|
362
|
+
handler.do_search("my_handler", "my_result", {}, request, response)
|
367
363
|
end
|
368
364
|
|
369
365
|
it "should return a 404 when searching returns nil" do
|
370
366
|
@model_class.stubs(:name).returns "my name"
|
371
|
-
|
367
|
+
handler.expects(:set_response).with(anything, anything, 404)
|
372
368
|
@indirection.stubs(:search).returns(nil)
|
373
|
-
|
369
|
+
handler.do_search("my_handler", "my_result", {}, request, response)
|
374
370
|
end
|
375
371
|
end
|
376
372
|
|
@@ -383,43 +379,39 @@ describe Puppet::Network::HTTP::Handler do
|
|
383
379
|
end
|
384
380
|
|
385
381
|
it "should use the indirection request to find the model" do
|
386
|
-
|
382
|
+
handler.do_destroy("my_handler", "my_result", {}, request, response)
|
387
383
|
end
|
388
384
|
|
389
385
|
it "should use the escaped request key to destroy the instance in the model" do
|
390
|
-
@indirection.expects(:destroy).with
|
391
|
-
|
392
|
-
end
|
393
|
-
@handler.do_destroy("my_handler", "foo bar", {}, @request, @response)
|
386
|
+
@indirection.expects(:destroy).with("foo bar", anything)
|
387
|
+
handler.do_destroy("my_handler", "foo bar", {}, request, response)
|
394
388
|
end
|
395
389
|
|
396
390
|
it "should use a common method for determining the request parameters" do
|
397
|
-
@indirection.expects(:destroy).with
|
398
|
-
|
399
|
-
end
|
400
|
-
@handler.do_destroy("my_handler", "my_result", {:foo => :baz, :bar => :xyzzy}, @request, @response)
|
391
|
+
@indirection.expects(:destroy).with(anything, has_entries(:foo => :baz, :bar => :xyzzy))
|
392
|
+
handler.do_destroy("my_handler", "my_result", {:foo => :baz, :bar => :xyzzy}, request, response)
|
401
393
|
end
|
402
394
|
|
403
395
|
it "should use the default status code a model destroy call succeeds" do
|
404
|
-
|
405
|
-
|
396
|
+
handler.expects(:set_response).with(anything, anything, nil)
|
397
|
+
handler.do_destroy("my_handler", "my_result", {}, request, response)
|
406
398
|
end
|
407
399
|
|
408
400
|
it "should return a yaml-encoded result when a model destroy call succeeds" do
|
409
401
|
@result = stub 'result', :to_yaml => "the result"
|
410
402
|
@indirection.expects(:destroy).returns(@result)
|
411
403
|
|
412
|
-
|
404
|
+
handler.expects(:set_response).with(anything, "the result", anything)
|
413
405
|
|
414
|
-
|
406
|
+
handler.do_destroy("my_handler", "my_result", {}, request, response)
|
415
407
|
end
|
416
408
|
end
|
417
409
|
|
418
410
|
describe "when saving a model instance" do
|
419
411
|
before do
|
420
412
|
Puppet::Indirector::Indirection.stubs(:instance).with(:my_handler).returns( stub "indirection", :model => @model_class )
|
421
|
-
|
422
|
-
|
413
|
+
handler.stubs(:body).returns('my stuff')
|
414
|
+
handler.stubs(:content_type_header).returns("text/yaml")
|
423
415
|
|
424
416
|
@result = stub 'result', :render => "the result"
|
425
417
|
|
@@ -434,50 +426,50 @@ describe Puppet::Network::HTTP::Handler do
|
|
434
426
|
end
|
435
427
|
|
436
428
|
it "should use the indirection request to find the model" do
|
437
|
-
|
429
|
+
handler.do_save("my_handler", "my_result", {}, request, response)
|
438
430
|
end
|
439
431
|
|
440
432
|
it "should use the 'body' hook to retrieve the body of the request" do
|
441
|
-
|
442
|
-
@model_class.expects(:convert_from).with
|
433
|
+
handler.expects(:body).returns "my body"
|
434
|
+
@model_class.expects(:convert_from).with(anything, "my body").returns @model_instance
|
443
435
|
|
444
|
-
|
436
|
+
handler.do_save("my_handler", "my_result", {}, request, response)
|
445
437
|
end
|
446
438
|
|
447
439
|
it "should fail to save model if data is not specified" do
|
448
|
-
|
440
|
+
handler.stubs(:body).returns('')
|
449
441
|
|
450
|
-
lambda {
|
442
|
+
lambda { handler.do_save("my_handler", "my_result", {}, request, response) }.should raise_error(ArgumentError)
|
451
443
|
end
|
452
444
|
|
453
445
|
it "should use a common method for determining the request parameters" do
|
454
446
|
@indirection.expects(:save).with(@model_instance, 'key').once
|
455
|
-
|
447
|
+
handler.do_save("my_handler", "key", {}, request, response)
|
456
448
|
end
|
457
449
|
|
458
450
|
it "should use the default status when a model save call succeeds" do
|
459
|
-
|
460
|
-
|
451
|
+
handler.expects(:set_response).with(anything, anything, nil)
|
452
|
+
handler.do_save("my_handler", "my_result", {}, request, response)
|
461
453
|
end
|
462
454
|
|
463
455
|
it "should return the yaml-serialized result when a model save call succeeds" do
|
464
456
|
@indirection.stubs(:save).returns(@model_instance)
|
465
457
|
@model_instance.expects(:to_yaml).returns('foo')
|
466
|
-
|
458
|
+
handler.do_save("my_handler", "my_result", {}, request, response)
|
467
459
|
end
|
468
460
|
|
469
461
|
it "should set the content to yaml" do
|
470
|
-
|
471
|
-
|
462
|
+
handler.expects(:set_content_type).with(response, @yamlformat)
|
463
|
+
handler.do_save("my_handler", "my_result", {}, request, response)
|
472
464
|
end
|
473
465
|
|
474
466
|
it "should use the content-type header to know the body format" do
|
475
|
-
|
467
|
+
handler.expects(:content_type_header).returns("text/format")
|
476
468
|
Puppet::Network::FormatHandler.stubs(:mime).with("text/format").returns @format
|
477
469
|
|
478
|
-
@model_class.expects(:convert_from).with
|
470
|
+
@model_class.expects(:convert_from).with("format", anything).returns @model_instance
|
479
471
|
|
480
|
-
|
472
|
+
handler.do_save("my_handler", "my_result", {}, request, response)
|
481
473
|
end
|
482
474
|
end
|
483
475
|
end
|
@@ -486,19 +478,55 @@ describe Puppet::Network::HTTP::Handler do
|
|
486
478
|
it "should use a look-up from the ip address" do
|
487
479
|
Resolv.expects(:getname).with("1.2.3.4").returns("host.domain.com")
|
488
480
|
|
489
|
-
|
481
|
+
handler.resolve_node(:ip => "1.2.3.4")
|
490
482
|
end
|
491
483
|
|
492
484
|
it "should return the look-up result" do
|
493
485
|
Resolv.stubs(:getname).with("1.2.3.4").returns("host.domain.com")
|
494
486
|
|
495
|
-
|
487
|
+
handler.resolve_node(:ip => "1.2.3.4").should == "host.domain.com"
|
496
488
|
end
|
497
489
|
|
498
490
|
it "should return the ip address if resolving fails" do
|
499
491
|
Resolv.stubs(:getname).with("1.2.3.4").raises(RuntimeError, "no such host")
|
500
492
|
|
501
|
-
|
493
|
+
handler.resolve_node(:ip => "1.2.3.4").should == "1.2.3.4"
|
494
|
+
end
|
495
|
+
end
|
496
|
+
|
497
|
+
class TestingHandler
|
498
|
+
include Puppet::Network::HTTP::Handler
|
499
|
+
|
500
|
+
def accept_header(request)
|
501
|
+
request[:accept_header]
|
502
|
+
end
|
503
|
+
|
504
|
+
def content_type_header(request)
|
505
|
+
request[:content_type_header]
|
506
|
+
end
|
507
|
+
|
508
|
+
def set_content_type(response, format)
|
509
|
+
"my_result"
|
510
|
+
end
|
511
|
+
|
512
|
+
def set_response(response, body, status = 200)
|
513
|
+
"my_result"
|
514
|
+
end
|
515
|
+
|
516
|
+
def http_method(request)
|
517
|
+
request[:http_method]
|
518
|
+
end
|
519
|
+
|
520
|
+
def path(request)
|
521
|
+
request[:path]
|
522
|
+
end
|
523
|
+
|
524
|
+
def params(request)
|
525
|
+
request[:params]
|
526
|
+
end
|
527
|
+
|
528
|
+
def client_cert(request)
|
529
|
+
request[:client_cert]
|
502
530
|
end
|
503
531
|
end
|
504
532
|
end
|