puppet 6.19.1-x64-mingw32 → 6.23.0-x64-mingw32
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CODEOWNERS +2 -16
- data/Gemfile +3 -1
- data/Gemfile.lock +51 -40
- data/ext/osx/puppet.plist +2 -0
- data/ext/project_data.yaml +2 -2
- data/lib/puppet/application.rb +10 -6
- data/lib/puppet/application/agent.rb +12 -4
- data/lib/puppet/application/apply.rb +4 -2
- data/lib/puppet/application/device.rb +2 -0
- data/lib/puppet/application/filebucket.rb +2 -2
- data/lib/puppet/application/resource.rb +2 -1
- data/lib/puppet/application/script.rb +2 -0
- data/lib/puppet/application/ssl.rb +11 -0
- data/lib/puppet/application_support.rb +7 -0
- data/lib/puppet/configurer.rb +28 -18
- data/lib/puppet/configurer/downloader.rb +2 -1
- data/lib/puppet/defaults.rb +51 -23
- data/lib/puppet/environments.rb +54 -55
- data/lib/puppet/face/config.rb +10 -0
- data/lib/puppet/face/epp.rb +12 -2
- data/lib/puppet/face/facts.rb +158 -0
- data/lib/puppet/ffi/posix.rb +10 -0
- data/lib/puppet/ffi/posix/constants.rb +14 -0
- data/lib/puppet/ffi/posix/functions.rb +24 -0
- data/lib/puppet/file_serving/fileset.rb +14 -2
- data/lib/puppet/file_system/memory_file.rb +8 -1
- data/lib/puppet/file_system/windows.rb +2 -0
- data/lib/puppet/functions/all.rb +1 -1
- data/lib/puppet/functions/camelcase.rb +1 -1
- data/lib/puppet/functions/capitalize.rb +2 -2
- data/lib/puppet/functions/downcase.rb +2 -2
- data/lib/puppet/functions/epp.rb +1 -0
- data/lib/puppet/functions/get.rb +5 -5
- data/lib/puppet/functions/group_by.rb +13 -5
- data/lib/puppet/functions/inline_epp.rb +1 -0
- data/lib/puppet/functions/lest.rb +1 -1
- data/lib/puppet/functions/new.rb +100 -100
- data/lib/puppet/functions/partition.rb +12 -4
- data/lib/puppet/functions/require.rb +5 -5
- data/lib/puppet/functions/sort.rb +3 -3
- data/lib/puppet/functions/tree_each.rb +7 -9
- data/lib/puppet/functions/type.rb +4 -4
- data/lib/puppet/functions/upcase.rb +2 -2
- data/lib/puppet/http/resolver/server_list.rb +15 -4
- data/lib/puppet/http/service/compiler.rb +69 -0
- data/lib/puppet/http/service/file_server.rb +2 -1
- data/lib/puppet/indirector/catalog/compiler.rb +1 -0
- data/lib/puppet/indirector/fact_search.rb +60 -0
- data/lib/puppet/indirector/facts/facter.rb +24 -3
- data/lib/puppet/indirector/facts/json.rb +27 -0
- data/lib/puppet/indirector/facts/yaml.rb +3 -58
- data/lib/puppet/indirector/file_metadata/rest.rb +1 -0
- data/lib/puppet/indirector/json.rb +5 -1
- data/lib/puppet/indirector/node/json.rb +8 -0
- data/lib/puppet/indirector/report/json.rb +34 -0
- data/lib/puppet/module_tool/applications/installer.rb +48 -2
- data/lib/puppet/module_tool/errors/shared.rb +17 -2
- data/lib/puppet/network/formats.rb +69 -1
- data/lib/puppet/network/http/factory.rb +4 -0
- data/lib/puppet/pal/pal_impl.rb +70 -17
- data/lib/puppet/parser/ast/leaf.rb +3 -2
- data/lib/puppet/parser/functions/fqdn_rand.rb +14 -6
- data/lib/puppet/parser/templatewrapper.rb +1 -1
- data/lib/puppet/pops/evaluator/deferred_resolver.rb +5 -3
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +22 -3
- data/lib/puppet/pops/model/ast_transformer.rb +1 -1
- data/lib/puppet/pops/types/p_sem_ver_type.rb +8 -2
- data/lib/puppet/pops/types/p_sensitive_type.rb +10 -0
- data/lib/puppet/property/list.rb +1 -1
- data/lib/puppet/provider/group/groupadd.rb +13 -8
- data/lib/puppet/provider/package/apt.rb +34 -2
- data/lib/puppet/provider/package/aptitude.rb +6 -0
- data/lib/puppet/provider/package/dnfmodule.rb +1 -1
- data/lib/puppet/provider/package/nim.rb +11 -6
- data/lib/puppet/provider/service/debian.rb +2 -0
- data/lib/puppet/provider/service/systemd.rb +14 -4
- data/lib/puppet/provider/service/windows.rb +38 -0
- data/lib/puppet/provider/user/aix.rb +2 -2
- data/lib/puppet/provider/user/directoryservice.rb +25 -12
- data/lib/puppet/provider/user/useradd.rb +62 -8
- data/lib/puppet/reference/configuration.rb +7 -6
- data/lib/puppet/settings.rb +33 -28
- data/lib/puppet/settings/alias_setting.rb +37 -0
- data/lib/puppet/settings/base_setting.rb +26 -2
- data/lib/puppet/settings/environment_conf.rb +1 -0
- data/lib/puppet/transaction/additional_resource_generator.rb +1 -1
- data/lib/puppet/type/file.rb +19 -1
- data/lib/puppet/type/file/selcontext.rb +1 -1
- data/lib/puppet/type/package.rb +3 -3
- data/lib/puppet/type/service.rb +18 -38
- data/lib/puppet/type/tidy.rb +21 -2
- data/lib/puppet/type/user.rb +38 -20
- data/lib/puppet/util/autoload.rb +1 -8
- data/lib/puppet/util/fact_dif.rb +81 -0
- data/lib/puppet/util/monkey_patches.rb +7 -0
- data/lib/puppet/util/posix.rb +54 -5
- data/lib/puppet/util/rubygems.rb +5 -1
- data/lib/puppet/util/selinux.rb +30 -4
- data/lib/puppet/util/windows/adsi.rb +46 -0
- data/lib/puppet/util/windows/api_types.rb +1 -1
- data/lib/puppet/util/windows/principal.rb +9 -2
- data/lib/puppet/util/windows/service.rb +1 -1
- data/lib/puppet/util/windows/sid.rb +4 -2
- data/lib/puppet/version.rb +1 -1
- data/locales/puppet.pot +372 -288
- data/man/man5/puppet.conf.5 +282 -254
- data/man/man8/puppet-agent.8 +2 -2
- data/man/man8/puppet-apply.8 +2 -2
- data/man/man8/puppet-catalog.8 +1 -1
- data/man/man8/puppet-config.8 +1 -1
- data/man/man8/puppet-describe.8 +1 -1
- data/man/man8/puppet-device.8 +2 -2
- data/man/man8/puppet-doc.8 +1 -1
- data/man/man8/puppet-epp.8 +1 -1
- data/man/man8/puppet-facts.8 +90 -1
- data/man/man8/puppet-filebucket.8 +3 -3
- data/man/man8/puppet-generate.8 +1 -1
- data/man/man8/puppet-help.8 +1 -1
- data/man/man8/puppet-key.8 +1 -1
- data/man/man8/puppet-lookup.8 +1 -1
- data/man/man8/puppet-man.8 +1 -1
- data/man/man8/puppet-module.8 +1 -1
- data/man/man8/puppet-node.8 +4 -1
- data/man/man8/puppet-parser.8 +1 -1
- data/man/man8/puppet-plugin.8 +1 -1
- data/man/man8/puppet-report.8 +4 -1
- data/man/man8/puppet-resource.8 +1 -1
- data/man/man8/puppet-script.8 +2 -2
- data/man/man8/puppet-ssl.8 +5 -1
- data/man/man8/puppet-status.8 +1 -1
- data/man/man8/puppet.8 +2 -2
- data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +91 -0
- data/spec/fixtures/ssl/127.0.0.1-key.pem +107 -57
- data/spec/fixtures/ssl/127.0.0.1.pem +52 -31
- data/spec/fixtures/ssl/bad-basic-constraints.pem +57 -35
- data/spec/fixtures/ssl/bad-int-basic-constraints.pem +57 -35
- data/spec/fixtures/ssl/ca.pem +57 -35
- data/spec/fixtures/ssl/crl.pem +28 -18
- data/spec/fixtures/ssl/ec-key.pem +11 -11
- data/spec/fixtures/ssl/ec.pem +33 -24
- data/spec/fixtures/ssl/encrypted-ec-key.pem +12 -12
- data/spec/fixtures/ssl/encrypted-key.pem +108 -58
- data/spec/fixtures/ssl/intermediate-agent-crl.pem +28 -19
- data/spec/fixtures/ssl/intermediate-agent.pem +57 -36
- data/spec/fixtures/ssl/intermediate-crl.pem +31 -21
- data/spec/fixtures/ssl/intermediate.pem +57 -36
- data/spec/fixtures/ssl/pluto-key.pem +107 -57
- data/spec/fixtures/ssl/pluto.pem +52 -30
- data/spec/fixtures/ssl/request-key.pem +107 -57
- data/spec/fixtures/ssl/request.pem +47 -26
- data/spec/fixtures/ssl/revoked-key.pem +107 -57
- data/spec/fixtures/ssl/revoked.pem +52 -30
- data/spec/fixtures/ssl/signed-key.pem +107 -57
- data/spec/fixtures/ssl/signed.pem +52 -30
- data/spec/fixtures/ssl/tampered-cert.pem +52 -30
- data/spec/fixtures/ssl/tampered-csr.pem +47 -26
- data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +107 -57
- data/spec/fixtures/ssl/unknown-127.0.0.1.pem +50 -29
- data/spec/fixtures/ssl/unknown-ca-key.pem +107 -57
- data/spec/fixtures/ssl/unknown-ca.pem +55 -33
- data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services_vendor_preset +9 -0
- data/spec/fixtures/unit/provider/user/aix/aix_passwd_file.out +4 -0
- data/spec/integration/application/agent_spec.rb +160 -3
- data/spec/integration/application/apply_spec.rb +19 -0
- data/spec/integration/application/plugin_spec.rb +1 -1
- data/spec/integration/application/resource_spec.rb +30 -0
- data/spec/integration/defaults_spec.rb +0 -7
- data/spec/integration/environments/setting_hooks_spec.rb +1 -1
- data/spec/integration/http/client_spec.rb +12 -0
- data/spec/integration/indirector/direct_file_server_spec.rb +1 -3
- data/spec/integration/resource/type_collection_spec.rb +2 -6
- data/spec/integration/transaction_spec.rb +4 -9
- data/spec/integration/util/windows/adsi_spec.rb +21 -1
- data/spec/integration/util/windows/principal_spec.rb +21 -0
- data/spec/integration/util/windows/registry_spec.rb +6 -10
- data/spec/lib/puppet/test_ca.rb +2 -2
- data/spec/lib/puppet_spec/settings.rb +6 -1
- data/spec/spec_helper.rb +12 -5
- data/spec/unit/agent_spec.rb +8 -6
- data/spec/unit/application/agent_spec.rb +7 -3
- data/spec/unit/application/config_spec.rb +224 -4
- data/spec/unit/application/facts_spec.rb +482 -3
- data/spec/unit/application/filebucket_spec.rb +0 -2
- data/spec/unit/application/ssl_spec.rb +23 -0
- data/spec/unit/application_spec.rb +51 -9
- data/spec/unit/configurer/downloader_spec.rb +6 -0
- data/spec/unit/configurer_spec.rb +23 -0
- data/spec/unit/confine/feature_spec.rb +1 -1
- data/spec/unit/confine_spec.rb +8 -2
- data/spec/unit/defaults_spec.rb +36 -1
- data/spec/unit/environments_spec.rb +221 -68
- data/spec/unit/face/config_spec.rb +27 -32
- data/spec/unit/face/facts_spec.rb +4 -0
- data/spec/unit/face/node_spec.rb +0 -11
- data/spec/unit/file_serving/configuration/parser_spec.rb +0 -1
- data/spec/unit/file_serving/fileset_spec.rb +60 -0
- data/spec/unit/file_serving/metadata_spec.rb +3 -3
- data/spec/unit/file_serving/terminus_helper_spec.rb +11 -4
- data/spec/unit/file_system_spec.rb +9 -0
- data/spec/unit/forge/module_release_spec.rb +2 -7
- data/spec/unit/functions/inline_epp_spec.rb +26 -1
- data/spec/unit/gettext/config_spec.rb +12 -0
- data/spec/unit/http/service/compiler_spec.rb +172 -0
- data/spec/unit/http/service_spec.rb +1 -1
- data/spec/unit/indirector/catalog/compiler_spec.rb +14 -10
- data/spec/unit/indirector/face_spec.rb +0 -1
- data/spec/unit/indirector/facts/facter_spec.rb +95 -1
- data/spec/unit/indirector/facts/json_spec.rb +255 -0
- data/spec/unit/indirector/file_bucket_file/selector_spec.rb +26 -8
- data/spec/unit/indirector/indirection_spec.rb +8 -12
- data/spec/unit/indirector/key/file_spec.rb +0 -1
- data/spec/unit/indirector/node/json_spec.rb +33 -0
- data/spec/{integration/indirector/report/yaml.rb → unit/indirector/report/json_spec.rb} +13 -24
- data/spec/unit/indirector/report/yaml_spec.rb +72 -8
- data/spec/unit/indirector_spec.rb +2 -2
- data/spec/unit/module_tool/applications/installer_spec.rb +66 -0
- data/spec/unit/network/authconfig_spec.rb +0 -3
- data/spec/unit/network/formats_spec.rb +41 -0
- data/spec/unit/network/http/api/indirected_routes_spec.rb +0 -9
- data/spec/unit/network/http/factory_spec.rb +19 -0
- data/spec/unit/network/http/handler_spec.rb +0 -5
- data/spec/unit/parser/compiler_spec.rb +3 -19
- data/spec/unit/parser/functions/fqdn_rand_spec.rb +15 -1
- data/spec/unit/parser/resource_spec.rb +14 -8
- data/spec/unit/parser/templatewrapper_spec.rb +4 -3
- data/spec/unit/pops/evaluator/deferred_resolver_spec.rb +20 -0
- data/spec/unit/pops/types/p_sem_ver_type_spec.rb +18 -0
- data/spec/unit/pops/types/p_sensitive_type_spec.rb +18 -0
- data/spec/unit/property_spec.rb +1 -0
- data/spec/unit/provider/group/groupadd_spec.rb +5 -2
- data/spec/unit/provider/nameservice_spec.rb +66 -65
- data/spec/unit/provider/package/apt_spec.rb +28 -23
- data/spec/unit/provider/package/aptitude_spec.rb +1 -1
- data/spec/unit/provider/package/base_spec.rb +6 -5
- data/spec/unit/provider/package/dnfmodule_spec.rb +10 -1
- data/spec/unit/provider/package/nim_spec.rb +42 -0
- data/spec/unit/provider/package/pacman_spec.rb +18 -12
- data/spec/unit/provider/package/pip_spec.rb +6 -11
- data/spec/unit/provider/package/pkgdmg_spec.rb +0 -4
- data/spec/unit/provider/service/init_spec.rb +1 -0
- data/spec/unit/provider/service/openwrt_spec.rb +3 -1
- data/spec/unit/provider/service/systemd_spec.rb +53 -8
- data/spec/unit/provider/service/windows_spec.rb +202 -0
- data/spec/unit/provider/user/aix_spec.rb +5 -0
- data/spec/unit/provider/user/directoryservice_spec.rb +67 -35
- data/spec/unit/provider/user/hpux_spec.rb +1 -1
- data/spec/unit/provider/user/pw_spec.rb +2 -0
- data/spec/unit/provider/user/useradd_spec.rb +71 -3
- data/spec/unit/provider_spec.rb +8 -10
- data/spec/unit/puppet_pal_catalog_spec.rb +45 -0
- data/spec/unit/resource/capability_finder_spec.rb +6 -1
- data/spec/unit/resource/catalog_spec.rb +1 -1
- data/spec/unit/resource/type_spec.rb +1 -1
- data/spec/unit/resource_spec.rb +11 -10
- data/spec/unit/settings_spec.rb +419 -242
- data/spec/unit/ssl/base_spec.rb +0 -1
- data/spec/unit/ssl/host_spec.rb +0 -5
- data/spec/unit/ssl/ssl_provider_spec.rb +14 -8
- data/spec/unit/ssl/state_machine_spec.rb +19 -5
- data/spec/unit/transaction/additional_resource_generator_spec.rb +3 -9
- data/spec/unit/transaction/event_manager_spec.rb +14 -11
- data/spec/unit/transaction_spec.rb +18 -11
- data/spec/unit/type/file/content_spec.rb +0 -1
- data/spec/unit/type/file/selinux_spec.rb +3 -5
- data/spec/unit/type/file_spec.rb +0 -6
- data/spec/unit/type/group_spec.rb +13 -6
- data/spec/unit/type/resources_spec.rb +7 -7
- data/spec/unit/type/service_spec.rb +60 -189
- data/spec/unit/type/tidy_spec.rb +17 -8
- data/spec/unit/type/user_spec.rb +45 -0
- data/spec/unit/type_spec.rb +2 -2
- data/spec/unit/util/at_fork_spec.rb +2 -2
- data/spec/unit/util/autoload_spec.rb +5 -1
- data/spec/unit/util/backups_spec.rb +1 -2
- data/spec/unit/util/execution_spec.rb +15 -11
- data/spec/unit/util/inifile_spec.rb +6 -14
- data/spec/unit/util/log_spec.rb +8 -7
- data/spec/unit/util/logging_spec.rb +3 -3
- data/spec/unit/util/posix_spec.rb +363 -15
- data/spec/unit/util/rubygems_spec.rb +2 -2
- data/spec/unit/util/selinux_spec.rb +163 -68
- data/spec/unit/util/storage_spec.rb +3 -1
- data/spec/unit/util/suidmanager_spec.rb +44 -41
- data/spec/unit/util/windows/sid_spec.rb +6 -0
- data/spec/unit/util_spec.rb +13 -6
- data/tasks/generate_cert_fixtures.rake +2 -2
- metadata +33 -16
- data/spec/integration/application/config_spec.rb +0 -74
- data/spec/lib/matchers/include.rb +0 -27
- data/spec/lib/matchers/include_spec.rb +0 -32
- data/spec/unit/face/catalog_spec.rb +0 -6
- data/spec/unit/face/module_spec.rb +0 -3
@@ -137,7 +137,7 @@ describe Puppet::HTTP::Service do
|
|
137
137
|
catalog_mimes = if Puppet.features.msgpack?
|
138
138
|
%w[application/vnd.puppet.rich+json application/json application/vnd.puppet.rich+msgpack application/x-msgpack text/pson]
|
139
139
|
else
|
140
|
-
%w[application/vnd.puppet.rich+json application/json
|
140
|
+
%w[application/vnd.puppet.rich+json application/json text/pson]
|
141
141
|
end
|
142
142
|
expect(service.mime_types(Puppet::Resource::Catalog)).to eq(catalog_mimes)
|
143
143
|
end
|
@@ -909,9 +909,10 @@ describe Puppet::Resource::Catalog::Compiler do
|
|
909
909
|
it "inlines child metadata" do
|
910
910
|
catalog = compile_to_catalog(<<-MANIFEST, node)
|
911
911
|
file { '#{path}':
|
912
|
-
ensure
|
913
|
-
recurse
|
914
|
-
source
|
912
|
+
ensure => directory,
|
913
|
+
recurse => true,
|
914
|
+
source => '#{source_dir}',
|
915
|
+
max_files => 1234,
|
915
916
|
}
|
916
917
|
MANIFEST
|
917
918
|
|
@@ -925,6 +926,7 @@ describe Puppet::Resource::Catalog::Compiler do
|
|
925
926
|
:source_permissions => :ignore,
|
926
927
|
:recurse => true,
|
927
928
|
:recurselimit => nil,
|
929
|
+
:max_files => 1234,
|
928
930
|
:ignore => nil,
|
929
931
|
}
|
930
932
|
expect(Puppet::FileServing::Metadata.indirection).to receive(:search).with(source_dir, options).and_return([metadata, child_metadata])
|
@@ -938,14 +940,15 @@ describe Puppet::Resource::Catalog::Compiler do
|
|
938
940
|
it "uses resource parameters when inlining metadata" do
|
939
941
|
catalog = compile_to_catalog(<<-MANIFEST, node)
|
940
942
|
file { '#{path}':
|
941
|
-
ensure
|
942
|
-
recurse
|
943
|
-
source
|
944
|
-
checksum
|
943
|
+
ensure => directory,
|
944
|
+
recurse => true,
|
945
|
+
source => '#{source_dir}',
|
946
|
+
checksum => sha256,
|
945
947
|
source_permissions => use_when_creating,
|
946
|
-
recurselimit
|
947
|
-
|
948
|
-
|
948
|
+
recurselimit => 2,
|
949
|
+
max_files => 4321,
|
950
|
+
ignore => 'foo.+',
|
951
|
+
links => follow,
|
949
952
|
}
|
950
953
|
MANIFEST
|
951
954
|
|
@@ -956,6 +959,7 @@ describe Puppet::Resource::Catalog::Compiler do
|
|
956
959
|
:source_permissions => :use_when_creating,
|
957
960
|
:recurse => true,
|
958
961
|
:recurselimit => 2,
|
962
|
+
:max_files => 4321,
|
959
963
|
:ignore => 'foo.+',
|
960
964
|
}
|
961
965
|
expect(Puppet::FileServing::Metadata.indirection).to receive(:search).with(source_dir, options).and_return([metadata, child_metadata])
|
@@ -33,7 +33,6 @@ describe Puppet::Indirector::Face do
|
|
33
33
|
describe "as an instance" do
|
34
34
|
it "should be able to determine its indirection" do
|
35
35
|
# Loading actions here can get, um, complicated
|
36
|
-
allow(Puppet::Face).to receive(:load_actions)
|
37
36
|
expect(Puppet::Indirector::Face.new(:catalog, '0.0.1').indirection).to equal(Puppet::Resource::Catalog.indirection)
|
38
37
|
end
|
39
38
|
end
|
@@ -22,13 +22,13 @@ describe Puppet::Node::Facts::Facter do
|
|
22
22
|
end
|
23
23
|
|
24
24
|
before :each do
|
25
|
-
allow(Puppet::Node::Facts::Facter).to receive(:reload_facter)
|
26
25
|
@facter = Puppet::Node::Facts::Facter.new
|
27
26
|
allow(Facter).to receive(:to_hash).and_return({})
|
28
27
|
@name = "me"
|
29
28
|
@request = double('request', :key => @name)
|
30
29
|
@environment = double('environment')
|
31
30
|
allow(@request).to receive(:environment).and_return(@environment)
|
31
|
+
allow(@request).to receive(:options).and_return({})
|
32
32
|
allow(@request.environment).to receive(:modules).and_return([])
|
33
33
|
allow(@request.environment).to receive(:modulepath).and_return([])
|
34
34
|
end
|
@@ -105,6 +105,7 @@ describe Puppet::Node::Facts::Facter do
|
|
105
105
|
expect(FileTest).to receive(:directory?).with(factpath1).and_return(true)
|
106
106
|
expect(FileTest).to receive(:directory?).with(factpath2).and_return(true)
|
107
107
|
allow(@request.environment).to receive(:modulepath).and_return([modulepath])
|
108
|
+
allow(@request).to receive(:options).and_return({})
|
108
109
|
expect(Dir).to receive(:glob).with("#{modulepath}/*/lib/facter").and_return([modulelibfacter])
|
109
110
|
expect(Dir).to receive(:glob).with("#{modulepath}/*/plugins/facter").and_return([modulepluginsfacter])
|
110
111
|
|
@@ -150,4 +151,97 @@ describe Puppet::Node::Facts::Facter do
|
|
150
151
|
Puppet::Node::Facts::Facter.setup_external_search_paths @request
|
151
152
|
end
|
152
153
|
end
|
154
|
+
|
155
|
+
describe 'when :resolve_options is true' do
|
156
|
+
let(:options) { { resolve_options: true, user_query: ["os", "timezone"], show_legacy: true } }
|
157
|
+
let(:facts) { Puppet::Node::Facts.new("foo") }
|
158
|
+
|
159
|
+
before :each do
|
160
|
+
allow(@request).to receive(:options).and_return(options)
|
161
|
+
allow(Puppet::Node::Facts).to receive(:new).and_return(facts)
|
162
|
+
allow(facts).to receive(:add_local_facts)
|
163
|
+
end
|
164
|
+
|
165
|
+
it 'should call Facter.resolve method' do
|
166
|
+
expect(Facter).to receive(:resolve).with("os timezone --show-legacy")
|
167
|
+
@facter.find(@request)
|
168
|
+
end
|
169
|
+
|
170
|
+
it 'should NOT add local facts' do
|
171
|
+
expect(facts).not_to receive(:add_local_facts)
|
172
|
+
|
173
|
+
@facter.find(@request)
|
174
|
+
end
|
175
|
+
|
176
|
+
describe 'when Facter version is lower than 4.0.40' do
|
177
|
+
before :each do
|
178
|
+
allow(Facter).to receive(:respond_to?).and_return(false)
|
179
|
+
allow(Facter).to receive(:respond_to?).with(:resolve).and_return(false)
|
180
|
+
end
|
181
|
+
|
182
|
+
it 'raises an error' do
|
183
|
+
expect { @facter.find(@request) }.to raise_error(Puppet::Error, "puppet facts show requires version 4.0.40 or greater of Facter.")
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
describe 'when setting up external search paths' do
|
188
|
+
let(:options) { { resolve_options: true, user_query: ["os", "timezone"], external_dir: 'some/dir' } }
|
189
|
+
let(:pluginfactdest) { File.expand_path 'plugin/dest' }
|
190
|
+
let(:modulepath) { File.expand_path 'module/foo' }
|
191
|
+
let(:modulefactsd) { File.expand_path 'module/foo/facts.d' }
|
192
|
+
|
193
|
+
before :each do
|
194
|
+
expect(FileTest).to receive(:directory?).with(pluginfactdest).and_return(true)
|
195
|
+
mod = Puppet::Module.new('foo', modulepath, @request.environment)
|
196
|
+
allow(@request.environment).to receive(:modules).and_return([mod])
|
197
|
+
Puppet[:pluginfactdest] = pluginfactdest
|
198
|
+
end
|
199
|
+
|
200
|
+
it 'should skip files' do
|
201
|
+
expect(File).to receive(:directory?).with(modulefactsd).and_return(false)
|
202
|
+
expect(Facter).to receive(:search_external).with([pluginfactdest, options[:external_dir]])
|
203
|
+
Puppet::Node::Facts::Facter.setup_external_search_paths @request
|
204
|
+
end
|
205
|
+
|
206
|
+
it 'should add directories' do
|
207
|
+
expect(File).to receive(:directory?).with(modulefactsd).and_return(true)
|
208
|
+
expect(Facter).to receive(:search_external).with([modulefactsd, pluginfactdest, options[:external_dir]])
|
209
|
+
Puppet::Node::Facts::Facter.setup_external_search_paths @request
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
describe 'when setting up search paths' do
|
214
|
+
let(:factpath1) { File.expand_path 'one' }
|
215
|
+
let(:factpath2) { File.expand_path 'two' }
|
216
|
+
let(:factpath) { [factpath1, factpath2].join(File::PATH_SEPARATOR) }
|
217
|
+
let(:modulepath) { File.expand_path 'module/foo' }
|
218
|
+
let(:modulelibfacter) { File.expand_path 'module/foo/lib/facter' }
|
219
|
+
let(:modulepluginsfacter) { File.expand_path 'module/foo/plugins/facter' }
|
220
|
+
let(:options) { { resolve_options: true, custom_dir: 'some/dir' } }
|
221
|
+
|
222
|
+
before :each do
|
223
|
+
expect(FileTest).to receive(:directory?).with(factpath1).and_return(true)
|
224
|
+
expect(FileTest).to receive(:directory?).with(factpath2).and_return(true)
|
225
|
+
allow(@request.environment).to receive(:modulepath).and_return([modulepath])
|
226
|
+
expect(Dir).to receive(:glob).with("#{modulepath}/*/lib/facter").and_return([modulelibfacter])
|
227
|
+
expect(Dir).to receive(:glob).with("#{modulepath}/*/plugins/facter").and_return([modulepluginsfacter])
|
228
|
+
|
229
|
+
Puppet[:factpath] = factpath
|
230
|
+
end
|
231
|
+
|
232
|
+
it 'should skip files' do
|
233
|
+
expect(FileTest).to receive(:directory?).with(modulelibfacter).and_return(false)
|
234
|
+
expect(FileTest).to receive(:directory?).with(modulepluginsfacter).and_return(false)
|
235
|
+
expect(Facter).to receive(:search).with(factpath1, factpath2, options[:custom_dir])
|
236
|
+
Puppet::Node::Facts::Facter.setup_search_paths @request
|
237
|
+
end
|
238
|
+
|
239
|
+
it 'should add directories' do
|
240
|
+
expect(FileTest).to receive(:directory?).with(modulelibfacter).and_return(true)
|
241
|
+
expect(FileTest).to receive(:directory?).with(modulepluginsfacter).and_return(false)
|
242
|
+
expect(Facter).to receive(:search).with(modulelibfacter, factpath1, factpath2, options[:custom_dir])
|
243
|
+
Puppet::Node::Facts::Facter.setup_search_paths @request
|
244
|
+
end
|
245
|
+
end
|
246
|
+
end
|
153
247
|
end
|
@@ -0,0 +1,255 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'puppet/node/facts'
|
4
|
+
require 'puppet/indirector/facts/json'
|
5
|
+
|
6
|
+
def dir_containing_json_facts(hash)
|
7
|
+
jsondir = tmpdir('json_facts')
|
8
|
+
|
9
|
+
Puppet[:client_datadir] = jsondir
|
10
|
+
dir = File.join(jsondir, 'facts')
|
11
|
+
Dir.mkdir(dir)
|
12
|
+
hash.each_pair do |file, facts|
|
13
|
+
File.open(File.join(dir, file), 'wb') do |f|
|
14
|
+
f.write(JSON.dump(facts))
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe Puppet::Node::Facts::Json do
|
20
|
+
include PuppetSpec::Files
|
21
|
+
|
22
|
+
it "should be a subclass of the Json terminus" do
|
23
|
+
expect(Puppet::Node::Facts::Json.superclass).to equal(Puppet::Indirector::JSON)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should have documentation" do
|
27
|
+
expect(Puppet::Node::Facts::Json.doc).not_to be_nil
|
28
|
+
expect(Puppet::Node::Facts::Json.doc).not_to be_empty
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should be registered with the facts indirection" do
|
32
|
+
indirection = Puppet::Indirector::Indirection.instance(:facts)
|
33
|
+
expect(Puppet::Node::Facts::Json.indirection).to equal(indirection)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should have its name set to :json" do
|
37
|
+
expect(Puppet::Node::Facts::Json.name).to eq(:json)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should allow network requests" do
|
41
|
+
# Doesn't allow json as a network format, but allows `puppet facts upload`
|
42
|
+
# to update the JSON cache on a master.
|
43
|
+
expect(Puppet::Node::Facts::Json.new.allow_remote_requests?).to be(true)
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "#search" do
|
47
|
+
def assert_search_matches(matching, nonmatching, query)
|
48
|
+
request = Puppet::Indirector::Request.new(:inventory, :search, nil, nil, query)
|
49
|
+
|
50
|
+
dir_containing_json_facts(matching.merge(nonmatching))
|
51
|
+
|
52
|
+
results = Puppet::Node::Facts::Json.new.search(request)
|
53
|
+
expect(results).to match_array(matching.values.map {|facts| facts.name})
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should return node names that match the search query options" do
|
57
|
+
assert_search_matches({
|
58
|
+
'matching.json' => Puppet::Node::Facts.new("matchingnode", "architecture" => "i386", 'processor_count' => '4'),
|
59
|
+
'matching1.json' => Puppet::Node::Facts.new("matchingnode1", "architecture" => "i386", 'processor_count' => '4', 'randomfact' => 'foo')
|
60
|
+
},
|
61
|
+
{
|
62
|
+
"nonmatching.json" => Puppet::Node::Facts.new("nonmatchingnode", "architecture" => "powerpc", 'processor_count' => '4'),
|
63
|
+
"nonmatching1.json" => Puppet::Node::Facts.new("nonmatchingnode1", "architecture" => "powerpc", 'processor_count' => '5'),
|
64
|
+
"nonmatching2.json" => Puppet::Node::Facts.new("nonmatchingnode2", "architecture" => "i386", 'processor_count' => '5'),
|
65
|
+
"nonmatching3.json" => Puppet::Node::Facts.new("nonmatchingnode3", 'processor_count' => '4'),
|
66
|
+
},
|
67
|
+
{'facts.architecture' => 'i386', 'facts.processor_count' => '4'}
|
68
|
+
)
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should return empty array when no nodes match the search query options" do
|
72
|
+
assert_search_matches({}, {
|
73
|
+
"nonmatching.json" => Puppet::Node::Facts.new("nonmatchingnode", "architecture" => "powerpc", 'processor_count' => '10'),
|
74
|
+
"nonmatching1.json" => Puppet::Node::Facts.new("nonmatchingnode1", "architecture" => "powerpc", 'processor_count' => '5'),
|
75
|
+
"nonmatching2.json" => Puppet::Node::Facts.new("nonmatchingnode2", "architecture" => "i386", 'processor_count' => '5'),
|
76
|
+
"nonmatching3.json" => Puppet::Node::Facts.new("nonmatchingnode3", 'processor_count' => '4'),
|
77
|
+
},
|
78
|
+
{'facts.processor_count.lt' => '4', 'facts.processor_count.gt' => '4'}
|
79
|
+
)
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should return node names that match the search query options with the greater than operator" do
|
83
|
+
assert_search_matches({
|
84
|
+
'matching.json' => Puppet::Node::Facts.new("matchingnode", "architecture" => "i386", 'processor_count' => '5'),
|
85
|
+
'matching1.json' => Puppet::Node::Facts.new("matchingnode1", "architecture" => "powerpc", 'processor_count' => '10', 'randomfact' => 'foo')
|
86
|
+
},
|
87
|
+
{
|
88
|
+
"nonmatching.json" => Puppet::Node::Facts.new("nonmatchingnode", "architecture" => "powerpc", 'processor_count' => '4'),
|
89
|
+
"nonmatching2.json" => Puppet::Node::Facts.new("nonmatchingnode2", "architecture" => "i386", 'processor_count' => '3'),
|
90
|
+
"nonmatching3.json" => Puppet::Node::Facts.new("nonmatchingnode3" ),
|
91
|
+
},
|
92
|
+
{'facts.processor_count.gt' => '4'}
|
93
|
+
)
|
94
|
+
end
|
95
|
+
|
96
|
+
it "should return node names that match the search query options with the less than operator" do
|
97
|
+
assert_search_matches({
|
98
|
+
'matching.json' => Puppet::Node::Facts.new("matchingnode", "architecture" => "i386", 'processor_count' => '5'),
|
99
|
+
'matching1.json' => Puppet::Node::Facts.new("matchingnode1", "architecture" => "powerpc", 'processor_count' => '30', 'randomfact' => 'foo')
|
100
|
+
},
|
101
|
+
{
|
102
|
+
"nonmatching.json" => Puppet::Node::Facts.new("nonmatchingnode", "architecture" => "powerpc", 'processor_count' => '50' ),
|
103
|
+
"nonmatching2.json" => Puppet::Node::Facts.new("nonmatchingnode2", "architecture" => "i386", 'processor_count' => '100'),
|
104
|
+
"nonmatching3.json" => Puppet::Node::Facts.new("nonmatchingnode3" ),
|
105
|
+
},
|
106
|
+
{'facts.processor_count.lt' => '50'}
|
107
|
+
)
|
108
|
+
end
|
109
|
+
|
110
|
+
it "should return node names that match the search query options with the less than or equal to operator" do
|
111
|
+
assert_search_matches({
|
112
|
+
'matching.json' => Puppet::Node::Facts.new("matchingnode", "architecture" => "i386", 'processor_count' => '5'),
|
113
|
+
'matching1.json' => Puppet::Node::Facts.new("matchingnode1", "architecture" => "powerpc", 'processor_count' => '50', 'randomfact' => 'foo')
|
114
|
+
},
|
115
|
+
{
|
116
|
+
"nonmatching.json" => Puppet::Node::Facts.new("nonmatchingnode", "architecture" => "powerpc", 'processor_count' => '100' ),
|
117
|
+
"nonmatching2.json" => Puppet::Node::Facts.new("nonmatchingnode2", "architecture" => "i386", 'processor_count' => '5000'),
|
118
|
+
"nonmatching3.json" => Puppet::Node::Facts.new("nonmatchingnode3" ),
|
119
|
+
},
|
120
|
+
{'facts.processor_count.le' => '50'}
|
121
|
+
)
|
122
|
+
end
|
123
|
+
|
124
|
+
it "should return node names that match the search query options with the greater than or equal to operator" do
|
125
|
+
assert_search_matches({
|
126
|
+
'matching.json' => Puppet::Node::Facts.new("matchingnode", "architecture" => "i386", 'processor_count' => '100'),
|
127
|
+
'matching1.json' => Puppet::Node::Facts.new("matchingnode1", "architecture" => "powerpc", 'processor_count' => '50', 'randomfact' => 'foo')
|
128
|
+
},
|
129
|
+
{
|
130
|
+
"nonmatching.json" => Puppet::Node::Facts.new("nonmatchingnode", "architecture" => "powerpc", 'processor_count' => '40'),
|
131
|
+
"nonmatching2.json" => Puppet::Node::Facts.new("nonmatchingnode2", "architecture" => "i386", 'processor_count' => '9' ),
|
132
|
+
"nonmatching3.json" => Puppet::Node::Facts.new("nonmatchingnode3" ),
|
133
|
+
},
|
134
|
+
{'facts.processor_count.ge' => '50'}
|
135
|
+
)
|
136
|
+
end
|
137
|
+
|
138
|
+
it "should return node names that match the search query options with the not equal operator" do
|
139
|
+
assert_search_matches({
|
140
|
+
'matching.json' => Puppet::Node::Facts.new("matchingnode", "architecture" => 'arm' ),
|
141
|
+
'matching1.json' => Puppet::Node::Facts.new("matchingnode1", "architecture" => 'powerpc', 'randomfact' => 'foo')
|
142
|
+
},
|
143
|
+
{
|
144
|
+
"nonmatching.json" => Puppet::Node::Facts.new("nonmatchingnode", "architecture" => "i386" ),
|
145
|
+
"nonmatching2.json" => Puppet::Node::Facts.new("nonmatchingnode2", "architecture" => "i386", 'processor_count' => '9' ),
|
146
|
+
"nonmatching3.json" => Puppet::Node::Facts.new("nonmatchingnode3" ),
|
147
|
+
},
|
148
|
+
{'facts.architecture.ne' => 'i386'}
|
149
|
+
)
|
150
|
+
end
|
151
|
+
|
152
|
+
def apply_timestamp(facts, timestamp)
|
153
|
+
facts.timestamp = timestamp
|
154
|
+
facts
|
155
|
+
end
|
156
|
+
|
157
|
+
it "should be able to query based on meta.timestamp.gt" do
|
158
|
+
assert_search_matches({
|
159
|
+
'2010-11-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-01", {}), Time.parse("2010-11-01")),
|
160
|
+
'2010-11-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-10", {}), Time.parse("2010-11-10")),
|
161
|
+
},
|
162
|
+
{
|
163
|
+
'2010-10-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-01", {}), Time.parse("2010-10-01")),
|
164
|
+
'2010-10-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-10", {}), Time.parse("2010-10-10")),
|
165
|
+
'2010-10-15.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-15", {}), Time.parse("2010-10-15")),
|
166
|
+
},
|
167
|
+
{'meta.timestamp.gt' => '2010-10-15'}
|
168
|
+
)
|
169
|
+
end
|
170
|
+
|
171
|
+
it "should be able to query based on meta.timestamp.le" do
|
172
|
+
assert_search_matches({
|
173
|
+
'2010-10-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-01", {}), Time.parse("2010-10-01")),
|
174
|
+
'2010-10-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-10", {}), Time.parse("2010-10-10")),
|
175
|
+
'2010-10-15.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-15", {}), Time.parse("2010-10-15")),
|
176
|
+
},
|
177
|
+
{
|
178
|
+
'2010-11-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-01", {}), Time.parse("2010-11-01")),
|
179
|
+
'2010-11-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-10", {}), Time.parse("2010-11-10")),
|
180
|
+
},
|
181
|
+
{'meta.timestamp.le' => '2010-10-15'}
|
182
|
+
)
|
183
|
+
end
|
184
|
+
|
185
|
+
it "should be able to query based on meta.timestamp.lt" do
|
186
|
+
assert_search_matches({
|
187
|
+
'2010-10-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-01", {}), Time.parse("2010-10-01")),
|
188
|
+
'2010-10-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-10", {}), Time.parse("2010-10-10")),
|
189
|
+
},
|
190
|
+
{
|
191
|
+
'2010-11-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-01", {}), Time.parse("2010-11-01")),
|
192
|
+
'2010-11-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-10", {}), Time.parse("2010-11-10")),
|
193
|
+
'2010-10-15.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-15", {}), Time.parse("2010-10-15")),
|
194
|
+
},
|
195
|
+
{'meta.timestamp.lt' => '2010-10-15'}
|
196
|
+
)
|
197
|
+
end
|
198
|
+
|
199
|
+
it "should be able to query based on meta.timestamp.ge" do
|
200
|
+
assert_search_matches({
|
201
|
+
'2010-11-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-01", {}), Time.parse("2010-11-01")),
|
202
|
+
'2010-11-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-10", {}), Time.parse("2010-11-10")),
|
203
|
+
'2010-10-15.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-15", {}), Time.parse("2010-10-15")),
|
204
|
+
},
|
205
|
+
{
|
206
|
+
'2010-10-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-01", {}), Time.parse("2010-10-01")),
|
207
|
+
'2010-10-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-10", {}), Time.parse("2010-10-10")),
|
208
|
+
},
|
209
|
+
{'meta.timestamp.ge' => '2010-10-15'}
|
210
|
+
)
|
211
|
+
end
|
212
|
+
|
213
|
+
it "should be able to query based on meta.timestamp.eq" do
|
214
|
+
assert_search_matches({
|
215
|
+
'2010-10-15.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-15", {}), Time.parse("2010-10-15")),
|
216
|
+
},
|
217
|
+
{
|
218
|
+
'2010-11-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-01", {}), Time.parse("2010-11-01")),
|
219
|
+
'2010-11-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-10", {}), Time.parse("2010-11-10")),
|
220
|
+
'2010-10-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-01", {}), Time.parse("2010-10-01")),
|
221
|
+
'2010-10-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-10", {}), Time.parse("2010-10-10")),
|
222
|
+
},
|
223
|
+
{'meta.timestamp.eq' => '2010-10-15'}
|
224
|
+
)
|
225
|
+
end
|
226
|
+
|
227
|
+
it "should be able to query based on meta.timestamp" do
|
228
|
+
assert_search_matches({
|
229
|
+
'2010-10-15.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-15", {}), Time.parse("2010-10-15")),
|
230
|
+
},
|
231
|
+
{
|
232
|
+
'2010-11-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-01", {}), Time.parse("2010-11-01")),
|
233
|
+
'2010-11-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-10", {}), Time.parse("2010-11-10")),
|
234
|
+
'2010-10-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-01", {}), Time.parse("2010-10-01")),
|
235
|
+
'2010-10-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-10", {}), Time.parse("2010-10-10")),
|
236
|
+
},
|
237
|
+
{'meta.timestamp' => '2010-10-15'}
|
238
|
+
)
|
239
|
+
end
|
240
|
+
|
241
|
+
it "should be able to query based on meta.timestamp.ne" do
|
242
|
+
assert_search_matches({
|
243
|
+
'2010-11-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-01", {}), Time.parse("2010-11-01")),
|
244
|
+
'2010-11-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-11-10", {}), Time.parse("2010-11-10")),
|
245
|
+
'2010-10-01.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-01", {}), Time.parse("2010-10-01")),
|
246
|
+
'2010-10-10.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-10", {}), Time.parse("2010-10-10")),
|
247
|
+
},
|
248
|
+
{
|
249
|
+
'2010-10-15.json' => apply_timestamp(Puppet::Node::Facts.new("2010-10-15", {}), Time.parse("2010-10-15")),
|
250
|
+
},
|
251
|
+
{'meta.timestamp.ne' => '2010-10-15'}
|
252
|
+
)
|
253
|
+
end
|
254
|
+
end
|
255
|
+
end
|
@@ -5,22 +5,40 @@ require 'puppet/indirector/file_bucket_file/file'
|
|
5
5
|
require 'puppet/indirector/file_bucket_file/rest'
|
6
6
|
|
7
7
|
describe Puppet::FileBucketFile::Selector do
|
8
|
+
let(:model) { Puppet::FileBucket::File.new('') }
|
9
|
+
let(:indirection) { Puppet::FileBucket::File.indirection }
|
10
|
+
let(:terminus) { indirection.terminus(:selector) }
|
11
|
+
|
8
12
|
%w[head find save search destroy].each do |method|
|
9
13
|
describe "##{method}" do
|
10
14
|
it "should proxy to rest terminus for https requests" do
|
11
|
-
|
15
|
+
key = "https://example.com/path/to/file"
|
12
16
|
|
13
|
-
|
17
|
+
expect(indirection.terminus(:rest)).to receive(method)
|
14
18
|
|
15
|
-
|
19
|
+
if method == 'save'
|
20
|
+
terminus.send(method, indirection.request(method, key, model))
|
21
|
+
else
|
22
|
+
terminus.send(method, indirection.request(method, key, nil))
|
23
|
+
end
|
16
24
|
end
|
17
25
|
|
18
26
|
it "should proxy to file terminus for other requests" do
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
27
|
+
key = "file:///path/to/file"
|
28
|
+
|
29
|
+
case method
|
30
|
+
when 'save'
|
31
|
+
expect(indirection.terminus(:file)).to receive(method)
|
32
|
+
terminus.send(method, indirection.request(method, key, model))
|
33
|
+
when 'find', 'head'
|
34
|
+
expect(indirection.terminus(:file)).to receive(method)
|
35
|
+
terminus.send(method, indirection.request(method, key, nil))
|
36
|
+
else
|
37
|
+
# file terminus doesn't implement search or destroy
|
38
|
+
expect {
|
39
|
+
terminus.send(method, indirection.request(method, key, nil))
|
40
|
+
}.to raise_error(NoMethodError)
|
41
|
+
end
|
24
42
|
end
|
25
43
|
end
|
26
44
|
end
|