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
metadata.gz.sig CHANGED
Binary file
@@ -1,127 +0,0 @@
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 Cluster
17
-
18
- # Periodically retrieves SRV records for the cluster's SRV URI, and
19
- # sets the cluster's server list to the SRV lookup result.
20
- #
21
- # If an error is encountered during SRV lookup or an SRV record is invalid
22
- # or disallowed for security reasons, a warning is logged and monitoring
23
- # continues.
24
- #
25
- # @api private
26
- class SrvMonitor
27
- include Loggable
28
- include BackgroundThread
29
-
30
- MIN_SCAN_INTERVAL = 60
31
-
32
- DEFAULT_TIMEOUT = 10
33
-
34
- # Creates the SRV monitor.
35
- #
36
- # @param [ Cluster ] cluster The cluster.
37
- # @param [ Hash ] options The cluster options.
38
- #
39
- # @option options [ Float ] :timeout The timeout to use for DNS lookups.
40
- # @option options [ URI::SRVProtocol ] :srv_uri The SRV URI to monitor.
41
- # @option options [ Hash ] :resolv_options For internal driver use only.
42
- # Options to pass through to Resolv::DNS constructor for SRV lookups.
43
- def initialize(cluster, options = nil)
44
- options = if options
45
- options.dup
46
- else
47
- {}
48
- end
49
- @cluster = cluster
50
- @resolver = Srv::Resolver.new(options)
51
- unless @srv_uri = options.delete(:srv_uri)
52
- raise ArgumentError, 'SRV URI is required'
53
- end
54
- @options = options.freeze
55
- @last_result = @srv_uri.srv_result
56
- @stop_semaphore = Semaphore.new
57
- end
58
-
59
- attr_reader :options
60
-
61
- attr_reader :cluster
62
-
63
- # @return [ Srv::Result ] Last known SRV lookup result. Used for
64
- # determining intervals between SRV lookups, which depend on SRV DNS
65
- # records' TTL values.
66
- attr_reader :last_result
67
-
68
- def start!
69
- super
70
- ObjectSpace.define_finalizer(self, self.class.finalize(@thread))
71
- end
72
-
73
- private
74
-
75
- def do_work
76
- scan!
77
- @stop_semaphore.wait(scan_interval)
78
- end
79
-
80
- def scan!
81
- old_hosts = last_result.address_strs
82
-
83
- begin
84
- last_result = Timeout.timeout(timeout) do
85
- @resolver.get_records(@srv_uri.query_hostname)
86
- end
87
- rescue Resolv::ResolvTimeout => e
88
- log_warn("SRV monitor: timed out trying to resolve hostname #{@srv_uri.query_hostname}: #{e.class}: #{e}")
89
- return
90
- rescue Timeout::Error
91
- log_warn("SRV monitor: timed out trying to resolve hostname #{@srv_uri.query_hostname} (timeout=#{timeout})")
92
- return
93
- rescue Resolv::ResolvError => e
94
- log_warn("SRV monitor: unable to resolve hostname #{@srv_uri.query_hostname}: #{e.class}: #{e}")
95
- return
96
- end
97
-
98
- if last_result.empty?
99
- log_warn("SRV monitor: hostname #{@srv_uri.query_hostname} resolved to zero records")
100
- return
101
- end
102
-
103
- @cluster.set_server_list(last_result.address_strs)
104
- end
105
-
106
- def self.finalize(thread)
107
- Proc.new do
108
- thread.kill
109
- end
110
- end
111
-
112
- def scan_interval
113
- if last_result.empty?
114
- [cluster.heartbeat_interval, MIN_SCAN_INTERVAL].min
115
- elsif last_result.min_ttl.nil?
116
- MIN_SCAN_INTERVAL
117
- else
118
- [last_result.min_ttl, MIN_SCAN_INTERVAL].max
119
- end
120
- end
121
-
122
- def timeout
123
- options[:timeout] || DEFAULT_TIMEOUT
124
- end
125
- end
126
- end
127
- end
@@ -1,35 +0,0 @@
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
-
17
- module Srv
18
-
19
- # SRV record lookup result which warns on errors rather than raising
20
- # exceptions.
21
- #
22
- # @api private
23
- class WarningResult < Result
24
-
25
- # Adds a new record.
26
- #
27
- # @param [ Resolv::DNS::Resource ] record An SRV record found for the hostname.
28
- def add_record(record)
29
- super
30
- rescue Error::InvalidAddress, Error::MismatchedDomain => e
31
- log_warn(e.message)
32
- end
33
- end
34
- end
35
- end
@@ -1,58 +0,0 @@
1
- require 'mongo'
2
- require 'support/lite_constraints'
3
-
4
- RSpec.configure do |config|
5
- config.extend(LiteConstraints)
6
- end
7
-
8
- describe 'kerberos authentication' do
9
- require_mongo_kerberos
10
-
11
- let(:user) do
12
- "#{ENV['SASL_USER']}%40#{ENV['SASL_HOST'].upcase}"
13
- end
14
-
15
- let(:host) do
16
- "#{ENV['SASL_HOST']}"
17
- end
18
-
19
- let(:kerberos_db) do
20
- "#{ENV['KERBEROS_DB']}"
21
- end
22
-
23
- let(:auth_source) do
24
- "#{ENV['SASL_DB']}"
25
- end
26
-
27
- let(:uri) do
28
- uri = "mongodb://#{user}@#{host}/#{kerberos_db}?authMechanism=GSSAPI&authSource=#{auth_source}"
29
- end
30
-
31
- let(:client) do
32
- Mongo::Client.new(uri)
33
- end
34
-
35
- let(:doc) do
36
- client.database[:test].find.first
37
- end
38
-
39
- it 'correctly authenticates' do
40
- expect(doc['kerberos']).to eq(true)
41
- expect(doc['authenticated']).to eq('yeah')
42
- end
43
-
44
- context 'when canonicalize_host_name is true' do
45
- let(:host) do
46
- "#{ENV['IP_ADDR']}"
47
- end
48
-
49
- let(:uri) do
50
- uri = "mongodb://#{user}@#{host}/#{kerberos_db}?authMechanism=GSSAPI&authSource=#{auth_source}&authMechanismProperties=CANONICALIZE_HOST_NAME:true"
51
- end
52
-
53
- it 'correctly authenticates when using the IP' do
54
- expect(doc['kerberos']).to eq(true)
55
- expect(doc['authenticated']).to eq('yeah')
56
- end
57
- end
58
- end
@@ -1,214 +0,0 @@
1
- require 'lite_spec_helper'
2
-
3
- xdescribe Mongo::Cluster::SrvMonitor do
4
- describe '#scan!' do
5
- let(:hostname) do
6
- 'test1.test.build.10gen.cc.'
7
- end
8
-
9
- let(:hosts) do
10
- [
11
- 'localhost.test.build.10gen.cc.:27017',
12
- 'localhost.test.build.10gen.cc.:27018',
13
- ]
14
- end
15
-
16
- let(:records) do
17
- double('records').tap do |records|
18
- allow(records).to receive(:hostname).and_return(hostname)
19
- allow(records).to receive(:hosts).and_return(hosts)
20
- allow(records).to receive(:empty?).and_return(false)
21
- allow(records).to receive(:min_ttl).and_return(nil)
22
- end
23
- end
24
-
25
- let(:srv_uri) do
26
- Mongo::URI.get("mongodb+srv://localhost.a.b")
27
- end
28
-
29
- let(:cluster) do
30
- Mongo::Cluster.new(records.hosts, Mongo::Monitoring.new, { monitoring_io: false })
31
- end
32
-
33
- let(:monitoring) do
34
- described_class.new(cluster, srv_uri: srv_uri)
35
- end
36
-
37
- before do
38
- monitoring.scan!
39
- end
40
-
41
- context 'when a new DNS record is added' do
42
- let(:new_hosts) do
43
- hosts + ['test1.test.build.10gen.cc.:27019']
44
- end
45
-
46
- let(:new_records) do
47
- double('records').tap do |records|
48
- allow(records).to receive(:hostname).and_return(hostname)
49
- allow(records).to receive(:hosts).and_return(new_hosts)
50
- allow(records).to receive(:empty?).and_return(false)
51
- allow(records).to receive(:min_ttl).and_return(nil)
52
- end
53
- end
54
-
55
- let(:resolver) do
56
- double('resolver').tap do |resolver|
57
- allow(resolver).to receive(:get_records).and_return(new_records)
58
- end
59
- end
60
-
61
- it 'adds the new host to the cluster' do
62
- expect(cluster.addresses.map(&:to_s).sort).to eq(new_hosts.sort)
63
- end
64
- end
65
-
66
- context 'when a DNS record is removed' do
67
- let(:new_hosts) do
68
- hosts - ['test1.test.build.10gen.cc.:27018']
69
- end
70
-
71
- let(:new_records) do
72
- double('records').tap do |records|
73
- allow(records).to receive(:hostname).and_return(hostname)
74
- allow(records).to receive(:hosts).and_return(new_hosts)
75
- allow(records).to receive(:empty?).and_return(false)
76
- allow(records).to receive(:min_ttl).and_return(nil)
77
- end
78
- end
79
-
80
- let(:resolver) do
81
- double('resolver').tap do |resolver|
82
- allow(resolver).to receive(:get_records).and_return(new_records)
83
- end
84
- end
85
-
86
- it 'adds the new host to the cluster' do
87
- expect(cluster.addresses.map(&:to_s).sort).to eq(new_hosts.sort)
88
- end
89
- end
90
-
91
- context 'when a single DNS record is replaced' do
92
- let(:new_hosts) do
93
- hosts - ['test1.test.build.10gen.cc.:27018'] + ['test1.test.build.10gen.cc.:27019']
94
- end
95
-
96
- let(:new_records) do
97
- double('records').tap do |records|
98
- allow(records).to receive(:hostname).and_return(hostname)
99
- allow(records).to receive(:hosts).and_return(new_hosts)
100
- allow(records).to receive(:empty?).and_return(false)
101
- allow(records).to receive(:min_ttl).and_return(nil)
102
- end
103
- end
104
-
105
- let(:resolver) do
106
- double('resolver').tap do |resolver|
107
- allow(resolver).to receive(:get_records).and_return(new_records)
108
- end
109
- end
110
-
111
- it 'adds the new host to the cluster' do
112
- expect(cluster.addresses.map(&:to_s).sort).to eq(new_hosts.sort)
113
- end
114
- end
115
-
116
- context 'when all DNS records are replaced with a single record' do
117
- let(:new_hosts) do
118
- ['test1.test.build.10gen.cc.:27019']
119
- end
120
-
121
- let(:new_records) do
122
- double('records').tap do |records|
123
- allow(records).to receive(:hostname).and_return(hostname)
124
- allow(records).to receive(:hosts).and_return(new_hosts)
125
- allow(records).to receive(:empty?).and_return(false)
126
- allow(records).to receive(:min_ttl).and_return(nil)
127
- end
128
- end
129
-
130
- let(:resolver) do
131
- double('resolver').tap do |resolver|
132
- allow(resolver).to receive(:get_records).and_return(new_records)
133
- end
134
- end
135
-
136
- it 'adds the new host to the cluster' do
137
- expect(cluster.addresses.map(&:to_s).sort).to eq(new_hosts.sort)
138
- end
139
- end
140
-
141
- context 'when all DNS records are replaced with multiple records' do
142
- let(:new_hosts) do
143
- [
144
- 'test1.test.build.10gen.cc.:27019',
145
- 'test1.test.build.10gen.cc.:27020',
146
- ]
147
- end
148
-
149
- let(:new_records) do
150
- double('records').tap do |records|
151
- allow(records).to receive(:hostname).and_return(hostname)
152
- allow(records).to receive(:hosts).and_return(new_hosts)
153
- allow(records).to receive(:empty?).and_return(false)
154
- allow(records).to receive(:min_ttl).and_return(nil)
155
- end
156
- end
157
-
158
- let(:resolver) do
159
- double('resolver').tap do |resolver|
160
- allow(resolver).to receive(:get_records).and_return(new_records)
161
- end
162
- end
163
-
164
- it 'adds the new host to the cluster' do
165
- expect(cluster.addresses.map(&:to_s).sort).to eq(new_hosts.sort)
166
- end
167
- end
168
-
169
- context 'when the DNS lookup times out' do
170
- let(:resolver) do
171
- double('resolver').tap do |resolver|
172
- allow(resolver).to receive(:get_records).and_raise(Resolv::ResolvTimeout)
173
- end
174
- end
175
-
176
- it 'does not add or remove any hosts from the cluster' do
177
- expect(cluster.addresses.map(&:to_s).sort).to eq(hosts.sort)
178
- end
179
- end
180
-
181
- context 'when the DNS lookup is unable to resolve the hostname' do
182
- let(:resolver) do
183
- double('resolver').tap do |resolver|
184
- allow(resolver).to receive(:get_records).and_raise(Resolv::ResolvError)
185
- end
186
- end
187
-
188
- it 'does not add or remove any hosts from the cluster' do
189
- expect(cluster.addresses.map(&:to_s).sort).to eq(hosts.sort)
190
- end
191
- end
192
-
193
- context 'when no DNS records are returned' do
194
- let(:new_records) do
195
- double('records').tap do |records|
196
- allow(records).to receive(:hostname).and_return(hostname)
197
- allow(records).to receive(:hosts).and_return([])
198
- allow(records).to receive(:empty?).and_return(true)
199
- allow(records).to receive(:min_ttl).and_return(nil)
200
- end
201
- end
202
-
203
- let(:resolver) do
204
- double('resolver').tap do |resolver|
205
- allow(resolver).to receive(:get_records).and_return(new_records)
206
- end
207
- end
208
-
209
- it 'does not add or remove any hosts from the cluster' do
210
- expect(cluster.addresses.map(&:to_s).sort).to eq(hosts.sort)
211
- end
212
- end
213
- end
214
- end
@@ -1,245 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Mongo::Operation::ReadPreferenceSupported do
4
-
5
- let(:selector) do
6
- { name: 'test' }
7
- end
8
-
9
- let(:options) do
10
- {}
11
- end
12
-
13
- let(:cluster_double) do
14
- double('cluster')
15
- end
16
-
17
- let(:single?) do
18
- true
19
- end
20
-
21
- let(:mongos?) do
22
- false
23
- end
24
-
25
- let(:read_pref) do
26
- Mongo::ServerSelector.get
27
- end
28
-
29
- let(:operation) do
30
- Class.new do
31
- include Mongo::Operation::ReadPreferenceSupported
32
- end.new.tap do |rp|
33
- allow(rp).to receive(:read).and_return(read_pref)
34
- allow(rp).to receive(:selector).and_return(selector)
35
- allow(rp).to receive(:options).and_return(options)
36
- end
37
- end
38
-
39
- let(:server) do
40
- double('server').tap do |c|
41
- allow(c).to receive(:cluster).and_return(cluster_double)
42
- allow(cluster_double).to receive(:single?).and_return(single?)
43
- allow(c).to receive(:mongos?).and_return(mongos?)
44
- end
45
- end
46
-
47
- shared_context 'a selector updater' do
48
-
49
- let(:read_pref) do
50
- Mongo::ServerSelector.get(:mode => mode)
51
- end
52
-
53
- let(:expected) do
54
- { :$query => selector, :$readPreference => read_pref.to_mongos }
55
- end
56
-
57
- it 'returns a special selector' do
58
- expect(operation.send(:update_selector_for_read_pref, operation.send(:selector), server)).to eq(expected)
59
- end
60
-
61
- context 'when the selector already has $query in it' do
62
-
63
- let(:selector) do
64
- { :$query => { :name => 'test' },
65
- :$orderby => { :name => -1 } }
66
- end
67
-
68
- let(:expected) do
69
- selector.merge(:$readPreference => read_pref.to_mongos)
70
- end
71
-
72
- it 'returns an unaltered special selector' do
73
- expect(operation.send(:update_selector_for_read_pref, operation.send(:selector), server)).to eq(expected)
74
- end
75
- end
76
- end
77
-
78
- shared_context 'not a selector updater' do
79
-
80
- let(:read_pref) do
81
- Mongo::ServerSelector.get(:mode => mode)
82
- end
83
-
84
- it 'returns a selector' do
85
- expect(operation.send(:update_selector_for_read_pref, operation.send(:selector), server)).to eq(selector)
86
- end
87
- end
88
-
89
- context 'when the server is a mongos' do
90
-
91
- let(:mongos?) do
92
- true
93
- end
94
-
95
- context 'when the read preference mode is primary' do
96
-
97
- let(:mode) do
98
- :primary
99
- end
100
-
101
- it_behaves_like 'not a selector updater'
102
- end
103
-
104
- context 'when the read preference mode is primary_preferred' do
105
-
106
- let(:mode) do
107
- :primary_preferred
108
- end
109
-
110
- it_behaves_like 'a selector updater'
111
- end
112
-
113
- context 'when the read preference mode is secondary' do
114
-
115
- let(:mode) do
116
- :secondary
117
- end
118
-
119
- it_behaves_like 'a selector updater'
120
- end
121
-
122
- context 'when the read preference mode is secondary_preferred' do
123
-
124
- let(:mode) do
125
- :secondary_preferred
126
- end
127
-
128
- it_behaves_like 'not a selector updater'
129
- end
130
-
131
- context 'when the read preference mode is nearest' do
132
-
133
- let(:mode) do
134
- :nearest
135
- end
136
-
137
- it_behaves_like 'a selector updater'
138
- end
139
- end
140
-
141
- context 'when the server is not a mongos' do
142
-
143
- let(:mongos?) do
144
- false
145
- end
146
-
147
- let(:mode) do
148
- :secondary_preferred
149
- end
150
-
151
- it_behaves_like 'not a selector updater'
152
- end
153
-
154
- context 'when the topology is Single' do
155
-
156
- let(:single?) do
157
- true
158
- end
159
-
160
- context 'when the server is a mongos' do
161
-
162
- let(:mongos?) do
163
- true
164
- end
165
-
166
- let(:expected) do
167
- { }
168
- end
169
-
170
- it 'does not set the slave_ok flag' do
171
- expect(operation.send(:update_options_for_slave_ok, operation.send(:options), server)).to eq(expected)
172
- end
173
- end
174
-
175
- context 'when the server is not a mongos' do
176
-
177
- let(:mongos?) do
178
- false
179
- end
180
-
181
- let(:expected) do
182
- { :flags => [ :slave_ok ] }
183
- end
184
-
185
- it 'sets the slave_ok flag' do
186
- expect(operation.send(:update_options_for_slave_ok, operation.send(:options), server)).to eq(expected)
187
- end
188
- end
189
- end
190
-
191
- context 'when the topology is not Single' do
192
-
193
- let(:single?) do
194
- false
195
- end
196
-
197
- context 'when there is no read preference set' do
198
-
199
- let(:read_pref) do
200
- Mongo::ServerSelector.get
201
- end
202
-
203
- let(:expected) do
204
- { }
205
- end
206
-
207
- it 'does not set the slave_ok flag' do
208
- expect(operation.send(:update_options_for_slave_ok, operation.send(:options), server)).to eq(expected)
209
- end
210
- end
211
-
212
- context 'when there is a read preference' do
213
-
214
- context 'when the read preference requires the slave_ok flag' do
215
-
216
- let(:read_pref) do
217
- Mongo::ServerSelector.get(:mode => :secondary)
218
- end
219
-
220
- let(:expected) do
221
- { :flags => [ :slave_ok ] }
222
- end
223
-
224
- it 'sets the slave_ok flag' do
225
- expect(operation.send(:update_options_for_slave_ok, operation.send(:options), server)).to eq(expected)
226
- end
227
- end
228
-
229
- context 'when the read preference does not require the slave_ok flag' do
230
-
231
- let(:read_pref) do
232
- Mongo::ServerSelector.get(:mode => :primary)
233
- end
234
-
235
- let(:expected) do
236
- { }
237
- end
238
-
239
- it 'does not set the slave_ok flag' do
240
- expect(operation.send(:update_options_for_slave_ok, operation.send(:options), server)).to eq(expected)
241
- end
242
- end
243
- end
244
- end
245
- end