mongo 2.17.0 → 2.17.3

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.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/lib/mongo/bulk_write.rb +1 -1
  4. data/lib/mongo/cluster/reapers/cursor_reaper.rb +26 -14
  5. data/lib/mongo/collection/view/builder/map_reduce.rb +7 -4
  6. data/lib/mongo/collection/view/iterable.rb +2 -1
  7. data/lib/mongo/collection/view/map_reduce.rb +14 -1
  8. data/lib/mongo/cursor/kill_spec.rb +19 -2
  9. data/lib/mongo/cursor.rb +11 -6
  10. data/lib/mongo/operation/shared/sessions_supported.rb +7 -3
  11. data/lib/mongo/query_cache.rb +12 -2
  12. data/lib/mongo/server/monitor/connection.rb +10 -4
  13. data/lib/mongo/version.rb +1 -1
  14. data/spec/integration/bulk_write_spec.rb +16 -0
  15. data/spec/integration/query_cache_spec.rb +159 -0
  16. data/spec/integration/sdam_events_spec.rb +40 -0
  17. data/spec/lite_spec_helper.rb +7 -0
  18. data/spec/mongo/cluster/cursor_reaper_spec.rb +22 -15
  19. data/spec/mongo/collection/view/map_reduce_spec.rb +16 -0
  20. data/spec/mongo/collection/view/readable_spec.rb +56 -0
  21. data/spec/mongo/cursor_spec.rb +53 -2
  22. data/spec/mongo/query_cache_spec.rb +165 -0
  23. data/spec/runners/auth.rb +1 -1
  24. data/spec/runners/change_streams/spec.rb +1 -1
  25. data/spec/runners/cmap.rb +1 -1
  26. data/spec/runners/command_monitoring.rb +1 -1
  27. data/spec/runners/connection_string.rb +1 -1
  28. data/spec/runners/crud/spec.rb +1 -3
  29. data/spec/runners/gridfs.rb +1 -1
  30. data/spec/runners/read_write_concern_document.rb +1 -1
  31. data/spec/runners/sdam.rb +1 -1
  32. data/spec/runners/server_selection.rb +1 -1
  33. data/spec/runners/server_selection_rtt.rb +1 -1
  34. data/spec/runners/unified/test_group.rb +1 -1
  35. data/spec/shared/share/Dockerfile.erb +3 -3
  36. data/spec/shared/shlib/server.sh +1 -1
  37. data/spec/spec_tests/seed_list_discovery_spec.rb +1 -1
  38. data/spec/support/certificates/atlas-ocsp-ca.crt +40 -47
  39. data/spec/support/certificates/atlas-ocsp.crt +101 -106
  40. data/spec/support/utils.rb +31 -0
  41. data.tar.gz.sig +2 -2
  42. metadata +1056 -1055
  43. metadata.gz.sig +1 -2
@@ -41,12 +41,12 @@ describe Mongo::Cluster::CursorReaper do
41
41
  let(:cursor_id) { 1 }
42
42
  let(:cursor_kill_spec_1) do
43
43
  Mongo::Cursor::KillSpec.new(
44
- cursor_id: cursor_id, coll_name: 'c', db_name: 'd', service_id: nil,
44
+ cursor_id: cursor_id, coll_name: 'c', db_name: 'd', service_id: nil, server_address: address
45
45
  )
46
46
  end
47
47
  let(:cursor_kill_spec_2) do
48
48
  Mongo::Cursor::KillSpec.new(
49
- cursor_id: cursor_id, coll_name: 'c', db_name: 'q', service_id: nil,
49
+ cursor_id: cursor_id, coll_name: 'c', db_name: 'q', service_id: nil, server_address: address
50
50
  )
51
51
  end
52
52
  let(:to_kill) { reaper.instance_variable_get(:@to_kill)}
@@ -60,36 +60,40 @@ describe Mongo::Cluster::CursorReaper do
60
60
  context 'when there is not a list already for the server' do
61
61
 
62
62
  before do
63
- reaper.schedule_kill_cursor(cursor_kill_spec_1, server)
63
+ reaper.schedule_kill_cursor(cursor_kill_spec_1)
64
+ reaper.read_scheduled_kill_specs
64
65
  end
65
66
 
66
67
  it 'initializes the list of op specs to a set' do
67
- expect(to_kill.keys).to eq([ address.seed ])
68
- expect(to_kill[address.seed]).to eq(Set.new([cursor_kill_spec_1]))
68
+ expect(to_kill.keys).to eq([ address ])
69
+ expect(to_kill[address]).to contain_exactly(cursor_kill_spec_1)
69
70
  end
