mongo 2.11.4 → 2.12.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (357) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/CONTRIBUTING.md +1 -1
  5. data/README.md +2 -1
  6. data/lib/mongo.rb +3 -0
  7. data/lib/mongo/address.rb +44 -19
  8. data/lib/mongo/auth.rb +1 -0
  9. data/lib/mongo/auth/credential_cache.rb +51 -0
  10. data/lib/mongo/auth/scram/conversation.rb +20 -16
  11. data/lib/mongo/auth/user.rb +0 -8
  12. data/lib/mongo/auth/user/view.rb +4 -4
  13. data/lib/mongo/background_thread.rb +1 -1
  14. data/lib/mongo/bulk_write.rb +5 -5
  15. data/lib/mongo/client.rb +143 -14
  16. data/lib/mongo/client_encryption.rb +103 -0
  17. data/lib/mongo/cluster.rb +8 -4
  18. data/lib/mongo/cluster/reapers/cursor_reaper.rb +18 -6
  19. data/lib/mongo/cluster/sdam_flow.rb +54 -58
  20. data/lib/mongo/collection.rb +3 -3
  21. data/lib/mongo/collection/view.rb +1 -1
  22. data/lib/mongo/collection/view/aggregation.rb +1 -1
  23. data/lib/mongo/collection/view/change_stream.rb +12 -3
  24. data/lib/mongo/collection/view/iterable.rb +14 -5
  25. data/lib/mongo/collection/view/map_reduce.rb +2 -2
  26. data/lib/mongo/collection/view/readable.rb +9 -7
  27. data/lib/mongo/collection/view/writable.rb +7 -7
  28. data/lib/mongo/crypt.rb +33 -0
  29. data/lib/mongo/crypt/auto_decryption_context.rb +40 -0
  30. data/lib/mongo/crypt/auto_encrypter.rb +179 -0
  31. data/lib/mongo/crypt/auto_encryption_context.rb +44 -0
  32. data/lib/mongo/crypt/binary.rb +155 -0
  33. data/lib/mongo/crypt/binding.rb +1229 -0
  34. data/lib/mongo/crypt/context.rb +135 -0
  35. data/lib/mongo/crypt/data_key_context.rb +162 -0
  36. data/lib/mongo/crypt/encryption_io.rb +289 -0
  37. data/lib/mongo/crypt/explicit_decryption_context.rb +40 -0
  38. data/lib/mongo/crypt/explicit_encrypter.rb +117 -0
  39. data/lib/mongo/crypt/explicit_encryption_context.rb +89 -0
  40. data/lib/mongo/crypt/handle.rb +315 -0
  41. data/lib/mongo/crypt/hooks.rb +90 -0
  42. data/lib/mongo/crypt/kms_context.rb +67 -0
  43. data/lib/mongo/crypt/status.rb +131 -0
  44. data/lib/mongo/cursor.rb +64 -32
  45. data/lib/mongo/database.rb +23 -6
  46. data/lib/mongo/database/view.rb +13 -4
  47. data/lib/mongo/dbref.rb +9 -2
  48. data/lib/mongo/error.rb +5 -1
  49. data/lib/mongo/error/bulk_write_error.rb +16 -14
  50. data/lib/mongo/error/crypt_error.rb +31 -0
  51. data/lib/mongo/error/{failed_stringprep_validation.rb → failed_string_prep_validation.rb} +0 -0
  52. data/lib/mongo/error/invalid_cursor_operation.rb +27 -0
  53. data/lib/mongo/error/kms_error.rb +22 -0
  54. data/lib/mongo/error/max_bson_size.rb +14 -3
  55. data/lib/mongo/error/mongocryptd_spawn_error.rb +22 -0
  56. data/lib/mongo/error/no_server_available.rb +8 -3
  57. data/lib/mongo/error/notable.rb +0 -15
  58. data/lib/mongo/error/operation_failure.rb +1 -0
  59. data/lib/mongo/error/parser.rb +1 -1
  60. data/lib/mongo/grid/file.rb +5 -0
  61. data/lib/mongo/grid/file/chunk.rb +2 -0
  62. data/lib/mongo/grid/file/info.rb +3 -2
  63. data/lib/mongo/grid/fs_bucket.rb +15 -13
  64. data/lib/mongo/grid/stream/write.rb +9 -3
  65. data/lib/mongo/index/view.rb +3 -3
  66. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +1 -1
  67. data/lib/mongo/monitoring/event/command_started.rb +6 -1
  68. data/lib/mongo/operation/collections_info.rb +6 -3
  69. data/lib/mongo/operation/delete/op_msg.rb +1 -1
  70. data/lib/mongo/operation/find/op_msg.rb +4 -1
  71. data/lib/mongo/operation/get_more/op_msg.rb +4 -1
  72. data/lib/mongo/operation/insert/command.rb +3 -2
  73. data/lib/mongo/operation/insert/legacy.rb +3 -2
  74. data/lib/mongo/operation/insert/op_msg.rb +3 -3
  75. data/lib/mongo/operation/result.rb +36 -27
  76. data/lib/mongo/operation/shared/executable.rb +11 -9
  77. data/lib/mongo/operation/shared/executable_no_validate.rb +2 -2
  78. data/lib/mongo/operation/shared/op_msg_or_command.rb +2 -2
  79. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +2 -2
  80. data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +2 -2
  81. data/lib/mongo/operation/shared/read_preference_supported.rb +68 -19
  82. data/lib/mongo/operation/shared/response_handling.rb +1 -1
  83. data/lib/mongo/operation/shared/sessions_supported.rb +44 -3
  84. data/lib/mongo/operation/shared/write.rb +17 -10
  85. data/lib/mongo/operation/update/op_msg.rb +1 -1
  86. data/lib/mongo/protocol/bit_vector.rb +2 -1
  87. data/lib/mongo/protocol/compressed.rb +6 -5
  88. data/lib/mongo/protocol/insert.rb +3 -1
  89. data/lib/mongo/protocol/message.rb +94 -15
  90. data/lib/mongo/protocol/msg.rb +207 -37
  91. data/lib/mongo/protocol/query.rb +7 -9
  92. data/lib/mongo/protocol/serializers.rb +43 -15
  93. data/lib/mongo/retryable.rb +1 -1
  94. data/lib/mongo/server.rb +10 -4
  95. data/lib/mongo/server/connection.rb +20 -9
  96. data/lib/mongo/server/connection_base.rb +118 -18
  97. data/lib/mongo/server/connection_common.rb +61 -0
  98. data/lib/mongo/server/connection_pool.rb +37 -1
  99. data/lib/mongo/server/connection_pool/populator.rb +1 -1
  100. data/lib/mongo/server/description.rb +9 -11
  101. data/lib/mongo/server/monitor.rb +2 -0
  102. data/lib/mongo/server/monitor/connection.rb +3 -18
  103. data/lib/mongo/server/pending_connection.rb +2 -1
  104. data/lib/mongo/session.rb +3 -3
  105. data/lib/mongo/session/session_pool.rb +8 -3
  106. data/lib/mongo/socket.rb +29 -16
  107. data/lib/mongo/socket/ssl.rb +23 -8
  108. data/lib/mongo/socket/tcp.rb +12 -3
  109. data/lib/mongo/srv/monitor.rb +73 -42
  110. data/lib/mongo/srv/result.rb +0 -1
  111. data/lib/mongo/timeout.rb +49 -0
  112. data/lib/mongo/uri.rb +30 -1
  113. data/lib/mongo/uri/srv_protocol.rb +1 -1
  114. data/lib/mongo/version.rb +1 -1
  115. data/mongo.gemspec +1 -3
  116. data/spec/README.md +228 -7
  117. data/spec/integration/auth_spec.rb +53 -0
  118. data/spec/integration/bulk_write_spec.rb +19 -0
  119. data/spec/integration/{client_options_spec.rb → client_authentication_options_spec.rb} +10 -10
  120. data/spec/integration/client_construction_spec.rb +100 -1
  121. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +353 -0
  122. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +303 -0
  123. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +72 -0
  124. data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +79 -0
  125. data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +221 -0
  126. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +601 -0
  127. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +187 -0
  128. data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +78 -0
  129. data/spec/integration/client_side_encryption/client_close_spec.rb +63 -0
  130. data/spec/integration/client_side_encryption/corpus_spec.rb +233 -0
  131. data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +132 -0
  132. data/spec/integration/client_side_encryption/data_key_spec.rb +165 -0
  133. data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +114 -0
  134. data/spec/integration/client_side_encryption/external_key_vault_spec.rb +141 -0
  135. data/spec/integration/client_side_encryption/views_spec.rb +44 -0
  136. data/spec/integration/client_update_spec.rb +154 -0
  137. data/spec/integration/command_monitoring_spec.rb +3 -1
  138. data/spec/integration/command_spec.rb +44 -10
  139. data/spec/integration/connection_spec.rb +57 -0
  140. data/spec/integration/crud_spec.rb +89 -0
  141. data/spec/integration/grid_fs_bucket_spec.rb +48 -0
  142. data/spec/integration/read_preference_spec.rb +26 -0
  143. data/spec/integration/reconnect_spec.rb +7 -6
  144. data/spec/integration/size_limit_spec.rb +111 -0
  145. data/spec/integration/srv_monitoring_spec.rb +16 -8
  146. data/spec/integration/zlib_compression_spec.rb +25 -0
  147. data/spec/kerberos/kerberos_spec.rb +87 -0
  148. data/spec/lite_spec_helper.rb +34 -29
  149. data/spec/mongo/auth/cr_spec.rb +8 -0
  150. data/spec/mongo/auth/ldap_spec.rb +5 -1
  151. data/spec/mongo/auth/scram/conversation_spec.rb +5 -6
  152. data/spec/mongo/auth/scram/negotiation_spec.rb +74 -75
  153. data/spec/mongo/auth/scram_spec.rb +45 -35
  154. data/spec/mongo/auth/user/view_spec.rb +3 -6
  155. data/spec/mongo/auth/x509_spec.rb +5 -1
  156. data/spec/mongo/bulk_write/result_spec.rb +11 -7
  157. data/spec/mongo/client_construction_spec.rb +206 -2
  158. data/spec/mongo/client_encryption_spec.rb +405 -0
  159. data/spec/mongo/cluster/cursor_reaper_spec.rb +12 -8
  160. data/spec/mongo/cluster/socket_reaper_spec.rb +14 -3
  161. data/spec/mongo/collection/view/aggregation_spec.rb +0 -2
  162. data/spec/mongo/collection/view/change_stream_spec.rb +7 -7
  163. data/spec/mongo/collection/view/map_reduce_spec.rb +3 -3
  164. data/spec/mongo/collection/view_spec.rb +1 -1
  165. data/spec/mongo/collection_spec.rb +28 -9
  166. data/spec/mongo/crypt/auto_decryption_context_spec.rb +90 -0
  167. data/spec/mongo/crypt/auto_encrypter_spec.rb +187 -0
  168. data/spec/mongo/crypt/auto_encryption_context_spec.rb +107 -0
  169. data/spec/mongo/crypt/binary_spec.rb +115 -0
  170. data/spec/mongo/crypt/binding/binary_spec.rb +56 -0
  171. data/spec/mongo/crypt/binding/context_spec.rb +257 -0
  172. data/spec/mongo/crypt/binding/helpers_spec.rb +46 -0
  173. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +144 -0
  174. data/spec/mongo/crypt/binding/status_spec.rb +99 -0
  175. data/spec/mongo/crypt/binding/version_spec.rb +22 -0
  176. data/spec/mongo/crypt/binding_unloaded_spec.rb +20 -0
  177. data/spec/mongo/crypt/data_key_context_spec.rb +213 -0
  178. data/spec/mongo/crypt/encryption_io_spec.rb +136 -0
  179. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +72 -0
  180. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +170 -0
  181. data/spec/mongo/crypt/handle_spec.rb +232 -0
  182. data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +108 -0
  183. data/spec/mongo/crypt/status_spec.rb +152 -0
  184. data/spec/mongo/cursor_spec.rb +24 -4
  185. data/spec/mongo/database_spec.rb +20 -0
  186. data/spec/mongo/error/bulk_write_error_spec.rb +49 -0
  187. data/spec/mongo/error/crypt_error_spec.rb +26 -0
  188. data/spec/mongo/error/max_bson_size_spec.rb +35 -0
  189. data/spec/mongo/error/no_server_available_spec.rb +11 -1
  190. data/spec/mongo/error/notable_spec.rb +59 -0
  191. data/spec/mongo/error/operation_failure_spec.rb +6 -6
  192. data/spec/mongo/operation/aggregate_spec.rb +1 -1
  193. data/spec/mongo/operation/collections_info_spec.rb +1 -1
  194. data/spec/mongo/operation/command_spec.rb +3 -3
  195. data/spec/mongo/operation/create_index_spec.rb +3 -3
  196. data/spec/mongo/operation/create_user_spec.rb +3 -3
  197. data/spec/mongo/operation/delete/bulk_spec.rb +6 -6
  198. data/spec/mongo/operation/delete/op_msg_spec.rb +1 -6
  199. data/spec/mongo/operation/delete_spec.rb +7 -7
  200. data/spec/mongo/operation/drop_index_spec.rb +2 -2
  201. data/spec/mongo/operation/find/legacy_spec.rb +2 -1
  202. data/spec/mongo/operation/get_more_spec.rb +1 -1
  203. data/spec/mongo/operation/indexes_spec.rb +1 -1
  204. data/spec/mongo/operation/insert/bulk_spec.rb +7 -7
  205. data/spec/mongo/operation/insert/op_msg_spec.rb +3 -6
  206. data/spec/mongo/operation/insert_spec.rb +12 -12
  207. data/spec/mongo/operation/map_reduce_spec.rb +2 -2
  208. data/spec/mongo/operation/read_preference_legacy_spec.rb +351 -0
  209. data/spec/mongo/operation/read_preference_op_msg_spec.rb +194 -0
  210. data/spec/mongo/operation/remove_user_spec.rb +3 -3
  211. data/spec/mongo/operation/update/bulk_spec.rb +6 -6
  212. data/spec/mongo/operation/update/op_msg_spec.rb +3 -6
  213. data/spec/mongo/operation/update_spec.rb +7 -7
  214. data/spec/mongo/operation/update_user_spec.rb +1 -1
  215. data/spec/mongo/protocol/compressed_spec.rb +2 -3
  216. data/spec/mongo/protocol/delete_spec.rb +9 -8
  217. data/spec/mongo/protocol/get_more_spec.rb +9 -8
  218. data/spec/mongo/protocol/insert_spec.rb +9 -8
  219. data/spec/mongo/protocol/kill_cursors_spec.rb +6 -5
  220. data/spec/mongo/protocol/msg_spec.rb +57 -53
  221. data/spec/mongo/protocol/query_spec.rb +12 -12
  222. data/spec/mongo/protocol/registry_spec.rb +1 -1
  223. data/spec/mongo/protocol/reply_spec.rb +1 -1
  224. data/spec/mongo/protocol/update_spec.rb +10 -9
  225. data/spec/mongo/server/connection_pool_spec.rb +1 -1
  226. data/spec/mongo/server/connection_spec.rb +28 -7
  227. data/spec/mongo/socket_spec.rb +1 -1
  228. data/spec/mongo/srv/monitor_spec.rb +88 -69
  229. data/spec/mongo/timeout_spec.rb +85 -0
  230. data/spec/mongo/uri/srv_protocol_spec.rb +2 -2
  231. data/spec/mongo/uri_spec.rb +52 -5
  232. data/spec/mongo/write_concern_spec.rb +13 -1
  233. data/spec/{support → runners}/auth.rb +14 -1
  234. data/spec/{support → runners}/change_streams.rb +1 -1
  235. data/spec/{support → runners}/change_streams/operation.rb +0 -0
  236. data/spec/{support → runners}/cmap.rb +1 -1
  237. data/spec/{support → runners}/cmap/verifier.rb +0 -0
  238. data/spec/{support → runners}/command_monitoring.rb +0 -0
  239. data/spec/runners/connection_string.rb +358 -4
  240. data/spec/{support → runners}/crud.rb +9 -9
  241. data/spec/{support → runners}/crud/context.rb +0 -0
  242. data/spec/{support → runners}/crud/operation.rb +7 -3
  243. data/spec/{support → runners}/crud/outcome.rb +0 -0
  244. data/spec/{support → runners}/crud/requirement.rb +1 -1
  245. data/spec/{support → runners}/crud/spec.rb +12 -1
  246. data/spec/{support → runners}/crud/test.rb +0 -0
  247. data/spec/{support → runners}/crud/test_base.rb +0 -0
  248. data/spec/{support → runners}/crud/verifier.rb +10 -12
  249. data/spec/{support → runners}/gridfs.rb +0 -0
  250. data/spec/{support → runners}/sdam_monitoring.rb +0 -0
  251. data/spec/{support → runners}/server_discovery_and_monitoring.rb +0 -0
  252. data/spec/{support → runners}/server_selection.rb +0 -0
  253. data/spec/{support → runners}/server_selection_rtt.rb +0 -0
  254. data/spec/{support → runners}/transactions.rb +9 -11
  255. data/spec/{support → runners}/transactions/context.rb +0 -0
  256. data/spec/{support → runners}/transactions/operation.rb +0 -0
  257. data/spec/{support → runners}/transactions/spec.rb +0 -0
  258. data/spec/{support → runners}/transactions/test.rb +37 -5
  259. data/spec/spec_helper.rb +0 -5
  260. data/spec/spec_tests/auth_spec.rb +3 -3
  261. data/spec/spec_tests/client_side_encryption_spec.rb +8 -0
  262. data/spec/spec_tests/connection_string_spec.rb +1 -1
  263. data/spec/spec_tests/data/auth/connection-string.yml +13 -0
  264. data/spec/spec_tests/data/client_side_encryption/aggregate.yml +134 -0
  265. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +526 -0
  266. data/spec/spec_tests/data/client_side_encryption/badSchema.yml +73 -0
  267. data/spec/spec_tests/data/client_side_encryption/basic.yml +116 -0
  268. data/spec/spec_tests/data/client_side_encryption/bulk.yml +88 -0
  269. data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +100 -0
  270. data/spec/spec_tests/data/client_side_encryption/bypassedCommand.yml +42 -0
  271. data/spec/spec_tests/data/client_side_encryption/count.yml +61 -0
  272. data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +59 -0
  273. data/spec/spec_tests/data/client_side_encryption/delete.yml +105 -0
  274. data/spec/spec_tests/data/client_side_encryption/distinct.yml +73 -0
  275. data/spec/spec_tests/data/client_side_encryption/explain.yml +64 -0
  276. data/spec/spec_tests/data/client_side_encryption/find.yml +119 -0
  277. data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +57 -0
  278. data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +57 -0
  279. data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +57 -0
  280. data/spec/spec_tests/data/client_side_encryption/getMore.yml +68 -0
  281. data/spec/spec_tests/data/client_side_encryption/insert.yml +102 -0
  282. data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +71 -0
  283. data/spec/spec_tests/data/client_side_encryption/localKMS.yml +54 -0
  284. data/spec/spec_tests/data/client_side_encryption/localSchema.yml +72 -0
  285. data/spec/spec_tests/data/client_side_encryption/malformedCiphertext.yml +69 -0
  286. data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +20 -0
  287. data/spec/spec_tests/data/client_side_encryption/missingKey.yml +49 -0
  288. data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +64 -0
  289. data/spec/spec_tests/data/client_side_encryption/types.yml +527 -0
  290. data/spec/spec_tests/data/client_side_encryption/unsupportedCommand.yml +25 -0
  291. data/spec/spec_tests/data/client_side_encryption/updateMany.yml +77 -0
  292. data/spec/spec_tests/data/client_side_encryption/updateOne.yml +171 -0
  293. data/spec/spec_tests/data/read_write_concern/connection-string/write-concern.yml +1 -4
  294. data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +21 -0
  295. data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +2 -4
  296. data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +1 -1
  297. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me_not_removed.yml +73 -0
  298. data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +1 -2
  299. data/spec/spec_tests/data/sdam/rs/repeated.yml +101 -0
  300. data/spec/spec_tests/data/sdam/rs/{primary_address_change.yml → ruby_primary_address_change.yml} +2 -0
  301. 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
  302. data/spec/spec_tests/data/sdam/sharded/ruby_discovered_single_mongos.yml +27 -0
  303. data/spec/spec_tests/data/sdam/sharded/{primary_address_change.yml → ruby_primary_different_address.yml} +1 -1
  304. data/spec/spec_tests/data/sdam/sharded/{primary_mismatched_me.yml → ruby_primary_mismatched_me.yml} +1 -1
  305. data/spec/spec_tests/data/sdam/single/{primary_address_change.yml → ruby_primary_different_address.yml} +1 -1
  306. data/spec/spec_tests/data/sdam/single/{primary_mismatched_me.yml → ruby_primary_mismatched_me.yml} +1 -1
  307. data/spec/spec_tests/data/sdam_monitoring/{replica_set_with_primary_change.yml → replica_set_primary_address_change.yml} +27 -5
  308. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_me_mismatch.yml +26 -74
  309. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +20 -16
  310. data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +73 -0
  311. data/spec/spec_tests/data/transactions/pin-mongos.yml +2 -3
  312. data/spec/spec_tests/data/uri_options/auth-options.yml +10 -0
  313. data/spec/spec_tests/data/uri_options/tls-options.yml +75 -4
  314. data/spec/spec_tests/read_write_concern_connection_string_spec.rb +1 -1
  315. data/spec/spec_tests/uri_options_spec.rb +6 -8
  316. data/spec/stress/connection_pool_timing_spec.rb +6 -3
  317. data/spec/support/certificates/README.md +4 -0
  318. data/spec/support/certificates/server-second-level-bundle.pem +77 -77
  319. data/spec/support/certificates/server-second-level.crt +52 -52
  320. data/spec/support/certificates/server-second-level.key +25 -25
  321. data/spec/support/certificates/server-second-level.pem +77 -77
  322. data/spec/support/client_registry.rb +19 -3
  323. data/spec/support/cluster_config.rb +9 -1
  324. data/spec/support/cluster_tools.rb +6 -1
  325. data/spec/support/common_shortcuts.rb +12 -0
  326. data/spec/support/constraints.rb +16 -0
  327. data/spec/support/crypt.rb +154 -0
  328. data/spec/support/crypt/corpus/corpus-key-aws.json +33 -0
  329. data/spec/support/crypt/corpus/corpus-key-local.json +31 -0
  330. data/spec/support/crypt/corpus/corpus-schema.json +2057 -0
  331. data/spec/support/crypt/corpus/corpus.json +3657 -0
  332. data/spec/support/crypt/corpus/corpus_encrypted.json +4152 -0
  333. data/spec/support/crypt/data_keys/key_document_aws.json +34 -0
  334. data/spec/support/crypt/data_keys/key_document_local.json +31 -0
  335. data/spec/support/crypt/external/external-key.json +31 -0
  336. data/spec/support/crypt/external/external-schema.json +19 -0
  337. data/spec/support/crypt/limits/limits-doc.json +102 -0
  338. data/spec/support/crypt/limits/limits-key.json +31 -0
  339. data/spec/support/crypt/limits/limits-schema.json +1405 -0
  340. data/spec/support/crypt/schema_maps/schema_map_aws.json +17 -0
  341. data/spec/support/crypt/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  342. data/spec/support/crypt/schema_maps/schema_map_local.json +18 -0
  343. data/spec/support/crypt/schema_maps/schema_map_local_key_alt_names.json +12 -0
  344. data/spec/support/lite_constraints.rb +19 -1
  345. data/spec/support/matchers.rb +19 -0
  346. data/spec/support/shared/protocol.rb +2 -0
  347. data/spec/support/spec_config.rb +53 -13
  348. data/spec/support/utils.rb +140 -10
  349. metadata +894 -687
  350. metadata.gz.sig +0 -0
  351. data/lib/mongo/cluster/srv_monitor.rb +0 -127
  352. data/lib/mongo/srv/warning_result.rb +0 -35
  353. data/spec/enterprise_auth/kerberos_spec.rb +0 -58
  354. data/spec/mongo/cluster/srv_monitor_spec.rb +0 -214
  355. data/spec/mongo/operation/read_preference_spec.rb +0 -245
  356. data/spec/spec_tests/data/sdam/sharded/single_mongos.yml +0 -33
  357. data/spec/support/connection_string.rb +0 -354
