chef 13.2.20-universal-mingw32 → 13.3.42-universal-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CONTRIBUTING.md +1 -1
- data/Gemfile +2 -8
- data/README.md +6 -2
- data/Rakefile +0 -11
- data/VERSION +1 -1
- data/acceptance/Gemfile.lock +1 -1
- data/acceptance/data-collector/.acceptance/data-collector-test/files/default/api.rb +34 -18
- data/acceptance/data-collector/.acceptance/data-collector-test/recipes/default.rb +6 -0
- data/lib/chef/cookbook/metadata.rb +2 -2
- data/lib/chef/deprecation/warnings.rb +3 -1
- data/lib/chef/exceptions.rb +1 -1
- data/lib/chef/http.rb +9 -10
- data/lib/chef/http/api_versions.rb +2 -0
- data/lib/chef/http/http_request.rb +3 -0
- data/lib/chef/knife/core/bootstrap_context.rb +1 -0
- data/lib/chef/knife/core/status_presenter.rb +1 -1
- data/lib/chef/knife/ssh.rb +4 -0
- data/lib/chef/provider/apt_preference.rb +99 -0
- data/lib/chef/provider/execute.rb +3 -2
- data/lib/chef/provider/http_request.rb +14 -0
- data/lib/chef/provider/mount/aix.rb +49 -8
- data/lib/chef/provider/package/windows/registry_uninstall_entry.rb +1 -1
- data/lib/chef/provider/package/zypper.rb +5 -5
- data/lib/chef/provider/service/systemd.rb +12 -11
- data/lib/chef/provider/support/zypper_repo.erb +17 -0
- data/lib/chef/provider/systemd_unit.rb +3 -2
- data/lib/chef/provider/windows_task.rb +92 -71
- data/lib/chef/provider/zypper_repository.rb +81 -0
- data/lib/chef/providers.rb +2 -0
- data/lib/chef/resource/apt_preference.rb +36 -0
- data/lib/chef/resource/execute.rb +12 -2
- data/lib/chef/resource/http_request.rb +1 -1
- data/lib/chef/resource/zypper_repository.rb +51 -0
- data/lib/chef/resources.rb +2 -0
- data/lib/chef/search/query.rb +6 -1
- data/lib/chef/server_api_versions.rb +21 -2
- data/lib/chef/version.rb +3 -4
- data/lib/chef/win32/api/file.rb +1 -0
- data/lib/chef/win32/file.rb +2 -0
- data/lib/chef/win32/version.rb +6 -0
- data/spec/functional/knife/ssh_spec.rb +1 -1
- data/spec/functional/resource/execute_spec.rb +2 -2
- data/spec/spec_helper.rb +8 -1
- data/spec/unit/cookbook/metadata_spec.rb +3 -3
- data/spec/unit/http/api_versions_spec.rb +6 -3
- data/spec/unit/knife/bootstrap_spec.rb +4 -0
- data/spec/unit/knife/cookbook_show_spec.rb +3 -3
- data/spec/unit/knife/ssh_spec.rb +7 -1
- data/spec/unit/knife/status_spec.rb +2 -0
- data/spec/unit/provider/apt_preference_spec.rb +87 -0
- data/spec/unit/provider/apt_update_spec.rb +7 -7
- data/spec/unit/provider/dsc_resource_spec.rb +2 -2
- data/spec/unit/provider/execute_spec.rb +32 -14
- data/spec/unit/provider/mount/aix_spec.rb +33 -1
- data/spec/unit/provider/package/rubygems_spec.rb +1 -1
- data/spec/unit/provider/package/windows/registry_uninstall_entry_spec.rb +56 -3
- data/spec/unit/provider/package/windows_spec.rb +1 -1
- data/spec/unit/provider/package/zypper_spec.rb +43 -0
- data/spec/unit/provider/script_spec.rb +1 -1
- data/spec/unit/provider/service/systemd_service_spec.rb +23 -21
- data/spec/unit/provider/systemd_unit_spec.rb +42 -41
- data/spec/unit/provider/windows_task_spec.rb +40 -0
- data/spec/unit/resource/apt_preference_spec.rb +41 -0
- data/spec/unit/resource/execute_spec.rb +21 -1
- data/spec/unit/resource/powershell_script_spec.rb +2 -2
- data/spec/unit/resource/zypper_repository_spec.rb +65 -0
- data/spec/unit/search/query_spec.rb +13 -18
- data/spec/unit/server_api_spec.rb +75 -1
- data/spec/unit/server_api_versions_spec.rb +22 -0
- data/spec/unit/win32/link_spec.rb +73 -0
- data/tasks/dependencies.rb +0 -1
- metadata +14 -81
- data/acceptance/.bundle/config +0 -2
- data/acceptance/bin/aws.rb +0 -17
- data/acceptance/bin/berks +0 -17
- data/acceptance/bin/bundler +0 -17
- data/acceptance/bin/chef-acceptance +0 -17
- data/acceptance/bin/coderay +0 -17
- data/acceptance/bin/erubis +0 -17
- data/acceptance/bin/htmldiff +0 -17
- data/acceptance/bin/httpclient +0 -17
- data/acceptance/bin/inspec +0 -17
- data/acceptance/bin/kitchen +0 -17
- data/acceptance/bin/ldiff +0 -17
- data/acceptance/bin/nokogiri +0 -17
- data/acceptance/bin/pry +0 -17
- data/acceptance/bin/rake +0 -17
- data/acceptance/bin/rspec +0 -17
- data/acceptance/bin/rwinrm +0 -17
- data/acceptance/bin/rwinrmcp +0 -17
- data/acceptance/bin/safe_yaml +0 -17
- data/acceptance/bin/thor +0 -17
- data/acceptance/fips/.kitchen/fips-unit-functional-centos-6.yml +0 -7
- data/acceptance/fips/.kitchen/kitchen-vagrant/kitchen-fips-fips-unit-functional-centos-6/.vagrant/machines/default/virtualbox/action_set_name +0 -1
- data/acceptance/fips/.kitchen/kitchen-vagrant/kitchen-fips-fips-unit-functional-centos-6/.vagrant/machines/default/virtualbox/creator_uid +0 -1
- data/acceptance/fips/.kitchen/kitchen-vagrant/kitchen-fips-fips-unit-functional-centos-6/.vagrant/machines/default/virtualbox/id +0 -1
- data/acceptance/fips/.kitchen/kitchen-vagrant/kitchen-fips-fips-unit-functional-centos-6/.vagrant/machines/default/virtualbox/index_uuid +0 -1
- data/acceptance/fips/.kitchen/kitchen-vagrant/kitchen-fips-fips-unit-functional-centos-6/.vagrant/machines/default/virtualbox/private_key +0 -27
- data/acceptance/fips/.kitchen/kitchen-vagrant/kitchen-fips-fips-unit-functional-centos-6/.vagrant/machines/default/virtualbox/synced_folders +0 -1
- data/acceptance/fips/.kitchen/kitchen-vagrant/kitchen-fips-fips-unit-functional-centos-6/Vagrantfile +0 -11
- data/acceptance/fips/.kitchen/logs/fips-integration-centos-6.log +0 -0
- data/acceptance/fips/.kitchen/logs/fips-integration-windows-2012r2.log +0 -0
- data/acceptance/fips/.kitchen/logs/fips-unit-functional-centos-6.log +0 -80
- data/acceptance/fips/.kitchen/logs/kitchen.log +0 -4
- data/tasks/changelog.rb +0 -37
- data/tasks/version.rb +0 -41
@@ -118,6 +118,7 @@ describe Chef::Provider::WindowsTask do
|
|
118
118
|
|
119
119
|
it "creates the task if it's not already existing" do
|
120
120
|
allow(provider).to receive(:task_need_update?).and_return(true)
|
121
|
+
allow(provider).to receive(:basic_validation).and_return(true)
|
121
122
|
expect(provider).to receive(:run_schtasks).with("CREATE", { "F" => "", "SC" => :hourly, "MO" => 1, "TR" => nil, "RU" => "SYSTEM" })
|
122
123
|
provider.run_action(:create)
|
123
124
|
expect(new_resource).to be_updated_by_last_action
|
@@ -126,6 +127,7 @@ describe Chef::Provider::WindowsTask do
|
|
126
127
|
it "updates the task XML if random_delay is provided" do
|
127
128
|
new_resource.random_delay "20"
|
128
129
|
allow(provider).to receive(:task_need_update?).and_return(true)
|
130
|
+
allow(provider).to receive(:basic_validation).and_return(true)
|
129
131
|
expect(provider).to receive(:run_schtasks).with("CREATE", { "F" => "", "SC" => :hourly, "MO" => 1, "TR" => nil, "RU" => "SYSTEM" })
|
130
132
|
expect(provider).to receive(:update_task_xml)
|
131
133
|
provider.run_action(:create)
|
@@ -135,6 +137,7 @@ describe Chef::Provider::WindowsTask do
|
|
135
137
|
it "updates the task XML if execution_time_limit is provided" do
|
136
138
|
new_resource.execution_time_limit "20"
|
137
139
|
allow(provider).to receive(:task_need_update?).and_return(true)
|
140
|
+
allow(provider).to receive(:basic_validation).and_return(true)
|
138
141
|
expect(provider).to receive(:run_schtasks).with("CREATE", { "F" => "", "SC" => :hourly, "MO" => 1, "TR" => nil, "RU" => "SYSTEM" })
|
139
142
|
expect(provider).to receive(:update_task_xml)
|
140
143
|
provider.run_action(:create)
|
@@ -280,6 +283,29 @@ describe Chef::Provider::WindowsTask do
|
|
280
283
|
end
|
281
284
|
end
|
282
285
|
|
286
|
+
describe "#basic_validation" do
|
287
|
+
context "when command doesn't exist" do
|
288
|
+
it "raise error" do
|
289
|
+
new_resource.command ""
|
290
|
+
expect { provider.send(:basic_validation) }.to raise_error(Chef::Exceptions::ValidationFailed)
|
291
|
+
end
|
292
|
+
end
|
293
|
+
|
294
|
+
context "when task_name doesn't exist" do
|
295
|
+
let(:new_resource) { Chef::Resource::WindowsTask.new("") }
|
296
|
+
it "raise error" do
|
297
|
+
expect { provider.send(:basic_validation) }.to raise_error(Chef::Exceptions::ValidationFailed)
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
301
|
+
context "when task_name and command exists" do
|
302
|
+
it "returns true" do
|
303
|
+
new_resource.command "cd ~/"
|
304
|
+
expect(provider.send(:basic_validation)).to be(true)
|
305
|
+
end
|
306
|
+
end
|
307
|
+
end
|
308
|
+
|
283
309
|
describe "#task_need_update?" do
|
284
310
|
context "when task doesn't exist" do
|
285
311
|
before do
|
@@ -325,6 +351,20 @@ describe Chef::Provider::WindowsTask do
|
|
325
351
|
expect(provider.send(:task_need_update?)).to be(true)
|
326
352
|
end
|
327
353
|
end
|
354
|
+
|
355
|
+
context "when start_day is updated" do
|
356
|
+
it "returns true" do
|
357
|
+
new_resource.start_day "01/01/2000"
|
358
|
+
expect(provider.send(:task_need_update?)).to be(true)
|
359
|
+
end
|
360
|
+
end
|
361
|
+
|
362
|
+
context "when start_time updated" do
|
363
|
+
it "returns true" do
|
364
|
+
new_resource.start_time "01:01"
|
365
|
+
expect(provider.send(:task_need_update?)).to be(true)
|
366
|
+
end
|
367
|
+
end
|
328
368
|
end
|
329
369
|
end
|
330
370
|
|
@@ -0,0 +1,41 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Tim Smith (<tsmith@chef.io>)
|
3
|
+
# Copyright:: 2016-2017, Chef Software, Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require "spec_helper"
|
20
|
+
|
21
|
+
describe Chef::Resource::AptPreference do
|
22
|
+
let(:node) { Chef::Node.new }
|
23
|
+
let(:events) { Chef::EventDispatch::Dispatcher.new }
|
24
|
+
let(:run_context) { Chef::RunContext.new(node, {}, events) }
|
25
|
+
let(:resource) { Chef::Resource::AptPreference.new("libmysqlclient16", run_context) }
|
26
|
+
|
27
|
+
it "should create a new Chef::Resource::AptPreference" do
|
28
|
+
expect(resource).to be_a_kind_of(Chef::Resource)
|
29
|
+
expect(resource).to be_a_kind_of(Chef::Resource::AptPreference)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should resolve to a Noop class when apt-get is not found" do
|
33
|
+
expect(Chef::Provider::AptPreference).to receive(:which).with("apt-get").and_return(false)
|
34
|
+
expect(resource.provider_for_action(:add)).to be_a(Chef::Provider::Noop)
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should resolve to a AptPreference class when apt-get is found" do
|
38
|
+
expect(Chef::Provider::AptPreference).to receive(:which).with("apt-get").and_return(true)
|
39
|
+
expect(resource.provider_for_action(:add)).to be_a(Chef::Provider::AptPreference)
|
40
|
+
end
|
41
|
+
end
|
@@ -77,7 +77,7 @@ describe Chef::Resource::Execute do
|
|
77
77
|
shared_examples_for "it received invalid credentials" do
|
78
78
|
describe "the validation method" do
|
79
79
|
it "should raise an error" do
|
80
|
-
expect { execute_resource.validate_identity_platform(username, password, domain) }.to raise_error(ArgumentError)
|
80
|
+
expect { execute_resource.validate_identity_platform(username, password, domain, elevated) }.to raise_error(ArgumentError)
|
81
81
|
end
|
82
82
|
end
|
83
83
|
end
|
@@ -113,6 +113,7 @@ describe Chef::Resource::Execute do
|
|
113
113
|
|
114
114
|
context "when a valid username is specified" do
|
115
115
|
let(:username) { "starchild" }
|
116
|
+
let(:elevated) { false }
|
116
117
|
context "when a valid domain is specified" do
|
117
118
|
let(:domain) { "mothership" }
|
118
119
|
|
@@ -129,6 +130,7 @@ describe Chef::Resource::Execute do
|
|
129
130
|
|
130
131
|
context "when the domain is not specified" do
|
131
132
|
let(:domain) { nil }
|
133
|
+
let(:elevated) { false }
|
132
134
|
|
133
135
|
context "when the password is not specified" do
|
134
136
|
let(:password) { nil }
|
@@ -179,6 +181,24 @@ describe Chef::Resource::Execute do
|
|
179
181
|
it_behaves_like "it received invalid username and domain"
|
180
182
|
end
|
181
183
|
end
|
184
|
+
|
185
|
+
context "when elevated is passed" do
|
186
|
+
let(:elevated) { true }
|
187
|
+
|
188
|
+
context "when username and password are not passed" do
|
189
|
+
let(:username) { nil }
|
190
|
+
let(:domain) { nil }
|
191
|
+
let(:password) { nil }
|
192
|
+
it_behaves_like "it received invalid credentials"
|
193
|
+
end
|
194
|
+
|
195
|
+
context "when username and password are passed" do
|
196
|
+
let(:username) { "user" }
|
197
|
+
let(:domain) { nil }
|
198
|
+
let(:password) { "we.funk!" }
|
199
|
+
it_behaves_like "it received valid credentials"
|
200
|
+
end
|
201
|
+
end
|
182
202
|
end
|
183
203
|
|
184
204
|
context "when not running on Windows" do
|
@@ -59,9 +59,9 @@ describe Chef::Resource::PowershellScript do
|
|
59
59
|
allow(resource).to receive(:updated).and_return(true)
|
60
60
|
end
|
61
61
|
|
62
|
-
it "inherits exactly the :cwd, :environment, :group, :path, :user, :umask,
|
62
|
+
it "inherits exactly the :cwd, :environment, :group, :path, :user, :umask, :architecture, :elevated attributes from a parent resource class" do
|
63
63
|
inherited_difference = Chef::Resource::PowershellScript.guard_inherited_attributes -
|
64
|
-
[:cwd, :environment, :group, :path, :user, :umask, :architecture ]
|
64
|
+
[:cwd, :environment, :group, :path, :user, :umask, :architecture, :elevated ]
|
65
65
|
|
66
66
|
expect(inherited_difference).to eq([])
|
67
67
|
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Tim Smith (<tsmith@chef.io>)
|
3
|
+
# Copyright:: Copyright (c) 2017 Chef Software, Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require "spec_helper"
|
20
|
+
|
21
|
+
describe Chef::Resource::ZypperRepository do
|
22
|
+
let(:node) { Chef::Node.new }
|
23
|
+
let(:events) { Chef::EventDispatch::Dispatcher.new }
|
24
|
+
let(:run_context) { Chef::RunContext.new(node, {}, events) }
|
25
|
+
let(:resource) { Chef::Resource::ZypperRepository.new("repo-source", run_context) }
|
26
|
+
|
27
|
+
context "on linux", :linux_only do
|
28
|
+
it "should create a new Chef::Resource::ZypperRepository" do
|
29
|
+
expect(resource).to be_a_kind_of(Chef::Resource)
|
30
|
+
expect(resource).to be_a_kind_of(Chef::Resource::ZypperRepository)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should have a name of repo-source" do
|
34
|
+
expect(resource.name).to eql("repo-source")
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should have a default action of create" do
|
38
|
+
expect(resource.action).to eql([:create])
|
39
|
+
end
|
40
|
+
|
41
|
+
it "supports all valid actions" do
|
42
|
+
expect { resource.action :add }.not_to raise_error
|
43
|
+
expect { resource.action :remove }.not_to raise_error
|
44
|
+
expect { resource.action :create }.not_to raise_error
|
45
|
+
expect { resource.action :refresh }.not_to raise_error
|
46
|
+
expect { resource.action :delete }.to raise_error(ArgumentError)
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should resolve to a Noop class when zypper is not found" do
|
50
|
+
expect(Chef::Provider::ZypperRepository).to receive(:which).with("zypper").and_return(false)
|
51
|
+
expect(resource.provider_for_action(:add)).to be_a(Chef::Provider::Noop)
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should resolve to a ZypperRepository class when zypper is found" do
|
55
|
+
expect(Chef::Provider::ZypperRepository).to receive(:which).with("zypper").and_return(true)
|
56
|
+
expect(resource.provider_for_action(:add)).to be_a(Chef::Provider::ZypperRepository)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
context "on windows", :windows_only do
|
61
|
+
it "should resolve to a NoOp provider" do
|
62
|
+
expect(resource.provider_for_action(:add)).to be_a(Chef::Provider::Noop)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -22,9 +22,10 @@ require "chef/search/query"
|
|
22
22
|
describe Chef::Search::Query do
|
23
23
|
let(:rest) { double("Chef::ServerAPI") }
|
24
24
|
let(:query) { Chef::Search::Query.new }
|
25
|
+
let(:default_rows) { 1000 }
|
25
26
|
|
26
27
|
shared_context "filtered search" do
|
27
|
-
let(:query_string) { "search/node?q=platform:rhel&start=0" }
|
28
|
+
let(:query_string) { "search/node?q=platform:rhel&start=0&rows=#{default_rows}" }
|
28
29
|
let(:server_url) { "https://api.opscode.com/organizations/opscode/nodes" }
|
29
30
|
let(:args) { { filter_key => filter_hash } }
|
30
31
|
let(:filter_hash) do
|
@@ -81,8 +82,8 @@ describe Chef::Search::Query do
|
|
81
82
|
end
|
82
83
|
|
83
84
|
describe "search" do
|
84
|
-
let(:query_string) { "search/node?q=platform:rhel&start=0" }
|
85
|
-
let(:query_string_continue) { "search/node?q=platform:rhel&start=4" }
|
85
|
+
let(:query_string) { "search/node?q=platform:rhel&start=0&rows=#{default_rows}" }
|
86
|
+
let(:query_string_continue) { "search/node?q=platform:rhel&start=4&rows=#{default_rows}" }
|
86
87
|
let(:query_string_with_rows) { "search/node?q=platform:rhel&start=0&rows=4" }
|
87
88
|
let(:query_string_continue_with_rows) { "search/node?q=platform:rhel&start=4&rows=4" }
|
88
89
|
|
@@ -150,12 +151,6 @@ describe Chef::Search::Query do
|
|
150
151
|
"total" => 4,
|
151
152
|
} end
|
152
153
|
|
153
|
-
let(:big_response) do
|
154
|
-
r = response.dup
|
155
|
-
r["total"] = 8
|
156
|
-
r
|
157
|
-
end
|
158
|
-
|
159
154
|
let(:big_response_empty) do
|
160
155
|
{
|
161
156
|
"start" => 0,
|
@@ -178,17 +173,17 @@ describe Chef::Search::Query do
|
|
178
173
|
end
|
179
174
|
|
180
175
|
it "queries for every object of a type by default" do
|
181
|
-
expect(rest).to receive(:get).with("search/node?q=*:*&start=0").and_return(response)
|
176
|
+
expect(rest).to receive(:get).with("search/node?q=*:*&start=0&rows=#{default_rows}").and_return(response)
|
182
177
|
query.search(:node)
|
183
178
|
end
|
184
179
|
|
185
180
|
it "allows a custom query" do
|
186
|
-
expect(rest).to receive(:get).with("search/node?q=platform:rhel&start=0").and_return(response)
|
181
|
+
expect(rest).to receive(:get).with("search/node?q=platform:rhel&start=0&rows=#{default_rows}").and_return(response)
|
187
182
|
query.search(:node, "platform:rhel")
|
188
183
|
end
|
189
184
|
|
190
185
|
it "lets you set a starting object" do
|
191
|
-
expect(rest).to receive(:get).with("search/node?q=platform:rhel&start=2").and_return(response)
|
186
|
+
expect(rest).to receive(:get).with("search/node?q=platform:rhel&start=2&rows=#{default_rows}").and_return(response)
|
192
187
|
query.search(:node, "platform:rhel", start: 2)
|
193
188
|
end
|
194
189
|
|
@@ -221,9 +216,9 @@ describe Chef::Search::Query do
|
|
221
216
|
query.search(:node, "*:*", start: 0, rows: 4) { |r| @call_me.do(r) }
|
222
217
|
end
|
223
218
|
|
224
|
-
|
225
|
-
|
226
|
-
|
219
|
+
# This test would loop infinitely if pagination didn't advance
|
220
|
+
it "paginates correctly in the face of filtered nodes without explicit rows" do
|
221
|
+
allow(rest).to receive(:get).with(query_string).and_return(big_response_empty)
|
227
222
|
query.search(:node, "platform:rhel") do |r|
|
228
223
|
nil
|
229
224
|
end
|
@@ -239,21 +234,21 @@ describe Chef::Search::Query do
|
|
239
234
|
|
240
235
|
it "fuzzifies node searches when fuzz is set" do
|
241
236
|
expect(rest).to receive(:get).with(
|
242
|
-
"search/node?q=tags:*free.messi*%20OR%20roles:*free.messi*%20OR%20fqdn:*free.messi*%20OR%20addresses:*free.messi*%20OR%20policy_name:*free.messi*%20OR%20policy_group:*free.messi*&start=0"
|
237
|
+
"search/node?q=tags:*free.messi*%20OR%20roles:*free.messi*%20OR%20fqdn:*free.messi*%20OR%20addresses:*free.messi*%20OR%20policy_name:*free.messi*%20OR%20policy_group:*free.messi*&start=0&rows=#{default_rows}"
|
243
238
|
).and_return(response)
|
244
239
|
query.search(:node, "free.messi", fuzz: true)
|
245
240
|
end
|
246
241
|
|
247
242
|
it "does not fuzzify node searches when fuzz is not set" do
|
248
243
|
expect(rest).to receive(:get).with(
|
249
|
-
"search/node?q=free.messi&start=0"
|
244
|
+
"search/node?q=free.messi&start=0&rows=#{default_rows}"
|
250
245
|
).and_return(response)
|
251
246
|
query.search(:node, "free.messi")
|
252
247
|
end
|
253
248
|
|
254
249
|
it "does not fuzzify client searches" do
|
255
250
|
expect(rest).to receive(:get).with(
|
256
|
-
"search/client?q=messi&start=0"
|
251
|
+
"search/client?q=messi&start=0&rows=#{default_rows}"
|
257
252
|
).and_return(response)
|
258
253
|
query.search(:client, "messi", fuzz: true)
|
259
254
|
end
|
@@ -26,12 +26,22 @@ b857vWviwPX2/P6+E3GPdl8IVsKXCvGWOBZWTuNTjQtwbDzsUepWoMgXnlQJSn5I
|
|
26
26
|
YSlLxQKBgQD16Gw9kajpKlzsPa6XoQeGmZALT6aKWJQlrKtUQIrsIWM0Z6eFtX12
|
27
27
|
2jjHZ0awuCQ4ldqwl8IfRogWMBkHOXjTPVK0YKWWlxMpD/5+bGPARa5fir8O1Zpo
|
28
28
|
Y6S6MeZ69Rp89ma4ttMZ+kwi1+XyHqC/dlcVRW42Zl5Dc7BALRlJjQ==
|
29
|
-
-----END RSA PRIVATE KEY-----"
|
29
|
+
-----END RSA PRIVATE KEY-----".freeze
|
30
30
|
|
31
31
|
describe Chef::ServerAPI do
|
32
32
|
let(:url) { "http://chef.example.com:4000" }
|
33
33
|
let(:key_path) { "/tmp/foo" }
|
34
34
|
|
35
|
+
let(:client) do
|
36
|
+
Chef::ServerAPI.new(url)
|
37
|
+
end
|
38
|
+
|
39
|
+
before do
|
40
|
+
Chef::Config[:node_name] = "silent-bob"
|
41
|
+
Chef::Config[:client_key] = CHEF_SPEC_DATA + "/ssl/private_key.pem"
|
42
|
+
Chef::Config[:http_retry_delay] = 0
|
43
|
+
end
|
44
|
+
|
35
45
|
describe "#initialize" do
|
36
46
|
it "uses the configured key file" do
|
37
47
|
allow(IO).to receive(:read).with(key_path).and_return(SIGNING_KEY_DOT_PEM)
|
@@ -47,4 +57,68 @@ describe Chef::ServerAPI do
|
|
47
57
|
expect(api.options[:raw_key]).to eql(SIGNING_KEY_DOT_PEM)
|
48
58
|
end
|
49
59
|
end
|
60
|
+
|
61
|
+
context "versioned apis" do
|
62
|
+
class VersionedClassV0
|
63
|
+
extend Chef::Mixin::VersionedAPI
|
64
|
+
minimum_api_version 0
|
65
|
+
end
|
66
|
+
|
67
|
+
class VersionedClassV2
|
68
|
+
extend Chef::Mixin::VersionedAPI
|
69
|
+
minimum_api_version 2
|
70
|
+
end
|
71
|
+
|
72
|
+
class VersionedClassVersions
|
73
|
+
extend Chef::Mixin::VersionedAPIFactory
|
74
|
+
add_versioned_api_class VersionedClassV0
|
75
|
+
add_versioned_api_class VersionedClassV2
|
76
|
+
end
|
77
|
+
|
78
|
+
before do
|
79
|
+
Chef::ServerAPIVersions.instance.reset!
|
80
|
+
end
|
81
|
+
|
82
|
+
let(:versioned_client) do
|
83
|
+
Chef::ServerAPI.new(url, version_class: VersionedClassVersions)
|
84
|
+
end
|
85
|
+
|
86
|
+
it "on protocol negotiation it posts the same message body without doubly-encoding the json string" do
|
87
|
+
WebMock.disable_net_connect!
|
88
|
+
post_body = { bar: "baz" }
|
89
|
+
body_406 = '{"error":"invalid-x-ops-server-api-version","message":"Specified version 2 not supported","min_version":0,"max_version":1}'
|
90
|
+
stub_request(:post, "http://chef.example.com:4000/foo").with(body: post_body.to_json, headers: { "X-Ops-Server-Api-Version" => "2" }).to_return(status: [406, "Not Acceptable"], body: body_406 )
|
91
|
+
stub_request(:post, "http://chef.example.com:4000/foo").with(body: post_body.to_json, headers: { "X-Ops-Server-Api-Version" => "0" }).to_return(status: 200, body: "", headers: {})
|
92
|
+
versioned_client.post("foo", post_body)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
context "retrying normal requests" do
|
97
|
+
it "500 on a post retries and posts correctly " do
|
98
|
+
WebMock.disable_net_connect!
|
99
|
+
post_body = { bar: "baz" }
|
100
|
+
headers = { "Accept" => "application/json", "Content-Type" => "application/json", "Accept-Encoding" => "gzip;q=1.0,deflate;q=0.6,identity;q=0.3", "Content-Length" => "13", "Host" => "chef.example.com:4000", "X-Chef-Version" => Chef::VERSION, "X-Ops-Sign" => "algorithm=sha1;version=1.1;", "X-Ops-Userid" => "silent-bob" }
|
101
|
+
stub_request(:post, "http://chef.example.com:4000/foo").with(body: post_body.to_json, headers: headers).to_return(status: [500, "Internal Server Error"])
|
102
|
+
stub_request(:post, "http://chef.example.com:4000/foo").with(body: post_body.to_json, headers: headers).to_return(status: 200, body: "", headers: {})
|
103
|
+
client.post("foo", post_body)
|
104
|
+
end
|
105
|
+
|
106
|
+
it "500 on a put retries and puts correctly " do
|
107
|
+
WebMock.disable_net_connect!
|
108
|
+
put_body = { bar: "baz" }
|
109
|
+
headers = { "Accept" => "application/json", "Content-Type" => "application/json", "Accept-Encoding" => "gzip;q=1.0,deflate;q=0.6,identity;q=0.3", "Content-Length" => "13", "Host" => "chef.example.com:4000", "X-Chef-Version" => Chef::VERSION, "X-Ops-Sign" => "algorithm=sha1;version=1.1;", "X-Ops-Userid" => "silent-bob" }
|
110
|
+
stub_request(:put, "http://chef.example.com:4000/foo").with(body: put_body.to_json, headers: headers).to_return(status: [500, "Internal Server Error"])
|
111
|
+
stub_request(:put, "http://chef.example.com:4000/foo").with(body: put_body.to_json, headers: headers).to_return(status: 200, body: "", headers: {})
|
112
|
+
client.put("foo", put_body)
|
113
|
+
end
|
114
|
+
|
115
|
+
it "500 on a get retries and gets correctly " do
|
116
|
+
WebMock.disable_net_connect!
|
117
|
+
get_body = { bar: "baz" }
|
118
|
+
headers = { "Accept" => "application/json", "Accept-Encoding" => "gzip;q=1.0,deflate;q=0.6,identity;q=0.3", "Host" => "chef.example.com:4000", "X-Chef-Version" => Chef::VERSION, "X-Ops-Sign" => "algorithm=sha1;version=1.1;", "X-Ops-Userid" => "silent-bob" }
|
119
|
+
stub_request(:get, "http://chef.example.com:4000/foo").with(headers: headers).to_return(status: [500, "Internal Server Error"])
|
120
|
+
stub_request(:get, "http://chef.example.com:4000/foo").with(headers: headers).to_return(status: 200, body: "", headers: {})
|
121
|
+
client.get("foo")
|
122
|
+
end
|
123
|
+
end
|
50
124
|
end
|
@@ -22,10 +22,28 @@ describe Chef::ServerAPIVersions do
|
|
22
22
|
Chef::ServerAPIVersions.instance.reset!
|
23
23
|
end
|
24
24
|
|
25
|
+
describe "#reset!" do
|
26
|
+
it "resets the version information" do
|
27
|
+
Chef::ServerAPIVersions.instance.set_versions({ "min_version" => 0, "max_version" => 2 })
|
28
|
+
Chef::ServerAPIVersions.instance.reset!
|
29
|
+
expect(Chef::ServerAPIVersions.instance.min_server_version).to be_nil
|
30
|
+
end
|
31
|
+
|
32
|
+
it "resets the unversioned flag" do
|
33
|
+
Chef::ServerAPIVersions.instance.unversioned!
|
34
|
+
Chef::ServerAPIVersions.instance.reset!
|
35
|
+
expect(Chef::ServerAPIVersions.instance.unversioned?).to be false
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
25
39
|
describe "#min_server_version" do
|
26
40
|
it "returns nil if no versions have been recorded" do
|
27
41
|
expect(Chef::ServerAPIVersions.instance.min_server_version).to be_nil
|
28
42
|
end
|
43
|
+
it "returns 0 if unversioned" do
|
44
|
+
Chef::ServerAPIVersions.instance.unversioned!
|
45
|
+
expect(Chef::ServerAPIVersions.instance.min_server_version).to eq(0)
|
46
|
+
end
|
29
47
|
it "returns the correct value" do
|
30
48
|
Chef::ServerAPIVersions.instance.set_versions({ "min_version" => 0, "max_version" => 2 })
|
31
49
|
expect(Chef::ServerAPIVersions.instance.min_server_version).to eq(0)
|
@@ -36,6 +54,10 @@ describe Chef::ServerAPIVersions do
|
|
36
54
|
it "returns nil if no versions have been recorded" do
|
37
55
|
expect(Chef::ServerAPIVersions.instance.max_server_version).to be_nil
|
38
56
|
end
|
57
|
+
it "returns 0 if unversioned" do
|
58
|
+
Chef::ServerAPIVersions.instance.unversioned!
|
59
|
+
expect(Chef::ServerAPIVersions.instance.min_server_version).to eq(0)
|
60
|
+
end
|
39
61
|
it "returns the correct value" do
|
40
62
|
Chef::ServerAPIVersions.instance.set_versions({ "min_version" => 0, "max_version" => 2 })
|
41
63
|
expect(Chef::ServerAPIVersions.instance.max_server_version).to eq(2)
|