70
71
  end
71
72
 
72
73
  context 'when there is a list of ops already for the server' do
73
74
 
74
75
  before do
75
- reaper.schedule_kill_cursor(cursor_kill_spec_1, server)
76
- reaper.schedule_kill_cursor(cursor_kill_spec_2, server)
76
+ reaper.schedule_kill_cursor(cursor_kill_spec_1)
77
+ reaper.read_scheduled_kill_specs
78
+ reaper.schedule_kill_cursor(cursor_kill_spec_2)
79
+ reaper.read_scheduled_kill_specs
77
80
  end
78
81
 
79
82
  it 'adds the op to the server list' do
80
- expect(to_kill.keys).to eq([ address.seed ])
81
- expect(to_kill[address.seed]).to contain_exactly(cursor_kill_spec_1, cursor_kill_spec_2)
83
+ expect(to_kill.keys).to eq([ address ])
84
+ expect(to_kill[address]).to contain_exactly(cursor_kill_spec_1, cursor_kill_spec_2)
82
85
  end
83
86
 
84
87
  context 'when the same op is added more than once' do
85
88
 
86
89
  before do
87
- reaper.schedule_kill_cursor(cursor_kill_spec_2, server)
90
+ reaper.schedule_kill_cursor(cursor_kill_spec_2)
91
+ reaper.read_scheduled_kill_specs
88
92
  end
89
93
 
90
94
  it 'does not allow duplicates ops for a server' do
91
- expect(to_kill.keys).to eq([ address.seed ])
92
- expect(to_kill[address.seed]).to contain_exactly(cursor_kill_spec_1, cursor_kill_spec_2)
95
+ expect(to_kill.keys).to eq([ address ])
96
+ expect(to_kill[address]).to contain_exactly(cursor_kill_spec_1, cursor_kill_spec_2)
93
97
  end
94
98
  end
95
99
  end
@@ -98,7 +102,7 @@ describe Mongo::Cluster::CursorReaper do
98
102
  context 'when the cursor is not on the list of active cursors' do
99
103
 
100
104
  before do
101
- reaper.schedule_kill_cursor(cursor_kill_spec_1, server)
105
+ reaper.schedule_kill_cursor(cursor_kill_spec_1)
102
106
  end
103
107
 
104
108
  it 'does not add the kill cursors op spec to the list' do
@@ -189,8 +193,11 @@ describe Mongo::Cluster::CursorReaper do
189
193
  around do |example|
190
194
  authorized_collection.insert_many(docs)
191
195
  periodic_executor.stop!
192
- cluster.schedule_kill_cursor(cursor.kill_spec,
193
- cursor.instance_variable_get(:@server))
196
+ cluster.schedule_kill_cursor(
197
+ cursor.kill_spec(
198
+ cursor.instance_variable_get(:@server)
199
+ )
200
+ )
194
201
  periodic_executor.flush
195
202
  example.run
196
203
  periodic_executor.run!
@@ -878,4 +878,20 @@ describe Mongo::Collection::View::MapReduce do
878
878
  end
879
879
  end
880
880
  end
881
+
882
+ describe '#map_reduce_spec' do
883
+ context 'when read preference is given' do
884
+ let(:view_options) do
885
+ { read: {mode: :secondary} }
886
+ end
887
+
888
+ context 'selector' do
889
+ # For compatibility with released versions of Mongoid, this method
890
+ # must return read preference under the :read key.
891
+ it 'contains read preference' do
892
+ map_reduce_spec[:selector][:read].should == {'mode' => :secondary}
893
+ end
894
+ end
895
+ end
896
+ end
881
897
  end
@@ -1186,6 +1186,62 @@ describe Mongo::Collection::View::Readable do
1186
1186
  it 'returns a new View' do
1187
1187
  expect(new_view).not_to be(view)
1188
1188
  end