@@ -126,12 +126,18 @@ module Mongo
126
126
  # information hash per collection, depends on the MongoDB server
127
127
  # version that fulfills the request.
128
128
  #
129
+ # @param [ Hash ] options
130
+ #
131
+ # @option options [ Hash ] :filter A filter on the collections returned.
132
+ # See https://docs.mongodb.com/manual/reference/command/listCollections/
133
+ # for more information and usage.
134
+ #
129
135
  # @return [ Array<Hash> ] Array of information hashes, one for each
130
136
  # collection in the database.
131
137
  #
132
138
  # @since 2.0.5
133
- def list_collections
134
- View.new(self).list_collections
139
+ def list_collections(**options)
140
+ View.new(self).list_collections(**options)
135
141
  end
136
142
 
137
143
  # Get all the non-system collections that belong to this database.
@@ -156,9 +162,18 @@ module Mongo
156
162
  #
157
163
  # @option opts :read [ Hash ] The read preference for this command.
158
164
  # @option opts :session [ Session ] The session to use for this command.
165
+ # @option opts :execution_options [ Hash ] Options to pass to the code that
166
+ # executes this command. This is an internal option and is subject to
167
+ # change.
168
+ # - :deserialize_as_bson [ Boolean ] Whether to deserialize the response
169
+ # to this command using BSON types intead of native Ruby types wherever
170
+ # possible.
159
171
  #
