mongo 2.10.5 → 2.15.1

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 (1345) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CONTRIBUTING.md +8 -36
  4. data/LICENSE +1 -1
  5. data/README.md +57 -53
  6. data/Rakefile +76 -16
  7. data/lib/mongo/active_support.rb +4 -1
  8. data/lib/mongo/address/ipv4.rb +35 -5
  9. data/lib/mongo/address/ipv6.rb +35 -5
  10. data/lib/mongo/address/unix.rb +6 -3
  11. data/lib/mongo/address/validator.rb +102 -0
  12. data/lib/mongo/address.rb +121 -46
  13. data/lib/mongo/auth/aws/conversation.rb +128 -0
  14. data/lib/mongo/auth/aws/credentials_retriever.rb +222 -0
  15. data/lib/mongo/auth/aws/request.rb +286 -0
  16. data/lib/mongo/auth/aws.rb +40 -0
  17. data/lib/mongo/auth/base.rb +138 -0
  18. data/lib/mongo/auth/conversation_base.rb +87 -0
  19. data/lib/mongo/auth/cr/conversation.rb +24 -89
  20. data/lib/mongo/auth/cr.rb +13 -36
  21. data/lib/mongo/auth/credential_cache.rb +54 -0
  22. data/lib/mongo/auth/gssapi/conversation.rb +100 -0
  23. data/lib/mongo/auth/gssapi.rb +41 -0
  24. data/lib/mongo/auth/ldap/conversation.rb +12 -63
  25. data/lib/mongo/auth/ldap.rb +13 -34
  26. data/lib/mongo/auth/roles.rb +4 -1
  27. data/lib/mongo/auth/sasl_conversation_base.rb +102 -0
  28. data/lib/mongo/auth/scram/conversation.rb +16 -491
  29. data/lib/mongo/auth/scram.rb +43 -51
  30. data/lib/mongo/auth/scram256/conversation.rb +66 -0
  31. data/lib/mongo/auth/scram256.rb +34 -0
  32. data/lib/mongo/auth/scram_conversation_base.rb +378 -0
  33. data/lib/mongo/auth/stringprep/profiles/sasl.rb +5 -1
  34. data/lib/mongo/auth/stringprep/tables.rb +5 -1
  35. data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +3 -2
  36. data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +2 -1
  37. data/lib/mongo/auth/stringprep.rb +9 -5
  38. data/lib/mongo/auth/user/view.rb +30 -14
  39. data/lib/mongo/auth/user.rb +17 -8
  40. data/lib/mongo/auth/x509/conversation.rb +26 -62
  41. data/lib/mongo/auth/x509.rb +29 -33
  42. data/lib/mongo/auth.rb +84 -23
  43. data/lib/mongo/background_thread.rb +173 -0
  44. data/lib/mongo/bson.rb +4 -1
  45. data/lib/mongo/bulk_write/combineable.rb +23 -8
  46. data/lib/mongo/bulk_write/ordered_combiner.rb +4 -1
  47. data/lib/mongo/bulk_write/result.rb +4 -1
  48. data/lib/mongo/bulk_write/result_combiner.rb +4 -1
  49. data/lib/mongo/bulk_write/transformable.rb +12 -10
  50. data/lib/mongo/bulk_write/unordered_combiner.rb +4 -1
  51. data/lib/mongo/bulk_write/validatable.rb +8 -1
  52. data/lib/mongo/bulk_write.rb +85 -26
  53. data/lib/mongo/caching_cursor.rb +77 -0
  54. data/lib/mongo/client.rb +584 -66
  55. data/lib/mongo/client_encryption.rb +106 -0
  56. data/lib/mongo/cluster/periodic_executor.rb +35 -44
  57. data/lib/mongo/cluster/reapers/cursor_reaper.rb +26 -7
  58. data/lib/mongo/cluster/reapers/socket_reaper.rb +4 -1
  59. data/lib/mongo/cluster/sdam_flow.rb +165 -26
  60. data/lib/mongo/cluster/topology/base.rb +4 -1
  61. data/lib/mongo/cluster/topology/no_replica_set_options.rb +4 -1
  62. data/lib/mongo/cluster/topology/replica_set_no_primary.rb +7 -3
  63. data/lib/mongo/cluster/topology/replica_set_with_primary.rb +4 -1
  64. data/lib/mongo/cluster/topology/sharded.rb +5 -2
  65. data/lib/mongo/cluster/topology/single.rb +6 -3
  66. data/lib/mongo/cluster/topology/unknown.rb +4 -1
  67. data/lib/mongo/cluster/topology.rb +22 -2
  68. data/lib/mongo/cluster.rb +426 -150
  69. data/lib/mongo/cluster_time.rb +4 -1
  70. data/lib/mongo/collection/view/aggregation.rb +35 -8
  71. data/lib/mongo/collection/view/builder/aggregation.rb +4 -1
  72. data/lib/mongo/collection/view/builder/find_command.rb +50 -19
  73. data/lib/mongo/collection/view/builder/flags.rb +4 -1
  74. data/lib/mongo/collection/view/builder/map_reduce.rb +4 -1
  75. data/lib/mongo/collection/view/builder/modifiers.rb +4 -1
  76. data/lib/mongo/collection/view/builder/op_query.rb +4 -1
  77. data/lib/mongo/collection/view/builder.rb +4 -1
  78. data/lib/mongo/collection/view/change_stream/retryable.rb +4 -1
  79. data/lib/mongo/collection/view/change_stream.rb +23 -10
  80. data/lib/mongo/collection/view/explainable.rb +31 -9
  81. data/lib/mongo/collection/view/immutable.rb +4 -1
  82. data/lib/mongo/collection/view/iterable.rb +106 -18
  83. data/lib/mongo/collection/view/map_reduce.rb +12 -6
  84. data/lib/mongo/collection/view/readable.rb +81 -25
  85. data/lib/mongo/collection/view/writable.rb +127 -28
  86. data/lib/mongo/collection/view.rb +33 -22
  87. data/lib/mongo/collection.rb +129 -41
  88. data/lib/mongo/crypt/auto_decryption_context.rb +43 -0
  89. data/lib/mongo/crypt/auto_encrypter.rb +182 -0
  90. data/lib/mongo/crypt/auto_encryption_context.rb +47 -0
  91. data/lib/mongo/crypt/binary.rb +158 -0
  92. data/lib/mongo/crypt/binding.rb +1232 -0
  93. data/lib/mongo/crypt/context.rb +138 -0
  94. data/lib/mongo/crypt/data_key_context.rb +165 -0
  95. data/lib/mongo/crypt/encryption_io.rb +309 -0
  96. data/lib/mongo/crypt/explicit_decryption_context.rb +43 -0
  97. data/lib/mongo/crypt/explicit_encrypter.rb +120 -0
  98. data/lib/mongo/crypt/explicit_encryption_context.rb +92 -0
  99. data/lib/mongo/crypt/handle.rb +318 -0
  100. data/lib/mongo/crypt/hooks.rb +93 -0
  101. data/lib/mongo/crypt/kms_context.rb +70 -0
  102. data/lib/mongo/crypt/status.rb +134 -0
  103. data/lib/mongo/crypt.rb +36 -0
  104. data/lib/mongo/cursor/builder/get_more_command.rb +4 -1
  105. data/lib/mongo/cursor/builder/kill_cursors_command.rb +4 -1
  106. data/lib/mongo/cursor/builder/op_get_more.rb +4 -1
  107. data/lib/mongo/cursor/builder/op_kill_cursors.rb +4 -1
  108. data/lib/mongo/cursor/builder.rb +4 -1
  109. data/lib/mongo/cursor.rb +97 -38
  110. data/lib/mongo/database/view.rb +34 -7
  111. data/lib/mongo/database.rb +87 -14
  112. data/lib/mongo/dbref.rb +13 -3
  113. data/lib/mongo/distinguishing_semaphore.rb +58 -0
  114. data/lib/mongo/error/auth_error.rb +5 -2
  115. data/lib/mongo/error/bulk_write_error.rb +34 -15
  116. data/lib/mongo/error/change_stream_resumable.rb +4 -1
  117. data/lib/mongo/error/closed_stream.rb +4 -1
  118. data/lib/mongo/error/connection_check_out_timeout.rb +11 -9
  119. data/lib/mongo/error/connection_perished.rb +26 -0
  120. data/lib/mongo/error/credential_check_error.rb +29 -0
  121. data/lib/mongo/error/crypt_error.rb +34 -0
  122. data/lib/mongo/error/extra_file_chunk.rb +4 -1
  123. data/lib/mongo/error/{failed_stringprep_validation.rb → failed_string_prep_validation.rb} +3 -0
  124. data/lib/mongo/error/file_not_found.rb +4 -1
  125. data/lib/mongo/error/handshake_error.rb +4 -1
  126. data/lib/mongo/error/insufficient_iteration_count.rb +4 -1
  127. data/lib/mongo/error/internal_driver_error.rb +25 -0
  128. data/lib/mongo/error/invalid_address.rb +27 -0
  129. data/lib/mongo/error/invalid_application_name.rb +4 -1
  130. data/lib/mongo/error/invalid_bulk_operation.rb +4 -1
  131. data/lib/mongo/error/invalid_bulk_operation_type.rb +4 -1
  132. data/lib/mongo/error/invalid_collection_name.rb +4 -1
  133. data/lib/mongo/error/invalid_cursor_operation.rb +30 -0
  134. data/lib/mongo/error/invalid_database_name.rb +4 -1
  135. data/lib/mongo/error/invalid_document.rb +4 -1
  136. data/lib/mongo/error/invalid_file.rb +4 -1
  137. data/lib/mongo/error/invalid_file_revision.rb +4 -1
  138. data/lib/mongo/error/invalid_min_pool_size.rb +4 -1
  139. data/lib/mongo/error/invalid_nonce.rb +5 -2
  140. data/lib/mongo/error/invalid_read_concern.rb +31 -0
  141. data/lib/mongo/error/invalid_read_option.rb +4 -1
  142. data/lib/mongo/error/invalid_replacement_document.rb +4 -1
  143. data/lib/mongo/error/invalid_server_auth_host.rb +25 -0
  144. data/lib/mongo/error/invalid_server_auth_response.rb +26 -0
  145. data/lib/mongo/error/invalid_server_preference.rb +9 -1
  146. data/lib/mongo/error/invalid_session.rb +6 -2
  147. data/lib/mongo/error/invalid_signature.rb +4 -1
  148. data/lib/mongo/error/invalid_transaction_operation.rb +4 -1
  149. data/lib/mongo/error/invalid_txt_record.rb +4 -1
  150. data/lib/mongo/error/invalid_update_document.rb +4 -1
  151. data/lib/mongo/error/invalid_uri.rb +4 -1
  152. data/lib/mongo/error/invalid_write_concern.rb +4 -1
  153. data/{spec/support/crud/context.rb → lib/mongo/error/kms_error.rb} +8 -6
  154. data/lib/mongo/error/lint_error.rb +4 -1
  155. data/lib/mongo/error/max_bson_size.rb +18 -4
  156. data/lib/mongo/error/max_message_size.rb +4 -1
  157. data/lib/mongo/error/mismatched_domain.rb +4 -1
  158. data/lib/mongo/error/missing_file_chunk.rb +4 -1
  159. data/lib/mongo/error/missing_password.rb +4 -1
  160. data/lib/mongo/error/missing_resume_token.rb +4 -1
  161. data/lib/mongo/error/missing_scram_server_signature.rb +30 -0
  162. data/lib/mongo/error/mongocryptd_spawn_error.rb +25 -0
  163. data/lib/mongo/error/multi_index_drop.rb +4 -1
  164. data/lib/mongo/error/need_primary_server.rb +4 -1
  165. data/lib/mongo/error/no_server_available.rb +12 -4
  166. data/lib/mongo/error/no_srv_records.rb +4 -1
  167. data/lib/mongo/error/notable.rb +22 -19
  168. data/lib/mongo/error/operation_failure.rb +92 -50
  169. data/lib/mongo/error/parser.rb +85 -18
  170. data/lib/mongo/error/pool_closed_error.rb +15 -5
  171. data/lib/mongo/error/raise_original_error.rb +32 -0
  172. data/lib/mongo/error/sdam_error_detection.rb +16 -5
  173. data/lib/mongo/error/server_api_conflict.rb +26 -0
  174. data/lib/mongo/error/server_api_not_supported.rb +27 -0
  175. data/lib/mongo/error/server_certificate_revoked.rb +25 -0
  176. data/lib/mongo/error/session_ended.rb +4 -1
  177. data/lib/mongo/error/sessions_not_supported.rb +38 -0
  178. data/lib/mongo/error/socket_error.rb +4 -1
  179. data/lib/mongo/error/socket_timeout_error.rb +4 -1
  180. data/lib/mongo/error/unchangeable_collection_option.rb +4 -1
  181. data/lib/mongo/error/unexpected_chunk_length.rb +4 -1
  182. data/lib/mongo/error/unexpected_response.rb +4 -1
  183. data/lib/mongo/error/unknown_payload_type.rb +4 -1
  184. data/lib/mongo/error/unmet_dependency.rb +24 -0
  185. data/lib/mongo/error/unsupported_array_filters.rb +10 -2
  186. data/lib/mongo/error/unsupported_collation.rb +10 -2
  187. data/lib/mongo/error/unsupported_features.rb +4 -1
  188. data/lib/mongo/error/unsupported_message_type.rb +4 -1
  189. data/lib/mongo/error/unsupported_option.rb +104 -0
  190. data/lib/mongo/error/write_retryable.rb +4 -1
  191. data/lib/mongo/error.rb +48 -4
  192. data/lib/mongo/event/base.rb +10 -1
  193. data/lib/mongo/event/listeners.rb +4 -1
  194. data/lib/mongo/event/publisher.rb +4 -1
  195. data/lib/mongo/event/subscriber.rb +4 -1
  196. data/lib/mongo/event.rb +5 -2
  197. data/lib/mongo/grid/file/chunk.rb +5 -2
  198. data/lib/mongo/grid/file/info.rb +7 -3
  199. data/lib/mongo/grid/file.rb +4 -1
  200. data/lib/mongo/grid/fs_bucket.rb +74 -48
  201. data/lib/mongo/grid/stream/read.rb +23 -8
  202. data/lib/mongo/grid/stream/write.rb +4 -1
  203. data/lib/mongo/grid/stream.rb +4 -1
  204. data/lib/mongo/grid.rb +4 -1
  205. data/lib/mongo/id.rb +4 -1
  206. data/lib/mongo/index/view.rb +78 -15
  207. data/lib/mongo/index.rb +5 -1
  208. data/lib/mongo/lint.rb +14 -0
  209. data/lib/mongo/loggable.rb +9 -2
  210. data/lib/mongo/logger.rb +7 -4
  211. data/lib/mongo/monitoring/cmap_log_subscriber.rb +4 -1
  212. data/lib/mongo/monitoring/command_log_subscriber.rb +24 -4
  213. data/lib/mongo/monitoring/event/cmap/base.rb +4 -1
  214. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +12 -2
  215. data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +4 -1
  216. data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +15 -4
  217. data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +15 -4
  218. data/lib/mongo/monitoring/event/cmap/connection_closed.rb +4 -1
  219. data/lib/mongo/monitoring/event/cmap/connection_created.rb +4 -1
  220. data/lib/mongo/monitoring/event/cmap/connection_ready.rb +4 -1
  221. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +4 -1
  222. data/lib/mongo/monitoring/event/cmap/pool_closed.rb +15 -4
  223. data/lib/mongo/monitoring/event/cmap/pool_created.rb +16 -4
  224. data/lib/mongo/monitoring/event/cmap.rb +4 -1
  225. data/lib/mongo/monitoring/event/command_failed.rb +44 -6
  226. data/lib/mongo/monitoring/event/command_started.rb +79 -5
  227. data/lib/mongo/monitoring/event/command_succeeded.rb +41 -4
  228. data/lib/mongo/monitoring/event/secure.rb +44 -4
  229. data/lib/mongo/monitoring/event/server_closed.rb +5 -2
  230. data/lib/mongo/monitoring/event/server_description_changed.rb +31 -5
  231. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +39 -18
  232. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +13 -3
  233. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +34 -13
  234. data/lib/mongo/monitoring/event/server_opening.rb +5 -2
  235. data/lib/mongo/monitoring/event/topology_changed.rb +5 -2
  236. data/lib/mongo/monitoring/event/topology_closed.rb +5 -2
  237. data/lib/mongo/monitoring/event/topology_opening.rb +5 -2
  238. data/lib/mongo/monitoring/event.rb +4 -1
  239. data/lib/mongo/monitoring/publishable.rb +41 -17
  240. data/lib/mongo/monitoring/sdam_log_subscriber.rb +4 -1
  241. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +4 -1
  242. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +13 -2
  243. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +4 -1
  244. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +5 -2
  245. data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +4 -1
  246. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +4 -1
  247. data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +65 -0
  248. data/lib/mongo/monitoring.rb +52 -1
  249. data/lib/mongo/operation/aggregate/command.rb +8 -5
  250. data/lib/mongo/operation/aggregate/op_msg.rb +4 -1
  251. data/lib/mongo/operation/aggregate/result.rb +13 -9
  252. data/lib/mongo/operation/aggregate.rb +4 -1
  253. data/lib/mongo/operation/collections_info/command.rb +48 -0
  254. data/lib/mongo/operation/collections_info/result.rb +22 -2
  255. data/lib/mongo/operation/collections_info.rb +18 -28
  256. data/lib/mongo/operation/command/command.rb +6 -3
  257. data/lib/mongo/operation/command/op_msg.rb +4 -1
  258. data/lib/mongo/operation/command.rb +4 -1
  259. data/lib/mongo/operation/context.rb +102 -0
  260. data/lib/mongo/operation/count/command.rb +6 -3
  261. data/lib/mongo/operation/count/op_msg.rb +4 -1
  262. data/lib/mongo/operation/count.rb +4 -1
  263. data/lib/mongo/operation/create/command.rb +6 -3
  264. data/lib/mongo/operation/create/op_msg.rb +4 -1
  265. data/lib/mongo/operation/create.rb +4 -1
  266. data/lib/mongo/operation/create_index/command.rb +7 -4
  267. data/lib/mongo/operation/create_index/op_msg.rb +9 -3
  268. data/lib/mongo/operation/create_index.rb +4 -1
  269. data/lib/mongo/operation/create_user/command.rb +8 -4
  270. data/lib/mongo/operation/create_user/op_msg.rb +5 -2
  271. data/lib/mongo/operation/create_user.rb +4 -1
  272. data/lib/mongo/operation/delete/bulk_result.rb +6 -1
  273. data/lib/mongo/operation/delete/command.rb +7 -4
  274. data/lib/mongo/operation/delete/legacy.rb +5 -2
  275. data/lib/mongo/operation/delete/op_msg.rb +8 -5
  276. data/lib/mongo/operation/delete/result.rb +8 -2
  277. data/lib/mongo/operation/delete.rb +4 -1
  278. data/lib/mongo/operation/distinct/command.rb +6 -3
  279. data/lib/mongo/operation/distinct/op_msg.rb +4 -1
  280. data/lib/mongo/operation/distinct.rb +4 -1
  281. data/lib/mongo/operation/drop/command.rb +6 -3
  282. data/lib/mongo/operation/drop/op_msg.rb +4 -1
  283. data/lib/mongo/operation/drop.rb +4 -1
  284. data/lib/mongo/operation/drop_database/command.rb +6 -3
  285. data/lib/mongo/operation/drop_database/op_msg.rb +4 -1
  286. data/lib/mongo/operation/drop_database.rb +4 -1
  287. data/lib/mongo/operation/drop_index/command.rb +7 -4
  288. data/lib/mongo/operation/drop_index/op_msg.rb +5 -2
  289. data/lib/mongo/operation/drop_index.rb +4 -1
  290. data/lib/mongo/operation/explain/command.rb +10 -3
  291. data/lib/mongo/operation/explain/legacy.rb +10 -3
  292. data/lib/mongo/operation/explain/op_msg.rb +10 -1
  293. data/lib/mongo/operation/explain/result.rb +7 -1
  294. data/lib/mongo/operation/explain.rb +4 -1
  295. data/lib/mongo/operation/find/command.rb +6 -3
  296. data/lib/mongo/operation/find/legacy/result.rb +6 -1
  297. data/lib/mongo/operation/find/legacy.rb +6 -3
  298. data/lib/mongo/operation/find/op_msg.rb +5 -9
  299. data/lib/mongo/operation/find/result.rb +17 -1
  300. data/lib/mongo/operation/find.rb +4 -1
  301. data/lib/mongo/operation/get_more/command.rb +6 -3
  302. data/lib/mongo/operation/get_more/legacy.rb +5 -2
  303. data/lib/mongo/operation/get_more/op_msg.rb +5 -9
  304. data/lib/mongo/operation/get_more/result.rb +7 -1
  305. data/lib/mongo/operation/get_more.rb +4 -1
  306. data/lib/mongo/operation/indexes/command.rb +6 -3
  307. data/lib/mongo/operation/indexes/legacy.rb +7 -4
  308. data/lib/mongo/operation/indexes/op_msg.rb +4 -1
  309. data/lib/mongo/operation/indexes/result.rb +9 -1
  310. data/lib/mongo/operation/indexes.rb +19 -2
  311. data/lib/mongo/operation/insert/bulk_result.rb +14 -2
  312. data/lib/mongo/operation/insert/command.rb +11 -7
  313. data/lib/mongo/operation/insert/legacy.rb +13 -5
  314. data/lib/mongo/operation/insert/op_msg.rb +10 -7
  315. data/lib/mongo/operation/insert/result.rb +15 -4
  316. data/lib/mongo/operation/insert.rb +6 -2
  317. data/lib/mongo/operation/kill_cursors/command.rb +6 -3
  318. data/lib/mongo/operation/kill_cursors/legacy.rb +5 -2
  319. data/lib/mongo/operation/kill_cursors/op_msg.rb +4 -1
  320. data/lib/mongo/operation/kill_cursors.rb +4 -1
  321. data/lib/mongo/operation/list_collections/command.rb +7 -4
  322. data/lib/mongo/operation/list_collections/op_msg.rb +5 -2
  323. data/lib/mongo/operation/list_collections/result.rb +13 -2
  324. data/lib/mongo/operation/list_collections.rb +4 -1
  325. data/lib/mongo/operation/map_reduce/command.rb +6 -3
  326. data/lib/mongo/operation/map_reduce/op_msg.rb +4 -1
  327. data/lib/mongo/operation/map_reduce/result.rb +14 -1
  328. data/lib/mongo/operation/map_reduce.rb +4 -1
  329. data/lib/mongo/operation/op_msg_base.rb +6 -3
  330. data/lib/mongo/operation/parallel_scan/command.rb +8 -6
  331. data/lib/mongo/operation/parallel_scan/op_msg.rb +5 -2
  332. data/lib/mongo/operation/parallel_scan/result.rb +8 -1
  333. data/lib/mongo/operation/parallel_scan.rb +4 -1
  334. data/lib/mongo/operation/remove_user/command.rb +8 -4
  335. data/lib/mongo/operation/remove_user/op_msg.rb +5 -2
  336. data/lib/mongo/operation/remove_user.rb +4 -1
  337. data/lib/mongo/operation/result.rb +104 -37
  338. data/lib/mongo/operation/shared/bypass_document_validation.rb +14 -4
  339. data/lib/mongo/operation/shared/causal_consistency_supported.rb +7 -3
  340. data/lib/mongo/operation/shared/executable.rb +60 -34
  341. data/lib/mongo/operation/shared/executable_no_validate.rb +6 -3
  342. data/lib/mongo/operation/shared/executable_transaction_label.rb +4 -1
  343. data/lib/mongo/operation/shared/idable.rb +6 -2
  344. data/lib/mongo/operation/shared/limited.rb +14 -2
  345. data/lib/mongo/operation/shared/object_id_generator.rb +5 -1
  346. data/lib/mongo/operation/shared/op_msg_or_command.rb +7 -8
  347. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +8 -9
  348. data/lib/mongo/operation/shared/polymorphic_lookup.rb +4 -1
  349. data/lib/mongo/operation/shared/polymorphic_operation.rb +42 -0
  350. data/lib/mongo/operation/shared/polymorphic_result.rb +4 -1
  351. data/lib/mongo/operation/shared/read_preference_supported.rb +80 -23
  352. data/lib/mongo/operation/shared/response_handling.rb +91 -13
  353. data/lib/mongo/operation/shared/result/aggregatable.rb +5 -1
  354. data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +4 -1
  355. data/lib/mongo/operation/shared/sessions_supported.rb +104 -28
  356. data/lib/mongo/operation/shared/specifiable.rb +36 -20
  357. data/lib/mongo/operation/shared/write.rb +31 -24
  358. data/lib/mongo/operation/shared/write_concern_supported.rb +10 -6
  359. data/lib/mongo/operation/update/bulk_result.rb +4 -1
  360. data/lib/mongo/operation/update/command.rb +7 -4
  361. data/lib/mongo/operation/update/legacy/result.rb +11 -1
  362. data/lib/mongo/operation/update/legacy.rb +5 -2
  363. data/lib/mongo/operation/update/op_msg.rb +8 -5
  364. data/lib/mongo/operation/update/result.rb +13 -2
  365. data/lib/mongo/operation/update.rb +4 -1
  366. data/lib/mongo/operation/update_user/command.rb +8 -4
  367. data/lib/mongo/operation/update_user/op_msg.rb +5 -2
  368. data/lib/mongo/operation/update_user.rb +4 -1
  369. data/lib/mongo/operation/users_info/command.rb +7 -4
  370. data/lib/mongo/operation/users_info/op_msg.rb +5 -2
  371. data/lib/mongo/operation/users_info/result.rb +7 -1
  372. data/lib/mongo/operation/users_info.rb +4 -1
  373. data/lib/mongo/operation.rb +7 -1
  374. data/lib/mongo/options/mapper.rb +4 -1
  375. data/lib/mongo/options/redacted.rb +4 -1
  376. data/lib/mongo/options.rb +4 -1
  377. data/lib/mongo/protocol/bit_vector.rb +6 -2
  378. data/lib/mongo/protocol/compressed.rb +61 -11
  379. data/lib/mongo/protocol/delete.rb +4 -1
  380. data/lib/mongo/protocol/get_more.rb +4 -1
  381. data/lib/mongo/protocol/insert.rb +7 -2
  382. data/lib/mongo/protocol/kill_cursors.rb +4 -1
  383. data/lib/mongo/protocol/message.rb +158 -21
  384. data/lib/mongo/protocol/msg.rb +248 -41
  385. data/lib/mongo/protocol/query.rb +62 -24
  386. data/lib/mongo/protocol/registry.rb +4 -1
  387. data/lib/mongo/protocol/reply.rb +4 -1
  388. data/lib/mongo/protocol/serializers.rb +47 -16
  389. data/lib/mongo/protocol/update.rb +4 -1
  390. data/lib/mongo/protocol.rb +3 -0
  391. data/lib/mongo/query_cache.rb +275 -0
  392. data/lib/mongo/retryable.rb +36 -13
  393. data/lib/mongo/semaphore.rb +5 -2
  394. data/lib/mongo/server/app_metadata.rb +128 -35
  395. data/lib/mongo/server/connection.rb +52 -111
  396. data/lib/mongo/server/connection_base.rb +167 -35
  397. data/lib/mongo/server/connection_common.rb +168 -0
  398. data/lib/mongo/server/connection_pool/populator.rb +61 -0
  399. data/lib/mongo/server/connection_pool.rb +315 -42
  400. data/lib/mongo/server/context.rb +4 -1
  401. data/lib/mongo/server/description/features.rb +23 -10
  402. data/lib/mongo/server/description.rb +135 -46
  403. data/lib/mongo/server/monitor/app_metadata.rb +5 -2
  404. data/lib/mongo/server/monitor/connection.rb +142 -116
  405. data/lib/mongo/server/monitor.rb +197 -131
  406. data/lib/mongo/server/pending_connection.rb +237 -1
  407. data/lib/mongo/server/push_monitor/connection.rb +31 -0
  408. data/lib/mongo/server/push_monitor.rb +194 -0
  409. data/lib/mongo/server/round_trip_time_averager.rb +18 -6
  410. data/lib/mongo/server.rb +197 -68
  411. data/lib/mongo/server_selector/{selectable.rb → base.rb} +183 -95
  412. data/lib/mongo/server_selector/nearest.rb +32 -25
  413. data/lib/mongo/server_selector/primary.rb +30 -32
  414. data/lib/mongo/server_selector/primary_preferred.rb +38 -29
  415. data/lib/mongo/server_selector/secondary.rb +32 -25
  416. data/lib/mongo/server_selector/secondary_preferred.rb +30 -38
  417. data/lib/mongo/server_selector.rb +5 -2
  418. data/lib/mongo/session/server_session.rb +4 -1
  419. data/lib/mongo/session/session_pool.rb +14 -4
  420. data/lib/mongo/session.rb +48 -37
  421. data/lib/mongo/socket/ocsp_cache.rb +100 -0
  422. data/lib/mongo/socket/ocsp_verifier.rb +376 -0
  423. data/lib/mongo/socket/ssl.rb +165 -55
  424. data/lib/mongo/socket/tcp.rb +45 -25
  425. data/lib/mongo/socket/unix.rb +17 -6
  426. data/lib/mongo/socket.rb +176 -42
  427. data/lib/mongo/srv/monitor.rb +113 -0
  428. data/lib/mongo/srv/resolver.rb +137 -0
  429. data/lib/mongo/srv/result.rb +128 -0
  430. data/lib/mongo/srv.rb +20 -0
  431. data/lib/mongo/timeout.rb +54 -0
  432. data/lib/mongo/topology_version.rb +92 -0
  433. data/lib/mongo/uri/options_mapper.rb +623 -0
  434. data/lib/mongo/uri/srv_protocol.rb +105 -46
  435. data/lib/mongo/uri.rb +102 -471
  436. data/lib/mongo/utils.rb +118 -0
  437. data/lib/mongo/version.rb +5 -2
  438. data/lib/mongo/write_concern/acknowledged.rb +4 -1
  439. data/lib/mongo/write_concern/base.rb +4 -1
  440. data/lib/mongo/write_concern/unacknowledged.rb +4 -1
  441. data/lib/mongo/write_concern.rb +4 -1
  442. data/lib/mongo.rb +47 -2
  443. data/mongo.gemspec +14 -8
  444. data/spec/NOTES.aws-auth.md +296 -0
  445. data/spec/README.aws-auth.md +318 -0
  446. data/spec/README.md +491 -24
  447. data/spec/USERS.md +72 -0
  448. data/spec/atlas/atlas_connectivity_spec.rb +3 -0
  449. data/spec/atlas/operations_spec.rb +3 -0
  450. data/spec/integration/auth_spec.rb +135 -16
  451. data/spec/integration/awaited_ismaster_spec.rb +31 -0
  452. data/spec/integration/aws_auth_request_spec.rb +77 -0
  453. data/spec/integration/aws_credentials_retriever_spec.rb +106 -0
  454. data/spec/integration/bson_symbol_spec.rb +8 -3
  455. data/spec/integration/bulk_insert_spec.rb +3 -0
  456. data/spec/integration/bulk_write_error_message_spec.rb +41 -0
  457. data/spec/integration/bulk_write_spec.rb +70 -0
  458. data/spec/integration/change_stream_examples_spec.rb +9 -6
  459. data/spec/integration/change_stream_spec.rb +128 -53
  460. data/spec/integration/check_clean_slate_spec.rb +19 -0
  461. data/spec/integration/client_authentication_options_spec.rb +514 -0
  462. data/spec/integration/client_connectivity_spec.rb +4 -1
  463. data/spec/integration/client_construction_aws_auth_spec.rb +194 -0
  464. data/spec/integration/client_construction_spec.rb +134 -3
  465. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +360 -0
  466. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +306 -0
  467. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +75 -0
  468. data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +82 -0
  469. data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +224 -0
  470. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +604 -0
  471. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +190 -0
  472. data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +81 -0
  473. data/spec/integration/client_side_encryption/client_close_spec.rb +66 -0
  474. data/spec/integration/client_side_encryption/corpus_spec.rb +236 -0
  475. data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +135 -0
  476. data/spec/integration/client_side_encryption/data_key_spec.rb +168 -0
  477. data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +117 -0
  478. data/spec/integration/client_side_encryption/external_key_vault_spec.rb +144 -0
  479. data/spec/integration/client_side_encryption/views_spec.rb +47 -0
  480. data/spec/integration/client_spec.rb +5 -2
  481. data/spec/integration/client_update_spec.rb +157 -0
  482. data/spec/integration/collection_indexes_prose_spec.rb +58 -0
  483. data/spec/integration/command_monitoring_spec.rb +97 -30
  484. data/spec/integration/command_spec.rb +58 -19
  485. data/spec/integration/connect_single_rs_name_spec.rb +17 -9
  486. data/spec/integration/connection_pool_populator_spec.rb +305 -0
  487. data/spec/integration/connection_spec.rb +159 -34
  488. data/spec/integration/crud_spec.rb +152 -4
  489. data/spec/integration/cursor_reaping_spec.rb +71 -28
  490. data/spec/integration/docs_examples_spec.rb +13 -1
  491. data/spec/integration/error_detection_spec.rb +3 -0
  492. data/spec/integration/fork_reconnect_spec.rb +204 -0
  493. data/spec/integration/get_more_spec.rb +13 -3
  494. data/spec/integration/grid_fs_bucket_spec.rb +4 -1
  495. data/spec/integration/heartbeat_events_spec.rb +27 -41
  496. data/spec/integration/mmapv1_spec.rb +3 -0
  497. data/spec/integration/mongos_pinning_spec.rb +3 -0
  498. data/spec/integration/ocsp_connectivity_spec.rb +29 -0
  499. data/spec/integration/ocsp_verifier_cache_spec.rb +191 -0
  500. data/spec/integration/ocsp_verifier_spec.rb +355 -0
  501. data/spec/integration/operation_failure_code_spec.rb +4 -1
  502. data/spec/integration/operation_failure_message_spec.rb +90 -0
  503. data/spec/integration/query_cache_spec.rb +1093 -0
  504. data/spec/integration/query_cache_transactions_spec.rb +193 -0
  505. data/spec/integration/read_concern_spec.rb +4 -1
  506. data/spec/integration/read_preference_spec.rb +70 -11
  507. data/spec/integration/reconnect_spec.rb +147 -1
  508. data/spec/integration/retryable_errors_spec.rb +38 -17
  509. data/spec/integration/{retryable_writes_spec.rb → retryable_writes/retryable_writes_36_and_older_spec.rb} +58 -51
  510. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +405 -0
  511. data/spec/integration/retryable_writes/shared/adds_diagnostics.rb +18 -0
  512. data/spec/integration/retryable_writes/shared/does_not_support_retries.rb +27 -0
  513. data/spec/integration/retryable_writes/shared/only_supports_legacy_retries.rb +28 -0
  514. data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +220 -0
  515. data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +235 -0
  516. data/spec/integration/retryable_writes/shared/performs_no_retries.rb +113 -0
  517. data/spec/integration/retryable_writes/shared/supports_legacy_retries.rb +22 -0
  518. data/spec/integration/retryable_writes/shared/supports_modern_retries.rb +28 -0
  519. data/spec/integration/retryable_writes/shared/supports_retries.rb +19 -0
  520. data/spec/integration/retryable_writes_errors_spec.rb +14 -14
  521. data/spec/integration/sdam_error_handling_spec.rb +257 -43
  522. data/spec/integration/sdam_events_spec.rb +88 -13
  523. data/spec/integration/sdam_prose_spec.rb +67 -0
  524. data/spec/integration/secondary_reads_spec.rb +102 -0
  525. data/spec/integration/server_description_spec.rb +3 -0
  526. data/spec/integration/server_monitor_spec.rb +55 -0
  527. data/spec/integration/server_selection_spec.rb +39 -0
  528. data/spec/integration/server_selector_spec.rb +10 -5
  529. data/spec/integration/server_spec.rb +45 -26
  530. data/spec/integration/shell_examples_spec.rb +3 -0
  531. data/spec/integration/{size_limit_spec.rb~12e1e9c4f... RUBY-2242 Fix zlib compression (#2021) → size_limit_spec.rb} +26 -9
  532. data/spec/integration/snappy_compression_spec.rb +28 -0
  533. data/spec/integration/srv_monitoring_spec.rb +406 -0
  534. data/spec/integration/srv_spec.rb +59 -0
  535. data/spec/integration/ssl_uri_options_spec.rb +5 -2
  536. data/spec/integration/step_down_spec.rb +19 -18
  537. data/spec/integration/time_zone_querying_spec.rb +3 -0
  538. data/spec/integration/transactions_api_examples_spec.rb +62 -0
  539. data/spec/integration/transactions_examples_spec.rb +31 -9
  540. data/spec/integration/truncated_utf8_spec.rb +26 -0
  541. data/spec/integration/versioned_api_examples_spec.rb +69 -0
  542. data/spec/integration/x509_auth_spec.rb +112 -0
  543. data/spec/integration/zlib_compression_spec.rb +28 -0
  544. data/spec/integration/zstd_compression_spec.rb +29 -0
  545. data/spec/kerberos/kerberos_spec.rb +94 -0
  546. data/spec/lite_spec_helper.rb +85 -33
  547. data/spec/mongo/address/ipv4_spec.rb +4 -1
  548. data/spec/mongo/address/ipv6_spec.rb +3 -0
  549. data/spec/mongo/address/unix_spec.rb +3 -0
  550. data/spec/mongo/address/validator_spec.rb +54 -0
  551. data/spec/mongo/address_spec.rb +37 -24
  552. data/spec/mongo/auth/aws/request_region_spec.rb +45 -0
  553. data/spec/mongo/auth/aws/request_spec.rb +79 -0
  554. data/spec/mongo/auth/cr_spec.rb +19 -36
  555. data/spec/mongo/auth/gssapi/conversation_spec.rb +124 -0
  556. data/spec/mongo/auth/invalid_mechanism_spec.rb +4 -1
  557. data/spec/mongo/auth/ldap/conversation_spec.rb +6 -3
  558. data/spec/mongo/auth/ldap_spec.rb +17 -34
  559. data/spec/mongo/auth/scram/conversation_spec.rb +124 -328
  560. data/spec/mongo/auth/scram256/conversation_spec.rb +174 -0
  561. data/spec/mongo/auth/{scram/negotiation_spec.rb → scram_negotiation_spec.rb} +83 -76
  562. data/spec/mongo/auth/scram_spec.rb +56 -110
  563. data/spec/mongo/auth/stringprep/profiles/sasl_spec.rb +3 -0
  564. data/spec/mongo/auth/stringprep_spec.rb +3 -0
  565. data/spec/mongo/auth/user/view_spec.rb +108 -7
  566. data/spec/mongo/auth/user_spec.rb +61 -17
  567. data/spec/mongo/auth/x509/conversation_spec.rb +8 -5
  568. data/spec/mongo/auth/x509_spec.rb +42 -33
  569. data/spec/mongo/auth_spec.rb +7 -4
  570. data/spec/mongo/bson_spec.rb +3 -0
  571. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +3 -0
  572. data/spec/mongo/bulk_write/result_spec.rb +14 -7
  573. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +3 -0
  574. data/spec/mongo/bulk_write_spec.rb +209 -2
  575. data/spec/mongo/caching_cursor_spec.rb +73 -0
  576. data/spec/mongo/client_construction_spec.rb +1296 -305
  577. data/spec/mongo/client_encryption_spec.rb +414 -0
  578. data/spec/mongo/client_spec.rb +157 -32
  579. data/spec/mongo/cluster/cursor_reaper_spec.rb +15 -8
  580. data/spec/mongo/cluster/periodic_executor_spec.rb +19 -0
  581. data/spec/mongo/cluster/socket_reaper_spec.rb +17 -3
  582. data/spec/mongo/cluster/topology/replica_set_spec.rb +81 -30
  583. data/spec/mongo/cluster/topology/sharded_spec.rb +18 -12
  584. data/spec/mongo/cluster/topology/single_spec.rb +44 -21
  585. data/spec/mongo/cluster/topology/unknown_spec.rb +4 -1
  586. data/spec/mongo/cluster/topology_spec.rb +4 -1
  587. data/spec/mongo/cluster_spec.rb +114 -48
  588. data/spec/mongo/cluster_time_spec.rb +3 -0
  589. data/spec/mongo/collection/view/aggregation_spec.rb +9 -4
  590. data/spec/mongo/collection/view/builder/find_command_spec.rb +20 -6
  591. data/spec/mongo/collection/view/builder/flags_spec.rb +3 -0
  592. data/spec/mongo/collection/view/builder/modifiers_spec.rb +3 -0
  593. data/spec/mongo/collection/view/builder/op_query_spec.rb +3 -0
  594. data/spec/mongo/collection/view/change_stream_resume_spec.rb +397 -0
  595. data/spec/mongo/collection/view/change_stream_spec.rb +21 -323
  596. data/spec/mongo/collection/view/explainable_spec.rb +90 -4
  597. data/spec/mongo/collection/view/immutable_spec.rb +3 -0
  598. data/spec/mongo/collection/view/iterable_spec.rb +41 -0
  599. data/spec/mongo/collection/view/map_reduce_spec.rb +29 -15
  600. data/spec/mongo/collection/view/readable_spec.rb +92 -21
  601. data/spec/mongo/collection/view/writable_spec.rb +211 -1
  602. data/spec/mongo/collection/view_spec.rb +4 -1
  603. data/spec/mongo/collection_crud_spec.rb +4360 -0
  604. data/spec/mongo/collection_ddl_spec.rb +537 -0
  605. data/spec/mongo/collection_spec.rb +21 -4361
  606. data/spec/mongo/crypt/auto_decryption_context_spec.rb +93 -0
  607. data/spec/mongo/crypt/auto_encrypter_spec.rb +190 -0
  608. data/spec/mongo/crypt/auto_encryption_context_spec.rb +110 -0
  609. data/spec/mongo/crypt/binary_spec.rb +113 -0
  610. data/spec/mongo/crypt/binding/binary_spec.rb +54 -0
  611. data/spec/mongo/crypt/binding/context_spec.rb +255 -0
  612. data/spec/mongo/crypt/binding/helpers_spec.rb +44 -0
  613. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +142 -0
  614. data/spec/mongo/crypt/binding/status_spec.rb +97 -0
  615. data/spec/mongo/crypt/binding/version_spec.rb +20 -0
  616. data/spec/mongo/crypt/binding_unloaded_spec.rb +23 -0
  617. data/spec/mongo/crypt/data_key_context_spec.rb +216 -0
  618. data/spec/mongo/crypt/encryption_io_spec.rb +139 -0
  619. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +75 -0
  620. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +173 -0
  621. data/spec/mongo/crypt/handle_spec.rb +235 -0
  622. data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +111 -0
  623. data/spec/mongo/crypt/status_spec.rb +150 -0
  624. data/spec/mongo/cursor/builder/get_more_command_spec.rb +11 -1
  625. data/spec/mongo/cursor/builder/op_get_more_spec.rb +11 -1
  626. data/spec/mongo/cursor/builder/op_kill_cursors_spec.rb +11 -1
  627. data/spec/mongo/cursor_spec.rb +130 -15
  628. data/spec/mongo/database_spec.rb +451 -17
  629. data/spec/mongo/dbref_spec.rb +3 -0
  630. data/spec/mongo/distinguishing_semaphore_spec.rb +66 -0
  631. data/spec/mongo/error/bulk_write_error_spec.rb +52 -0
  632. data/spec/mongo/error/crypt_error_spec.rb +29 -0
  633. data/spec/mongo/error/max_bson_size_spec.rb +38 -0
  634. data/spec/mongo/error/no_server_available_spec.rb +15 -2
  635. data/spec/mongo/error/notable_spec.rb +62 -0
  636. data/spec/mongo/error/operation_failure_heavy_spec.rb +61 -0
  637. data/spec/mongo/error/operation_failure_spec.rb +231 -70
  638. data/spec/mongo/error/parser_spec.rb +40 -6
  639. data/spec/mongo/error/unsupported_option_spec.rb +57 -0
  640. data/spec/mongo/event/publisher_spec.rb +3 -0
  641. data/spec/mongo/event/subscriber_spec.rb +3 -0
  642. data/spec/mongo/grid/file/chunk_spec.rb +7 -4
  643. data/spec/mongo/grid/file/info_spec.rb +3 -0
  644. data/spec/mongo/grid/file_spec.rb +4 -1
  645. data/spec/mongo/grid/fs_bucket_spec.rb +40 -5
  646. data/spec/mongo/grid/stream/read_spec.rb +33 -10
  647. data/spec/mongo/grid/stream/write_spec.rb +35 -0
  648. data/spec/mongo/grid/stream_spec.rb +3 -0
  649. data/spec/mongo/id_spec.rb +3 -0
  650. data/spec/mongo/index/view_spec.rb +321 -0
  651. data/spec/mongo/lint_spec.rb +3 -0
  652. data/spec/mongo/logger_spec.rb +16 -11
  653. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +3 -0
  654. data/spec/mongo/monitoring/event/cmap/connection_check_out_failed_spec.rb +3 -0
  655. data/spec/mongo/monitoring/event/cmap/connection_check_out_started_spec.rb +3 -0
  656. data/spec/mongo/monitoring/event/cmap/connection_checked_in_spec.rb +13 -3
  657. data/spec/mongo/monitoring/event/cmap/connection_checked_out_spec.rb +13 -3
  658. data/spec/mongo/monitoring/event/cmap/connection_closed_spec.rb +3 -0
  659. data/spec/mongo/monitoring/event/cmap/connection_created_spec.rb +3 -0
  660. data/spec/mongo/monitoring/event/cmap/connection_ready_spec.rb +3 -0
  661. data/spec/mongo/monitoring/event/cmap/pool_cleared_spec.rb +3 -0
  662. data/spec/mongo/monitoring/event/cmap/pool_closed_spec.rb +13 -3
  663. data/spec/mongo/monitoring/event/cmap/pool_created_spec.rb +13 -3
  664. data/spec/mongo/monitoring/event/command_failed_spec.rb +59 -2
  665. data/spec/mongo/monitoring/event/command_started_spec.rb +3 -0
  666. data/spec/mongo/monitoring/event/command_succeeded_spec.rb +46 -6
  667. data/spec/mongo/monitoring/event/secure_spec.rb +28 -4
  668. data/spec/mongo/monitoring/event/server_closed_spec.rb +4 -1
  669. data/spec/mongo/monitoring/event/server_description_changed_spec.rb +4 -4
  670. data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +4 -1
  671. data/spec/mongo/monitoring/event/server_heartbeat_started_spec.rb +3 -0
  672. data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +4 -1
  673. data/spec/mongo/monitoring/event/server_opening_spec.rb +4 -1
  674. data/spec/mongo/monitoring/event/topology_changed_spec.rb +4 -1
  675. data/spec/mongo/monitoring/event/topology_closed_spec.rb +4 -1
  676. data/spec/mongo/monitoring/event/topology_opening_spec.rb +4 -1
  677. data/spec/mongo/monitoring_spec.rb +3 -0
  678. data/spec/mongo/operation/aggregate/result_spec.rb +11 -1
  679. data/spec/mongo/operation/aggregate_spec.rb +5 -1
  680. data/spec/mongo/operation/collections_info_spec.rb +7 -1
  681. data/spec/mongo/operation/command_spec.rb +11 -5
  682. data/spec/mongo/operation/create_index_spec.rb +9 -3
  683. data/spec/mongo/operation/create_user_spec.rb +9 -3
  684. data/spec/mongo/operation/delete/bulk_spec.rb +24 -6
  685. data/spec/mongo/operation/delete/command_spec.rb +3 -0
  686. data/spec/mongo/operation/delete/op_msg_spec.rb +36 -21
  687. data/spec/mongo/operation/delete_spec.rb +14 -7
  688. data/spec/mongo/operation/drop_index_spec.rb +9 -2
  689. data/spec/mongo/operation/find/legacy_spec.rb +33 -7
  690. data/spec/mongo/operation/get_more_spec.rb +11 -1
  691. data/spec/mongo/operation/indexes_spec.rb +8 -1
  692. data/spec/mongo/operation/insert/bulk_spec.rb +27 -7
  693. data/spec/mongo/operation/insert/command_spec.rb +7 -0
  694. data/spec/mongo/operation/insert/op_msg_spec.rb +67 -44
  695. data/spec/mongo/operation/insert_spec.rb +18 -12
  696. data/spec/mongo/operation/kill_cursors_spec.rb +3 -0
  697. data/spec/mongo/operation/limited_spec.rb +8 -3
  698. data/spec/mongo/operation/map_reduce_spec.rb +8 -2
  699. data/spec/mongo/operation/read_preference_legacy_spec.rb +356 -0
  700. data/spec/mongo/operation/read_preference_op_msg_spec.rb +307 -0
  701. data/spec/mongo/operation/remove_user_spec.rb +9 -3
  702. data/spec/mongo/operation/result_spec.rb +14 -4
  703. data/spec/mongo/operation/specifiable_spec.rb +3 -0
  704. data/spec/mongo/operation/update/bulk_spec.rb +24 -6
  705. data/spec/mongo/operation/update/command_spec.rb +7 -0
  706. data/spec/mongo/operation/update/op_msg_spec.rb +35 -20
  707. data/spec/mongo/operation/update_spec.rb +13 -7
  708. data/spec/mongo/operation/update_user_spec.rb +7 -1
  709. data/spec/mongo/options/redacted_spec.rb +3 -0
  710. data/spec/mongo/protocol/compressed_spec.rb +29 -13
  711. data/spec/mongo/protocol/delete_spec.rb +12 -8
  712. data/spec/mongo/protocol/get_more_spec.rb +12 -8
  713. data/spec/mongo/protocol/insert_spec.rb +12 -8
  714. data/spec/mongo/protocol/kill_cursors_spec.rb +9 -5
  715. data/spec/mongo/protocol/msg_spec.rb +70 -53
  716. data/spec/mongo/protocol/query_spec.rb +18 -15
  717. data/spec/mongo/protocol/registry_spec.rb +4 -1
  718. data/spec/mongo/protocol/reply_spec.rb +4 -1
  719. data/spec/mongo/protocol/update_spec.rb +13 -9
  720. data/spec/mongo/query_cache_middleware_spec.rb +55 -0
  721. data/spec/mongo/query_cache_spec.rb +283 -0
  722. data/spec/mongo/retryable_spec.rb +77 -72
  723. data/spec/mongo/semaphore_spec.rb +54 -0
  724. data/spec/mongo/server/app_metadata_spec.rb +53 -29
  725. data/spec/mongo/server/connection_auth_spec.rb +45 -23
  726. data/spec/mongo/server/connection_common_spec.rb +24 -0
  727. data/spec/mongo/server/connection_pool/populator_spec.rb +106 -0
  728. data/spec/mongo/server/connection_pool_spec.rb +259 -130
  729. data/spec/mongo/server/connection_spec.rb +277 -121
  730. data/spec/mongo/server/description/features_spec.rb +3 -0
  731. data/spec/mongo/server/description_query_methods_spec.rb +4 -1
  732. data/spec/mongo/server/description_spec.rb +630 -561
  733. data/spec/mongo/server/monitor/app_metadata_spec.rb +10 -1
  734. data/spec/mongo/server/monitor/connection_spec.rb +66 -79
  735. data/spec/mongo/server/monitor_spec.rb +173 -126
  736. data/spec/mongo/server/round_trip_time_averager_spec.rb +8 -3
  737. data/spec/mongo/server_selector/nearest_spec.rb +32 -25
  738. data/spec/mongo/server_selector/primary_preferred_spec.rb +35 -28
  739. data/spec/mongo/server_selector/primary_spec.rb +35 -11
  740. data/spec/mongo/server_selector/secondary_preferred_spec.rb +52 -29
  741. data/spec/mongo/server_selector/secondary_spec.rb +27 -20
  742. data/spec/mongo/server_selector_spec.rb +11 -8
  743. data/spec/mongo/server_spec.rb +100 -62
  744. data/spec/mongo/session/server_session_spec.rb +3 -0
  745. data/spec/mongo/session/session_pool_spec.rb +11 -8
  746. data/spec/mongo/session_spec.rb +38 -4
  747. data/spec/mongo/session_transaction_spec.rb +7 -12
  748. data/spec/mongo/socket/ssl_spec.rb +180 -103
  749. data/spec/mongo/socket/tcp_spec.rb +6 -11
  750. data/spec/mongo/socket/unix_spec.rb +5 -2
  751. data/spec/mongo/socket_spec.rb +14 -11
  752. data/spec/mongo/srv/monitor_spec.rb +233 -0
  753. data/spec/mongo/srv/result_spec.rb +57 -0
  754. data/spec/mongo/timeout_spec.rb +42 -0
  755. data/spec/mongo/tls_context_hooks_spec.rb +40 -0
  756. data/spec/mongo/uri/srv_protocol_spec.rb +95 -58
  757. data/spec/mongo/uri_option_parsing_spec.rb +14 -19
  758. data/spec/mongo/uri_spec.rb +253 -54
  759. data/spec/mongo/utils_spec.rb +56 -0
  760. data/spec/mongo/write_concern/acknowledged_spec.rb +3 -0
  761. data/spec/mongo/write_concern/unacknowledged_spec.rb +3 -0
  762. data/spec/mongo/write_concern_spec.rb +16 -1
  763. data/spec/runners/auth.rb +140 -0
  764. data/spec/runners/change_streams/outcome.rb +45 -0
  765. data/spec/runners/change_streams/spec.rb +60 -0
  766. data/spec/runners/change_streams/test.rb +232 -0
  767. data/spec/{support → runners}/cmap/verifier.rb +8 -6
  768. data/spec/{support → runners}/cmap.rb +29 -23
  769. data/spec/{support → runners}/command_monitoring.rb +10 -43
  770. data/spec/runners/connection_string.rb +381 -0
  771. data/spec/{support/transactions → runners/crud}/context.rb +12 -15
  772. data/spec/{support → runners}/crud/operation.rb +187 -58
  773. data/spec/{support → runners}/crud/outcome.rb +4 -1
  774. data/spec/runners/crud/requirement.rb +133 -0
  775. data/spec/{support → runners}/crud/spec.rb +20 -16
  776. data/spec/{support → runners}/crud/test.rb +11 -26
  777. data/spec/runners/crud/test_base.rb +53 -0
  778. data/spec/{support → runners}/crud/verifier.rb +40 -13
  779. data/spec/{support → runners}/crud.rb +33 -11
  780. data/spec/{support → runners}/gridfs.rb +8 -8
  781. data/spec/runners/read_write_concern_document.rb +70 -0
  782. data/spec/runners/sdam/verifier.rb +35 -11
  783. data/spec/{support/server_discovery_and_monitoring.rb → runners/sdam.rb} +51 -32
  784. data/spec/runners/server_selection.rb +365 -0
  785. data/spec/{support → runners}/server_selection_rtt.rb +8 -8
  786. data/spec/runners/transactions/operation.rb +328 -0
  787. data/spec/{support → runners}/transactions/spec.rb +4 -1
  788. data/spec/runners/transactions/test.rb +326 -0
  789. data/spec/{support → runners}/transactions.rb +19 -19
  790. data/spec/runners/unified/assertions.rb +282 -0
  791. data/spec/runners/unified/change_stream_operations.rb +29 -0
  792. data/spec/runners/unified/crud_operations.rb +206 -0
  793. data/spec/runners/unified/ddl_operations.rb +106 -0
  794. data/spec/runners/unified/entity_map.rb +42 -0
  795. data/spec/runners/unified/error.rb +28 -0
  796. data/spec/runners/unified/event_subscriber.rb +104 -0
  797. data/spec/runners/unified/exceptions.rb +24 -0
  798. data/spec/runners/unified/grid_fs_operations.rb +58 -0
  799. data/spec/runners/unified/support_operations.rb +253 -0
  800. data/spec/runners/unified/test.rb +423 -0
  801. data/spec/runners/unified/test_group.rb +31 -0
  802. data/spec/runners/unified/using_hash.rb +34 -0
  803. data/spec/runners/unified.rb +99 -0
  804. data/spec/shared/LICENSE +20 -0
  805. data/spec/shared/bin/get-mongodb-download-url +17 -0
  806. data/spec/shared/bin/s3-copy +45 -0
  807. data/spec/shared/bin/s3-upload +69 -0
  808. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  809. data/spec/shared/lib/mrss/cluster_config.rb +226 -0
  810. data/spec/shared/lib/mrss/constraints.rb +379 -0
  811. data/spec/shared/lib/mrss/docker_runner.rb +271 -0
  812. data/spec/shared/lib/mrss/lite_constraints.rb +191 -0
  813. data/spec/shared/lib/mrss/server_version_registry.rb +115 -0
  814. data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
  815. data/spec/shared/lib/mrss/utils.rb +15 -0
  816. data/spec/shared/share/Dockerfile.erb +322 -0
  817. data/spec/shared/share/haproxy-1.conf +16 -0
  818. data/spec/shared/share/haproxy-2.conf +17 -0
  819. data/spec/shared/shlib/distro.sh +73 -0
  820. data/spec/shared/shlib/server.sh +317 -0
  821. data/spec/shared/shlib/set_env.sh +131 -0
  822. data/spec/solo/clean_exit_spec.rb +24 -0
  823. data/spec/spec_helper.rb +15 -7
  824. data/spec/spec_tests/auth_spec.rb +58 -0
  825. data/spec/spec_tests/change_streams_spec.rb +58 -5
  826. data/spec/spec_tests/change_streams_unified_spec.rb +13 -0
  827. data/spec/spec_tests/client_side_encryption_spec.rb +14 -0
  828. data/spec/spec_tests/cmap_spec.rb +67 -8
  829. data/spec/spec_tests/collection_management_spec.rb +13 -0
  830. data/spec/spec_tests/command_monitoring_spec.rb +51 -33
  831. data/spec/spec_tests/command_monitoring_unified_spec.rb +13 -0
  832. data/spec/spec_tests/connection_string_spec.rb +6 -83
  833. data/spec/spec_tests/crud_spec.rb +6 -1
  834. data/spec/spec_tests/crud_unified_spec.rb +13 -0
  835. data/spec/spec_tests/data/auth/connection-string.yml +366 -0
  836. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +30 -5
  837. data/spec/spec_tests/data/change_streams/change-streams-resume-allowlist.yml +1173 -0
  838. data/spec/spec_tests/data/change_streams/change-streams-resume-errorLabels.yml +1105 -0
  839. data/spec/spec_tests/data/change_streams/change-streams.yml +83 -16
  840. data/spec/spec_tests/data/change_streams_unified/change-streams.yml +72 -0
  841. data/spec/spec_tests/data/client_side_encryption/aggregate.yml +134 -0
  842. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +526 -0
  843. data/spec/spec_tests/data/client_side_encryption/badSchema.yml +73 -0
  844. data/spec/spec_tests/data/client_side_encryption/basic.yml +116 -0
  845. data/spec/spec_tests/data/client_side_encryption/bulk.yml +88 -0
  846. data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +100 -0
  847. data/spec/spec_tests/data/client_side_encryption/bypassedCommand.yml +42 -0
  848. data/spec/spec_tests/data/client_side_encryption/count.yml +61 -0
  849. data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +59 -0
  850. data/spec/spec_tests/data/client_side_encryption/delete.yml +105 -0
  851. data/spec/spec_tests/data/client_side_encryption/distinct.yml +73 -0
  852. data/spec/spec_tests/data/client_side_encryption/explain.yml +64 -0
  853. data/spec/spec_tests/data/client_side_encryption/find.yml +119 -0
  854. data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +57 -0
  855. data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +57 -0
  856. data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +57 -0
  857. data/spec/spec_tests/data/client_side_encryption/getMore.yml +68 -0
  858. data/spec/spec_tests/data/client_side_encryption/insert.yml +102 -0
  859. data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +71 -0
  860. data/spec/spec_tests/data/client_side_encryption/localKMS.yml +54 -0
  861. data/spec/spec_tests/data/client_side_encryption/localSchema.yml +72 -0
  862. data/spec/spec_tests/data/client_side_encryption/malformedCiphertext.yml +69 -0
  863. data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +20 -0
  864. data/spec/spec_tests/data/client_side_encryption/missingKey.yml +49 -0
  865. data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +64 -0
  866. data/spec/spec_tests/data/client_side_encryption/types.yml +527 -0
  867. data/spec/spec_tests/data/client_side_encryption/unsupportedCommand.yml +25 -0
  868. data/spec/spec_tests/data/client_side_encryption/updateMany.yml +77 -0
  869. data/spec/spec_tests/data/client_side_encryption/updateOne.yml +171 -0
  870. data/spec/spec_tests/data/cmap/connection-must-have-id.yml +6 -0
  871. data/spec/spec_tests/data/cmap/connection-must-order-ids.yml +6 -0
  872. data/spec/spec_tests/data/cmap/pool-checkin-destroy-closed.yml +3 -0
  873. data/spec/spec_tests/data/cmap/pool-checkin-destroy-stale.yml +3 -0
  874. data/spec/spec_tests/data/cmap/pool-checkin-make-available.yml +3 -0
  875. data/spec/spec_tests/data/cmap/pool-checkin.yml +1 -0
  876. data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +8 -2
  877. data/spec/spec_tests/data/cmap/pool-checkout-error-closed.yml +9 -1
  878. data/spec/spec_tests/data/cmap/pool-checkout-multiple.yml +3 -0
  879. data/spec/spec_tests/data/cmap/pool-checkout-no-idle.yml +4 -0
  880. data/spec/spec_tests/data/cmap/pool-checkout-no-stale.yml +4 -0
  881. data/spec/spec_tests/data/cmap/pool-close-destroy-conns.yml +2 -0
  882. data/spec/spec_tests/data/cmap/pool-create-max-size.yml +15 -0
  883. data/spec/spec_tests/data/cmap/pool-create-min-size.yml +7 -0
  884. data/spec/spec_tests/data/cmap/pool-create-with-options.yml +1 -0
  885. data/spec/spec_tests/data/cmap/wait-queue-fairness.yml +31 -1
  886. data/spec/spec_tests/data/cmap/wait-queue-timeout.yml +5 -0
  887. data/spec/spec_tests/data/collection_management/timeseries-collection.yml +129 -0
  888. data/spec/spec_tests/data/command_monitoring/insertMany.yml +1 -1
  889. data/spec/spec_tests/data/command_monitoring_unified/redacted-commands.yml +340 -0
  890. data/spec/spec_tests/data/connection_string/invalid-uris.yml +20 -0
  891. data/spec/spec_tests/data/connection_string/valid-auth.yml +16 -0
  892. data/spec/spec_tests/data/connection_string/valid-warnings.yml +50 -30
  893. data/spec/spec_tests/data/crud/write/bulkWrite.yml +26 -22
  894. data/spec/spec_tests/data/crud/write/insertMany.yml +26 -22
  895. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +267 -0
  896. data/spec/spec_tests/data/crud_unified/updateWithPipelines.yml +305 -0
  897. data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +1 -1
  898. data/spec/spec_tests/data/crud_v2/aggregate-out-readConcern.yml +1 -0
  899. data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +33 -11
  900. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-clientError.yml +63 -0
  901. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-serverError.yml +92 -0
  902. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint.yml +103 -0
  903. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-clientError.yml +90 -0
  904. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-serverError.yml +147 -0
  905. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint.yml +164 -0
  906. data/spec/spec_tests/data/crud_v2/db-aggregate.yml +1 -0
  907. data/spec/spec_tests/data/crud_v2/deleteMany-hint-clientError.yml +43 -0
  908. data/spec/spec_tests/data/crud_v2/deleteMany-hint-serverError.yml +62 -0
  909. data/spec/spec_tests/data/crud_v2/deleteMany-hint.yml +58 -0
  910. data/spec/spec_tests/data/crud_v2/deleteOne-hint-clientError.yml +41 -0
  911. data/spec/spec_tests/data/crud_v2/deleteOne-hint-serverError.yml +60 -0
  912. data/spec/spec_tests/data/crud_v2/deleteOne-hint.yml +57 -0
  913. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-clientError.yml +28 -0
  914. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-serverError.yml +44 -0
  915. data/spec/spec_tests/data/crud_v2/find-allowdiskuse.yml +50 -0
  916. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-clientError.yml +45 -0
  917. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-serverError.yml +60 -0
  918. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint.yml +56 -0
  919. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-clientError.yml +40 -0
  920. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-serverError.yml +59 -0
  921. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint.yml +55 -0
  922. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-clientError.yml +40 -0
  923. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-serverError.yml +58 -0
  924. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint.yml +55 -0
  925. data/spec/spec_tests/data/crud_v2/replaceOne-hint.yml +61 -0
  926. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-delete-hint-clientError.yml +60 -0
  927. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-update-hint-clientError.yml +88 -0
  928. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteMany-hint-clientError.yml +40 -0
  929. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteOne-hint-clientError.yml +38 -0
  930. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndDelete-hint-clientError.yml +42 -0
  931. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndReplace-hint-clientError.yml +40 -0
  932. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndUpdate-hint-clientError.yml +40 -0
  933. data/spec/spec_tests/data/crud_v2/unacknowledged-replaceOne-hint-clientError.yml +40 -0
  934. data/spec/spec_tests/data/crud_v2/unacknowledged-updateMany-hint-clientError.yml +43 -0
  935. data/spec/spec_tests/data/crud_v2/unacknowledged-updateOne-hint-clientError.yml +40 -0
  936. data/spec/spec_tests/data/crud_v2/updateMany-hint-clientError.yml +45 -0
  937. data/spec/spec_tests/data/crud_v2/updateMany-hint-serverError.yml +66 -0
  938. data/spec/spec_tests/data/crud_v2/updateMany-hint.yml +65 -0
  939. data/spec/spec_tests/data/crud_v2/updateOne-hint-clientError.yml +43 -0
  940. data/spec/spec_tests/data/crud_v2/updateOne-hint-serverError.yml +62 -0
  941. data/spec/spec_tests/data/crud_v2/updateOne-hint.yml +61 -0
  942. data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +65 -0
  943. data/spec/spec_tests/data/dns_seedlist_discovery/direct-connection-false.yml +10 -0
  944. data/spec/spec_tests/data/dns_seedlist_discovery/direct-connection-true.yml +5 -0
  945. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/MaxStalenessTooSmall.yml +15 -0
  946. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/NoKnownServers.yml +4 -3
  947. data/spec/spec_tests/data/max_staleness/Unknown/SmallMaxStaleness.yml +1 -0
  948. data/spec/spec_tests/data/read_write_concern/connection-string/read-concern.yml +32 -0
  949. data/spec/spec_tests/data/read_write_concern/connection-string/write-concern.yml +79 -0
  950. data/spec/spec_tests/data/read_write_concern/document/read-concern.yml +37 -0
  951. data/spec/spec_tests/data/read_write_concern/document/write-concern.yml +100 -0
  952. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-2.6.yml +215 -0
  953. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-3.2.yml +58 -0
  954. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-3.4.yml +95 -0
  955. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-4.2.yml +36 -0
  956. data/spec/spec_tests/data/retryable_reads/aggregate-merge.yml +39 -0
  957. data/spec/spec_tests/data/retryable_reads/aggregate-serverErrors.yml +2 -2
  958. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch-serverErrors.yml +8 -7
  959. data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch.yml +2 -1
  960. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch-serverErrors.yml +8 -7
  961. data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch.yml +2 -1
  962. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch-serverErrors.yml +8 -7
  963. data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch.yml +2 -1
  964. data/spec/spec_tests/data/retryable_reads/count-serverErrors.yml +2 -2
  965. data/spec/spec_tests/data/retryable_reads/countDocuments-serverErrors.yml +2 -2
  966. data/spec/spec_tests/data/retryable_reads/distinct-serverErrors.yml +2 -2
  967. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +60 -0
  968. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount.yml → estimatedDocumentCount-pre4.9.yml} +2 -0
  969. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +146 -0
  970. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-serverErrors.yml → estimatedDocumentCount-serverErrors-pre4.9.yml} +4 -2
  971. data/spec/spec_tests/data/retryable_reads/find-serverErrors.yml +2 -2
  972. data/spec/spec_tests/data/retryable_reads/findOne-serverErrors.yml +2 -2
  973. data/spec/spec_tests/data/retryable_reads/gridfs-download-serverErrors.yml +2 -2
  974. data/spec/spec_tests/data/retryable_reads/gridfs-downloadByName-serverErrors.yml +2 -2
  975. data/spec/spec_tests/data/retryable_reads/listCollectionNames-serverErrors.yml +2 -2
  976. data/spec/spec_tests/data/retryable_reads/listCollectionObjects-serverErrors.yml +2 -2
  977. data/spec/spec_tests/data/retryable_reads/listCollections-serverErrors.yml +2 -2
  978. data/spec/spec_tests/data/retryable_reads/listDatabaseNames-serverErrors.yml +2 -2
  979. data/spec/spec_tests/data/retryable_reads/listDatabaseObjects-serverErrors.yml +2 -2
  980. data/spec/spec_tests/data/retryable_reads/listDatabases-serverErrors.yml +2 -2
  981. data/spec/spec_tests/data/retryable_reads/listIndexNames-serverErrors.yml +2 -2
  982. data/spec/spec_tests/data/retryable_reads/listIndexNames.yml +1 -1
  983. data/spec/spec_tests/data/retryable_reads/listIndexes-serverErrors.yml +2 -2
  984. data/spec/spec_tests/data/retryable_writes/bulkWrite-errorLabels.yml +77 -0
  985. data/spec/spec_tests/data/retryable_writes/bulkWrite-serverErrors.yml +37 -0
  986. data/spec/spec_tests/data/retryable_writes/bulkWrite.yml +30 -24
  987. data/spec/spec_tests/data/retryable_writes/deleteOne-errorLabels.yml +48 -0
  988. data/spec/spec_tests/data/retryable_writes/deleteOne-serverErrors.yml +22 -0
  989. data/spec/spec_tests/data/retryable_writes/findOneAndDelete-errorLabels.yml +49 -0
  990. data/spec/spec_tests/data/retryable_writes/findOneAndDelete-serverErrors.yml +23 -0
  991. data/spec/spec_tests/data/retryable_writes/findOneAndReplace-errorLabels.yml +52 -0
  992. data/spec/spec_tests/data/retryable_writes/findOneAndReplace-serverErrors.yml +25 -0
  993. data/spec/spec_tests/data/retryable_writes/findOneAndUpdate-errorLabels.yml +52 -0
  994. data/spec/spec_tests/data/retryable_writes/findOneAndUpdate-serverErrors.yml +24 -0
  995. data/spec/spec_tests/data/retryable_writes/insertMany-errorLabels.yml +54 -0
  996. data/spec/spec_tests/data/retryable_writes/insertMany-serverErrors.yml +24 -0
  997. data/spec/spec_tests/data/retryable_writes/insertOne-errorLabels.yml +44 -0
  998. data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +94 -3
  999. data/spec/spec_tests/data/retryable_writes/replaceOne-errorLabels.yml +53 -0
  1000. data/spec/spec_tests/data/retryable_writes/replaceOne-serverErrors.yml +23 -0
  1001. data/spec/spec_tests/data/retryable_writes/updateOne-errorLabels.yml +53 -0
  1002. data/spec/spec_tests/data/retryable_writes/updateOne-serverErrors.yml +23 -0
  1003. data/spec/spec_tests/data/sdam/errors/error_handling_handshake.yml +55 -0
  1004. data/spec/spec_tests/data/sdam/errors/non-stale-network-error.yml +47 -0
  1005. data/spec/spec_tests/data/sdam/errors/non-stale-network-timeout-error.yml +38 -0
  1006. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedAtShutdown.yml +61 -0
  1007. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedDueToReplStateChange.yml +61 -0
  1008. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-LegacyNotPrimary.yml +61 -0
  1009. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotPrimaryNoSecondaryOk.yml +61 -0
  1010. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotPrimaryOrSecondary.yml +61 -0
  1011. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotWritablePrimary.yml +61 -0
  1012. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-PrimarySteppedDown.yml +61 -0
  1013. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-ShutdownInProgress.yml +61 -0
  1014. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedAtShutdown.yml +52 -0
  1015. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedDueToReplStateChange.yml +52 -0
  1016. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-LegacyNotPrimary.yml +52 -0
  1017. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotPrimaryNoSecondaryOk.yml +52 -0
  1018. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotPrimaryOrSecondary.yml +52 -0
  1019. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotWritablePrimary.yml +52 -0
  1020. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-PrimarySteppedDown.yml +52 -0
  1021. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-ShutdownInProgress.yml +52 -0
  1022. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedAtShutdown.yml +61 -0
  1023. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedDueToReplStateChange.yml +61 -0
  1024. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-LegacyNotPrimary.yml +61 -0
  1025. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryNoSecondaryOk.yml +61 -0
  1026. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryOrSecondary.yml +61 -0
  1027. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotWritablePrimary.yml +61 -0
  1028. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-PrimarySteppedDown.yml +61 -0
  1029. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-ShutdownInProgress.yml +61 -0
  1030. data/spec/spec_tests/data/sdam/errors/post-42-InterruptedAtShutdown.yml +47 -0
  1031. data/spec/spec_tests/data/sdam/errors/post-42-InterruptedDueToReplStateChange.yml +47 -0
  1032. data/spec/spec_tests/data/sdam/errors/post-42-LegacyNotPrimary.yml +47 -0
  1033. data/spec/spec_tests/data/sdam/errors/post-42-NotPrimaryNoSecondaryOk.yml +47 -0
  1034. data/spec/spec_tests/data/sdam/errors/post-42-NotPrimaryOrSecondary.yml +47 -0
  1035. data/spec/spec_tests/data/sdam/errors/post-42-NotWritablePrimary.yml +47 -0
  1036. data/spec/spec_tests/data/sdam/errors/post-42-PrimarySteppedDown.yml +47 -0
  1037. data/spec/spec_tests/data/sdam/errors/post-42-ShutdownInProgress.yml +47 -0
  1038. data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedAtShutdown.yml +47 -0
  1039. data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedDueToReplStateChange.yml +47 -0
  1040. data/spec/spec_tests/data/sdam/errors/pre-42-LegacyNotPrimary.yml +47 -0
  1041. data/spec/spec_tests/data/sdam/errors/pre-42-NotPrimaryNoSecondaryOk.yml +47 -0
  1042. data/spec/spec_tests/data/sdam/errors/pre-42-NotPrimaryOrSecondary.yml +47 -0
  1043. data/spec/spec_tests/data/sdam/errors/pre-42-NotWritablePrimary.yml +47 -0
  1044. data/spec/spec_tests/data/sdam/errors/pre-42-PrimarySteppedDown.yml +47 -0
  1045. data/spec/spec_tests/data/sdam/errors/pre-42-ShutdownInProgress.yml +47 -0
  1046. data/spec/spec_tests/data/sdam/errors/prefer-error-code.yml +54 -0
  1047. data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedAtShutdown.yml +91 -0
  1048. data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedDueToReplStateChange.yml +91 -0
  1049. data/spec/spec_tests/data/sdam/errors/stale-generation-NotPrimaryNoSecondaryOk.yml +91 -0
  1050. data/spec/spec_tests/data/sdam/errors/stale-generation-NotPrimaryOrSecondary.yml +91 -0
  1051. data/spec/spec_tests/data/sdam/errors/stale-generation-NotWritablePrimary.yml +91 -0
  1052. data/spec/spec_tests/data/sdam/errors/stale-generation-PrimarySteppedDown.yml +91 -0
  1053. data/spec/spec_tests/data/sdam/errors/stale-generation-ShutdownInProgress.yml +91 -0
  1054. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedAtShutdown.yml +91 -0
  1055. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedDueToReplStateChange.yml +91 -0
  1056. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-LegacyNotPrimary.yml +91 -0
  1057. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotPrimaryNoSecondaryOk.yml +91 -0
  1058. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotPrimaryOrSecondary.yml +91 -0
  1059. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotWritablePrimary.yml +91 -0
  1060. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-PrimarySteppedDown.yml +91 -0
  1061. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-ShutdownInProgress.yml +91 -0
  1062. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-network.yml +82 -0
  1063. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-timeout.yml +82 -0
  1064. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedAtShutdown.yml +91 -0
  1065. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedDueToReplStateChange.yml +91 -0
  1066. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-LegacyNotPrimary.yml +91 -0
  1067. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryNoSecondaryOk.yml +91 -0
  1068. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryOrSecondary.yml +91 -0
  1069. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotWritablePrimary.yml +91 -0
  1070. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-PrimarySteppedDown.yml +91 -0
  1071. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-ShutdownInProgress.yml +91 -0
  1072. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-network.yml +82 -0
  1073. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-timeout.yml +82 -0
  1074. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedAtShutdown.yml +65 -0
  1075. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedDueToReplStateChange.yml +65 -0
  1076. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-LegacyNotPrimary.yml +65 -0
  1077. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotPrimaryNoSecondaryOk.yml +65 -0
  1078. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotPrimaryOrSecondary.yml +65 -0
  1079. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotWritablePrimary.yml +65 -0
  1080. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-PrimarySteppedDown.yml +65 -0
  1081. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-ShutdownInProgress.yml +65 -0
  1082. data/spec/spec_tests/data/sdam/errors/write_errors_ignored.yml +42 -0
  1083. data/spec/spec_tests/data/sdam/rs/compatible.yml +6 -2
  1084. data/spec/spec_tests/data/sdam/rs/compatible_unknown.yml +4 -1
  1085. data/spec/spec_tests/data/sdam/rs/discover_arbiters.yml +4 -3
  1086. data/spec/spec_tests/data/sdam/rs/discover_arbiters_replicaset.yml +44 -0
  1087. data/spec/spec_tests/data/sdam/rs/discover_ghost.yml +36 -0
  1088. data/spec/spec_tests/data/sdam/rs/{ghost_discovered.yml → discover_ghost_replicaset.yml} +3 -2
  1089. data/spec/spec_tests/data/sdam/rs/discover_hidden.yml +51 -0
  1090. data/spec/spec_tests/data/sdam/rs/discover_hidden_replicaset.yml +51 -0
  1091. data/spec/spec_tests/data/sdam/rs/discover_passives.yml +6 -4
  1092. data/spec/spec_tests/data/sdam/rs/discover_passives_replicaset.yml +83 -0
  1093. data/spec/spec_tests/data/sdam/rs/discover_primary.yml +4 -3
  1094. data/spec/spec_tests/data/sdam/rs/discover_primary_replicaset.yml +43 -0
  1095. data/spec/spec_tests/data/sdam/rs/discover_rsother.yml +50 -0
  1096. data/spec/spec_tests/data/sdam/rs/{rsother_discovered.yml → discover_rsother_replicaset.yml} +5 -3
  1097. data/spec/spec_tests/data/sdam/rs/discover_secondary.yml +4 -3
  1098. data/spec/spec_tests/data/sdam/rs/discover_secondary_replicaset.yml +44 -0
  1099. data/spec/spec_tests/data/sdam/rs/discovery.yml +8 -4
  1100. data/spec/spec_tests/data/sdam/rs/equal_electionids.yml +4 -2
  1101. data/spec/spec_tests/data/sdam/rs/hosts_differ_from_seeds.yml +2 -1
  1102. data/spec/spec_tests/data/sdam/rs/incompatible_arbiter.yml +5 -1
  1103. data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +7 -5
  1104. data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +6 -2
  1105. data/spec/spec_tests/data/sdam/rs/ls_timeout.yml +12 -6
  1106. data/spec/spec_tests/data/sdam/rs/member_reconfig.yml +4 -2
  1107. data/spec/spec_tests/data/sdam/rs/member_standalone.yml +4 -2
  1108. data/spec/spec_tests/data/sdam/rs/new_primary.yml +4 -2
  1109. data/spec/spec_tests/data/sdam/rs/new_primary_new_electionid.yml +6 -3
  1110. data/spec/spec_tests/data/sdam/rs/new_primary_new_setversion.yml +6 -3
  1111. data/spec/spec_tests/data/sdam/rs/new_primary_wrong_set_name.yml +4 -2
  1112. data/spec/spec_tests/data/sdam/rs/non_rs_member.yml +1 -0
  1113. data/spec/spec_tests/data/sdam/rs/normalize_case.yml +2 -1
  1114. data/spec/spec_tests/data/sdam/rs/normalize_case_me.yml +4 -2
  1115. data/spec/spec_tests/data/sdam/rs/null_election_id.yml +8 -4
  1116. data/spec/spec_tests/data/sdam/rs/primary_becomes_ghost.yml +4 -2
  1117. data/spec/spec_tests/data/sdam/rs/primary_becomes_mongos.yml +4 -2
  1118. data/spec/spec_tests/data/sdam/rs/primary_becomes_standalone.yml +2 -1
  1119. data/spec/spec_tests/data/sdam/rs/primary_changes_set_name.yml +4 -2
  1120. data/spec/spec_tests/data/sdam/rs/primary_disconnect.yml +2 -1
  1121. data/spec/spec_tests/data/sdam/rs/primary_disconnect_electionid.yml +10 -5
  1122. data/spec/spec_tests/data/sdam/rs/primary_disconnect_setversion.yml +10 -5
  1123. data/spec/spec_tests/data/sdam/rs/primary_hint_from_secondary_with_mismatched_me.yml +4 -2
  1124. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me.yml +2 -1
  1125. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me_not_removed.yml +75 -0
  1126. data/spec/spec_tests/data/sdam/rs/primary_reports_new_member.yml +8 -4
  1127. data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +4 -2
  1128. data/spec/spec_tests/data/sdam/rs/primary_wrong_set_name.yml +2 -1
  1129. data/spec/spec_tests/data/sdam/rs/repeated.yml +105 -0
  1130. data/spec/spec_tests/data/sdam/rs/replicaset_rsnp.yml +21 -0
  1131. data/spec/spec_tests/data/sdam/rs/response_from_removed.yml +4 -2
  1132. data/spec/spec_tests/data/sdam/rs/ruby_primary_address_change.yml +31 -0
  1133. data/spec/spec_tests/data/sdam/rs/{secondary_wrong_set_name_with_primary_second.yml → ruby_secondary_wrong_set_name_with_primary_second.yml} +0 -0
  1134. data/spec/spec_tests/data/sdam/rs/sec_not_auth.yml +4 -2
  1135. data/spec/spec_tests/data/sdam/rs/secondary_ignore_ok_0.yml +4 -2
  1136. data/spec/spec_tests/data/sdam/rs/secondary_mismatched_me.yml +5 -3
  1137. data/spec/spec_tests/data/sdam/rs/secondary_wrong_set_name.yml +2 -1
  1138. data/spec/spec_tests/data/sdam/rs/secondary_wrong_set_name_with_primary.yml +4 -2
  1139. data/spec/spec_tests/data/sdam/rs/setversion_without_electionid.yml +4 -2
  1140. data/spec/spec_tests/data/sdam/rs/stepdown_change_set_name.yml +4 -2
  1141. data/spec/spec_tests/data/sdam/rs/too_new.yml +6 -2
  1142. data/spec/spec_tests/data/sdam/rs/too_old.yml +4 -2
  1143. data/spec/spec_tests/data/sdam/rs/topology_version_equal.yml +68 -0
  1144. data/spec/spec_tests/data/sdam/rs/topology_version_greater.yml +194 -0
  1145. data/spec/spec_tests/data/sdam/rs/topology_version_less.yml +64 -0
  1146. data/spec/spec_tests/data/sdam/rs/unexpected_mongos.yml +2 -1
  1147. data/spec/spec_tests/data/sdam/rs/use_setversion_without_electionid.yml +6 -3
  1148. data/spec/spec_tests/data/sdam/rs/wrong_set_name.yml +2 -1
  1149. data/spec/spec_tests/data/sdam/sharded/compatible.yml +4 -2
  1150. data/spec/spec_tests/data/sdam/sharded/discover_single_mongos.yml +24 -0
  1151. data/spec/spec_tests/data/sdam/sharded/ls_timeout_mongos.yml +9 -5
  1152. data/spec/spec_tests/data/sdam/sharded/mongos_disconnect.yml +6 -3
  1153. data/spec/spec_tests/data/sdam/sharded/multiple_mongoses.yml +4 -2
  1154. data/spec/spec_tests/data/sdam/sharded/non_mongos_removed.yml +4 -2
  1155. data/spec/spec_tests/data/sdam/sharded/ruby_primary_different_address.yml +21 -0
  1156. data/spec/spec_tests/data/sdam/sharded/ruby_primary_mismatched_me.yml +22 -0
  1157. data/spec/spec_tests/data/sdam/sharded/too_new.yml +4 -2
  1158. data/spec/spec_tests/data/sdam/sharded/too_old.yml +4 -2
  1159. data/spec/spec_tests/data/sdam/single/compatible.yml +2 -1
  1160. data/spec/spec_tests/data/sdam/single/direct_connection_external_ip.yml +3 -2
  1161. data/spec/spec_tests/data/sdam/single/direct_connection_mongos.yml +4 -3
  1162. data/spec/spec_tests/data/sdam/single/direct_connection_replicaset.yml +23 -0
  1163. data/spec/spec_tests/data/sdam/single/direct_connection_rsarbiter.yml +4 -3
  1164. data/spec/spec_tests/data/sdam/single/direct_connection_rsprimary.yml +4 -3
  1165. data/spec/spec_tests/data/sdam/single/direct_connection_rssecondary.yml +4 -3
  1166. data/spec/spec_tests/data/sdam/single/direct_connection_standalone.yml +4 -3
  1167. data/spec/spec_tests/data/sdam/single/{unavailable_seed.yml → direct_connection_unavailable_seed.yml} +2 -2
  1168. data/spec/spec_tests/data/sdam/single/direct_connection_wrong_set_name.yml +40 -0
  1169. data/spec/spec_tests/data/sdam/single/discover_standalone.yml +35 -0
  1170. data/spec/spec_tests/data/sdam/single/discover_unavailable_seed.yml +28 -0
  1171. data/spec/spec_tests/data/sdam/single/ls_timeout_standalone.yml +2 -1
  1172. data/spec/spec_tests/data/sdam/single/not_ok_response.yml +5 -3
  1173. data/spec/spec_tests/data/sdam/single/ruby_primary_different_address.yml +24 -0
  1174. data/spec/spec_tests/data/sdam/single/ruby_primary_mismatched_me.yml +25 -0
  1175. data/spec/spec_tests/data/sdam/single/standalone_removed.yml +2 -1
  1176. data/spec/spec_tests/data/sdam/single/{direct_connection_slave.yml → standalone_using_legacy_hello.yml} +2 -2
  1177. data/spec/spec_tests/data/sdam/single/too_new.yml +2 -1
  1178. data/spec/spec_tests/data/sdam/single/too_old.yml +2 -1
  1179. data/spec/spec_tests/data/sdam/single/too_old_then_upgraded.yml +48 -0
  1180. data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +96 -0
  1181. data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +88 -0
  1182. data/spec/spec_tests/data/sdam_integration/find-network-error.yml +83 -0
  1183. data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +116 -0
  1184. data/spec/spec_tests/data/sdam_integration/hello-command-error.yml +158 -0
  1185. data/spec/spec_tests/data/sdam_integration/hello-network-error.yml +156 -0
  1186. data/spec/spec_tests/data/sdam_integration/hello-timeout.yml +223 -0
  1187. data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +86 -0
  1188. data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +115 -0
  1189. data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +98 -0
  1190. data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +2 -4
  1191. data/spec/spec_tests/data/sdam_monitoring/{replica_set_other_seed.yml → replica_set_primary_address_change.yml} +114 -96
  1192. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_me_mismatch.yml +111 -0
  1193. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_no_primary.yml +2 -1
  1194. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary.yml +2 -1
  1195. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary_removal.yml +22 -18
  1196. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +21 -16
  1197. data/spec/spec_tests/data/sdam_monitoring/required_replica_set.yml +2 -1
  1198. data/spec/spec_tests/data/sdam_monitoring/standalone.yml +3 -3
  1199. data/spec/spec_tests/data/sdam_monitoring/standalone_repeated.yml +2 -2
  1200. data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +73 -0
  1201. data/spec/spec_tests/data/sdam_monitoring/standalone_to_rs_with_me_mismatch.yml +90 -0
  1202. data/spec/spec_tests/data/transactions/abort.yml +3 -3
  1203. data/spec/spec_tests/data/transactions/create-collection.yml +131 -0
  1204. data/spec/spec_tests/data/transactions/create-index.yml +152 -0
  1205. data/spec/spec_tests/data/transactions/error-labels.yml +93 -24
  1206. data/spec/spec_tests/data/transactions/mongos-pin-auto.yml +3 -0
  1207. data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +3 -0
  1208. data/spec/spec_tests/data/transactions/pin-mongos.yml +8 -6
  1209. data/spec/spec_tests/data/transactions/read-concern.yml +6 -6
  1210. data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +124 -0
  1211. data/spec/spec_tests/data/transactions/retryable-abort.yml +17 -2
  1212. data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +132 -0
  1213. data/spec/spec_tests/data/transactions/retryable-commit.yml +24 -9
  1214. data/spec/spec_tests/data/transactions/transaction-options-repl.yml +117 -0
  1215. data/spec/spec_tests/data/transactions/transaction-options.yml +14 -121
  1216. data/spec/spec_tests/data/transactions/write-concern.yml +3 -0
  1217. data/spec/spec_tests/data/transactions_api/callback-retry.yml +3 -3
  1218. data/spec/spec_tests/data/transactions_api/transaction-options.yml +11 -12
  1219. data/spec/spec_tests/data/transactions_unified/mongos-unpin.yml +172 -0
  1220. data/spec/spec_tests/data/unified/valid-fail/operation-failure.yml +31 -0
  1221. data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +220 -0
  1222. data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +102 -0
  1223. data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +184 -0
  1224. data/spec/spec_tests/data/unified/valid-pass/poc-gridfs.yml +155 -0
  1225. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +193 -0
  1226. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +210 -0
  1227. data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +215 -0
  1228. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +235 -0
  1229. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +169 -0
  1230. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +170 -0
  1231. data/spec/spec_tests/data/uri_options/auth-options.yml +36 -1
  1232. data/spec/spec_tests/data/uri_options/compression-options.yml +7 -4
  1233. data/spec/spec_tests/data/uri_options/connection-options.yml +43 -0
  1234. data/spec/spec_tests/data/uri_options/read-preference-options.yml +24 -0
  1235. data/spec/spec_tests/data/uri_options/ruby-auth-options.yml +12 -0
  1236. data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +58 -0
  1237. data/spec/spec_tests/data/uri_options/tls-options.yml +233 -6
  1238. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +417 -0
  1239. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +411 -0
  1240. data/spec/spec_tests/data/versioned_api/runcommand-helper-no-api-version-declared.yml +75 -0
  1241. data/spec/spec_tests/data/versioned_api/test-commands-deprecation-errors.yml +47 -0
  1242. data/spec/spec_tests/data/versioned_api/test-commands-strict-mode.yml +46 -0
  1243. data/spec/spec_tests/data/versioned_api/transaction-handling.yml +128 -0
  1244. data/spec/spec_tests/dns_seedlist_discovery_spec.rb +32 -9
  1245. data/spec/spec_tests/gridfs_spec.rb +5 -0
  1246. data/spec/spec_tests/max_staleness_spec.rb +7 -135
  1247. data/spec/spec_tests/read_write_concern_connection_string_spec.rb +13 -0
  1248. data/spec/spec_tests/read_write_concern_document_spec.rb +77 -0
  1249. data/spec/spec_tests/read_write_concern_operaton_spec.rb +13 -0
  1250. data/spec/spec_tests/retryable_reads_spec.rb +7 -2
  1251. data/spec/spec_tests/retryable_writes_spec.rb +11 -1
  1252. data/spec/spec_tests/sdam_integration_spec.rb +16 -0
  1253. data/spec/spec_tests/sdam_monitoring_spec.rb +15 -6
  1254. data/spec/spec_tests/sdam_spec.rb +78 -9
  1255. data/spec/spec_tests/server_selection_rtt_spec.rb +5 -0
  1256. data/spec/spec_tests/server_selection_spec.rb +7 -110
  1257. data/spec/spec_tests/transactions_api_spec.rb +8 -0
  1258. data/spec/spec_tests/transactions_spec.rb +7 -1
  1259. data/spec/spec_tests/transactions_unified_spec.rb +13 -0
  1260. data/spec/spec_tests/unified_spec.rb +18 -0
  1261. data/spec/spec_tests/uri_options_spec.rb +63 -42
  1262. data/spec/spec_tests/versioned_api_spec.rb +13 -0
  1263. data/spec/stress/cleanup_spec.rb +61 -0
  1264. data/spec/stress/connection_pool_stress_spec.rb +204 -0
  1265. data/spec/stress/connection_pool_timing_spec.rb +184 -0
  1266. data/spec/stress/fork_reconnect_stress_spec.rb +112 -0
  1267. data/spec/stress/push_monitor_close_spec.rb +44 -0
  1268. data/spec/support/authorization.rb +4 -11
  1269. data/spec/support/aws_utils/base.rb +137 -0
  1270. data/spec/support/aws_utils/inspector.rb +227 -0
  1271. data/spec/support/aws_utils/orchestrator.rb +373 -0
  1272. data/spec/support/aws_utils/provisioner.rb +363 -0
  1273. data/spec/support/aws_utils.rb +65 -0
  1274. data/spec/support/background_thread_registry.rb +70 -0
  1275. data/spec/support/certificates/README.md +7 -2
  1276. data/spec/support/certificates/atlas-ocsp-ca.crt +118 -0
  1277. data/spec/support/certificates/atlas-ocsp.crt +152 -0
  1278. data/spec/support/certificates/client-x509.crt +78 -0
  1279. data/spec/support/certificates/client-x509.key +27 -0
  1280. data/spec/support/certificates/client-x509.pem +105 -0
  1281. data/spec/support/certificates/server-second-level-bundle.pem +77 -77
  1282. data/spec/support/certificates/server-second-level.crt +52 -52
  1283. data/spec/support/certificates/server-second-level.key +25 -25
  1284. data/spec/support/certificates/server-second-level.pem +77 -77
  1285. data/spec/support/client_registry.rb +65 -37
  1286. data/spec/support/client_registry_macros.rb +17 -5
  1287. data/spec/support/cluster_tools.rb +15 -5
  1288. data/spec/support/common_shortcuts.rb +239 -6
  1289. data/spec/support/constraints.rb +9 -184
  1290. data/spec/support/crypt/corpus/corpus-key-aws.json +33 -0
  1291. data/spec/support/crypt/corpus/corpus-key-local.json +31 -0
  1292. data/spec/support/crypt/corpus/corpus-schema.json +2057 -0
  1293. data/spec/support/crypt/corpus/corpus.json +3657 -0
  1294. data/spec/support/crypt/corpus/corpus_encrypted.json +4152 -0
  1295. data/spec/support/crypt/data_keys/key_document_aws.json +34 -0
  1296. data/spec/support/crypt/data_keys/key_document_local.json +31 -0
  1297. data/spec/support/crypt/external/external-key.json +31 -0
  1298. data/spec/support/crypt/external/external-schema.json +19 -0
  1299. data/spec/support/crypt/limits/limits-doc.json +102 -0
  1300. data/spec/support/crypt/limits/limits-key.json +31 -0
  1301. data/spec/support/crypt/limits/limits-schema.json +1405 -0
  1302. data/spec/support/crypt/schema_maps/schema_map_aws.json +17 -0
  1303. data/spec/support/crypt/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  1304. data/spec/support/crypt/schema_maps/schema_map_local.json +18 -0
  1305. data/spec/support/crypt/schema_maps/schema_map_local_key_alt_names.json +12 -0
  1306. data/spec/support/crypt.rb +157 -0
  1307. data/spec/support/dns.rb +16 -0
  1308. data/spec/support/event_subscriber.rb +193 -84
  1309. data/spec/support/json_ext_formatter.rb +8 -1
  1310. data/spec/support/keyword_struct.rb +29 -0
  1311. data/spec/support/local_resource_registry.rb +37 -0
  1312. data/spec/support/matchers.rb +39 -1
  1313. data/spec/support/monitoring_ext.rb +3 -0
  1314. data/spec/support/ocsp +1 -0
  1315. data/spec/support/primary_socket.rb +3 -0
  1316. data/spec/support/sdam_formatter_integration.rb +3 -0
  1317. data/spec/support/session_registry.rb +55 -0
  1318. data/spec/support/shared/app_metadata.rb +167 -0
  1319. data/spec/support/shared/protocol.rb +5 -0
  1320. data/spec/support/shared/scram_conversation.rb +103 -0
  1321. data/spec/support/shared/server_selector.rb +99 -4
  1322. data/spec/support/shared/session.rb +34 -23
  1323. data/spec/support/spec_config.rb +292 -56
  1324. data/spec/support/spec_setup.rb +58 -36
  1325. data/spec/support/utils.rb +446 -45
  1326. data.tar.gz.sig +0 -0
  1327. metadata +1626 -683
  1328. metadata.gz.sig +0 -0
  1329. data/lib/mongo/event/description_changed.rb +0 -52
  1330. data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +0 -45
  1331. data/lib/mongo/server/connectable.rb +0 -107
  1332. data/spec/enterprise_auth/kerberos_spec.rb +0 -57
  1333. data/spec/mongo/operation/read_preference_spec.rb +0 -245
  1334. data/spec/spec_tests/data/sdam/sharded/single_mongos.yml +0 -33
  1335. data/spec/support/change_streams/operation.rb +0 -89
  1336. data/spec/support/change_streams.rb +0 -265
  1337. data/spec/support/cluster_config.rb +0 -139
  1338. data/spec/support/connection_string.rb +0 -326
  1339. data/spec/support/crud/requirement.rb +0 -69
  1340. data/spec/support/crud/test_base.rb +0 -22
  1341. data/spec/support/lite_constraints.rb +0 -52
  1342. data/spec/support/sdam_monitoring.rb +0 -89
  1343. data/spec/support/server_selection.rb +0 -153
  1344. data/spec/support/transactions/operation.rb +0 -184
  1345. data/spec/support/transactions/test.rb +0 -252