1189
+
1190
+ context 'when sending to server' do
1191
+ let(:subscriber) { Mrss::EventSubscriber.new }
1192
+
1193
+ before do
1194
+ authorized_collection.client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
1195
+ end
1196
+
1197
+ let(:event) do
1198
+ subscriber.single_command_started_event('find')
1199
+ end
1200
+
1201
+ it 'is sent to server' do
1202
+ new_view.to_a
1203
+ event.command.slice('noCursorTimeout').should == {'noCursorTimeout' => true}
1204
+ end
1205
+ end
1206
+
1207
+ context 'integration test' do
1208
+ require_topology :single
1209
+
1210
+ # The number of open cursors with the option set to prevent timeout.
1211
+ def current_no_timeout_count
1212
+ root_authorized_client
1213
+ .command(serverStatus: 1)
1214
+ .documents
1215
+ .first
1216
+ .fetch('metrics')
1217
+ .fetch('cursor')
1218
+ .fetch('open')
1219
+ .fetch('noTimeout')
1220
+ end
1221
+
1222
+ it 'is applied on the server' do
1223
+ # Initialize collection with two documents.
1224
+ new_view.collection.insert_many([{}, {}])
1225
+
1226
+ expect(new_view.count).to be == 2
1227
+
1228
+ # Initial "noTimeout" count should be zero.
1229
+ states = [current_no_timeout_count]
1230
+
1231
+ # The "noTimeout" count should be one while iterating.
1232
+ new_view.batch_size(1).each { states << current_no_timeout_count }
1233
+
1234
+ # Final "noTimeout" count should be back to zero.
1235
+ states << current_no_timeout_count
1236
+
1237
+ # This succeeds on:
1238
+ # commit aab776ebdfb15ddb9765039f7300e15796de0c5c
1239
+ #
1240
+ # This starts failing with [0, 0, 0, 0] from:
1241
+ # commit 2d9f0217ec904a1952a1ada2136502eefbca562e
1242
+ expect(states).to be == [0, 1, 1, 0]
1243
+ end
1244
+ end
1189
1245
  end
1190
1246
 
1191
1247
  describe '#projection' do
@@ -331,8 +331,9 @@ describe Mongo::Cursor do
331
331
 
332
332
  before do
333
333
  authorized_collection.insert_many(documents)
334
- cluster.schedule_kill_cursor(cursor.kill_spec,
335
- cursor.instance_variable_get(:@server))
334
+ cluster.schedule_kill_cursor(
335
+ cursor.kill_spec(cursor.instance_variable_get(:@server))
336
+ )
336
337
  end
337
338
 
338
339
  let(:view) do
@@ -697,4 +698,54 @@ describe Mongo::Cursor do
697
698
  end
698
699
  end
699
700
  end
701
+
702
+ describe '#batch_size' do
703
+ let(:subscriber) { Mrss::EventSubscriber.new }
704
+
705
+ let(:subscribed_client) do
706
+ authorized_client.tap do |client|
707
+ client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
708
+ end
709
+ end
710
+
711
+ let(:collection) do
712
+ subscribed_client[TEST_COLL]
713
+ end
714
+
715
+ let(:view) do
716
+ collection.find({}, limit: limit)
717
+ end
718
+
719
+ before do
720
+ collection.drop
721
+ collection.insert_many([].fill({ "bar": "baz" }, 0, 102))
722
+ end
723
+
724
+ context 'when limit is 0 and batch_size is not set' do
725
+ let(:limit) do
726
+ 0
727
+ end
728
+
729
+ it 'does not set batch_size' do
730
+ view.to_a
731
+ get_more_commands = subscriber.started_events.select { |e| e.command_name == 'getMore' }
732
+ expect(get_more_commands.length).to eq(1)
733
+ expect(get_more_commands.first.command.keys).not_to include('batchSize')
734
+ end
735
+ end
736
+
737
+ context 'when limit is not zero and batch_size is not set' do
738
+ let(:limit) do
739
+ 1000
740
+ end
741
+
742
+ it 'sets batch_size' do
743
+ view.to_a
744
+ get_more_commands = subscriber.started_events.select { |e| e.command_name == 'getMore' }
745
+
746
+ expect(get_more_commands.length).to eq(1)
747
+ expect(get_more_commands.first.command.keys).to include('batchSize')
748
+ end
749
+ end
750
+ end
700
751
  end
@@ -191,6 +191,14 @@ describe Mongo::QueryCache do
191
191
  end
192
192
  end
193
193
 
194
+ context 'when the query has a limit but negative' do
195
+ let(:limit) { -5 }
196
+
197
+ it 'returns the caching cursor' do
198
+ expect(Mongo::QueryCache.get(**query_options)).to eq(caching_cursor)
199
+ end
200
+ end
201
+
194
202
  context 'when the query has no limit' do
195
203
  let(:limit) { nil }
196
204
 
@@ -198,6 +206,65 @@ describe Mongo::QueryCache do
198
206
  expect(Mongo::QueryCache.get(**query_options)).to eq(caching_cursor)
199
207
  end
200
208
  end