160
172
  # @return [ Mongo::Operation::Result ] The result of the command execution.
161
173
  def command(operation, opts = {})
174
+ opts = opts.dup
175
+ execution_opts = opts.delete(:execution_options) || {}
176
+
162
177
  txn_read_pref = if opts[:session] && opts[:session].in_transaction?
163
178
  opts[:session].txn_read_preference
164
179
  else
@@ -170,12 +185,14 @@ module Mongo
170
185
 
171
186
  client.send(:with_session, opts) do |session|
172
187
  server = selector.select_server(cluster, nil, session)
173
- Operation::Command.new({
188
+ op = Operation::Command.new(
174
189
  :selector => operation.dup,
175
190
  :db_name => name,
176
191
  :read => selector,
177
192
  :session => session
178
- }).execute(server)
193
+ )
194
+
195
+ op.execute(server, client: client, options: execution_opts)
179
196
  end
180
197
  end
181
198
 
@@ -206,7 +223,7 @@ module Mongo
206
223
  :db_name => name,
207
224
  :read => preference,
208
225
  :session => session
209
- }).execute(server)
226
+ }).execute(server, client: client)
210
227
  end
211
228
  end
212
229
  end
@@ -231,7 +248,7 @@ module Mongo
231
248
  db_name: name,
232
249
  write_concern: write_concern,
