scooter 4.3.2 → 4.5.0
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 +5 -5
- data/.github/workflows/unit-tests.yaml +33 -0
- data/CODEOWNERS +1 -0
- data/README.md +2 -5
- data/lib/beaker-http/dsl/web_helpers.rb +62 -0
- data/lib/beaker-http/helpers/puppet_helpers.rb +49 -0
- data/lib/beaker-http/http.rb +93 -0
- data/lib/beaker-http/middleware/response/faraday_beaker_logger.rb +60 -0
- data/lib/beaker-http/version.rb +7 -0
- data/lib/scooter/httpdispatchers/orchestrator/v1/v1.rb +17 -1
- data/lib/scooter/httpdispatchers/orchestratordispatcher.rb +11 -1
- data/lib/scooter/version.rb +1 -1
- data/lib/scooter.rb +5 -1
- data/scooter.gemspec +11 -11
- data/spec/scooter/httpdispatchers/activity/activity_spec.rb +14 -25
- data/spec/scooter/httpdispatchers/classifier/classifier_spec.rb +38 -71
- data/spec/scooter/httpdispatchers/consoledispatcher_spec.rb +13 -12
- data/spec/scooter/httpdispatchers/httpdispatcher_spec.rb +3 -7
- data/spec/scooter/httpdispatchers/orchestratordispatcher_spec.rb +33 -19
- data/spec/scooter/httpdispatchers/puppetdbdispatcher_spec.rb +62 -65
- data/spec/scooter/httpdispatchers/rbac/rbac_spec.rb +29 -33
- data/spec/spec_helper.rb +2 -0
- metadata +46 -70
@@ -343,12 +343,8 @@ module Scooter
|
|
343
343
|
|
344
344
|
describe '.update_classes' do
|
345
345
|
before do
|
346
|
-
|
347
|
-
|
348
|
-
index = subject.connection.builder.handlers.index(Faraday::Adapter::NetHttp)
|
349
|
-
subject.connection.builder.swap(index, Faraday::Adapter::Test) do |stub|
|
350
|
-
stub.post('/classifier-api/v1/update-classes') { [201, {}] }
|
351
|
-
end
|
346
|
+
stub_request(:post, /classifier-api\/v1\/update-classes/).
|
347
|
+
to_return(status: 201, body: {}.to_json, headers: {"Content-Type"=> "application/json"})
|
352
348
|
end
|
353
349
|
it 'updates the classes for all environments' do
|
354
350
|
expect { subject.update_classes }.not_to raise_error
|
@@ -379,12 +375,8 @@ module Scooter
|
|
379
375
|
|
380
376
|
describe '.get_list_of_node_groups' do
|
381
377
|
before do
|
382
|
-
|
383
|
-
|
384
|
-
index = subject.connection.builder.handlers.index(Faraday::Adapter::NetHttp)
|
385
|
-
subject.connection.builder.swap(index, Faraday::Adapter::Test) do |stub|
|
386
|
-
stub.get('classifier-api/v1/groups') { |env| [200, {}, group_list] }
|
387
|
-
end
|
378
|
+
stub_request(:get, /classifier-api\/v1\/groups/).
|
379
|
+
to_return(status: 200, body: group_list.to_json, headers: {"Content-Type"=> "application/json"})
|
388
380
|
end
|
389
381
|
it 'returns list of groups' do
|
390
382
|
expect { subject.get_list_of_node_groups }.not_to raise_error
|
@@ -395,12 +387,8 @@ module Scooter
|
|
395
387
|
|
396
388
|
describe '.get_list_of_nodes' do
|
397
389
|
before do
|
398
|
-
|
399
|
-
|
400
|
-
index = subject.connection.builder.handlers.index(Faraday::Adapter::NetHttp)
|
401
|
-
subject.connection.builder.swap(index, Faraday::Adapter::Test) do |stub|
|
402
|
-
stub.get('classifier-api/v1/nodes') { |env| [200, {}, node_list] }
|
403
|
-
end
|
390
|
+
stub_request(:get, /classifier-api\/v1\/nodes/).
|
391
|
+
to_return(status: 200, body: node_list.to_json, headers: {"Content-Type"=> "application/json"})
|
404
392
|
end
|
405
393
|
it 'returns list of nodes' do
|
406
394
|
expect { subject.get_list_of_nodes }.not_to raise_error
|
@@ -411,12 +399,8 @@ module Scooter
|
|
411
399
|
|
412
400
|
describe '.get_list_of_environments' do
|
413
401
|
before do
|
414
|
-
|
415
|
-
|
416
|
-
index = subject.connection.builder.handlers.index(Faraday::Adapter::NetHttp)
|
417
|
-
subject.connection.builder.swap(index, Faraday::Adapter::Test) do |stub|
|
418
|
-
stub.get('classifier-api/v1/environments') { |env| [200, {}, environment_list] }
|
419
|
-
end
|
402
|
+
stub_request(:get, /classifier-api\/v1\/environments/).
|
403
|
+
to_return(status: 200, body: environment_list.to_json, headers: {"Content-Type"=> "application/json"})
|
420
404
|
end
|
421
405
|
it 'returns list of environments' do
|
422
406
|
expect { subject.get_list_of_environments }.not_to raise_error
|
@@ -427,12 +411,8 @@ module Scooter
|
|
427
411
|
|
428
412
|
describe '.get_list_of_classes' do
|
429
413
|
before do
|
430
|
-
|
431
|
-
|
432
|
-
index = subject.connection.builder.handlers.index(Faraday::Adapter::NetHttp)
|
433
|
-
subject.connection.builder.swap(index, Faraday::Adapter::Test) do |stub|
|
434
|
-
stub.get('classifier-api/v1/classes') { |env| [200, {}, class_list] }
|
435
|
-
end
|
414
|
+
stub_request(:get, /classifier-api\/v1\/classes/).
|
415
|
+
to_return(status: 200, body: class_list.to_json, headers: {"Content-Type"=> "application/json"})
|
436
416
|
end
|
437
417
|
it 'returns list of classes' do
|
438
418
|
expect { subject.get_list_of_classes }.not_to raise_error
|
@@ -443,12 +423,8 @@ module Scooter
|
|
443
423
|
|
444
424
|
describe '.nodes_match?' do
|
445
425
|
before do
|
446
|
-
|
447
|
-
|
448
|
-
index = subject.connection.builder.handlers.index(Faraday::Adapter::NetHttp)
|
449
|
-
subject.connection.builder.swap(index, Faraday::Adapter::Test) do |stub|
|
450
|
-
stub.get('classifier-api/v1/nodes') { |env| [200, {}, node_list] }
|
451
|
-
end
|
426
|
+
stub_request(:get, /classifier-api\/v1\/nodes/).
|
427
|
+
to_return(status: 200, body: node_list.to_json, headers: {"Content-Type"=> "application/json"})
|
452
428
|
end
|
453
429
|
it 'nodes do not match' do
|
454
430
|
expect(subject.nodes_match?(node_list.dup.push('another_array_item'))).to be false
|
@@ -461,12 +437,8 @@ module Scooter
|
|
461
437
|
|
462
438
|
describe '.groups_match?' do
|
463
439
|
before do
|
464
|
-
|
465
|
-
|
466
|
-
index = subject.connection.builder.handlers.index(Faraday::Adapter::NetHttp)
|
467
|
-
subject.connection.builder.swap(index, Faraday::Adapter::Test) do |stub|
|
468
|
-
stub.get('classifier-api/v1/groups') { |env| [200, {}, group_list] }
|
469
|
-
end
|
440
|
+
stub_request(:get, /classifier-api\/v1\/groups/).
|
441
|
+
to_return(status: 200, body: group_list.to_json, headers: {"Content-Type"=> "application/json"})
|
470
442
|
end
|
471
443
|
it 'groups do not match' do
|
472
444
|
expect(subject.groups_match?(group_list.dup.push('another_array_item'))).to be false
|
@@ -479,12 +451,8 @@ module Scooter
|
|
479
451
|
|
480
452
|
describe '.classes_match?' do
|
481
453
|
before do
|
482
|
-
|
483
|
-
|
484
|
-
index = subject.connection.builder.handlers.index(Faraday::Adapter::NetHttp)
|
485
|
-
subject.connection.builder.swap(index, Faraday::Adapter::Test) do |stub|
|
486
|
-
stub.get('classifier-api/v1/classes') { |env| [200, {}, class_list] }
|
487
|
-
end
|
454
|
+
stub_request(:get, /classifier-api\/v1\/classes/).
|
455
|
+
to_return(status: 200, body: class_list.to_json, headers: {"Content-Type"=> "application/json"})
|
488
456
|
end
|
489
457
|
it 'classes do not match' do
|
490
458
|
expect(subject.classes_match?(class_list.dup.push('another_array_item'))).to be false
|
@@ -497,12 +465,8 @@ module Scooter
|
|
497
465
|
|
498
466
|
describe '.environments_match?' do
|
499
467
|
before do
|
500
|
-
|
501
|
-
|
502
|
-
index = subject.connection.builder.handlers.index(Faraday::Adapter::NetHttp)
|
503
|
-
subject.connection.builder.swap(index, Faraday::Adapter::Test) do |stub|
|
504
|
-
stub.get('classifier-api/v1/environments') { |env| [200, {}, environment_list] }
|
505
|
-
end
|
468
|
+
stub_request(:get, /classifier-api\/v1\/environments/).
|
469
|
+
to_return(status: 200, body: environment_list.to_json, headers: {"Content-Type"=> "application/json"})
|
506
470
|
end
|
507
471
|
it 'environments do not match' do
|
508
472
|
expect(subject.environments_match?(environment_list.dup.push('another_array_item'))).to be false
|
@@ -515,23 +479,26 @@ module Scooter
|
|
515
479
|
|
516
480
|
describe '.classifier_database_matches_self?' do
|
517
481
|
before do
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
482
|
+
stub_request(:get, 'https://test.com:4433/classifier-api/v1/nodes').
|
483
|
+
to_return(status: 200, body: node_list.to_json, headers: {"Content-Type"=> "application/json"})
|
484
|
+
stub_request(:get, 'https://test2.com:4433/classifier-api/v1/nodes').
|
485
|
+
to_return(status: 200, body: node_list.dup.push('another_array_item').to_json, headers: {"Content-Type"=> "application/json"})
|
486
|
+
|
487
|
+
stub_request(:get, 'https://test.com:4433/classifier-api/v1/environments').
|
488
|
+
to_return(status: 200, body: environment_list.to_json, headers: {"Content-Type"=> "application/json"})
|
489
|
+
stub_request(:get, 'https://test2.com:4433/classifier-api/v1/environments').
|
490
|
+
to_return(status: 200, body: environment_list.dup.push('another_array_item').to_json, headers: {"Content-Type"=> "application/json"})
|
491
|
+
|
492
|
+
stub_request(:get, 'https://test.com:4433/classifier-api/v1/groups').
|
493
|
+
to_return(status: 200, body: group_list.to_json, headers: {"Content-Type"=> "application/json"})
|
494
|
+
stub_request(:get, 'https://test2.com:4433/classifier-api/v1/groups').
|
495
|
+
to_return(status: 200, body: group_list.dup.push('another_array_item').to_json, headers: {"Content-Type"=> "application/json"})
|
496
|
+
|
497
|
+
stub_request(:get, 'https://test.com:4433/classifier-api/v1/classes').
|
498
|
+
to_return(status: 200, body: class_list.to_json, headers: {"Content-Type"=> "application/json"})
|
499
|
+
stub_request(:get, 'https://test2.com:4433/classifier-api/v1/classes').
|
500
|
+
to_return(status: 200, body: class_list.dup.push('another_array_item').to_json, headers: {"Content-Type"=> "application/json"})
|
501
|
+
|
535
502
|
expect(subject).to receive(:is_resolvable).exactly(8).times.and_return(true)
|
536
503
|
end
|
537
504
|
it 'compare with self' do
|
@@ -28,18 +28,19 @@ module Scooter
|
|
28
28
|
|
29
29
|
context '"signin with a page that returns a token' do
|
30
30
|
before do
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
31
|
+
stub_request(:post, /auth\/login/).
|
32
|
+
to_return(status: 200,
|
33
|
+
body: '',
|
34
|
+
headers: {"server"=>"nginx/1.8.1",
|
35
|
+
"date"=>"Tue, 29 Nov 2016 22:05:41 GMT",
|
36
|
+
"content-length"=>"0",
|
37
|
+
"connection"=>"close",
|
38
|
+
"set-cookie"=>"JSESSIONID=b05e9b11-5e9f-4d6a-9faf-e28a0415197d; Path=/; Secure; HttpOnly, rememberMe=deleteMe; Path=/auth; Max-Age=0; Expires=Mon, 28-Nov-2016 22:05:41 GMT, pl_ssti=0CeHhpz5PPLna7kpaEMcTHjJ62z9eizHTzsxEXNK8W20;Secure;Path=/",
|
39
|
+
"location"=>"/",
|
40
|
+
"x-frame-options"=>"DENY"})
|
41
|
+
|
42
|
+
stub_request(:get, 'https://test.com/').
|
43
|
+
to_return(status: 200, body: '', headers: {})
|
43
44
|
end
|
44
45
|
|
45
46
|
it 'sends the credentials' do
|
@@ -55,18 +55,14 @@ module Scooter
|
|
55
55
|
before do
|
56
56
|
allow_any_instance_of(Beaker::Http::FaradayBeakerLogger).to receive(:info) { true }
|
57
57
|
allow_any_instance_of(Beaker::Http::FaradayBeakerLogger).to receive(:debug) { true }
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
{'content-type' => 'application/json;charset=UTF-8'},
|
62
|
-
"{ \"key\" : \"value\" }"]}
|
63
|
-
end
|
58
|
+
|
59
|
+
stub_request(:get, /test\/route/).
|
60
|
+
to_return(status: 500, body: {"key" => "value"}.to_json, headers: {"Content-Type"=> "application/json"})
|
64
61
|
end
|
65
62
|
it 'has a correctly parsed body in the error' do
|
66
63
|
expect{subject.connection.get('/test/route')}.to raise_error do |error|
|
67
64
|
expect(error.response[:body]).to be_a(Hash)
|
68
65
|
end
|
69
|
-
|
70
66
|
end
|
71
67
|
end
|
72
68
|
end
|
@@ -4,12 +4,18 @@ describe Scooter::HttpDispatchers::OrchestratorDispatcher do
|
|
4
4
|
|
5
5
|
let(:orchestrator_api) { Scooter::HttpDispatchers::OrchestratorDispatcher.new(host) }
|
6
6
|
let(:job_id) { random_string }
|
7
|
+
let(:schedule_task_payload) {
|
8
|
+
{ 'task' => 'foo' }
|
9
|
+
}
|
10
|
+
let(:schedule_plan_payload) {
|
11
|
+
{ 'plan' => 'foo' }
|
12
|
+
}
|
7
13
|
let(:environment) {random_string}
|
8
14
|
let(:logger) { double('logger')}
|
9
15
|
|
10
16
|
|
11
|
-
unixhost = { roles:
|
12
|
-
|
17
|
+
unixhost = { roles: ['test_role'],
|
18
|
+
'platform' => 'debian-7-x86_64' }
|
13
19
|
let(:host) { Beaker::Host.create('test.com', unixhost, {:logger => logger}) }
|
14
20
|
|
15
21
|
subject { orchestrator_api }
|
@@ -39,9 +45,21 @@ describe Scooter::HttpDispatchers::OrchestratorDispatcher do
|
|
39
45
|
it { is_expected.to respond_to(:list_jobs).with(1).arguments }
|
40
46
|
it { is_expected.not_to respond_to(:list_jobs).with(2).arguments }
|
41
47
|
|
42
|
-
it 'should
|
48
|
+
it 'should accept a max jobs argument' do
|
43
49
|
expect(orchestrator_api.connection).to receive(:get).with('v1/jobs')
|
44
|
-
expect{ orchestrator_api.list_jobs }.not_to raise_error
|
50
|
+
expect{ orchestrator_api.list_jobs(1) }.not_to raise_error
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe '.list_plan_jobs' do
|
55
|
+
|
56
|
+
it { is_expected.to respond_to(:list_jobs).with(0).arguments }
|
57
|
+
it { is_expected.to respond_to(:list_jobs).with(1).arguments }
|
58
|
+
it { is_expected.not_to respond_to(:list_jobs).with(2).arguments }
|
59
|
+
|
60
|
+
it 'should take accept a max plan_jobs argument' do
|
61
|
+
expect(orchestrator_api.connection).to receive(:get).with('v1/plan_jobs')
|
62
|
+
expect{ orchestrator_api.list_plan_jobs(1) }.not_to raise_error
|
45
63
|
end
|
46
64
|
end
|
47
65
|
|
@@ -72,7 +90,6 @@ describe Scooter::HttpDispatchers::OrchestratorDispatcher do
|
|
72
90
|
it { is_expected.not_to respond_to(:get_job_report).with(0).arguments }
|
73
91
|
it { is_expected.to respond_to(:get_job_report).with(1).arguments }
|
74
92
|
|
75
|
-
|
76
93
|
it 'should take a job_id' do
|
77
94
|
expect(orchestrator_api.connection).to receive(:get).with("v1/jobs/#{job_id}/report")
|
78
95
|
expect{ orchestrator_api.get_job_report(job_id) }.not_to raise_error
|
@@ -172,9 +189,14 @@ describe Scooter::HttpDispatchers::OrchestratorDispatcher do
|
|
172
189
|
it { is_expected.to respond_to(:create_scheduled_job).with(1).arguments }
|
173
190
|
it { is_expected.not_to respond_to(:create_scheduled_job).with(2).arguments }
|
174
191
|
|
175
|
-
it 'should
|
192
|
+
it 'should schedule a task' do
|
176
193
|
expect(orchestrator_api.connection).to receive(:post).with("v1/command/schedule_task")
|
177
|
-
expect{ orchestrator_api.create_scheduled_job(
|
194
|
+
expect{ orchestrator_api.create_scheduled_job(schedule_task_payload) }.not_to raise_error
|
195
|
+
end
|
196
|
+
|
197
|
+
it 'should schedule a plan' do
|
198
|
+
expect(orchestrator_api.connection).to receive(:post).with("v1/command/schedule_plan")
|
199
|
+
expect{ orchestrator_api.create_scheduled_job(schedule_plan_payload) }.not_to raise_error
|
178
200
|
end
|
179
201
|
end
|
180
202
|
|
@@ -229,12 +251,8 @@ describe Scooter::HttpDispatchers::OrchestratorDispatcher do
|
|
229
251
|
it {is_expected.to respond_to(:get_last_jobs).with(4).arguments }
|
230
252
|
|
231
253
|
before do
|
232
|
-
|
233
|
-
|
234
|
-
index = subject.connection.builder.handlers.index(Faraday::Adapter::NetHttp)
|
235
|
-
subject.connection.builder.swap(index, Faraday::Adapter::Test) do |stub|
|
236
|
-
stub.get('/orchestrator/v1/jobs') { [200, {}] }
|
237
|
-
end
|
254
|
+
stub_request(:get, /orchestrator\/v1\/jobs/).
|
255
|
+
to_return(status: 200, body: {}.to_json, headers: {"Content-Type"=> "application/json"})
|
238
256
|
end
|
239
257
|
|
240
258
|
it 'should make a request with query params' do
|
@@ -276,12 +294,8 @@ describe Scooter::HttpDispatchers::OrchestratorDispatcher do
|
|
276
294
|
it {is_expected.to respond_to(:list_scheduled_jobs).with(2).arguments }
|
277
295
|
|
278
296
|
before do
|
279
|
-
|
280
|
-
|
281
|
-
index = subject.connection.builder.handlers.index(Faraday::Adapter::NetHttp)
|
282
|
-
subject.connection.builder.swap(index, Faraday::Adapter::Test) do |stub|
|
283
|
-
stub.get('/orchestrator/v1/scheduled_jobs') { [200, {}] }
|
284
|
-
end
|
297
|
+
stub_request(:get, /orchestrator\/v1\/scheduled_jobs/).
|
298
|
+
to_return(status: 200, body: {}.to_json, headers: {"Content-Type"=> "application/json"})
|
285
299
|
end
|
286
300
|
|
287
301
|
it 'should make a request with query params' do
|
@@ -29,12 +29,8 @@ module Scooter
|
|
29
29
|
context 'with a beaker host passed in' do
|
30
30
|
describe '.query_nodes' do
|
31
31
|
before do
|
32
|
-
|
33
|
-
|
34
|
-
index = subject.connection.builder.handlers.index(Faraday::Adapter::NetHttp)
|
35
|
-
subject.connection.builder.swap(index, Faraday::Adapter::Test) do |stub|
|
36
|
-
stub.post('/pdb/query/v4/nodes') { [200, []] }
|
37
|
-
end
|
32
|
+
stub_request(:post, /pdb\/query\/v4\/nodes/).
|
33
|
+
to_return(status: 200, body: [], headers: {})
|
38
34
|
end
|
39
35
|
it 'query for all nodes' do
|
40
36
|
expect { subject.query_nodes }.not_to raise_error
|
@@ -51,12 +47,8 @@ module Scooter
|
|
51
47
|
|
52
48
|
describe '.query_catalogs' do
|
53
49
|
before do
|
54
|
-
|
55
|
-
|
56
|
-
index = subject.connection.builder.handlers.index(Faraday::Adapter::NetHttp)
|
57
|
-
subject.connection.builder.swap(index, Faraday::Adapter::Test) do |stub|
|
58
|
-
stub.post('/pdb/query/v4/catalogs') { [200, []] }
|
59
|
-
end
|
50
|
+
stub_request(:post, /pdb\/query\/v4\/catalogs/).
|
51
|
+
to_return(status: 200, body: [], headers: {})
|
60
52
|
end
|
61
53
|
it 'query for all catalogs' do
|
62
54
|
expect { subject.query_catalogs }.not_to raise_error
|
@@ -73,12 +65,8 @@ module Scooter
|
|
73
65
|
|
74
66
|
describe '.query_reports' do
|
75
67
|
before do
|
76
|
-
|
77
|
-
|
78
|
-
index = subject.connection.builder.handlers.index(Faraday::Adapter::NetHttp)
|
79
|
-
subject.connection.builder.swap(index, Faraday::Adapter::Test) do |stub|
|
80
|
-
stub.post('/pdb/query/v4/reports') { [200, []] }
|
81
|
-
end
|
68
|
+
stub_request(:post, /pdb\/query\/v4\/reports/).
|
69
|
+
to_return(status: 200, body: [], headers: {})
|
82
70
|
end
|
83
71
|
it 'query for all reports' do
|
84
72
|
expect { subject.query_reports }.not_to raise_error
|
@@ -95,12 +83,8 @@ module Scooter
|
|
95
83
|
|
96
84
|
describe '.query_facts' do
|
97
85
|
before do
|
98
|
-
|
99
|
-
|
100
|
-
index = subject.connection.builder.handlers.index(Faraday::Adapter::NetHttp)
|
101
|
-
subject.connection.builder.swap(index, Faraday::Adapter::Test) do |stub|
|
102
|
-
stub.post('/pdb/query/v4/facts') { [200, []] }
|
103
|
-
end
|
86
|
+
stub_request(:post, /pdb\/query\/v4\/facts/).
|
87
|
+
to_return(status: 200, body: [], headers: {})
|
104
88
|
end
|
105
89
|
it 'query for all facts' do
|
106
90
|
expect { subject.query_facts }.not_to raise_error
|
@@ -121,12 +105,10 @@ module Scooter
|
|
121
105
|
|
122
106
|
describe '.nodes_match?' do
|
123
107
|
before do
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
stub.post('/pdb/query/v4/nodes') { [200, [], [{ 'certname' => 'name', 'facts_timestamp' => 'facts_time', 'report_timestamp' => 'reports_time', 'catalog_timestamp' => 'catalog_time' }]] }
|
129
|
-
end
|
108
|
+
stub_request(:post, /pdb\/query\/v4\/nodes/).
|
109
|
+
to_return(status: 200,
|
110
|
+
body: [{ 'certname' => 'name', 'facts_timestamp' => 'facts_time', 'report_timestamp' => 'reports_time', 'catalog_timestamp' => 'catalog_time' }],
|
111
|
+
headers: {})
|
130
112
|
end
|
131
113
|
it 'nodes different size' do
|
132
114
|
expect(subject.send(:nodes_match?, [{ 'certname' => 'name', 'facts_timestamp' => 'facts_time', 'report_timestamp' => 'reports_time', 'catalog_timestamp' => 'catalog_time' },
|
@@ -148,12 +130,10 @@ module Scooter
|
|
148
130
|
|
149
131
|
describe '.catalogs_match?' do
|
150
132
|
before do
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
stub.post('/pdb/query/v4/catalogs') { [200, [], [{ 'catalog_uuid' => 'catalog_uuid_1', 'producer_timestamp' => 'time' }]] }
|
156
|
-
end
|
133
|
+
stub_request(:post, /pdb\/query\/v4\/catalogs/).
|
134
|
+
to_return(status: 200,
|
135
|
+
body: [{ 'catalog_uuid' => 'catalog_uuid_1', 'producer_timestamp' => 'time' }],
|
136
|
+
headers: {})
|
157
137
|
end
|
158
138
|
it 'catalogs different size' do
|
159
139
|
expect(subject.send(:catalogs_match?, [{ 'catalog_uuid' => 'catalog_uuid_1', 'producer_timestamp' => 'time' },
|
@@ -170,13 +150,12 @@ module Scooter
|
|
170
150
|
|
171
151
|
describe '.facts_match?' do
|
172
152
|
before do
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
stub.post('/pdb/query/v4/facts') { [200, [], [{ 'name' => 'name', 'value' => 'value' }]] }
|
178
|
-
end
|
153
|
+
stub_request(:post, /pdb\/query\/v4\/facts/).
|
154
|
+
to_return(status: 200,
|
155
|
+
body: [{ 'name' => 'name', 'value' => 'value' }],
|
156
|
+
headers: {})
|
179
157
|
end
|
158
|
+
|
180
159
|
it 'facts different size' do
|
181
160
|
expect(subject.send(:facts_match?, [{ 'name' => 'name', 'value' => 'value' },
|
182
161
|
{ 'name2' => 'name', 'value2' => 'value' }])).to be false
|
@@ -192,12 +171,10 @@ module Scooter
|
|
192
171
|
|
193
172
|
describe '.reports_match?' do
|
194
173
|
before do
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
stub.post('/pdb/query/v4/reports') { [200, [], [{ 'hash' => 'hash_value', 'producer_timestamp' => 'time' }]] }
|
200
|
-
end
|
174
|
+
stub_request(:post, /pdb\/query\/v4\/reports/).
|
175
|
+
to_return(status: 200,
|
176
|
+
body: [{ 'hash' => 'hash_value', 'producer_timestamp' => 'time' }],
|
177
|
+
headers: {})
|
201
178
|
end
|
202
179
|
it 'reports different size' do
|
203
180
|
expect(subject.send(:reports_match?, [{ 'hash' => 'hash_value', 'producer_timestamp' => 'time' },
|
@@ -214,23 +191,43 @@ module Scooter
|
|
214
191
|
|
215
192
|
describe '.replica_db_synced_with_master_db?' do
|
216
193
|
before do
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
194
|
+
stub_request(:post, "https://test.com:8081/pdb/query/v4/nodes").
|
195
|
+
to_return(status: 200,
|
196
|
+
body: [{ 'certname' => 'test.com', 'facts_timestamp' => 'facts_time', 'report_timestamp' => 'reports_time', 'catalog_timestamp' => 'catalog_time' }, { 'certname' => 'test.com', 'facts_timestamp' => 'facts_time', 'report_timestamp' => 'reports_time', 'catalog_timestamp' => 'catalog_time' }],
|
197
|
+
headers: {})
|
198
|
+
stub_request(:post, "https://test2.com:8081/pdb/query/v4/nodes").
|
199
|
+
to_return(status: 200,
|
200
|
+
body: [{ 'certname' => 'test2.com', 'facts_timestamp' => 'facts_time', 'report_timestamp' => 'reports_time', 'catalog_timestamp' => 'catalog_time' }, { 'certname' => 'test.com', 'facts_timestamp' => 'facts_time', 'report_timestamp' => 'reports_time', 'catalog_timestamp' => 'catalog_time' }],
|
201
|
+
headers: {})
|
202
|
+
|
203
|
+
stub_request(:post, "https://test.com:8081/pdb/query/v4/catalogs").
|
204
|
+
to_return(status: 200,
|
205
|
+
body: [{ 'certname' => 'test.com', 'catalog_uuid' => 'catalog_uuid_1', 'producer_timestamp' => 'time' }],
|
206
|
+
headers: {})
|
207
|
+
stub_request(:post, "https://test2.com:8081/pdb/query/v4/catalogs").
|
208
|
+
to_return(status: 200,
|
209
|
+
body: [{ 'certname' => 'test2.com', 'catalog_uuid' => 'catalog_uuid_2', 'producer_timestamp' => 'time2' }],
|
210
|
+
headers: {})
|
211
|
+
|
212
|
+
stub_request(:post, "https://test.com:8081/pdb/query/v4/facts").
|
213
|
+
to_return(status: 200,
|
214
|
+
body: [{ 'name' => 'name', 'value' => 'value' }],
|
215
|
+
headers: {})
|
216
|
+
stub_request(:post, "https://test2.com:8081/pdb/query/v4/facts").
|
217
|
+
to_return(status: 200,
|
218
|
+
body: [{ 'name' => 'name2', 'value' => 'value2' }],
|
219
|
+
headers: {})
|
220
|
+
|
221
|
+
stub_request(:post, "https://test.com:8081/pdb/query/v4/reports").
|
222
|
+
to_return(status: 200,
|
223
|
+
body: [{ 'certname' => 'test.com', 'hash' => 'hash_value', 'producer_timestamp' => 'time' }],
|
224
|
+
headers: {})
|
225
|
+
stub_request(:post, "https://test2.com:8081/pdb/query/v4/reports").
|
226
|
+
to_return(status: 200,
|
227
|
+
body: [{ 'certname' => 'test2.com', 'hash' => 'hash_value2', 'producer_timestamp' => 'time2' }],
|
228
|
+
headers: {})
|
229
|
+
|
230
|
+
|
234
231
|
expect(subject).to receive(:is_resolvable).exactly(8).times.and_return(true)
|
235
232
|
expect(subject).to receive(:master_has_node?).twice.and_return(true)
|
236
233
|
end
|