scooter 4.3.2 → 4.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/workflows/unit-tests.yaml +26 -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 -64
@@ -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
|