233
250
  session: session
234
- }).execute(next_primary(nil, session))
251
+ }).execute(next_primary(nil, session), client: client)
235
252
  end
236
253
  end
237
254
 
@@ -78,12 +78,18 @@ module Mongo
78
78
  # @example Get info on each collection.
79
79
  # database.list_collections
80
80
  #
81
+ # @param [ Hash ] options
82
+ #
83
+ # @option options [ Hash ] :filter A filter on the collections returned.
84
+ # See https://docs.mongodb.com/manual/reference/command/listCollections/
85
+ # for more information and usage.
86
+ #
81
87
  # @return [ Array<Hash> ] Info for each collection in the database.
82
88
  #
83
89
  # @since 2.0.5
84
- def list_collections
90
+ def list_collections(**options)
85
91
  session = client.send(:get_session)
86
- collections_info(session, ServerSelector.primary)
92
+ collections_info(session, ServerSelector.primary, **options)
87
93
  end
88
94
 
89
95
  # Create the new database view.
@@ -157,7 +163,10 @@ module Mongo
157
163
  cursor: batch_size ? { batchSize: batch_size } : {} },
158
164
  db_name: @database.name,
159
165
  session: session
160
- }.tap { |spec| spec[:selector][:nameOnly] = true if options[:name_only] }
166
+ }.tap do |spec|
167
+ spec[:selector][:nameOnly] = true if options[:name_only]
168
+ spec[:selector][:filter] = options[:filter] if options[:filter]
169
+ end
161
170
  end