data/lib/mongo/address.rb CHANGED
@@ -1,4 +1,7 @@
1
- # Copyright (C) 2014-2019 MongoDB, Inc.
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ # Copyright (C) 2014-2020 MongoDB Inc.
2
5
  #
3
6
  # Licensed under the Apache License, Version 2.0 (the 'License');
4
7
  # you may not use this file except in compliance with the License.
@@ -15,6 +18,7 @@
15
18
  require 'mongo/address/ipv4'
16
19
  require 'mongo/address/ipv6'
17
20
  require 'mongo/address/unix'
21
+ require 'mongo/address/validator'
18
22
 
19
23
  module Mongo
20
24
 
@@ -65,11 +69,16 @@ module Mongo
65
69
  # @param [ String ] seed The provided address.
66
70
  # @param [ Hash ] options The address options.
67
71
  #
72
+ # @option options [ Float ] :connect_timeout Connect timeout.
73
+ #
68
74
  # @since 2.0.0
69
75
  def initialize(seed, options = {})
76
+ if seed.nil?
77
+ raise ArgumentError, "address must be not nil"
78
+ end
70
79
  @seed = seed
71
80
  @host, @port = parse_host_port
72
- @options = options
81
+ @options = Hash[options.map { |k, v| [k.to_sym, v] }]
73
82
  end
