puppet 6.18.0-x86-mingw32 → 6.21.1-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CODEOWNERS +2 -16
- data/Gemfile +2 -0
- data/Gemfile.lock +37 -34
- data/README.md +1 -2
- data/Rakefile +4 -12
- data/lib/puppet/agent/locker.rb +0 -7
- data/lib/puppet/application.rb +10 -6
- data/lib/puppet/application/agent.rb +9 -3
- data/lib/puppet/application/apply.rb +3 -2
- data/lib/puppet/application/device.rb +1 -0
- data/lib/puppet/application/doc.rb +1 -1
- data/lib/puppet/application/filebucket.rb +2 -2
- data/lib/puppet/application/lookup.rb +5 -5
- data/lib/puppet/application/script.rb +1 -0
- data/lib/puppet/application_support.rb +7 -0
- data/lib/puppet/configurer.rb +50 -8
- data/lib/puppet/defaults.rb +67 -35
- data/lib/puppet/environments.rb +84 -59
- data/lib/puppet/face/catalog.rb +1 -1
- data/lib/puppet/face/config.rb +56 -16
- data/lib/puppet/face/epp.rb +12 -2
- data/lib/puppet/face/facts.rb +60 -0
- data/lib/puppet/face/node.rb +3 -3
- data/lib/puppet/face/node/clean.rb +2 -2
- data/lib/puppet/face/status.rb +1 -1
- 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_bucket/dipper.rb +1 -1
- data/lib/puppet/functions/epp.rb +1 -0
- data/lib/puppet/functions/inline_epp.rb +1 -0
- data/lib/puppet/functions/new.rb +8 -3
- data/lib/puppet/http.rb +1 -0
- data/lib/puppet/http/client.rb +1 -1
- data/lib/puppet/http/resolver.rb +5 -8
- data/lib/puppet/http/resolver/server_list.rb +18 -36
- data/lib/puppet/http/resolver/settings.rb +4 -4
- data/lib/puppet/http/resolver/srv.rb +5 -5
- data/lib/puppet/http/service.rb +3 -1
- data/lib/puppet/http/service/compiler.rb +1 -1
- data/lib/puppet/http/service/file_server.rb +1 -1
- data/lib/puppet/http/service/puppetserver.rb +39 -0
- data/lib/puppet/http/session.rb +5 -4
- data/lib/puppet/indirector/catalog/compiler.rb +1 -1
- data/lib/puppet/indirector/fact_search.rb +60 -0
- data/lib/puppet/indirector/facts/json.rb +27 -0
- data/lib/puppet/indirector/facts/yaml.rb +4 -59
- data/lib/puppet/indirector/json.rb +5 -1
- data/lib/puppet/indirector/msgpack.rb +1 -1
- data/lib/puppet/indirector/node/json.rb +8 -0
- data/lib/puppet/indirector/report/json.rb +34 -0
- data/lib/puppet/indirector/request.rb +4 -4
- data/lib/puppet/indirector/yaml.rb +1 -1
- 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 +2 -1
- data/lib/puppet/network/http/api/master/v3/environments.rb +0 -1
- data/lib/puppet/node/facts.rb +17 -0
- data/lib/puppet/pal/pal_impl.rb +70 -17
- data/lib/puppet/parser/ast/leaf.rb +3 -2
- data/lib/puppet/parser/templatewrapper.rb +1 -1
- data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -3
- data/lib/puppet/pops/evaluator/deferred_resolver.rb +5 -3
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +22 -3
- data/lib/puppet/pops/evaluator/runtime3_converter.rb +2 -2
- data/lib/puppet/pops/model/ast_transformer.rb +1 -1
- data/lib/puppet/pops/types/p_meta_type.rb +1 -1
- data/lib/puppet/pops/types/p_type_set_type.rb +4 -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/dpkg.rb +1 -1
- data/lib/puppet/provider/package/pip2.rb +17 -0
- data/lib/puppet/provider/package/puppetserver_gem.rb +180 -0
- data/lib/puppet/provider/package/yum.rb +1 -0
- data/lib/puppet/provider/service/debian.rb +2 -0
- data/lib/puppet/provider/user/aix.rb +2 -2
- data/lib/puppet/provider/user/useradd.rb +62 -8
- data/lib/puppet/reference/configuration.rb +6 -5
- data/lib/puppet/resource/type.rb +2 -1
- data/lib/puppet/rest/route.rb +2 -2
- data/lib/puppet/settings.rb +62 -20
- data/lib/puppet/settings/alias_setting.rb +37 -0
- data/lib/puppet/settings/base_setting.rb +26 -2
- data/lib/puppet/transaction/report.rb +11 -7
- data/lib/puppet/type/file/source.rb +1 -1
- data/lib/puppet/type/filebucket.rb +1 -1
- data/lib/puppet/type/package.rb +3 -3
- data/lib/puppet/util/autoload.rb +1 -8
- data/lib/puppet/util/connection.rb +8 -8
- data/lib/puppet/util/fact_dif.rb +62 -0
- data/lib/puppet/util/posix.rb +54 -5
- data/lib/puppet/util/rubygems.rb +5 -1
- data/lib/puppet/util/run_mode.rb +5 -1
- data/lib/puppet/util/windows/service.rb +1 -1
- data/lib/puppet/version.rb +1 -1
- data/locales/puppet.pot +289 -268
- data/man/man5/puppet.conf.5 +33 -17
- data/man/man8/puppet-agent.8 +7 -4
- data/man/man8/puppet-apply.8 +2 -2
- data/man/man8/puppet-catalog.8 +1 -1
- data/man/man8/puppet-config.8 +6 -6
- 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 +32 -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 +7 -4
- 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 +1 -1
- data/man/man8/puppet-status.8 +2 -2
- data/man/man8/puppet.8 +2 -2
- data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +91 -0
- data/spec/fixtures/unit/provider/package/puppetserver_gem/gem-list-local-packages +30 -0
- data/spec/fixtures/unit/provider/user/aix/aix_passwd_file.out +4 -0
- data/spec/integration/application/agent_spec.rb +183 -22
- data/spec/integration/application/apply_spec.rb +19 -0
- data/spec/integration/application/filebucket_spec.rb +7 -7
- data/spec/integration/application/plugin_spec.rb +3 -3
- data/spec/integration/configurer_spec.rb +14 -0
- data/spec/integration/defaults_spec.rb +19 -1
- data/spec/integration/environments/setting_hooks_spec.rb +1 -1
- 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 +5 -3
- data/spec/integration/util/windows/registry_spec.rb +0 -10
- data/spec/lib/puppet_spec/settings.rb +6 -1
- data/spec/shared_contexts/types_setup.rb +2 -0
- data/spec/spec_helper.rb +1 -4
- data/spec/unit/agent_spec.rb +8 -6
- data/spec/unit/application/agent_spec.rb +0 -1
- data/spec/unit/application/config_spec.rb +224 -4
- data/spec/unit/application/doc_spec.rb +2 -2
- data/spec/unit/application/facts_spec.rb +3 -1
- data/spec/unit/application/filebucket_spec.rb +0 -2
- data/spec/unit/application_spec.rb +60 -13
- data/spec/unit/configurer_spec.rb +39 -6
- data/spec/unit/confine/feature_spec.rb +1 -1
- data/spec/unit/confine_spec.rb +8 -2
- data/spec/unit/defaults_spec.rb +20 -1
- data/spec/unit/environments_spec.rb +176 -32
- data/spec/unit/face/config_spec.rb +62 -11
- data/spec/unit/face/node_spec.rb +2 -13
- data/spec/unit/file_serving/configuration/parser_spec.rb +0 -1
- 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 +1 -2
- data/spec/unit/forge/module_release_spec.rb +2 -7
- data/spec/unit/functions/inline_epp_spec.rb +26 -1
- data/spec/unit/http/resolver_spec.rb +24 -4
- data/spec/unit/http/service/ca_spec.rb +2 -2
- data/spec/unit/http/service/compiler_spec.rb +51 -2
- data/spec/unit/http/service/file_server_spec.rb +2 -2
- data/spec/unit/http/service/puppetserver_spec.rb +82 -0
- data/spec/unit/http/service/report_spec.rb +2 -2
- data/spec/unit/http/service_spec.rb +1 -1
- data/spec/unit/http/session_spec.rb +8 -20
- data/spec/unit/indirector/catalog/json_spec.rb +1 -1
- data/spec/unit/indirector/catalog/rest_spec.rb +1 -1
- data/spec/unit/indirector/face_spec.rb +0 -1
- data/spec/unit/indirector/facts/facter_spec.rb +0 -1
- data/spec/unit/indirector/facts/json_spec.rb +255 -0
- data/spec/unit/indirector/facts/rest_spec.rb +1 -1
- 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/json_spec.rb +8 -8
- data/spec/unit/indirector/key/file_spec.rb +0 -1
- data/spec/unit/indirector/msgpack_spec.rb +8 -8
- data/spec/unit/indirector/node/json_spec.rb +33 -0
- data/spec/unit/indirector/node/rest_spec.rb +1 -1
- 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/request_spec.rb +4 -4
- data/spec/unit/indirector/rest_spec.rb +1 -1
- data/spec/unit/indirector/status/rest_spec.rb +1 -1
- data/spec/unit/indirector/yaml_spec.rb +7 -7
- 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/http/api/indirected_routes_spec.rb +0 -9
- data/spec/unit/network/http/api/master/v3/environments_spec.rb +12 -23
- data/spec/unit/network/http/handler_spec.rb +0 -5
- data/spec/unit/parser/compiler_spec.rb +3 -19
- 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/property_spec.rb +1 -0
- data/spec/unit/provider/exec_spec.rb +4 -3
- 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/dpkg_spec.rb +22 -7
- data/spec/unit/provider/package/openbsd_spec.rb +2 -0
- data/spec/unit/provider/package/pacman_spec.rb +18 -12
- data/spec/unit/provider/package/pip2_spec.rb +36 -0
- data/spec/unit/provider/package/pip_spec.rb +6 -11
- data/spec/unit/provider/package/pkgdmg_spec.rb +0 -4
- data/spec/unit/provider/package/puppetserver_gem_spec.rb +137 -0
- data/spec/unit/provider/package/yum_spec.rb +31 -0
- data/spec/unit/provider/service/base_spec.rb +2 -4
- data/spec/unit/provider/service/bsd_spec.rb +5 -1
- data/spec/unit/provider/service/daemontools_spec.rb +1 -1
- data/spec/unit/provider/service/debian_spec.rb +3 -5
- data/spec/unit/provider/service/freebsd_spec.rb +1 -1
- data/spec/unit/provider/service/gentoo_spec.rb +4 -5
- data/spec/unit/provider/service/init_spec.rb +4 -5
- data/spec/unit/provider/service/launchd_spec.rb +5 -6
- data/spec/unit/provider/service/openrc_spec.rb +4 -5
- data/spec/unit/provider/service/openwrt_spec.rb +1 -1
- data/spec/unit/provider/service/redhat_spec.rb +1 -1
- data/spec/unit/provider/service/runit_spec.rb +2 -1
- data/spec/unit/provider/service/smf_spec.rb +1 -1
- data/spec/unit/provider/service/src_spec.rb +3 -5
- data/spec/unit/provider/service/systemd_spec.rb +3 -1
- data/spec/unit/provider/service/upstart_spec.rb +4 -5
- data/spec/unit/provider/user/aix_spec.rb +5 -0
- 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 +56 -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/type_spec.rb +1 -1
- data/spec/unit/resource_spec.rb +11 -10
- data/spec/unit/rest/route_spec.rb +4 -4
- data/spec/unit/settings_spec.rb +576 -239
- 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/transaction/additional_resource_generator_spec.rb +3 -7
- data/spec/unit/transaction/event_manager_spec.rb +14 -11
- data/spec/unit/transaction/report_spec.rb +2 -0
- data/spec/unit/transaction_spec.rb +13 -4
- data/spec/unit/type/file/content_spec.rb +0 -1
- data/spec/unit/type/file/selinux_spec.rb +0 -2
- data/spec/unit/type/file/source_spec.rb +1 -1
- data/spec/unit/type/file_spec.rb +0 -6
- data/spec/unit/type/filebucket_spec.rb +1 -1
- 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 +1 -1
- data/spec/unit/type/tidy_spec.rb +0 -1
- 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/run_mode_spec.rb +6 -6
- data/spec/unit/util/selinux_spec.rb +76 -52
- data/spec/unit/util/storage_spec.rb +3 -1
- data/spec/unit/util/suidmanager_spec.rb +44 -41
- data/spec/unit/util_spec.rb +13 -6
- metadata +32 -10
- data/spec/integration/application/config_spec.rb +0 -74
- data/spec/unit/face/catalog_spec.rb +0 -6
- data/spec/unit/face/module_spec.rb +0 -3
@@ -36,11 +36,11 @@ describe Puppet::HTTP::Service::Report do
|
|
36
36
|
subject.put_report('report', report, environment: environment)
|
37
37
|
end
|
38
38
|
|
39
|
-
it 'fallbacks to server and
|
39
|
+
it 'fallbacks to server and serverport' do
|
40
40
|
Puppet[:report_server] = nil
|
41
41
|
Puppet[:report_port] = nil
|
42
42
|
Puppet[:server] = 'report2.example.com'
|
43
|
-
Puppet[:
|
43
|
+
Puppet[:serverport] = 8142
|
44
44
|
|
45
45
|
stub_request(:put, "https://report2.example.com:8142/puppet/v3/report/report?environment=testing")
|
46
46
|
|
@@ -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
|
@@ -26,9 +26,9 @@ describe Puppet::HTTP::Session do
|
|
26
26
|
@count = 0
|
27
27
|
end
|
28
28
|
|
29
|
-
def resolve(session, name, ssl_context: nil,
|
29
|
+
def resolve(session, name, ssl_context: nil, canceled_handler: nil)
|
30
30
|
@count += 1
|
31
|
-
return @service if check_connection?(session, @service, ssl_context: ssl_context
|
31
|
+
return @service if check_connection?(session, @service, ssl_context: ssl_context)
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
@@ -67,19 +67,8 @@ describe Puppet::HTTP::Session do
|
|
67
67
|
session.route_to(:ca)
|
68
68
|
}.to raise_error(Puppet::HTTP::RouteError, 'No more routes to ca')
|
69
69
|
|
70
|
-
expect(@logs).to include(an_object_having_attributes(level: :err, message: "whoops1"),
|
71
|
-
an_object_having_attributes(level: :err, message: "whoops2"))
|
72
|
-
end
|
73
|
-
|
74
|
-
it 'logs routing failures as debug until routing succeeds' do
|
75
|
-
Puppet[:log_level] = 'debug'
|
76
|
-
|
77
|
-
resolvers = [DummyResolver.new(bad_service), DummyResolver.new(good_service)]
|
78
|
-
session = described_class.new(client, resolvers)
|
79
|
-
session.route_to(:ca)
|
80
|
-
|
81
|
-
expect(@logs).to include(an_object_having_attributes(level: :debug, message: "Connection to #{uri} failed, trying next route: whoops"))
|
82
|
-
expect(@logs).to_not include(an_object_having_attributes(level: :err))
|
70
|
+
expect(@logs).to include(an_object_having_attributes(level: :err, message: "Connection to #{uri} failed, trying next route: whoops1"),
|
71
|
+
an_object_having_attributes(level: :err, message: "Connection to #{uri} failed, trying next route: whoops2"))
|
83
72
|
end
|
84
73
|
|
85
74
|
it 'accepts an ssl context to use when connecting' do
|
@@ -167,16 +156,15 @@ describe Puppet::HTTP::Session do
|
|
167
156
|
expect(service.url).to eq(URI("https://bar.example.com:8140/puppet-ca/v1"))
|
168
157
|
end
|
169
158
|
|
170
|
-
it "
|
171
|
-
Puppet[:server_list] = 'foo.example.com
|
159
|
+
it "does not fallback from server_list to the settings resolver when server_list is exhausted" do
|
160
|
+
Puppet[:server_list] = 'foo.example.com'
|
172
161
|
|
173
|
-
|
162
|
+
expect_any_instance_of(Puppet::HTTP::Resolver::Settings).to receive(:resolve).never
|
174
163
|
stub_request(:get, "https://foo.example.com:8140/status/v1/simple/master").to_return(status: 500)
|
175
|
-
stub_request(:get, "https://bar.example.com:8140/status/v1/simple/master").to_return(status: 500)
|
176
164
|
|
177
165
|
expect {
|
178
166
|
session.route_to(:ca)
|
179
|
-
}.to raise_error(Puppet::
|
167
|
+
}.to raise_error(Puppet::HTTP::RouteError, "No more routes to ca")
|
180
168
|
end
|
181
169
|
|
182
170
|
it "raises when there are no more routes" do
|
@@ -24,7 +24,7 @@ describe Puppet::Resource::Catalog::Json do
|
|
24
24
|
end
|
25
25
|
|
26
26
|
before :each do
|
27
|
-
allow(Puppet.run_mode).to receive(:
|
27
|
+
allow(Puppet.run_mode).to receive(:server?).and_return(true)
|
28
28
|
Puppet[:server_datadir] = tmpdir('jsondir')
|
29
29
|
FileUtils.mkdir_p(File.join(Puppet[:server_datadir], 'indirector_testing'))
|
30
30
|
Puppet.push_context(:loaders => Puppet::Pops::Loaders.new(env))
|
@@ -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
|
@@ -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
|
@@ -178,29 +178,25 @@ describe Puppet::Indirector::Indirection do
|
|
178
178
|
|
179
179
|
describe "creates a request" do
|
180
180
|
it "should create it with its name as the request's indirection name" do
|
181
|
-
expect(
|
182
|
-
@indirection.request(:funtest, "yayness")
|
181
|
+
expect(@indirection.request(:funtest, "yayness", nil).indirection_name).to eq(@indirection.name)
|
183
182
|
end
|
184
183
|
|
185
184
|
it "should require a method and key" do
|
186
|
-
|
187
|
-
|
185
|
+
request = @indirection.request(:funtest, "yayness", nil)
|
186
|
+
expect(request.method).to eq(:funtest)
|
187
|
+
expect(request.key).to eq("yayness")
|
188
188
|
end
|
189
189
|
|
190
190
|
it "should support optional arguments" do
|
191
|
-
expect(
|
192
|
-
@indirection.request(:funtest, "yayness", :one => :two)
|
191
|
+
expect(@indirection.request(:funtest, "yayness", nil, :one => :two).options).to eq(:one => :two)
|
193
192
|
end
|
194
193
|
|
195
194
|
it "should not pass options if none are supplied" do
|
196
|
-
expect(
|
197
|
-
@indirection.request(:funtest, "yayness")
|
195
|
+
expect(@indirection.request(:funtest, "yayness", nil).options).to eq({})
|
198
196
|
end
|
199
197
|
|
200
198
|
it "should return the request" do
|
201
|
-
request
|
202
|
-
expect(Puppet::Indirector::Request).to receive(:new).and_return(request)
|
203
|
-
expect(@indirection.request(:funtest, "yayness")).to equal(request)
|
199
|
+
expect(@indirection.request(:funtest, "yayness", nil)).to be_a(Puppet::Indirector::Request)
|
204
200
|
end
|
205
201
|
end
|
206
202
|
|
@@ -833,7 +829,7 @@ describe Puppet::Indirector::Indirection do
|
|
833
829
|
end
|
834
830
|
|
835
831
|
it "should not create a terminus instance until one is actually needed" do
|
836
|
-
expect(
|
832
|
+
expect(@indirection).not_to receive(:terminus)
|
837
833
|
Puppet::Indirector::Indirection.new(double('model'), :lazytest)
|
838
834
|
end
|
839
835
|
|