162
171
 
163
172
  def initial_query_op(session, options = {})
@@ -165,7 +174,7 @@ module Mongo
165
174
  end
166
175
 
167
176
  def send_initial_query(server, session, options = {})
168
- initial_query_op(session, options).execute(server)
177
+ initial_query_op(session, options).execute(server, client: client)
169
178
  end
170
179
  end
171
180
  end
@@ -100,8 +100,15 @@ module Mongo
100
100
  # @see http://bsonspec.org/#/specification
101
101
  #
102
102
  # @since 2.0.0
103
- def from_bson(buffer)
104
- decoded = super
103
+ def from_bson(buffer, **options)
104
+ # bson-ruby 4.8.0 changes #from_bson API to take **options.
105
+ # However older bsons fail if invoked with a plain super here,
106
+ # even if options are empty.
107
+ decoded = if options.empty?
108
+ super(buffer)
109
+ else
110
+ super
111
+ end
105
112
  if ref = decoded[COLLECTION]
106
113
  decoded = DBRef.new(ref, decoded[ID], decoded[DATABASE])
107
114
  end
@@ -152,6 +152,7 @@ require 'mongo/error/change_stream_resumable'
152
152
  require 'mongo/error/bulk_write_error'
153
153
  require 'mongo/error/closed_stream'