74
83
 
75
84
  # @return [ String ] seed The seed address.
@@ -81,6 +90,9 @@ module Mongo
81
90
  # @return [ Integer ] port The port.
82
91
  attr_reader :port
83
92
 
93
+ # @api private
94
+ attr_reader :options
95
+
84
96
  # Check equality of the address to another.
85
97
  #
86
98
  # @example Check address equality.
@@ -134,28 +146,108 @@ module Mongo
134
146
  "#<Mongo::Address:0x#{object_id} address=#{to_s}>"
135
147
  end
136
148
 
137
- # Get a socket for the provided address, given the options.
138
- #
139
- # The address the socket connects to is determined by the algorithm described in the
140
- # #intialize_resolver! documentation. Each time this method is called, #initialize_resolver!
141
- # will be called, meaning that a new hostname lookup will occur. This is done so that any
142
- # changes to which addresses the hostname resolves to will be picked up even if a socket has
143
- # been connected to it before.
149
+ # Get a socket for the address stored in this object, given the options.
150
+ #
151
+ # If the address stored in this object looks like a Unix path, this method
152
+ # returns a Unix domain socket for this path.
153
+ #
154
+ # Otherwise, this method attempts to resolve the address stored in
155
+ # this object to IPv4 and IPv6 addresses using +Socket#getaddrinfo+, then
156
+ # connects to the resulting addresses and returns the socket of the first
157
+ # successful connection. The order in which address families (IPv4/IPV6)
158
+ # are tried is the same order in which the addresses are returned by
159
+ # +getaddrinfo+, and is determined by the host system.
160
+ #
161
+ # Name resolution is performed on each +socket+ call. This is done so that
162
+ # any changes to which addresses the host names used as seeds or in
163
+ # server configuration resolve to are immediately noticed by the driver,
164
+ # even if a socket has been connected to the affected host name/address
165
+ # before. However, note that DNS TTL values may still affect when a change
166
+ # to a host address is noticed by the driver.
167
+ #
168
+ # This method propagates any exceptions raised during DNS resolution and
169
+ # subsequent connection attempts. In case of a host name resolving to
170
+ # multiple IP addresses, the error raised by the last attempt is propagated
171
+ # to the caller. This method does not map exceptions to Mongo::Error
172
+ # subclasses, and may raise any subclass of Exception.
144
173
  #