209
+
210
+ context 'when the query has a 0 limit' do
211
+ let(:limit) { 0 }
212
+
213
+ it 'returns the caching cursor' do
214
+ expect(Mongo::QueryCache.get(**query_options)).to eq(caching_cursor)
215
+ end
216
+ end
217
+ end
218
+
219
+ context 'when that entry has a 0 limit' do
220
+ let(:caching_cursor_options) do
221
+ {
222
+ namespace: 'db.coll',
223
+ selector: { field: 'value' },
224
+ limit: 0,
225
+ }
226
+ end
227
+
228
+ let(:query_options) do
229
+ caching_cursor_options.merge(limit: limit)
230
+ end
231
+
232
+ before do
233
+ allow(view).to receive(:limit) { 0 }
234
+ end
235
+
236
+ context 'when the query has a limit' do
237
+ let(:limit) { 5 }
238
+
239
+ it 'returns the caching cursor' do
240
+ expect(Mongo::QueryCache.get(**query_options)).to eq(caching_cursor)
241
+ end
242
+ end
243
+
244
+ context 'when the query has a limit but negative' do
245
+ let(:limit) { -5 }
246
+
247
+ it 'returns the caching cursor' do
248
+ expect(Mongo::QueryCache.get(**query_options)).to eq(caching_cursor)
249
+ end
250
+ end
251
+
252
+
253
+ context 'when the query has no limit' do
254
+ let(:limit) { nil }
255
+
256
+ it 'returns the caching cursor' do
257
+ expect(Mongo::QueryCache.get(**query_options)).to eq(caching_cursor)
258
+ end
259
+ end
260
+
261
+ context 'when the query has a 0 limit' do
262
+ let(:limit) { 0 }
263
+
264
+ it 'returns the caching cursor' do
265
+ expect(Mongo::QueryCache.get(**query_options)).to eq(caching_cursor)
266
+ end
267
+ end
201
268
  end
202
269
 
203
270
  context 'when that entry has a limit' do
@@ -225,6 +292,14 @@ describe Mongo::QueryCache do
225
292
  end
226
293
  end
227
294
 
295
+ context 'and the new query has a smaller limit but negative' do
296
+ let(:limit) { -4 }
297
+
298
+ it 'returns the caching cursor' do
299
+ expect(Mongo::QueryCache.get(**query_options)).to eq(caching_cursor)
300
+ end
301
+ end
302
+
228
303
  context 'and the new query has a larger limit' do
229
304
  let(:limit) { 6 }
230
305
 
@@ -233,6 +308,14 @@ describe Mongo::QueryCache do
233
308
  end
234
309
  end
235
310
 
311
+ context 'and the new query has a larger limit but negative' do
312
+ let(:limit) { -6 }
313
+
314
+ it 'returns nil' do
315
+ expect(Mongo::QueryCache.get(**query_options)).to be_nil
316
+ end
317
+ end
318
+
236
319
  context 'and the new query has the same limit' do
237
320
  let(:limit) { 5 }
238
321
 
@@ -241,6 +324,80 @@ describe Mongo::QueryCache do
241
324
  end
242
325
  end
243
326
 
327
+ context 'and the new query has the same limit but negative' do
328
+ let(:limit) { -5 }
329
+
330
+ it 'returns the caching cursor' do
331
+ expect(Mongo::QueryCache.get(**query_options)).to eq(caching_cursor)
332
+ end
333
+ end
334
+
335
+ context 'and the new query has no limit' do
336
+ let(:limit) { nil }
337
+
338
+ it 'returns nil' do
339
+ expect(Mongo::QueryCache.get(**query_options)).to be_nil
340
+ end
341
+ end
342
+
343
+ context 'and the new query has a 0 limit' do
344
+ let(:limit) { 0 }
345
+
346
+ it 'returns nil' do
347
+ expect(Mongo::QueryCache.get(**query_options)).to be_nil
348
+ end
349
+ end
350
+ end
351
+
352
+ context 'when that entry has a negative limit' do
353
+ let(:caching_cursor_options) do
354
+ {
355
+ namespace: 'db.coll',
356
+ selector: { field: 'value' },
357
+ limit: -5,
358
+ }
359
+ end
360
+
361
+ let(:query_options) do
362
+ caching_cursor_options.merge(limit: limit)
363
+ end
364
+
365
+ before do
366
+ allow(view).to receive(:limit) { -5 }
367
+ end
368
+
369
+ context 'and the new query has a smaller limit' do
370
+ let(:limit) { 4 }
371
+
372
+ it 'returns the caching cursor' do
373
+ expect(Mongo::QueryCache.get(**query_options)).to eq(caching_cursor)
374
+ end
375
+ end
376
+
377
+ context 'and the new query has a larger limit' do
378
+ let(:limit) { 6 }
379
+
380
+ it 'returns nil' do
381
+ expect(Mongo::QueryCache.get(**query_options)).to be_nil
382
+ end
383
+ end
384
+
385
+ context 'and the new query has the same negative limit' do
386
+ let(:limit) { -5 }
387
+
388
+ it 'returns the caching cursor' do
389
+ expect(Mongo::QueryCache.get(**query_options)).to eq(caching_cursor)
390
+ end
391
+ end
392
+
393
+ context 'and the new query has the same positive limit' do
394
+ let(:limit) { 5 }
395
+
396
+ it 'returns the caching cursor' do
397
+ expect(Mongo::QueryCache.get(**query_options)).to eq(caching_cursor)
398
+ end
399
+ end
400
+
244
401
  context 'and the new query has no limit' do