154
154
  require 'mongo/error/connection_check_out_timeout'
155
+ require 'mongo/error/crypt_error'
155
156
  require 'mongo/error/extra_file_chunk'
156
157
  require 'mongo/error/file_not_found'
157
158
  require 'mongo/error/operation_failure'
@@ -159,6 +160,7 @@ require 'mongo/error/invalid_address'
159
160
  require 'mongo/error/invalid_bulk_operation'
160
161
  require 'mongo/error/invalid_bulk_operation_type'
161
162
  require 'mongo/error/invalid_collection_name'
163
+ require 'mongo/error/invalid_cursor_operation'
162
164
  require 'mongo/error/invalid_database_name'
163
165
  require 'mongo/error/invalid_document'
164
166
  require 'mongo/error/invalid_file'
@@ -177,10 +179,12 @@ require 'mongo/error/invalid_update_document'
177
179
  require 'mongo/error/invalid_uri'
178
180
  require 'mongo/error/invalid_write_concern'
179
181
  require 'mongo/error/insufficient_iteration_count'
182
+ require 'mongo/error/kms_error'
180
183
  require 'mongo/error/lint_error'
181
184
  require 'mongo/error/max_bson_size'
182
185
  require 'mongo/error/max_message_size'
183
186
  require 'mongo/error/mismatched_domain'