145
174
  # @example Get a socket.
146
175
  # address.socket(5, :ssl => true)
147
176
  #
148
177
  # @param [ Float ] socket_timeout The socket timeout.
149
- # @param [ Hash ] ssl_options SSL options.
150
- # @param [ Hash ] options The options.
151
- #
152
- # @option options [ Float ] :connect_timeout Connect timeout.
153
- #
154
- # @return [ Mongo::Socket::SSL, Mongo::Socket::TCP, Mongo::Socket::Unix ] The socket.
178
+ # @param [ Hash ] opts The options.
179
+ #
180
+ # @option opts [ Float ] :connect_timeout Connect timeout.
181
+ # @option opts [ true | false ] :ssl Whether to use SSL.
182
+ # @option opts [ String ] :ssl_ca_cert
183
+ # Same as the corresponding Client/Socket::SSL option.
184
+ # @option opts [ Array<OpenSSL::X509::Certificate> ] :ssl_ca_cert_object
185
+ # Same as the corresponding Client/Socket::SSL option.
186
+ # @option opts [ String ] :ssl_ca_cert_string
187
+ # Same as the corresponding Client/Socket::SSL option.
188
+ # @option opts [ String ] :ssl_cert
189
+ # Same as the corresponding Client/Socket::SSL option.
190
+ # @option opts [ OpenSSL::X509::Certificate ] :ssl_cert_object
191
+ # Same as the corresponding Client/Socket::SSL option.
192
+ # @option opts [ String ] :ssl_cert_string
193
+ # Same as the corresponding Client/Socket::SSL option.
194
+ # @option opts [ String ] :ssl_key
195
+ # Same as the corresponding Client/Socket::SSL option.
196
+ # @option opts [ OpenSSL::PKey ] :ssl_key_object
197
+ # Same as the corresponding Client/Socket::SSL option.
198
+ # @option opts [ String ] :ssl_key_pass_phrase
199
+ # Same as the corresponding Client/Socket::SSL option.
200
+ # @option opts [ String ] :ssl_key_string
201
+ # Same as the corresponding Client/Socket::SSL option.
202
+ # @option opts [ true, false ] :ssl_verify
203
+ # Same as the corresponding Client/Socket::SSL option.
204
+ # @option opts [ true, false ] :ssl_verify_certificate
205
+ # Same as the corresponding Client/Socket::SSL option.
206
+ # @option opts [ true, false ] :ssl_verify_hostname
207
+ # Same as the corresponding Client/Socket::SSL option.
208
+ #
209
+ # @return [ Mongo::Socket::SSL | Mongo::Socket::TCP | Mongo::Socket::Unix ]
210
+ # The socket.
211
+ #
212
+ # @raise [ Mongo::Error ] If network connection failed.
155
213
  #
