puppet 0.24.6 → 0.24.7
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/CHANGELOG +115 -0
- data/Rakefile +43 -14
- data/bin/puppetca +6 -5
- data/bin/puppetdoc +109 -15
- data/bin/ralsh +3 -1
- data/conf/redhat/puppet.spec +74 -48
- data/examples/mcx_dock_absent.pp +4 -0
- data/examples/mcx_dock_default.pp +118 -0
- data/examples/mcx_dock_full.pp +125 -0
- data/examples/mcx_dock_invalid.pp +9 -0
- data/examples/mcx_nogroup.pp +118 -0
- data/examples/mcx_notexists_absent.pp +4 -0
- data/ext/emacs/puppet-mode.el +1 -1
- data/lib/puppet.rb +1 -1
- data/lib/puppet/external/nagios/base.rb +114 -71
- data/lib/puppet/feature/base.rb +6 -0
- data/lib/puppet/indirector/yaml.rb +12 -3
- data/lib/puppet/module.rb +1 -1
- data/lib/puppet/network/client/master.rb +1 -1
- data/lib/puppet/network/xmlrpc/client.rb +3 -1
- data/lib/puppet/parameter.rb +1 -1
- data/lib/puppet/parser/ast.rb +15 -0
- data/lib/puppet/parser/ast/astarray.rb +1 -2
- data/lib/puppet/parser/ast/casestatement.rb +2 -0
- data/lib/puppet/parser/ast/collection.rb +2 -0
- data/lib/puppet/parser/ast/comparison_operator.rb +4 -0
- data/lib/puppet/parser/ast/definition.rb +2 -0
- data/lib/puppet/parser/ast/else.rb +3 -0
- data/lib/puppet/parser/ast/function.rb +19 -12
- data/lib/puppet/parser/ast/hostclass.rb +9 -1
- data/lib/puppet/parser/ast/ifstatement.rb +3 -0
- data/lib/puppet/parser/ast/node.rb +3 -0
- data/lib/puppet/parser/ast/resource.rb +3 -0
- data/lib/puppet/parser/ast/resource_defaults.rb +2 -0
- data/lib/puppet/parser/ast/resource_override.rb +3 -0
- data/lib/puppet/parser/ast/vardef.rb +3 -0
- data/lib/puppet/parser/functions.rb +14 -0
- data/lib/puppet/parser/functions/inline_template.rb +21 -0
- data/lib/puppet/parser/functions/template.rb +3 -2
- data/lib/puppet/parser/lexer.rb +56 -7
- data/lib/puppet/parser/parser.rb +114 -98
- data/lib/puppet/parser/parser_support.rb +24 -4
- data/lib/puppet/parser/resource/reference.rb +4 -3
- data/lib/puppet/parser/templatewrapper.rb +30 -22
- data/lib/puppet/property.rb +1 -1
- data/lib/puppet/property/list.rb +7 -2
- data/lib/puppet/property/ordered_list.rb +22 -0
- data/lib/puppet/provider/augeas/augeas.rb +189 -0
- data/lib/puppet/provider/computer/computer.rb +22 -0
- data/lib/puppet/provider/confine.rb +4 -1
- data/lib/puppet/provider/confine/variable.rb +13 -2
- data/lib/puppet/provider/confine_collection.rb +4 -1
- data/lib/puppet/provider/confiner.rb +1 -1
- data/lib/puppet/provider/group/directoryservice.rb +6 -3
- data/lib/puppet/provider/group/groupadd.rb +5 -2
- data/lib/puppet/provider/group/ldap.rb +11 -9
- data/lib/puppet/provider/group/netinfo.rb +8 -4
- data/lib/puppet/provider/group/pw.rb +5 -1
- data/lib/puppet/provider/host/netinfo.rb +5 -2
- data/lib/puppet/provider/macauthorization/macauthorization.rb +315 -0
- data/lib/puppet/provider/mcx/mcxcontent.rb +201 -0
- data/lib/puppet/provider/nameservice/directoryservice.rb +210 -107
- data/lib/puppet/provider/nameservice/netinfo.rb +7 -2
- data/lib/puppet/provider/package/appdmg.rb +0 -3
- data/lib/puppet/provider/package/apt.rb +6 -0
- data/lib/puppet/provider/package/rpm.rb +2 -0
- data/lib/puppet/provider/package/yum.rb +5 -1
- data/lib/puppet/provider/package/yumhelper.py +9 -0
- data/lib/puppet/provider/service/base.rb +9 -6
- data/lib/puppet/provider/service/daemontools.rb +25 -15
- data/lib/puppet/provider/service/debian.rb +6 -2
- data/lib/puppet/provider/service/freebsd.rb +5 -2
- data/lib/puppet/provider/service/gentoo.rb +6 -3
- data/lib/puppet/provider/service/init.rb +31 -21
- data/lib/puppet/provider/service/launchd.rb +195 -0
- data/lib/puppet/provider/service/redhat.rb +5 -2
- data/lib/puppet/provider/service/runit.rb +30 -20
- data/lib/puppet/provider/service/smf.rb +7 -4
- data/lib/puppet/provider/ssh_authorized_key/parsed.rb +21 -1
- data/lib/puppet/provider/user/directoryservice.rb +1 -0
- data/lib/puppet/provider/user/netinfo.rb +9 -3
- data/lib/puppet/provider/user/user_role_add.rb +43 -6
- data/lib/puppet/provider/zfs/solaris.rb +45 -0
- data/lib/puppet/provider/zone/solaris.rb +8 -4
- data/lib/puppet/provider/zpool/solaris.rb +116 -0
- data/lib/puppet/rails/database/003_add_environment_to_host.rb +9 -0
- data/lib/puppet/rails/database/schema.rb +1 -0
- data/lib/puppet/rails/host.rb +4 -0
- data/lib/puppet/reference/configuration.rb +1 -1
- data/lib/puppet/reports/tagmail.rb +15 -6
- data/lib/puppet/transaction/change.rb +3 -5
- data/lib/puppet/transportable.rb +1 -0
- data/lib/puppet/type/augeas.rb +155 -0
- data/lib/puppet/type/computer.rb +62 -0
- data/lib/puppet/type/exec.rb +2 -1
- data/lib/puppet/type/file.rb +1 -1
- data/lib/puppet/type/file/ensure.rb +8 -5
- data/lib/puppet/type/file/mode.rb +0 -14
- data/lib/puppet/type/file/owner.rb +32 -64
- data/lib/puppet/type/file/selcontext.rb +3 -8
- data/lib/puppet/type/group.rb +27 -45
- data/lib/puppet/type/k5login.rb +1 -1
- data/lib/puppet/type/macauthorization.rb +141 -0
- data/lib/puppet/type/mcx.rb +115 -0
- data/lib/puppet/type/mount.rb +1 -1
- data/lib/puppet/type/nagios_hostdependency.rb +3 -0
- data/lib/puppet/type/ssh_authorized_key.rb +16 -0
- data/lib/puppet/type/tidy.rb +43 -14
- data/lib/puppet/type/user.rb +25 -1
- data/lib/puppet/type/zfs.rb +51 -0
- data/lib/puppet/type/zone.rb +8 -0
- data/lib/puppet/type/zpool.rb +93 -0
- data/lib/puppet/util.rb +17 -38
- data/lib/puppet/util/file_locking.rb +44 -0
- data/lib/puppet/util/filetype.rb +3 -3
- data/lib/puppet/util/log.rb +1 -16
- data/lib/puppet/util/metric.rb +0 -5
- data/lib/puppet/util/rdoc.rb +85 -0
- data/lib/puppet/util/rdoc/code_objects.rb +219 -0
- data/lib/puppet/util/rdoc/generators/puppet_generator.rb +829 -0
- data/lib/puppet/util/rdoc/generators/template/puppet/puppet.rb +1051 -0
- data/lib/puppet/util/rdoc/parser.rb +437 -0
- data/lib/puppet/util/selinux.rb +135 -63
- data/lib/puppet/util/settings.rb +136 -126
- data/lib/puppet/util/storage.rb +4 -2
- data/spec/Rakefile +91 -0
- data/spec/integration/checksum.rb +47 -0
- data/spec/integration/defaults.rb +47 -0
- data/spec/integration/file_serving/configuration.rb +43 -0
- data/spec/integration/file_serving/content.rb +18 -0
- data/spec/integration/file_serving/metadata.rb +18 -0
- data/spec/integration/indirector/direct_file_server.rb +80 -0
- data/spec/integration/indirector/file_content/file_server.rb +18 -0
- data/spec/integration/indirector/file_metadata/file_server.rb +18 -0
- data/spec/integration/indirector/module_files.rb +57 -0
- data/spec/integration/indirector/node/ldap.rb +15 -0
- data/spec/integration/indirector/rest.rb +464 -0
- data/spec/integration/network/server/mongrel.rb +48 -0
- data/spec/integration/network/server/webrick.rb +48 -0
- data/spec/integration/node.rb +93 -0
- data/spec/integration/node/catalog.rb +54 -0
- data/spec/integration/node/facts.rb +45 -0
- data/spec/integration/provider/package.rb +26 -0
- data/spec/integration/provider/service/init.rb +32 -0
- data/spec/integration/reference/providers.rb +17 -0
- data/spec/integration/reports.rb +14 -0
- data/spec/integration/transaction/report.rb +26 -0
- data/spec/integration/type/package.rb +22 -0
- data/spec/integration/util/file_locking.rb +36 -0
- data/spec/monkey_patches/add_confine_and_runnable_to_rspec_dsl.rb +46 -0
- data/spec/monkey_patches/alias_should_to_must.rb +5 -0
- data/spec/shared_behaviours/file_server_terminus.rb +42 -0
- data/spec/shared_behaviours/file_serving.rb +64 -0
- data/spec/shared_behaviours/memory_terminus.rb +32 -0
- data/spec/spec.opts +5 -0
- data/spec/spec_helper.rb +36 -0
- data/spec/unit/executables/client/certhandler.rb +122 -0
- data/spec/unit/file_serving/configuration.rb +224 -0
- data/spec/unit/file_serving/configuration/parser.rb +135 -0
- data/spec/unit/file_serving/content.rb +71 -0
- data/spec/unit/file_serving/file_base.rb +124 -0
- data/spec/unit/file_serving/fileset.rb +239 -0
- data/spec/unit/file_serving/indirection_hooks.rb +124 -0
- data/spec/unit/file_serving/metadata.rb +187 -0
- data/spec/unit/file_serving/mount.rb +143 -0
- data/spec/unit/file_serving/terminus_helper.rb +76 -0
- data/spec/unit/indirector.rb +152 -0
- data/spec/unit/indirector/catalog/compiler.rb +156 -0
- data/spec/unit/indirector/catalog/yaml.rb +25 -0
- data/spec/unit/indirector/checksum/file.rb +139 -0
- data/spec/unit/indirector/code.rb +33 -0
- data/spec/unit/indirector/direct_file_server.rb +89 -0
- data/spec/unit/indirector/envelope.rb +47 -0
- data/spec/unit/indirector/exec.rb +51 -0
- data/spec/unit/indirector/facts/facter.rb +76 -0
- data/spec/unit/indirector/facts/yaml.rb +26 -0
- data/spec/unit/indirector/file.rb +154 -0
- data/spec/unit/indirector/file_content/file.rb +18 -0
- data/spec/unit/indirector/file_content/file_server.rb +18 -0
- data/spec/unit/indirector/file_content/modules.rb +18 -0
- data/spec/unit/indirector/file_content/rest.rb +11 -0
- data/spec/unit/indirector/file_metadata/file.rb +52 -0
- data/spec/unit/indirector/file_metadata/file_server.rb +18 -0
- data/spec/unit/indirector/file_metadata/modules.rb +42 -0
- data/spec/unit/indirector/file_metadata/rest.rb +9 -0
- data/spec/unit/indirector/file_server.rb +184 -0
- data/spec/unit/indirector/indirection.rb +731 -0
- data/spec/unit/indirector/ldap.rb +143 -0
- data/spec/unit/indirector/memory.rb +29 -0
- data/spec/unit/indirector/module_files.rb +259 -0
- data/spec/unit/indirector/node/exec.rb +69 -0
- data/spec/unit/indirector/node/ldap.rb +424 -0
- data/spec/unit/indirector/node/memory.rb +19 -0
- data/spec/unit/indirector/node/plain.rb +19 -0
- data/spec/unit/indirector/node/rest.rb +13 -0
- data/spec/unit/indirector/node/yaml.rb +25 -0
- data/spec/unit/indirector/plain.rb +29 -0
- data/spec/unit/indirector/report/processor.rb +81 -0
- data/spec/unit/indirector/request.rb +87 -0
- data/spec/unit/indirector/rest.rb +372 -0
- data/spec/unit/indirector/ssl_rsa/file.rb +116 -0
- data/spec/unit/indirector/terminus.rb +245 -0
- data/spec/unit/indirector/yaml.rb +145 -0
- data/spec/unit/module.rb +247 -0
- data/spec/unit/network/client.rb +45 -0
- data/spec/unit/network/client/master.rb +442 -0
- data/spec/unit/network/handler/fileserver.rb +179 -0
- data/spec/unit/network/http.rb +35 -0
- data/spec/unit/network/http/mongrel.rb +117 -0
- data/spec/unit/network/http/mongrel/rest.rb +377 -0
- data/spec/unit/network/http/mongrel/xmlrpc.rb +0 -0
- data/spec/unit/network/http/webrick.rb +127 -0
- data/spec/unit/network/http/webrick/rest.rb +323 -0
- data/spec/unit/network/http/webrick/xmlrpc.rb +0 -0
- data/spec/unit/network/http_pool.rb +238 -0
- data/spec/unit/network/server.rb +316 -0
- data/spec/unit/network/xmlrpc/client.rb +13 -0
- data/spec/unit/node.rb +167 -0
- data/spec/unit/node/catalog.rb +864 -0
- data/spec/unit/node/environment.rb +37 -0
- data/spec/unit/node/facts.rb +44 -0
- data/spec/unit/other/checksum.rb +92 -0
- data/spec/unit/other/pgraph.rb +210 -0
- data/spec/unit/other/transaction.rb +33 -0
- data/spec/unit/other/transbucket.rb +172 -0
- data/spec/unit/other/transobject.rb +92 -0
- data/spec/unit/parameter.rb +24 -0
- data/spec/unit/parser/ast.rb +37 -0
- data/spec/unit/parser/ast/arithmetic_operator.rb +73 -0
- data/spec/unit/parser/ast/astarray.rb +66 -0
- data/spec/unit/parser/ast/boolean_operator.rb +53 -0
- data/spec/unit/parser/ast/collexpr.rb +92 -0
- data/spec/unit/parser/ast/comparison_operator.rb +92 -0
- data/spec/unit/parser/ast/definition.rb +195 -0
- data/spec/unit/parser/ast/function.rb +77 -0
- data/spec/unit/parser/ast/hostclass.rb +148 -0
- data/spec/unit/parser/ast/minus.rb +36 -0
- data/spec/unit/parser/ast/node.rb +125 -0
- data/spec/unit/parser/ast/nop.rb +20 -0
- data/spec/unit/parser/ast/not.rb +30 -0
- data/spec/unit/parser/ast/resource_override.rb +51 -0
- data/spec/unit/parser/ast/resource_reference.rb +63 -0
- data/spec/unit/parser/ast/vardef.rb +47 -0
- data/spec/unit/parser/collector.rb +426 -0
- data/spec/unit/parser/compiler.rb +561 -0
- data/spec/unit/parser/functions.rb +83 -0
- data/spec/unit/parser/functions/inline_template.rb +59 -0
- data/spec/unit/parser/functions/template.rb +62 -0
- data/spec/unit/parser/interpreter.rb +138 -0
- data/spec/unit/parser/lexer.rb +646 -0
- data/spec/unit/parser/parser.rb +228 -0
- data/spec/unit/parser/resource.rb +336 -0
- data/spec/unit/parser/resource/reference.rb +95 -0
- data/spec/unit/parser/scope.rb +87 -0
- data/spec/unit/parser/templatewrapper.rb +129 -0
- data/spec/unit/property.rb +35 -0
- data/spec/unit/property/keyvalue.rb +168 -0
- data/spec/unit/property/list.rb +156 -0
- data/spec/unit/property/ordered_list.rb +64 -0
- data/spec/unit/provider/augeas/augeas.rb +238 -0
- data/spec/unit/provider/confine.rb +78 -0
- data/spec/unit/provider/confine/exists.rb +81 -0
- data/spec/unit/provider/confine/false.rb +53 -0
- data/spec/unit/provider/confine/feature.rb +60 -0
- data/spec/unit/provider/confine/true.rb +53 -0
- data/spec/unit/provider/confine/variable.rb +107 -0
- data/spec/unit/provider/confine_collection.rb +134 -0
- data/spec/unit/provider/confiner.rb +63 -0
- data/spec/unit/provider/group/groupadd.rb +31 -0
- data/spec/unit/provider/group/ldap.rb +105 -0
- data/spec/unit/provider/ldap.rb +248 -0
- data/spec/unit/provider/macauthorization.rb +147 -0
- data/spec/unit/provider/mcx/mcxcontent.rb +175 -0
- data/spec/unit/provider/mount.rb +130 -0
- data/spec/unit/provider/mount/parsed.rb +185 -0
- data/spec/unit/provider/package/apt.rb +138 -0
- data/spec/unit/provider/package/dpkg.rb +163 -0
- data/spec/unit/provider/package/gem.rb +87 -0
- data/spec/unit/provider/package/hpux.rb +52 -0
- data/spec/unit/provider/selboolean.rb +37 -0
- data/spec/unit/provider/selmodule-example.pp +0 -0
- data/spec/unit/provider/selmodule.rb +66 -0
- data/spec/unit/provider/service/daemontools.rb +124 -0
- data/spec/unit/provider/service/launchd.rb +134 -0
- data/spec/unit/provider/service/runit.rb +117 -0
- data/spec/unit/provider/ssh_authorized_key/parsed.rb +102 -0
- data/spec/unit/provider/user/hpux.rb +25 -0
- data/spec/unit/provider/user/ldap.rb +279 -0
- data/spec/unit/provider/user/user_role_add.rb +249 -0
- data/spec/unit/provider/user/useradd.rb +115 -0
- data/spec/unit/provider/zfs/solaris.rb +87 -0
- data/spec/unit/provider/zone/solaris.rb +42 -0
- data/spec/unit/provider/zpool/solaris.rb +179 -0
- data/spec/unit/rails.rb +125 -0
- data/spec/unit/relationship.rb +149 -0
- data/spec/unit/reports.rb +61 -0
- data/spec/unit/resource_reference.rb +73 -0
- data/spec/unit/simple_graph.rb +280 -0
- data/spec/unit/transaction/change.rb +187 -0
- data/spec/unit/transaction/event.rb +25 -0
- data/spec/unit/transaction/report.rb +40 -0
- data/spec/unit/type.rb +64 -0
- data/spec/unit/type/augeas.rb +113 -0
- data/spec/unit/type/computer.rb +82 -0
- data/spec/unit/type/exec.rb +91 -0
- data/spec/unit/type/file.rb +155 -0
- data/spec/unit/type/file/ensure.rb +21 -0
- data/spec/unit/type/file/group.rb +118 -0
- data/spec/unit/type/file/owner.rb +132 -0
- data/spec/unit/type/file/selinux.rb +82 -0
- data/spec/unit/type/group.rb +40 -0
- data/spec/unit/type/macauthorization.rb +78 -0
- data/spec/unit/type/mcx.rb +108 -0
- data/spec/unit/type/mount.rb +219 -0
- data/spec/unit/type/nagios.rb +63 -0
- data/spec/unit/type/noop_metaparam.rb +38 -0
- data/spec/unit/type/package.rb +246 -0
- data/spec/unit/type/resources.rb +27 -0
- data/spec/unit/type/schedule.rb +339 -0
- data/spec/unit/type/selboolean.rb +47 -0
- data/spec/unit/type/selmodule.rb +18 -0
- data/spec/unit/type/service.rb +254 -0
- data/spec/unit/type/ssh_authorized_key.rb +106 -0
- data/spec/unit/type/tidy.rb +68 -0
- data/spec/unit/type/user.rb +260 -0
- data/spec/unit/type/zfs.rb +45 -0
- data/spec/unit/type/zone.rb +20 -0
- data/spec/unit/type/zpool.rb +110 -0
- data/spec/unit/util/checksums.rb +99 -0
- data/spec/unit/util/constant_inflector.rb +70 -0
- data/spec/unit/util/file_locking.rb +115 -0
- data/spec/unit/util/ldap/connection.rb +169 -0
- data/spec/unit/util/ldap/generator.rb +54 -0
- data/spec/unit/util/ldap/manager.rb +654 -0
- data/spec/unit/util/loadedfile.rb +65 -0
- data/spec/unit/util/log.rb +107 -0
- data/spec/unit/util/metric.rb +95 -0
- data/spec/unit/util/nagios_maker.rb +128 -0
- data/spec/unit/util/posix.rb +256 -0
- data/spec/unit/util/resource_template.rb +58 -0
- data/spec/unit/util/selinux.rb +219 -0
- data/spec/unit/util/settings.rb +847 -0
- data/spec/unit/util/storage.rb +248 -0
- data/spec/unit/util/tagging.rb +92 -0
- data/spec/unit/util/uri_helper.rb +41 -0
- data/spec/unit/util/user_attr.rb +47 -0
- data/spec/unit/util/warnings.rb +35 -0
- data/test/certmgr/support.rb +0 -6
- data/test/data/providers/ssh_authorized_key/parsed/authorized_keys +1 -0
- data/test/data/snippets/multilinecomments.pp +6 -0
- data/test/data/snippets/multipleclass.pp +9 -0
- data/test/language/functions.rb +11 -1
- data/test/language/snippets.rb +16 -0
- data/test/lib/puppettest/runnable_test.rb +1 -1
- data/test/network/handler/fileserver.rb +5 -0
- data/test/other/report.rb +0 -4
- data/test/ral/type/resources.rb +2 -19
- data/test/util/settings.rb +4 -4
- data/test/util/storage.rb +0 -24
- data/test/util/utiltest.rb +0 -33
- metadata +319 -26
- data/conf/debian/README.source +0 -2
- data/conf/debian/TODO.Debian +0 -1
- data/conf/debian/changelog +0 -257
- data/conf/debian/compat +0 -1
- data/conf/debian/control +0 -45
- data/conf/debian/copyright +0 -17
- data/conf/debian/docs +0 -1
- data/conf/debian/fileserver.conf +0 -12
- data/conf/debian/puppet.NEWS +0 -63
- data/conf/debian/puppet.conf +0 -8
- data/conf/debian/puppet.dirs +0 -7
- data/conf/debian/puppet.files +0 -6
- data/conf/debian/puppet.init +0 -64
- data/conf/debian/puppet.logrotate +0 -11
- data/conf/debian/puppet.postinst +0 -9
- data/conf/debian/puppet.postrm +0 -21
- data/conf/debian/puppet.preinst +0 -25
- data/conf/debian/puppetmaster.files +0 -4
- data/conf/debian/puppetmaster.init +0 -58
- data/conf/debian/rules +0 -115
- data/conf/debian/watch +0 -2
- data/lib/puppet/type/nagios_hostgroupescalation.rb +0 -3
@@ -0,0 +1,54 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Created by Luke Kanies on 2008-3-28.
|
4
|
+
# Copyright (c) 2008. All rights reserved.
|
5
|
+
|
6
|
+
require File.dirname(__FILE__) + '/../../../spec_helper'
|
7
|
+
|
8
|
+
require 'puppet/util/ldap/generator'
|
9
|
+
|
10
|
+
describe Puppet::Util::Ldap::Generator do
|
11
|
+
before do
|
12
|
+
@generator = Puppet::Util::Ldap::Generator.new(:uno)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should require a parameter name at initialization" do
|
16
|
+
lambda { Puppet::Util::Ldap::Generator.new }.should raise_error
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should always return its name as a string" do
|
20
|
+
g = Puppet::Util::Ldap::Generator.new(:myname)
|
21
|
+
g.name.should == "myname"
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should provide a method for declaring the source parameter" do
|
25
|
+
@generator.from(:dos)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should always return a set source as a string" do
|
29
|
+
@generator.from(:dos)
|
30
|
+
@generator.source.should == "dos"
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should return the source as nil if there is no source" do
|
34
|
+
@generator.source.should be_nil
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should return itself when declaring the source" do
|
38
|
+
@generator.from(:dos).should equal(@generator)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should run the provided block when asked to generate the value" do
|
42
|
+
@generator.with { "yayness" }
|
43
|
+
@generator.generate().should == "yayness"
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should pass in any provided value to the block" do
|
47
|
+
@generator.with { |value| value.upcase }
|
48
|
+
@generator.generate("myval").should == "MYVAL"
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should return itself when declaring the code used for generating" do
|
52
|
+
@generator.with { |value| value.upcase }.should equal(@generator)
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,654 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Created by Luke Kanies on 2008-3-19.
|
4
|
+
# Copyright (c) 2006. All rights reserved.
|
5
|
+
|
6
|
+
require File.dirname(__FILE__) + '/../../../spec_helper'
|
7
|
+
|
8
|
+
require 'puppet/util/ldap/manager'
|
9
|
+
|
10
|
+
# If the ldap classes aren't available, go ahead and
|
11
|
+
# create some, so our tests will pass.
|
12
|
+
unless defined?(LDAP::Mod)
|
13
|
+
class LDAP
|
14
|
+
LDAP_MOD_ADD = :adding
|
15
|
+
LDAP_MOD_REPLACE = :replacing
|
16
|
+
LDAP_MOD_DELETE = :deleting
|
17
|
+
class ResultError < RuntimeError; end
|
18
|
+
class Mod
|
19
|
+
def initialize(*args)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe Puppet::Util::Ldap::Manager do
|
26
|
+
before do
|
27
|
+
@manager = Puppet::Util::Ldap::Manager.new
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should return self when specifying objectclasses" do
|
31
|
+
@manager.manages(:one, :two).should equal(@manager)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should allow specification of what objectclasses are managed" do
|
35
|
+
@manager.manages(:one, :two).objectclasses.should == [:one, :two]
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should return self when specifying the relative base" do
|
39
|
+
@manager.at("yay").should equal(@manager)
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should allow specification of the relative base" do
|
43
|
+
@manager.at("yay").location.should == "yay"
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should return self when specifying the attribute map" do
|
47
|
+
@manager.maps(:one => :two).should equal(@manager)
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should allow specification of the rdn attribute" do
|
51
|
+
@manager.named_by(:uid).rdn.should == :uid
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should allow specification of the attribute map" do
|
55
|
+
@manager.maps(:one => :two).puppet2ldap.should == {:one => :two}
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should have a no-op 'and' method that just returns self" do
|
59
|
+
@manager.and.should equal(@manager)
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should allow specification of generated attributes" do
|
63
|
+
@manager.generates(:thing).should be_instance_of(Puppet::Util::Ldap::Generator)
|
64
|
+
end
|
65
|
+
|
66
|
+
describe "when generating attributes" do
|
67
|
+
before do
|
68
|
+
@generator = stub 'generator', :source => "one", :name => "myparam"
|
69
|
+
|
70
|
+
Puppet::Util::Ldap::Generator.stubs(:new).with(:myparam).returns @generator
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should create a generator to do the parameter generation" do
|
74
|
+
Puppet::Util::Ldap::Generator.expects(:new).with(:myparam).returns @generator
|
75
|
+
@manager.generates(:myparam)
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should return the generator from the :generates method" do
|
79
|
+
@manager.generates(:myparam).should equal(@generator)
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should not replace already present values" do
|
83
|
+
@manager.generates(:myparam)
|
84
|
+
|
85
|
+
attrs = {"myparam" => "testing"}
|
86
|
+
@generator.expects(:generate).never
|
87
|
+
|
88
|
+
@manager.generate attrs
|
89
|
+
|
90
|
+
attrs["myparam"].should == "testing"
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should look for the parameter as a string, not a symbol" do
|
94
|
+
@manager.generates(:myparam)
|
95
|
+
@generator.expects(:generate).with("yay").returns %w{double yay}
|
96
|
+
attrs = {"one" => "yay"}
|
97
|
+
@manager.generate attrs
|
98
|
+
|
99
|
+
attrs["myparam"].should == %w{double yay}
|
100
|
+
end
|
101
|
+
|
102
|
+
it "should fail if a source is specified and no source value is not defined" do
|
103
|
+
@manager.generates(:myparam)
|
104
|
+
lambda { @manager.generate "two" => "yay" }.should raise_error(ArgumentError)
|
105
|
+
end
|
106
|
+
|
107
|
+
it "should use the source value to generate the new value if a source attribute is specified" do
|
108
|
+
@manager.generates(:myparam)
|
109
|
+
@generator.expects(:generate).with("yay").returns %w{double yay}
|
110
|
+
@manager.generate "one" => "yay"
|
111
|
+
end
|
112
|
+
|
113
|
+
it "should not pass in any value if no source attribute is specified" do
|
114
|
+
@generator.stubs(:source).returns nil
|
115
|
+
@manager.generates(:myparam)
|
116
|
+
@generator.expects(:generate).with().returns %w{double yay}
|
117
|
+
@manager.generate "one" => "yay"
|
118
|
+
end
|
119
|
+
|
120
|
+
it "should convert any results to arrays of strings if necessary" do
|
121
|
+
@generator.expects(:generate).returns :test
|
122
|
+
@manager.generates(:myparam)
|
123
|
+
|
124
|
+
attrs = {"one" => "two"}
|
125
|
+
@manager.generate(attrs)
|
126
|
+
attrs["myparam"].should == ["test"]
|
127
|
+
end
|
128
|
+
|
129
|
+
it "should add the result to the passed-in attribute hash" do
|
130
|
+
@generator.expects(:generate).returns %w{test}
|
131
|
+
@manager.generates(:myparam)
|
132
|
+
|
133
|
+
attrs = {"one" => "two"}
|
134
|
+
@manager.generate(attrs)
|
135
|
+
attrs["myparam"].should == %w{test}
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
it "should be considered invalid if it is missing a location" do
|
140
|
+
@manager.manages :me
|
141
|
+
@manager.maps :me => :you
|
142
|
+
@manager.should_not be_valid
|
143
|
+
end
|
144
|
+
|
145
|
+
it "should be considered invalid if it is missing an objectclass list" do
|
146
|
+
@manager.maps :me => :you
|
147
|
+
@manager.at "ou=yayness"
|
148
|
+
@manager.should_not be_valid
|
149
|
+
end
|
150
|
+
|
151
|
+
it "should be considered invalid if it is missing an attribute map" do
|
152
|
+
@manager.manages :me
|
153
|
+
@manager.at "ou=yayness"
|
154
|
+
@manager.should_not be_valid
|
155
|
+
end
|
156
|
+
|
157
|
+
it "should be considered valid if it has an attribute map, location, and objectclass list" do
|
158
|
+
@manager.maps :me => :you
|
159
|
+
@manager.manages :me
|
160
|
+
@manager.at "ou=yayness"
|
161
|
+
@manager.should be_valid
|
162
|
+
end
|
163
|
+
|
164
|
+
it "should calculate an instance's dn using the :ldapbase setting and the relative base" do
|
165
|
+
Puppet.settings.expects(:value).with(:ldapbase).returns "dc=testing"
|
166
|
+
@manager.at "ou=mybase"
|
167
|
+
@manager.dn("me").should == "cn=me,ou=mybase,dc=testing"
|
168
|
+
end
|
169
|
+
|
170
|
+
it "should use the specified rdn when calculating an instance's dn" do
|
171
|
+
Puppet.settings.expects(:value).with(:ldapbase).returns "dc=testing"
|
172
|
+
@manager.named_by :uid
|
173
|
+
@manager.at "ou=mybase"
|
174
|
+
@manager.dn("me").should =~ /^uid=me/
|
175
|
+
end
|
176
|
+
|
177
|
+
it "should calculate its base using the :ldapbase setting and the relative base" do
|
178
|
+
Puppet.settings.expects(:value).with(:ldapbase).returns "dc=testing"
|
179
|
+
@manager.at "ou=mybase"
|
180
|
+
@manager.base.should == "ou=mybase,dc=testing"
|
181
|
+
end
|
182
|
+
|
183
|
+
describe "when generating its search filter" do
|
184
|
+
it "should using a single 'objectclass=<name>' filter if a single objectclass is specified" do
|
185
|
+
@manager.manages("testing")
|
186
|
+
@manager.filter.should == "objectclass=testing"
|
187
|
+
end
|
188
|
+
|
189
|
+
it "should create an LDAP AND filter if multiple objectclasses are specified" do
|
190
|
+
@manager.manages "testing", "okay", "done"
|
191
|
+
@manager.filter.should == "(&(objectclass=testing)(objectclass=okay)(objectclass=done))"
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
it "should have a method for converting a Puppet attribute name to an LDAP attribute name as a string" do
|
196
|
+
@manager.maps :puppet_attr => :ldap_attr
|
197
|
+
@manager.ldap_name(:puppet_attr).should == "ldap_attr"
|
198
|
+
end
|
199
|
+
|
200
|
+
it "should have a method for converting an LDAP attribute name to a Puppet attribute name" do
|
201
|
+
@manager.maps :puppet_attr => :ldap_attr
|
202
|
+
@manager.puppet_name(:ldap_attr).should == :puppet_attr
|
203
|
+
end
|
204
|
+
|
205
|
+
it "should have a :create method for creating ldap entries" do
|
206
|
+
@manager.should respond_to(:create)
|
207
|
+
end
|
208
|
+
|
209
|
+
it "should have a :delete method for deleting ldap entries" do
|
210
|
+
@manager.should respond_to(:delete)
|
211
|
+
end
|
212
|
+
|
213
|
+
it "should have a :modify method for modifying ldap entries" do
|
214
|
+
@manager.should respond_to(:modify)
|
215
|
+
end
|
216
|
+
|
217
|
+
it "should have a method for finding an entry by name in ldap" do
|
218
|
+
@manager.should respond_to(:find)
|
219
|
+
end
|
220
|
+
|
221
|
+
describe "when converting ldap entries to hashes for providers" do
|
222
|
+
before do
|
223
|
+
@manager.maps :uno => :one, :dos => :two
|
224
|
+
|
225
|
+
@result = @manager.entry2provider("dn" => ["cn=one,ou=people,dc=madstop"], "one" => ["two"], "three" => %w{four}, "objectclass" => %w{yay ness})
|
226
|
+
end
|
227
|
+
|
228
|
+
it "should set the name to the short portion of the dn" do
|
229
|
+
@result[:name].should == "one"
|
230
|
+
end
|
231
|
+
|
232
|
+
it "should remove the objectclasses" do
|
233
|
+
@result["objectclass"].should be_nil
|
234
|
+
end
|
235
|
+
|
236
|
+
it "should remove any attributes that are not mentioned in the map" do
|
237
|
+
@result["three"].should be_nil
|
238
|
+
end
|
239
|
+
|
240
|
+
it "should rename convert to symbols all attributes to their puppet names" do
|
241
|
+
@result[:uno].should == %w{two}
|
242
|
+
end
|
243
|
+
|
244
|
+
it "should set the value of all unset puppet attributes as :absent" do
|
245
|
+
@result[:dos].should == :absent
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
249
|
+
describe "when using an ldap connection" do
|
250
|
+
before do
|
251
|
+
@ldapconn = mock 'ldapconn'
|
252
|
+
@conn = stub 'connection', :connection => @ldapconn, :start => nil, :close => nil
|
253
|
+
Puppet::Util::Ldap::Connection.stubs(:new).returns(@conn)
|
254
|
+
end
|
255
|
+
|
256
|
+
it "should fail unless a block is given" do
|
257
|
+
lambda { @manager.connect }.should raise_error(ArgumentError)
|
258
|
+
end
|
259
|
+
|
260
|
+
it "should open the connection with its server set to :ldapserver" do
|
261
|
+
Puppet.settings.stubs(:value).returns(false)
|
262
|
+
Puppet.settings.expects(:value).with(:ldapserver).returns("myserver")
|
263
|
+
Puppet::Util::Ldap::Connection.expects(:new).with { |*args| args[0] == "myserver" }.returns @conn
|
264
|
+
|
265
|
+
@manager.connect { |c| }
|
266
|
+
end
|
267
|
+
|
268
|
+
it "should open the connection with its port set to the :ldapport" do
|
269
|
+
Puppet.settings.stubs(:value).returns(false)
|
270
|
+
Puppet.settings.expects(:value).with(:ldapport).returns("28")
|
271
|
+
Puppet::Util::Ldap::Connection.expects(:new).with { |*args| args[1] == "28" }.returns @conn
|
272
|
+
|
273
|
+
@manager.connect { |c| }
|
274
|
+
end
|
275
|
+
|
276
|
+
it "should open the connection with no user if :ldapuser is not set" do
|
277
|
+
Puppet.settings.stubs(:value).returns(false)
|
278
|
+
Puppet.settings.expects(:value).with(:ldapuser).returns("")
|
279
|
+
Puppet::Util::Ldap::Connection.expects(:new).with { |*args| args[2][:user].nil? }.returns @conn
|
280
|
+
|
281
|
+
@manager.connect { |c| }
|
282
|
+
end
|
283
|
+
|
284
|
+
it "should open the connection with its user set to the :ldapuser if it is set" do
|
285
|
+
Puppet.settings.stubs(:value).returns(false)
|
286
|
+
Puppet.settings.expects(:value).with(:ldapuser).returns("mypass")
|
287
|
+
Puppet::Util::Ldap::Connection.expects(:new).with { |*args| args[2][:user] == "mypass" }.returns @conn
|
288
|
+
|
289
|
+
@manager.connect { |c| }
|
290
|
+
end
|
291
|
+
|
292
|
+
it "should open the connection with no password if :ldappassword is not set" do
|
293
|
+
Puppet.settings.stubs(:value).returns(false)
|
294
|
+
Puppet.settings.expects(:value).with(:ldappassword).returns("")
|
295
|
+
Puppet::Util::Ldap::Connection.expects(:new).with { |*args| args[2][:password].nil? }.returns @conn
|
296
|
+
|
297
|
+
@manager.connect { |c| }
|
298
|
+
end
|
299
|
+
|
300
|
+
it "should open the connection with its password set to the :ldappassword if it is set" do
|
301
|
+
Puppet.settings.stubs(:value).returns(false)
|
302
|
+
Puppet.settings.expects(:value).with(:ldappassword).returns("mypass")
|
303
|
+
Puppet::Util::Ldap::Connection.expects(:new).with { |*args| args[2][:password] == "mypass" }.returns @conn
|
304
|
+
|
305
|
+
@manager.connect { |c| }
|
306
|
+
end
|
307
|
+
|
308
|
+
it "should set ssl to :tls if ldaptls is enabled" do
|
309
|
+
Puppet.settings.stubs(:value).returns(false)
|
310
|
+
Puppet.settings.expects(:value).with(:ldaptls).returns(true)
|
311
|
+
Puppet::Util::Ldap::Connection.expects(:new).with { |*args| args[2][:ssl] == :tls }.returns @conn
|
312
|
+
|
313
|
+
@manager.connect { |c| }
|
314
|
+
end
|
315
|
+
|
316
|
+
it "should set ssl to true if ldapssl is enabled" do
|
317
|
+
Puppet.settings.stubs(:value).returns(false)
|
318
|
+
Puppet.settings.expects(:value).with(:ldapssl).returns(true)
|
319
|
+
Puppet::Util::Ldap::Connection.expects(:new).with { |*args| args[2][:ssl] == true }.returns @conn
|
320
|
+
|
321
|
+
@manager.connect { |c| }
|
322
|
+
end
|
323
|
+
|
324
|
+
it "should set ssl to false if neither ldaptls nor ldapssl is enabled" do
|
325
|
+
Puppet.settings.stubs(:value).returns(false)
|
326
|
+
Puppet.settings.expects(:value).with(:ldapssl).returns(false)
|
327
|
+
Puppet::Util::Ldap::Connection.expects(:new).with { |*args| args[2][:ssl] == false }.returns @conn
|
328
|
+
|
329
|
+
@manager.connect { |c| }
|
330
|
+
end
|
331
|
+
|
332
|
+
it "should open, yield, and then close the connection" do
|
333
|
+
@conn.expects(:start)
|
334
|
+
@conn.expects(:close)
|
335
|
+
Puppet::Util::Ldap::Connection.expects(:new).returns(@conn)
|
336
|
+
@ldapconn.expects(:test)
|
337
|
+
@manager.connect { |c| c.test }
|
338
|
+
end
|
339
|
+
|
340
|
+
it "should close the connection even if there's an exception in the passed block" do
|
341
|
+
@conn.expects(:close)
|
342
|
+
lambda { @manager.connect { |c| raise ArgumentError } }.should raise_error(ArgumentError)
|
343
|
+
end
|
344
|
+
end
|
345
|
+
|
346
|
+
describe "when using ldap" do
|
347
|
+
before do
|
348
|
+
@conn = mock 'connection'
|
349
|
+
@manager.stubs(:connect).yields @conn
|
350
|
+
@manager.stubs(:objectclasses).returns [:oc1, :oc2]
|
351
|
+
@manager.maps :one => :uno, :two => :dos, :three => :tres, :four => :quatro
|
352
|
+
end
|
353
|
+
|
354
|
+
describe "to create entries" do
|
355
|
+
it "should convert the first argument to its :create method to a full dn and pass the resulting argument list to its connection" do
|
356
|
+
@manager.expects(:dn).with("myname").returns "mydn"
|
357
|
+
@conn.expects(:add).with { |name, attrs| name == "mydn" }
|
358
|
+
|
359
|
+
@manager.create("myname", {"attr" => "myattrs"})
|
360
|
+
end
|
361
|
+
|
362
|
+
it "should add the objectclasses to the attributes" do
|
363
|
+
@manager.expects(:dn).with("myname").returns "mydn"
|
364
|
+
@conn.expects(:add).with { |name, attrs| attrs["objectClass"].include?("oc1") and attrs["objectClass"].include?("oc2") }
|
365
|
+
|
366
|
+
@manager.create("myname", {:one => :testing})
|
367
|
+
end
|
368
|
+
|
369
|
+
it "should add the rdn to the attributes" do
|
370
|
+
@manager.expects(:dn).with("myname").returns "mydn"
|
371
|
+
@conn.expects(:add).with { |name, attrs| attrs["cn"] == %w{myname} }
|
372
|
+
|
373
|
+
@manager.create("myname", {:one => :testing})
|
374
|
+
end
|
375
|
+
|
376
|
+
it "should add 'top' to the objectclasses if it is not listed" do
|
377
|
+
@manager.expects(:dn).with("myname").returns "mydn"
|
378
|
+
@conn.expects(:add).with { |name, attrs| attrs["objectClass"].include?("top") }
|
379
|
+
|
380
|
+
@manager.create("myname", {:one => :testing})
|
381
|
+
end
|
382
|
+
|
383
|
+
it "should add any generated values that are defined" do
|
384
|
+
generator = stub 'generator', :source => :one, :name => "myparam"
|
385
|
+
|
386
|
+
Puppet::Util::Ldap::Generator.expects(:new).with(:myparam).returns generator
|
387
|
+
|
388
|
+
@manager.generates(:myparam)
|
389
|
+
|
390
|
+
@manager.stubs(:dn).with("myname").returns "mydn"
|
391
|
+
|
392
|
+
generator.expects(:generate).with(:testing).returns ["generated value"]
|
393
|
+
@conn.expects(:add).with { |name, attrs| attrs["myparam"] == ["generated value"] }
|
394
|
+
|
395
|
+
@manager.create("myname", {:one => :testing})
|
396
|
+
end
|
397
|
+
|
398
|
+
it "should convert any generated values to arrays of strings if necessary" do
|
399
|
+
generator = stub 'generator', :source => :one, :name => "myparam"
|
400
|
+
|
401
|
+
Puppet::Util::Ldap::Generator.expects(:new).with(:myparam).returns generator
|
402
|
+
|
403
|
+
@manager.generates(:myparam)
|
404
|
+
|
405
|
+
@manager.stubs(:dn).returns "mydn"
|
406
|
+
|
407
|
+
generator.expects(:generate).returns :generated
|
408
|
+
@conn.expects(:add).with { |name, attrs| attrs["myparam"] == ["generated"] }
|
409
|
+
|
410
|
+
@manager.create("myname", {:one => :testing})
|
411
|
+
end
|
412
|
+
end
|
413
|
+
|
414
|
+
describe "do delete entries" do
|
415
|
+
it "should convert the first argument to its :delete method to a full dn and pass the resulting argument list to its connection" do
|
416
|
+
@manager.expects(:dn).with("myname").returns "mydn"
|
417
|
+
@conn.expects(:delete).with("mydn")
|
418
|
+
|
419
|
+
@manager.delete("myname")
|
420
|
+
end
|
421
|
+
end
|
422
|
+
|
423
|
+
describe "to modify entries" do
|
424
|
+
it "should convert the first argument to its :modify method to a full dn and pass the resulting argument list to its connection" do
|
425
|
+
@manager.expects(:dn).with("myname").returns "mydn"
|
426
|
+
@conn.expects(:modify).with("mydn", :mymods)
|
427
|
+
|
428
|
+
@manager.modify("myname", :mymods)
|
429
|
+
end
|
430
|
+
end
|
431
|
+
|
432
|
+
describe "to find a single entry" do
|
433
|
+
it "should use the dn of the provided name as the search base, a scope of 0, and 'objectclass=*' as the filter for a search2 call" do
|
434
|
+
@manager.expects(:dn).with("myname").returns "mydn"
|
435
|
+
@conn.expects(:search2).with("mydn", 0, "objectclass=*")
|
436
|
+
|
437
|
+
@manager.find("myname")
|
438
|
+
end
|
439
|
+
|
440
|
+
it "should return nil if an exception is thrown because no result is found" do
|
441
|
+
@manager.expects(:dn).with("myname").returns "mydn"
|
442
|
+
@conn.expects(:search2).raises LDAP::ResultError
|
443
|
+
|
444
|
+
@manager.find("myname").should be_nil
|
445
|
+
end
|
446
|
+
|
447
|
+
it "should return a converted provider hash if the result is found" do
|
448
|
+
@manager.expects(:dn).with("myname").returns "mydn"
|
449
|
+
result = {"one" => "two"}
|
450
|
+
@conn.expects(:search2).yields result
|
451
|
+
|
452
|
+
@manager.expects(:entry2provider).with(result).returns "myprovider"
|
453
|
+
|
454
|
+
@manager.find("myname").should == "myprovider"
|
455
|
+
end
|
456
|
+
end
|
457
|
+
|
458
|
+
describe "to search for multiple entries" do
|
459
|
+
before do
|
460
|
+
@manager.stubs(:filter).returns "myfilter"
|
461
|
+
end
|
462
|
+
|
463
|
+
it "should use the manager's search base as the dn of the provided name as the search base" do
|
464
|
+
@manager.expects(:base).returns "mybase"
|
465
|
+
@conn.expects(:search2).with { |base, scope, filter| base == "mybase" }
|
466
|
+
|
467
|
+
@manager.search
|
468
|
+
end
|
469
|
+
|
470
|
+
it "should use a scope of 1" do
|
471
|
+
@conn.expects(:search2).with { |base, scope, filter| scope == 1 }
|
472
|
+
|
473
|
+
@manager.search
|
474
|
+
end
|
475
|
+
|
476
|
+
it "should use any specified search filter" do
|
477
|
+
@manager.expects(:filter).never
|
478
|
+
@conn.expects(:search2).with { |base, scope, filter| filter == "boo" }
|
479
|
+
|
480
|
+
@manager.search("boo")
|
481
|
+
end
|
482
|
+
|
483
|
+
it "should turn its objectclass list into its search filter if one is not specified" do
|
484
|
+
@manager.expects(:filter).returns "yay"
|
485
|
+
@conn.expects(:search2).with { |base, scope, filter| filter == "yay" }
|
486
|
+
|
487
|
+
@manager.search
|
488
|
+
end
|
489
|
+
|
490
|
+
it "should return nil if no result is found" do
|
491
|
+
@conn.expects(:search2)
|
492
|
+
|
493
|
+
@manager.search.should be_nil
|
494
|
+
end
|
495
|
+
|
496
|
+
it "should return an array of the found results converted to provider hashes" do
|
497
|
+
# LAK: AFAICT, it's impossible to yield multiple times in an expectation.
|
498
|
+
one = {"dn" => "cn=one,dc=madstop,dc=com", "one" => "two"}
|
499
|
+
@conn.expects(:search2).yields(one)
|
500
|
+
|
501
|
+
@manager.expects(:entry2provider).with(one).returns "myprov"
|
502
|
+
|
503
|
+
@manager.search.should == ["myprov"]
|
504
|
+
end
|
505
|
+
end
|
506
|
+
end
|
507
|
+
|
508
|
+
describe "when an instance" do
|
509
|
+
before do
|
510
|
+
@name = "myname"
|
511
|
+
@manager.maps :one => :uno, :two => :dos, :three => :tres, :four => :quatro
|
512
|
+
end
|
513
|
+
|
514
|
+
describe "is being updated" do
|
515
|
+
it "should get created if the current attribute list is empty and the desired attribute list has :ensure == :present" do
|
516
|
+
@manager.expects(:create)
|
517
|
+
@manager.update(@name, {}, {:ensure => :present})
|
518
|
+
end
|
519
|
+
|
520
|
+
it "should get created if the current attribute list has :ensure == :absent and the desired attribute list has :ensure == :present" do
|
521
|
+
@manager.expects(:create)
|
522
|
+
@manager.update(@name, {:ensure => :absent}, {:ensure => :present})
|
523
|
+
end
|
524
|
+
|
525
|
+
it "should get deleted if the current attribute list has :ensure == :present and the desired attribute list has :ensure == :absent" do
|
526
|
+
@manager.expects(:delete)
|
527
|
+
@manager.update(@name, {:ensure => :present}, {:ensure => :absent})
|
528
|
+
end
|
529
|
+
|
530
|
+
it "should get modified if both attribute lists have :ensure == :present" do
|
531
|
+
@manager.expects(:modify)
|
532
|
+
@manager.update(@name, {:ensure => :present, :one => :two}, {:ensure => :present, :one => :three})
|
533
|
+
end
|
534
|
+
end
|
535
|
+
|
536
|
+
describe "is being deleted" do
|
537
|
+
it "should call the :delete method with its name and manager" do
|
538
|
+
@manager.expects(:delete).with(@name)
|
539
|
+
|
540
|
+
@manager.update(@name, {}, {:ensure => :absent})
|
541
|
+
end
|
542
|
+
end
|
543
|
+
|
544
|
+
describe "is being created" do
|
545
|
+
before do
|
546
|
+
@is = {}
|
547
|
+
@should = {:ensure => :present, :one => :yay, :two => :absent}
|
548
|
+
end
|
549
|
+
|
550
|
+
it "should call the :create method with its name" do
|
551
|
+
@manager.expects(:create).with { |name, attrs| name == @name }
|
552
|
+
@manager.update(@name, @is, @should)
|
553
|
+
end
|
554
|
+
|
555
|
+
it "should call the :create method with its property hash converted to ldap attribute names" do
|
556
|
+
@manager.expects(:create).with { |name, attrs| attrs["uno"] == ["yay"] }
|
557
|
+
@manager.update(@name, @is, @should)
|
558
|
+
end
|
559
|
+
|
560
|
+
it "should convert the property names to strings" do
|
561
|
+
@manager.expects(:create).with { |name, attrs| attrs["uno"] == ["yay"] }
|
562
|
+
@manager.update(@name, @is, @should)
|
563
|
+
end
|
564
|
+
|
565
|
+
it "should convert the property values to arrays if necessary" do
|
566
|
+
@manager.expects(:create).with { |name, attrs| attrs["uno"] == ["yay"] }
|
567
|
+
@manager.update(@name, @is, @should)
|
568
|
+
end
|
569
|
+
|
570
|
+
it "should convert the property values to strings if necessary" do
|
571
|
+
@manager.expects(:create).with { |name, attrs| attrs["uno"] == ["yay"] }
|
572
|
+
@manager.update(@name, @is, @should)
|
573
|
+
end
|
574
|
+
|
575
|
+
it "should not include :ensure in the properties sent" do
|
576
|
+
@manager.expects(:create).with { |*args| args[1][:ensure].nil? }
|
577
|
+
@manager.update(@name, @is, @should)
|
578
|
+
end
|
579
|
+
|
580
|
+
it "should not include attributes set to :absent in the properties sent" do
|
581
|
+
@manager.expects(:create).with { |*args| args[1][:dos].nil? }
|
582
|
+
@manager.update(@name, @is, @should)
|
583
|
+
end
|
584
|
+
end
|
585
|
+
|
586
|
+
describe "is being modified" do
|
587
|
+
it "should call the :modify method with its name and an array of LDAP::Mod instances" do
|
588
|
+
LDAP::Mod.stubs(:new).returns "whatever"
|
589
|
+
|
590
|
+
@is = {:one => :yay}
|
591
|
+
@should = {:one => :yay, :two => :foo}
|
592
|
+
|
593
|
+
@manager.expects(:modify).with { |name, mods| name == @name }
|
594
|
+
@manager.update(@name, @is, @should)
|
595
|
+
end
|
596
|
+
|
597
|
+
it "should create the LDAP::Mod with the property name converted to the ldap name as a string" do
|
598
|
+
@is = {:one => :yay}
|
599
|
+
@should = {:one => :yay, :two => :foo}
|
600
|
+
mod = mock 'module'
|
601
|
+
LDAP::Mod.expects(:new).with { |form, name, value| name == "dos" }.returns mod
|
602
|
+
|
603
|
+
@manager.stubs(:modify)
|
604
|
+
|
605
|
+
@manager.update(@name, @is, @should)
|
606
|
+
end
|
607
|
+
|
608
|
+
it "should create an LDAP::Mod instance of type LDAP_MOD_ADD for each attribute being added, with the attribute value converted to a string of arrays" do
|
609
|
+
@is = {:one => :yay}
|
610
|
+
@should = {:one => :yay, :two => :foo}
|
611
|
+
mod = mock 'module'
|
612
|
+
LDAP::Mod.expects(:new).with(LDAP::LDAP_MOD_ADD, "dos", ["foo"]).returns mod
|
613
|
+
|
614
|
+
@manager.stubs(:modify)
|
615
|
+
|
616
|
+
@manager.update(@name, @is, @should)
|
617
|
+
end
|
618
|
+
|
619
|
+
it "should create an LDAP::Mod instance of type LDAP_MOD_DELETE for each attribute being deleted" do
|
620
|
+
@is = {:one => :yay, :two => :foo}
|
621
|
+
@should = {:one => :yay, :two => :absent}
|
622
|
+
mod = mock 'module'
|
623
|
+
LDAP::Mod.expects(:new).with(LDAP::LDAP_MOD_DELETE, "dos", []).returns mod
|
624
|
+
|
625
|
+
@manager.stubs(:modify)
|
626
|
+
|
627
|
+
@manager.update(@name, @is, @should)
|
628
|
+
end
|
629
|
+
|
630
|
+
it "should create an LDAP::Mod instance of type LDAP_MOD_REPLACE for each attribute being modified, with the attribute converted to a string of arrays" do
|
631
|
+
@is = {:one => :yay, :two => :four}
|
632
|
+
@should = {:one => :yay, :two => :five}
|
633
|
+
mod = mock 'module'
|
634
|
+
LDAP::Mod.expects(:new).with(LDAP::LDAP_MOD_REPLACE, "dos", ["five"]).returns mod
|
635
|
+
|
636
|
+
@manager.stubs(:modify)
|
637
|
+
|
638
|
+
@manager.update(@name, @is, @should)
|
639
|
+
end
|
640
|
+
|
641
|
+
it "should pass all created Mod instances to the modify method" do
|
642
|
+
@is = {:one => :yay, :two => :foo, :three => :absent}
|
643
|
+
@should = {:one => :yay, :two => :foe, :three => :fee, :four => :fie}
|
644
|
+
LDAP::Mod.expects(:new).times(3).returns("mod1").then.returns("mod2").then.returns("mod3")
|
645
|
+
|
646
|
+
@manager.expects(:modify).with do |name, mods|
|
647
|
+
mods.sort == %w{mod1 mod2 mod3}.sort
|
648
|
+
end
|
649
|
+
|
650
|
+
@manager.update(@name, @is, @should)
|
651
|
+
end
|
652
|
+
end
|
653
|
+
end
|
654
|
+
end
|