187
+ require 'mongo/error/mongocryptd_spawn_error'
184
188
  require 'mongo/error/multi_index_drop'
185
189
  require 'mongo/error/need_primary_server'
186
190
  require 'mongo/error/no_server_available'
@@ -189,7 +193,7 @@ require 'mongo/error/session_ended'
189
193
  require 'mongo/error/pool_closed_error'
190
194
  require 'mongo/error/socket_error'
191
195
  require 'mongo/error/socket_timeout_error'
192
- require 'mongo/error/failed_stringprep_validation'
196
+ require 'mongo/error/failed_string_prep_validation'
193
197
  require 'mongo/error/unchangeable_collection_option'
194
198
  require 'mongo/error/unexpected_chunk_length'
195
199
  require 'mongo/error/unexpected_response'
@@ -35,22 +35,24 @@ module Mongo
35
35
  # @since 2.0.0
36
36
  def initialize(result)
37
37
  @result = result
38
+ # Exception constructor behaves differently for a nil argument and
39
+ # for no argument. Avoid passing nil explicitly.
40
+ super(*[build_message])
38
41
  end
39
42
 
40
- def to_s
41
- messages = if errors = result['writeErrors']
42
- frag = ': ' + errors[0..10].map do |error|
43
- "#{error['errmsg']} (#{error['code']})"
44
- end.join(', ')
45
- if errors.length > 10
46
- frag += '...'
47
- else
48
- frag
49
- end
50
- else
51
- ''
52
- end
53
- "#{self.class}: #{messages}" + notes_tail
43
+ private
44
+
45
+ def build_message
46
+ errors = @result['writeErrors']
47
+ return nil unless errors
48
+
49
+ fragment = errors.first(10).map do |error|
50
+ "#{error['errmsg']} (#{error['code']})"
51
+ end.join(', ')
52
+
53
+ fragment += '...' if errors.length > 10
54
+
55
+ fragment
54
56
  end
55
57
  end
56
58
  end
@@ -0,0 +1,31 @@
1
+ # Copyright (C) 2020 MongoDB Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ class Error
17
+
18
+ # An error related to client-side encryption.
19
+ class CryptError < Mongo::Error
20
+ # Create a new CryptError
21
+ #
22
+ # @param [ Integer | nil ] code The optional libmongocrypt error code
23
+ # @param [ String ] message The error message
24
+ def initialize(message, code: nil)
25
+ msg = message
26
+ msg += " (libmongocrypt error code #{code})" if code
27
+ super(msg)
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,27 @@
1
+ # Copyright (C) 2019 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ class Error
17
+
18
+ # Exception raised when an unsupported operation is attempted on a cursor.
19
+ #
20
+ # Examples:
21
+ # - Attempting to iterate a regular cursor more than once.
22
+ # - Attempting to call try_next on a caching cursor after it had been
23
+ # iterated completely the first time.
24
+ class InvalidCursorOperation < Error
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,22 @@
1
+ # Copyright (C) 2020 MongoDB Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ class Error
17
+
18
+ # A KMS-related error during client-side encryption.
19
+ class KmsError < CryptError
20
+ end
21
+ end
22
+ end
@@ -24,16 +24,27 @@ module Mongo
24
24
  # The message is constant.
25
25
  #
26
26
  # @since 2.0.0
27
- MESSAGE = "Document exceeds allowed max BSON size.".freeze
27
+ MESSAGE = "The document exceeds maximum allowed BSON size".freeze
28
28
 
29
29
  # Instantiate the new exception.
30
30
  #
31
31
  # @example Instantiate the exception.
32
32
  # Mongo::Error::MaxBSONSize.new(max)
33
33
  #
34
+ # @param [ String | Numeric ] max_size_or_msg The message to use or
35
+ # the maximum size to insert into the predefined message. The
36
+ # Numeric argument type is deprecated.
37
+ #
34
38
  # @since 2.0.0
35
- def initialize(max_size = nil)
36
- super(max_size ? MESSAGE + " The max is #{max_size}." : MESSAGE)
39
+ def initialize(max_size_or_msg = nil)
40
+ if max_size_or_msg.is_a?(Numeric)
41
+ msg = "#{MESSAGE}. The maximum allowed size is #{max_size_or_msg}"
42
+ elsif max_size_or_msg
43
+ msg = max_size_or_msg
44
+ else
45
+ msg = MESSAGE
46
+ end
47
+ super(msg)
37
48
  end