156
214
  # @since 2.0.0
157
- def socket(socket_timeout, ssl_options = {}, options = {})
158
- create_resolver(ssl_options).socket(socket_timeout, ssl_options, options)
215
+ # @api private
216
+ def socket(socket_timeout, opts = {})
217
+ opts = {
218
+ connect_timeout: Server::CONNECT_TIMEOUT,
219
+ }.update(options).update(Hash[opts.map { |k, v| [k.to_sym, v] }])
220
+
221
+ map_exceptions do
222
+ if seed.downcase =~ Unix::MATCH
223
+ specific_address = Unix.new(seed.downcase)
224
+ return specific_address.socket(socket_timeout, opts)
225
+ end
226
+
227
+ # When the driver connects to "localhost", it only attempts IPv4
228
+ # connections. When the driver connects to other hosts, it will
229
+ # attempt both IPv4 and IPv6 connections.
230
+ family = (host == LOCALHOST) ? ::Socket::AF_INET : ::Socket::AF_UNSPEC
231
+ error = nil
232
+ # Sometimes Socket#getaddrinfo returns the same info more than once
233
+ # (multiple identical items in the returned array). It does not make
234
+ # sense to try to connect to the same address more than once, thus
235
+ # eliminate duplicates here.
236
+ infos = ::Socket.getaddrinfo(host, nil, family, ::Socket::SOCK_STREAM)
237
+ results = infos.map do |info|
238
+ [info[4], info[3]]
239
+ end.uniq
240
+ results.each do |family, address_str|
241
+ begin
242
+ specific_address = FAMILY_MAP[family].new(address_str, port, host)
243
+ socket = specific_address.socket(socket_timeout, opts)
244
+ return socket
245
+ rescue IOError, SystemCallError, Error::SocketTimeoutError, Error::SocketError => e
246
+ error = e
247
+ end
248
+ end
249
+ raise error
250
+ end
159
251
  end