245
402
  let(:limit) { nil }
246
403
 
@@ -248,6 +405,14 @@ describe Mongo::QueryCache do
248
405
  expect(Mongo::QueryCache.get(**query_options)).to be_nil
249
406
  end
250
407
  end
408
+
409
+ context 'and the new query has a 0 limit' do
410
+ let(:limit) { 0 }
411
+
412
+ it 'returns nil' do
413
+ expect(Mongo::QueryCache.get(**query_options)).to be_nil
414
+ end
415
+ end
251
416
  end
252
417
  end
253
418
  end
data/spec/runners/auth.rb CHANGED
@@ -48,7 +48,7 @@ module Mongo
48
48
  attr_reader :tests
49
49
 
50
50
  def initialize(test_path)
51
- @spec = YAML.load(File.read(test_path))
51
+ @spec = ::Utils.load_spec_yaml_file(test_path)
52
52
  @description = File.basename(test_path)
53
53
  end
54
54
 
@@ -32,7 +32,7 @@ module Mongo
32
32
  #
33
33
  # @since 2.6.0
34
34
  def initialize(test_path)
35
- @spec = YAML.load(File.read(test_path))
35
+ @spec = ::Utils.load_spec_yaml_file(test_path)
36
36
  @description = File.basename(test_path)
37
37
  @spec_tests = @spec['tests']
38
38
  @collection_name = @spec['collection_name']
data/spec/runners/cmap.rb CHANGED
@@ -40,7 +40,7 @@ module Mongo
40
40
  #
41
41
  # @param [ String ] test_path The path to the file.
42
42
  def initialize(test_path)
43
- @test = YAML.load(File.read(test_path))
43
+ @test = ::Utils.load_spec_yaml_file(test_path)
44
44
 
45
45
  @description = @test['description']
46
46
  @pool_options = ::Utils.snakeize_hash(process_options(@test['poolOptions']))
@@ -204,7 +204,7 @@ module Mongo
204
204
  #
205
205
  # @since 2.1.0
206
206
  def initialize(test_path)
207
- @spec = YAML.load(File.read(test_path))
207
+ @spec = ::Utils.load_spec_yaml_file(test_path)
208
208
  @data = @spec['data']
209
209
  @tests = @spec['tests']
210
210
  end
@@ -100,7 +100,7 @@ module Mongo
100
100
  #
101
101
  # @since 2.0.0
102
102
  def initialize(test_path)
103
- @spec = YAML.load(File.read(test_path))
103
+ @spec = ::Utils.load_spec_yaml_file(test_path)
104
104
  @description = File.basename(test_path)
105
105
  end
106
106
 
@@ -12,9 +12,7 @@ module Mongo
12
12
  #
13
13
  # @since 2.0.0
14
14
  def initialize(test_path)
15
- contents = File.read(test_path)
16
-
17
- @spec = YAML.load(contents)
15
+ @spec = ::Utils.load_spec_yaml_file(test_path)
18
16
  @description = File.basename(test_path)
19
17
  @data = BSON::ExtJSON.parse_obj(@spec['data'])
20
18
  @tests = @spec['tests']
@@ -100,7 +100,7 @@ module Mongo
100
100
  #
101
101
  # @since 2.1.0
102
102
  def initialize(test_path)
103
- @spec = YAML.load(File.read(test_path))
103
+ @spec = ::Utils.load_spec_yaml_file(test_path)
104
104
  @description = File.basename(test_path)