38
49
  end
39
50
  end
@@ -0,0 +1,22 @@
1
+ # Copyright (C) 2020 MongoDB Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ class Error
17
+
18
+ # An error related to spawning mongocryptd for client-side encryption.
19
+ class MongocryptdSpawnError < CryptError
20
+ end
21
+ end
22
+ end
@@ -32,9 +32,14 @@ module Mongo
32
32
  #
33
33
  # @since 2.0.0
34
34
  def initialize(server_selector, cluster=nil, msg=nil)
35
- msg ||= "No #{server_selector.name} server is available in cluster: #{cluster.summary} " +
36
- "with timeout=#{server_selector.server_selection_timeout}, " +
37
- "LT=#{server_selector.local_threshold}"
35
+ unless msg
36
+ msg = "No #{server_selector.name} server is available"
37
+ if cluster
38
+ msg += " in cluster: #{cluster.summary}"
39
+ end
40
+ msg += " with timeout=#{server_selector.server_selection_timeout}, " +
41
+ "LT=#{server_selector.local_threshold}"
42
+ end
38
43
 
39
44
  super(msg)
40
45
  end
@@ -45,26 +45,11 @@ module Mongo
45
45
  @notes << note
46
46
  end
47
47
 
48
- # @api public
49
- def message
50
- super + notes_tail
51
- end
52
-
53
48
  # @api public
54
49
  def to_s
55
50
  super + notes_tail
56
51
  end
57
52
 
58
- # @api public
59
- def inspect
60
- msg = super
61
- if msg.end_with?('>')
62
- msg[0...msg.length-1] + notes_tail + '>'
63
- else
64
- msg + notes_tail
65
- end
66
- end
67
-
68
53
  private
69
54
 
70
55
  # @api private
@@ -39,6 +39,7 @@ module Mongo
39
39
  {:code_name => 'HostUnreachable', :code => 6},
40
40
  {:code_name => 'NetworkTimeout', :code => 89},
41
41
  {:code_name => 'SocketException', :code => 9001},
42
+ {:code_name => 'ExceededTimeLimit', :code => 262}
42
43
  ].freeze
43
44
 
44
45
  # These are magic error messages that could indicate a master change.
@@ -76,7 +76,7 @@ module Mongo
76
76
  # examined because the status (ok: 1) is not part of the document and
77
77
  # there is no way to distinguish successful from failed responses using
78
78
  # the document itself, and a successful response may legitimately have
79
- # {code: 123, codeName: 'foo'} as the contents of a user-inserted
79
+ # { code: 123, codeName: 'foo' } as the contents of a user-inserted
80
80
  # document. The legacy server versions do not fill out code nor codeName
81
81
  # thus not reading them does not lose information.
82
82
  #
@@ -104,6 +104,11 @@ module Mongo
104
104
  # chunk objects and assemble the data. If we have an IO object, then
105
105
  # it's the original file data and we must split it into chunks and set
106
106
  # the original data itself.
107
+ #
108
+ # @param [ IO, String, Array<BSON::Document> ] value The file object,
109
+ # file contents or chunk documents.
110
+ #
111
+ # @return [ Array<Grid::File::Chunk> ] Array of chunks.
107
112
  def initialize_chunks!(value)
108
113
  if value.is_a?(Array)
109
114
  @chunks = value.map{ |doc| Chunk.new(doc) }
@@ -151,6 +151,7 @@ module Mongo
151
151
  # @return [ String ] The assembled data.
152
152
  #
153
153
  # @since 2.0.0
154
+ # @api private
154
155
  def assemble(chunks)
155
156
  chunks.reduce(''){ |data, chunk| data << chunk.data.data }
156
157
  end
@@ -167,6 +168,7 @@ module Mongo
167
168
  # @return [ Array<Chunk> ] The chunks of the data.
168
169
  #
169
170
  # @since 2.0.0
171
+ # @api private
170
172
  def split(io, file_info, offset = 0)
171
173
  io = StringIO.new(io) if io.is_a?(String)
172
174
  parts = Enumerator.new { |y| y << io.read(file_info.chunk_size) until io.eof? }
@@ -204,7 +204,7 @@ module Mongo
204
204
  # @note This method is transitional and is provided for backwards compatibility.
205
205
  # It will be removed when md5 support is deprecated entirely.
206
206
  #
207
- # @param [ String ] The bytes to use to update the digest.
207
+ # @param [ String ] bytes The bytes to use to update the digest.
208
208
  #
209
209
  # @return [ Digest::MD5 ] The md5 hash object.
210
210
  #
@@ -254,7 +254,8 @@ module Mongo
254
254
  BSON::Document.new(
255
255
  :_id => BSON::ObjectId.new,
256
256
  :chunkSize => Chunk::DEFAULT_SIZE,
257
- :uploadDate => Time.now.utc,
257
+ # MongoDB stores times with millisecond precision
258
+ :uploadDate => Time.now.utc.round(3),
258
259
  :contentType => DEFAULT_CONTENT_TYPE
259
260
  )
260
261
  end