160
252
 
161
253
  # Get the address as a string.
@@ -178,37 +270,8 @@ module Mongo
178
270
  end
179
271
  end
180
272
 
181
- # @api private
182
- def connect_timeout
183
- @connect_timeout ||= @options[:connect_timeout] || Server::CONNECT_TIMEOUT
184
- end
185
-
186
273
  private
187
274
 
188
- # To determine which address the socket will connect to, the driver will
189
- # attempt to connect to each IP address returned by Socket::getaddrinfo in
190
- # sequence. Once a successful connection is made, a resolver with that
191
- # IP address specified is returned. If no successful connection is
192
- # made, the error made by the last connection attempt is raised.
193
- def create_resolver(ssl_options)
194
- return Unix.new(seed.downcase) if seed.downcase =~ Unix::MATCH
195
-
196
- family = (host == LOCALHOST) ? ::Socket::AF_INET : ::Socket::AF_UNSPEC
197
- error = nil
198
- ::Socket.getaddrinfo(host, nil, family, ::Socket::SOCK_STREAM).each do |info|
199
- begin
200
- specific_address = FAMILY_MAP[info[4]].new(info[3], port, host)
201
- socket = specific_address.socket(
202
- connect_timeout, ssl_options, connect_timeout: connect_timeout)
203
- socket.close
204
- return specific_address
205
- rescue IOError, SystemCallError, Error::SocketTimeoutError, Error::SocketError => e
206
- error = e
207
- end
208
- end
209
- raise error
210
- end
211
-
212
275
  def parse_host_port