105
105
  @data = @spec['data']
106
106
  end
@@ -13,7 +13,7 @@ module ReadWriteConcernDocument
13
13
  #
14
14
  # @since 2.0.0
15
15
  def initialize(test_path)
16
- @spec = YAML.load(File.read(test_path))
16
+ @spec = ::Utils.load_spec_yaml_file(test_path)
17
17
  @description = File.basename(test_path)
18
18
  end
19
19
 
data/spec/runners/sdam.rb CHANGED
@@ -77,7 +77,7 @@ module Mongo
77
77
  #
78
78
  # @since 2.0.0
79
79
  def initialize(test_path)
80
- @test = YAML.load(File.read(test_path))
80
+ @test = ::Utils.load_spec_yaml_file(test_path)
81
81
  @description = @test['description']
82
82
  @uri_string = @test['uri']
83
83
  @uri = URI.new(uri_string)
@@ -64,7 +64,7 @@ module Mongo
64
64
  #
65
65
  # @since 2.0.0
66
66
  def initialize(test_path)
67
- @test = YAML.load(File.read(test_path))
67
+ @test = ::Utils.load_spec_yaml_file(test_path)
68
68
  @description = "#{@test['topology_description']['type']}: #{File.basename(test_path)}"
69
69
  @heartbeat_frequency = @test['heartbeatFrequencyMS'] / 1000 if @test['heartbeatFrequencyMS']
70
70
  @read_preference = @test['read_preference']
@@ -28,7 +28,7 @@ module Mongo
28
28
  #
29
29
  # @since 2.0.0
30
30
  def initialize(test_path)
31
- @test = YAML.load(File.read(test_path))
31
+ @test = ::Utils.load_spec_yaml_file(test_path)
32
32
  @description = "#{File.basename(test_path)}: avg_rtt_ms: #{@test['avg_rtt_ms']}, new_rtt_ms: #{@test['new_rtt_ms']}," +
33
33
  " new_avg_rtt: #{@test['new_avg_rtt']}"
34
34
  @average_rtt = @test['avg_rtt_ms'] == 'NULL' ? nil : @test['avg_rtt_ms'].to_f / 1000
@@ -6,7 +6,7 @@ module Unified
6
6
  class TestGroup
7
7
  def initialize(path, **opts)
8
8
  if String === path
9
- data = YAML.load(File.read(path))
9
+ data = ::Utils.load_spec_yaml_file(path)
10
10
  else
11
11
  data = path
12
12
  end
@@ -233,13 +233,13 @@ CFG
233
233
  # Current virtualenv fails with
234
234
  # https://github.com/pypa/virtualenv/issues/1630
235
235
  <% if distro =~ /ubuntu2004/ %>
236
- RUN python3 -m pip install 'virtualenv<20' 'mtools-legacy[mlaunch]'
236
+ RUN python3 -m pip install 'virtualenv<20' 'mtools-legacy[mlaunch]==1.5.5'
237
237
  <% else %>
238
- RUN python2 -m pip install 'virtualenv<20' 'mtools-legacy[mlaunch]'
238
+ RUN python2 -m pip install 'virtualenv<20' 'mtools-legacy[mlaunch]==1.5.5'
239
239
  <% end %>
240
240
 
241
241
  RUN pip --version && \
242
- pip install mtools-legacy[mlaunch]
242
+ pip install 'mtools-legacy[mlaunch]==1.5.5'
243
243
 
244
244
  <% if @env.fetch('MONGODB_VERSION') >= '4.4' %>
245
245
  # ubuntu1604 installs MarkupSafe 0.0.0 here instead of 2.0.0+
@@ -71,7 +71,7 @@ install_mlaunch_virtualenv() {
71
71
  venvpath="$MONGO_ORCHESTRATION_HOME"/venv
72
72
  python2 -m virtualenv -p python2 $venvpath
73
73
  . $venvpath/bin/activate
74
- pip install 'mtools-legacy[mlaunch]'
74
+ pip install 'mtools-legacy[mlaunch]==1.5.5'
75
75
  fi
76
76
  }
77
77
 
@@ -15,7 +15,7 @@ describe 'DNS Seedlist Discovery' do
15
15
 
16
16
  SEED_LIST_DISCOVERY_TESTS.each do |test_path|
17
17
 
18
- spec = YAML.load(File.read(test_path))
18
+ spec = ::Utils.load_spec_yaml_file(test_path)
19
19
 
20
20
  test = Mongo::ConnectionString::Test.new(spec)
21
21