213
276
  address = seed.downcase
214
277
  case address
@@ -217,5 +280,17 @@ module Mongo
217
280
  else IPv4.parse(address)
218
281
  end
219
282
  end
283
+
284
+ def map_exceptions
285
+ begin
286
+ yield
287
+ rescue Errno::ETIMEDOUT => e
288
+ raise Error::SocketTimeoutError, "#{e.class}: #{e} (for #{self})"
289
+ rescue IOError, SystemCallError => e
290
+ raise Error::SocketError, "#{e.class}: #{e} (for #{self})"
291
+ rescue OpenSSL::SSL::SSLError => e
292
+ raise Error::SocketError, "#{e.class}: #{e} (for #{self})"
293
+ end
294
+ end
220
295
  end
221
296
  end
@@ -0,0 +1,128 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ # Copyright (C) 2020 MongoDB Inc.
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
+ module Mongo
19
+ module Auth
20
+ class Aws
21
+
22
+ # Defines behavior around a single MONGODB-AWS conversation between the
23
+ # client and server.
24
+ #
25
+ # @see https://github.com/mongodb/specifications/blob/master/source/auth/auth.rst#mongodb-aws
26
+ #
27
+ # @api private
28
+ class Conversation < SaslConversationBase
29
+
30
+ # Continue the AWS conversation. This sends the client final message
31
+ # to the server after setting the reply from the previous server
32
+ # communication.
33
+ #
34
+ # @param [ BSON::Document ] reply_document The reply document of the
35
+ # previous message.
36
+ # @param [ Server::Connection ] connection The connection being
37
+ # authenticated.
38
+ #
39
+ # @return [ Protocol::Message ] The next message to send.
40
+ def continue(reply_document, connection)
41
+ @conversation_id = reply_document[:conversationId]
42
+ payload = reply_document[:payload].data
43
+ payload = BSON::Document.from_bson(BSON::ByteBuffer.new(payload))
44
+ @server_nonce = payload[:s].data
45
+ validate_server_nonce!
46
+ @sts_host = payload[:h]
47
+ unless (1..255).include?(@sts_host.bytesize)
48
+ raise Error::InvalidServerAuthConfiguration, "STS host name length is not in 1..255 bytes range: #{@sts_host}"
49
+ end
50
+
51
+ selector = CLIENT_CONTINUE_MESSAGE.merge(
52
+ payload: BSON::Binary.new(client_final_payload),
53
+ conversationId: conversation_id,
54
+ )
55
+ build_message(connection, user.auth_source, selector)
56
+ end
57
+
58
+ private
59
+
60
+ # @return [ String ] The server nonce.
61
+ attr_reader :server_nonce
62
+
63
+ # Get the id of the conversation.
64
+ #
65
+ # @return [ Integer ] The conversation id.
66
+ attr_reader :conversation_id
67
+
68
+ def client_first_payload
69
+ {payload: client_first_message}
70
+ end
71
+
72
+ def client_first_data
73
+ {
74
+ r: BSON::Binary.new(client_nonce),
75
+ p: 110,
76
+ }
77
+ end
78
+
79
+ def client_first_payload
80
+ client_first_data.to_bson.to_s
81
+ end
82
+
83
+ def wrap_data(data)
84
+ BSON::Binary.new(data.to_bson.to_s)
85
+ end
86
+
87
+ def client_nonce
88
+ @client_nonce ||= SecureRandom.random_bytes(32)
89
+ end
90
+
91
+ def client_final_payload
92
+ credentials = CredentialsRetriever.new(user).credentials
93
+ request = Request.new(
94
+ access_key_id: credentials.access_key_id,
95
+ secret_access_key: credentials.secret_access_key,
96
+ session_token: credentials.session_token,
97
+ host: @sts_host,
98
+ server_nonce: server_nonce,
99
+ )
100
+
101
+ # Uncomment this line to validate obtained credentials on the
102
+ # client side prior to sending them to the server.
103
+ # This generally produces informative diagnostics as to why
104
+ # the credentials are not valid (e.g., they could be expired)
105
+ # whereas the server normally does not elaborate on why
106
+ # authentication failed (but the reason usually is logged into
107
+ # the server logs).
108
+ #
109
+ # Note that credential validation requires that the client is
110
+ # able to access AWS STS. If this is not permitted by firewall
111
+ # rules, validation will fail but credentials may be perfectly OK
112
+ # and the server may be able to authenticate using them just fine
113
+ # (provided the server is allowed to communicate with STS).
114
+ #request.validate!
115
+
116
+ payload = {
117
+ a: request.authorization,
118
+ d: request.formatted_time,
119
+ }
120
+ if credentials.session_token
121
+ payload[:t] = credentials.session_token
122
+ end
123
+ payload.to_bson.to_s
124
+ end
125
+ end
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,222 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ # Copyright (C) 2020 MongoDB Inc.
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
+ module Mongo
19
+ module Auth
20
+ class Aws
21
+
22
+ # Retrieves AWS credentials from a variety of sources.
23
+ #
24
+ # This class provides for AWS credentials retrieval from:
25
+ # - the passed user (which receives the credentials passed to the
26
+ # client via URI options and Ruby options)
27
+ # - AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN
28
+ # environment variables (commonly used by AWS SDKs and various tools,
29
+ # as well as AWS Lambda)
30
+ # - EC2 metadata endpoint
31
+ # - ECS metadata endpoint
32
+ #
33
+ # The sources listed above are consulted in the order specified.
34
+ # The first source that contains any of the three credential components
35
+ # (access key id, secret access key or session token) is used.
36
+ # The credential components must form a valid set if any of the components
37
+ # is specified; meaning, access key id and secret access key must
38
+ # always be provided together, and if a session token is provided
39
+ # the key id and secret key must also be provided. If a source provides
40
+ # partial credentials, credential retrieval fails with an exception.
41
+ #
42
+ # @api private
43
+ class CredentialsRetriever
44
+
45
+ # Timeout for metadata operations, in seconds.
46
+ #
47
+ # The auth spec suggests a 10 second timeout but this seems
48
+ # excessively long given that the endpoint is essentially local.
49
+ METADATA_TIMEOUT = 5
50
+
51
+ def initialize(user = nil)
52
+ @user = user
53
+ end
54
+
55
+ # @return [ Auth::User | nil ] The user object, if one was provided.
56
+ attr_reader :user
57
+
58
+ # Retrieves a valid set of credentials, if possible, or raises
59
+ # Auth::InvalidConfiguration.
60
+ #
61
+ # @return [ Auth::Aws::Credentials ] A valid set of credentials.
62
+ #
63
+ # @raise Auth::InvalidConfiguration if credentials could not be
64
+ # retrieved for any reason, or if a source contains an invalid set
65
+ # of credentials.
66
+ def credentials
67
+ if user
68
+ credentials = Credentials.new(
69
+ user.name,
70
+ user.password,
71
+ user.auth_mech_properties['aws_session_token'],
72
+ )
73
+
74
+ if credentials_valid?(credentials, 'Mongo::Client URI or Ruby options')
75
+ return credentials
76
+ end
77
+ end
78
+
79
+ credentials = Credentials.new(
80
+ ENV['AWS_ACCESS_KEY_ID'],
81
+ ENV['AWS_SECRET_ACCESS_KEY'],
82
+ ENV['AWS_SESSION_TOKEN'],
83
+ )
84
+
85
+ if credentials_valid?(credentials, 'environment variables')
86
+ return credentials
87
+ end
88
+
89
+ credentials = ecs_metadata_credentials
90
+
91
+ if credentials && credentials_valid?(credentials, 'ECS task metadata')
92
+ return credentials
93
+ end
94
+
95
+ credentials = ec2_metadata_credentials
96
+
97
+ if credentials && credentials_valid?(credentials, 'EC2 instance metadata')
98
+ return credentials
99
+ end
100
+
101
+ raise Auth::InvalidConfiguration,
102
+ "Could not locate AWS credentials (checked Client URI and Ruby options, environment variables, ECS and EC2 metadata)"
103
+ end
104
+
105
+ private
106
+
107
+ # Returns credentials from the EC2 metadata endpoint. The credentials
108
+ # could be empty, partial or invalid.
109
+ #
110
+ # @return [ Auth::Aws::Credentials | nil ] A set of credentials, or nil
111
+ # if retrieval failed.
112
+ def ec2_metadata_credentials
113
+ http = Net::HTTP.new('169.254.169.254')
114
+ req = Net::HTTP::Put.new('/latest/api/token',
115
+ # The TTL is required in order to obtain the metadata token.
116
+ {'x-aws-ec2-metadata-token-ttl-seconds' => '30'})
117
+ resp = ::Timeout.timeout(METADATA_TIMEOUT) do
118
+ http.request(req)
119
+ end
120
+ if resp.code != '200'
121
+ return nil
122
+ end
123
+ metadata_token = resp.body
124
+ resp = ::Timeout.timeout(METADATA_TIMEOUT) do
125
+ http_get(http, '/latest/meta-data/iam/security-credentials', metadata_token)
126
+ end
127
+ if resp.code != '200'
128
+ return nil
129
+ end
130
+ role_name = resp.body
131
+ escaped_role_name = CGI.escape(role_name).gsub('+', '%20')
132
+ resp = ::Timeout.timeout(METADATA_TIMEOUT) do
133
+ http_get(http, "/latest/meta-data/iam/security-credentials/#{escaped_role_name}", metadata_token)
134
+ end
135
+ if resp.code != '200'
136
+ return nil
137
+ end
138
+ payload = JSON.parse(resp.body)
139
+ unless payload['Code'] == 'Success'
140
+ return nil
141
+ end
142
+ Credentials.new(
143
+ payload['AccessKeyId'],
144
+ payload['SecretAccessKey'],
145
+ payload['Token'],
146
+ )
147
+ # When trying to use the EC2 metadata endpoint on ECS:
148
+ # Errno::EINVAL: Failed to open TCP connection to 169.254.169.254:80 (Invalid argument - connect(2) for "169.254.169.254" port 80)
149
+ rescue ::Timeout::Error, IOError, SystemCallError
150
+ return nil
151
+ end
152
+
153
+ def ecs_metadata_credentials
154
+ relative_uri = ENV['AWS_CONTAINER_CREDENTIALS_RELATIVE_URI']
155
+ if relative_uri.nil? || relative_uri.empty?
156
+ return nil
157
+ end
158
+
159
+ http = Net::HTTP.new('169.254.170.2')
160
+ # Per https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html
161
+ # the value in AWS_CONTAINER_CREDENTIALS_RELATIVE_URI includes
162
+ # the leading slash.
163
+ # The current language in MONGODB-AWS specification implies that
164
+ # a leading slash must be added by the driver, but this is not
165
+ # in fact needed.
166
+ req = Net::HTTP::Get.new(relative_uri)
167
+ resp = ::Timeout.timeout(METADATA_TIMEOUT) do
168
+ http.request(req)
169
+ end
170
+ if resp.code != '200'
171
+ return nil
172
+ end
173
+ payload = JSON.parse(resp.body)
174
+ Credentials.new(
175
+ payload['AccessKeyId'],
176
+ payload['SecretAccessKey'],
177
+ payload['Token'],
178
+ )
179
+ rescue ::Timeout::Error, IOError, SystemCallError
180
+ return nil
181
+ end
182
+
183
+ def http_get(http, uri, metadata_token)
184
+ req = Net::HTTP::Get.new(uri,
185
+ {'x-aws-ec2-metadata-token' => metadata_token})
186
+ http.request(req)
187
+ end
188
+
189
+ # Checks whether the credentials provided are valid.
190
+ #
191
+ # Returns true if they are valid, false if they are empty, and
192
+ # raises Auth::InvalidConfiguration if the credentials are
193
+ # incomplete (i.e. some of the components are missing).
194
+ def credentials_valid?(credentials, source)
195
+ unless credentials.access_key_id || credentials.secret_access_key ||
196
+ credentials.session_token
197
+ then
198
+ return false
199
+ end
200
+
201
+ if credentials.access_key_id || credentials.secret_access_key
202
+ if credentials.access_key_id && !credentials.secret_access_key
203
+ raise Auth::InvalidConfiguration,
204
+ "Access key ID is provided without secret access key (source: #{source})"
205
+ end
206
+
207
+ if credentials.secret_access_key && !credentials.access_key_id
208
+ raise Auth::InvalidConfiguration,
209
+ "Secret access key is provided without access key ID (source: #{source})"
210
+ end
211
+
212
+ elsif credentials.session_token
213
+ raise Auth::InvalidConfiguration,
214
+ "Session token is provided without access key ID or secret access key (source: #{source})"
215
+ end
216
+
217
+ true
218
+ end
219
+ end
220
+ end
221
+ end
222
+ end