mongo 2.12.4 → 2.13.0.beta1

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 (817) 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 +8 -36
  5. data/LICENSE +1 -1
  6. data/README.md +54 -54
  7. data/Rakefile +1 -1
  8. data/lib/mongo.rb +4 -1
  9. data/lib/mongo/active_support.rb +1 -1
  10. data/lib/mongo/address.rb +40 -13
  11. data/lib/mongo/address/ipv4.rb +32 -5
  12. data/lib/mongo/address/ipv6.rb +32 -5
  13. data/lib/mongo/address/unix.rb +3 -3
  14. data/lib/mongo/address/validator.rb +1 -1
  15. data/lib/mongo/auth.rb +36 -13
  16. data/lib/mongo/auth/aws.rb +37 -0
  17. data/lib/mongo/auth/aws/conversation.rb +128 -0
  18. data/lib/mongo/auth/aws/credentials_retriever.rb +219 -0
  19. data/lib/mongo/auth/aws/request.rb +257 -0
  20. data/lib/mongo/auth/base.rb +129 -0
  21. data/lib/mongo/auth/conversation_base.rb +52 -0
  22. data/lib/mongo/auth/cr.rb +9 -36
  23. data/lib/mongo/auth/cr/conversation.rb +24 -69
  24. data/lib/mongo/auth/credential_cache.rb +1 -1
  25. data/lib/mongo/auth/gssapi.rb +38 -0
  26. data/lib/mongo/auth/gssapi/conversation.rb +108 -0
  27. data/lib/mongo/auth/ldap.rb +9 -34
  28. data/lib/mongo/auth/ldap/conversation.rb +3 -43
  29. data/lib/mongo/auth/roles.rb +1 -1
  30. data/lib/mongo/auth/sasl_conversation_base.rb +111 -0
  31. data/lib/mongo/auth/scram.rb +39 -51
  32. data/lib/mongo/auth/scram/conversation.rb +12 -506
  33. data/lib/mongo/auth/scram256.rb +31 -0
  34. data/lib/mongo/auth/scram256/conversation.rb +63 -0
  35. data/lib/mongo/auth/scram_conversation_base.rb +402 -0
  36. data/lib/mongo/auth/stringprep.rb +5 -4
  37. data/lib/mongo/auth/stringprep/profiles/sasl.rb +2 -1
  38. data/lib/mongo/auth/stringprep/tables.rb +2 -1
  39. data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +1 -0
  40. data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +1 -0
  41. data/lib/mongo/auth/user.rb +2 -2
  42. data/lib/mongo/auth/user/view.rb +1 -1
  43. data/lib/mongo/auth/x509.rb +14 -32
  44. data/lib/mongo/auth/x509/conversation.rb +15 -42
  45. data/lib/mongo/background_thread.rb +11 -2
  46. data/lib/mongo/bson.rb +1 -1
  47. data/lib/mongo/bulk_write.rb +61 -26
  48. data/lib/mongo/bulk_write/combineable.rb +20 -8
  49. data/lib/mongo/bulk_write/ordered_combiner.rb +1 -1
  50. data/lib/mongo/bulk_write/result.rb +1 -1
  51. data/lib/mongo/bulk_write/result_combiner.rb +1 -1
  52. data/lib/mongo/bulk_write/transformable.rb +9 -10
  53. data/lib/mongo/bulk_write/unordered_combiner.rb +1 -1
  54. data/lib/mongo/bulk_write/validatable.rb +5 -1
  55. data/lib/mongo/client.rb +38 -23
  56. data/lib/mongo/client_encryption.rb +1 -1
  57. data/lib/mongo/cluster.rb +126 -54
  58. data/lib/mongo/cluster/periodic_executor.rb +1 -1
  59. data/lib/mongo/cluster/reapers/cursor_reaper.rb +1 -1
  60. data/lib/mongo/cluster/reapers/socket_reaper.rb +1 -1
  61. data/lib/mongo/cluster/sdam_flow.rb +23 -7
  62. data/lib/mongo/cluster/topology.rb +19 -2
  63. data/lib/mongo/cluster/topology/base.rb +1 -1
  64. data/lib/mongo/cluster/topology/no_replica_set_options.rb +1 -1
  65. data/lib/mongo/cluster/topology/replica_set_no_primary.rb +1 -1
  66. data/lib/mongo/cluster/topology/replica_set_with_primary.rb +1 -1
  67. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  68. data/lib/mongo/cluster/topology/single.rb +1 -1
  69. data/lib/mongo/cluster/topology/unknown.rb +1 -1
  70. data/lib/mongo/cluster_time.rb +1 -1
  71. data/lib/mongo/collection.rb +24 -8
  72. data/lib/mongo/collection/view.rb +6 -2
  73. data/lib/mongo/collection/view/aggregation.rb +6 -3
  74. data/lib/mongo/collection/view/builder.rb +1 -1
  75. data/lib/mongo/collection/view/builder/aggregation.rb +1 -1
  76. data/lib/mongo/collection/view/builder/find_command.rb +9 -1
  77. data/lib/mongo/collection/view/builder/flags.rb +1 -1
  78. data/lib/mongo/collection/view/builder/map_reduce.rb +1 -1
  79. data/lib/mongo/collection/view/builder/modifiers.rb +1 -1
  80. data/lib/mongo/collection/view/builder/op_query.rb +1 -1
  81. data/lib/mongo/collection/view/change_stream.rb +3 -6
  82. data/lib/mongo/collection/view/change_stream/retryable.rb +1 -1
  83. data/lib/mongo/collection/view/explainable.rb +1 -1
  84. data/lib/mongo/collection/view/immutable.rb +1 -1
  85. data/lib/mongo/collection/view/iterable.rb +8 -2
  86. data/lib/mongo/collection/view/map_reduce.rb +7 -4
  87. data/lib/mongo/collection/view/readable.rb +11 -5
  88. data/lib/mongo/collection/view/writable.rb +52 -8
  89. data/lib/mongo/crypt.rb +1 -1
  90. data/lib/mongo/crypt/auto_decryption_context.rb +1 -1
  91. data/lib/mongo/crypt/auto_encrypter.rb +1 -1
  92. data/lib/mongo/crypt/auto_encryption_context.rb +1 -1
  93. data/lib/mongo/crypt/binary.rb +1 -1
  94. data/lib/mongo/crypt/binding.rb +1 -1
  95. data/lib/mongo/crypt/context.rb +1 -1
  96. data/lib/mongo/crypt/data_key_context.rb +1 -1
  97. data/lib/mongo/crypt/encryption_io.rb +41 -24
  98. data/lib/mongo/crypt/explicit_decryption_context.rb +1 -1
  99. data/lib/mongo/crypt/explicit_encrypter.rb +1 -1
  100. data/lib/mongo/crypt/explicit_encryption_context.rb +1 -1
  101. data/lib/mongo/crypt/handle.rb +1 -1
  102. data/lib/mongo/crypt/hooks.rb +1 -1
  103. data/lib/mongo/crypt/kms_context.rb +1 -1
  104. data/lib/mongo/crypt/status.rb +1 -1
  105. data/lib/mongo/cursor.rb +3 -3
  106. data/lib/mongo/cursor/builder.rb +1 -1
  107. data/lib/mongo/cursor/builder/get_more_command.rb +1 -1
  108. data/lib/mongo/cursor/builder/kill_cursors_command.rb +1 -1
  109. data/lib/mongo/cursor/builder/op_get_more.rb +1 -1
  110. data/lib/mongo/cursor/builder/op_kill_cursors.rb +1 -1
  111. data/lib/mongo/database.rb +4 -1
  112. data/lib/mongo/database/view.rb +2 -2
  113. data/lib/mongo/dbref.rb +1 -1
  114. data/lib/mongo/error.rb +25 -2
  115. data/lib/mongo/error/auth_error.rb +1 -1
  116. data/lib/mongo/error/bulk_write_error.rb +1 -1
  117. data/lib/mongo/error/change_stream_resumable.rb +1 -1
  118. data/lib/mongo/error/closed_stream.rb +1 -1
  119. data/lib/mongo/error/connection_check_out_timeout.rb +1 -1
  120. data/lib/mongo/error/connection_perished.rb +23 -0
  121. data/lib/mongo/error/credential_check_error.rb +26 -0
  122. data/lib/mongo/error/extra_file_chunk.rb +1 -1
  123. data/lib/mongo/error/file_not_found.rb +1 -1
  124. data/lib/mongo/error/handshake_error.rb +1 -1
  125. data/lib/mongo/error/insufficient_iteration_count.rb +1 -1
  126. data/lib/mongo/error/invalid_address.rb +1 -1
  127. data/lib/mongo/error/invalid_application_name.rb +1 -1
  128. data/lib/mongo/error/invalid_bulk_operation.rb +1 -1
  129. data/lib/mongo/error/invalid_bulk_operation_type.rb +1 -1
  130. data/lib/mongo/error/invalid_collection_name.rb +1 -1
  131. data/lib/mongo/error/invalid_cursor_operation.rb +1 -1
  132. data/lib/mongo/error/invalid_database_name.rb +1 -1
  133. data/lib/mongo/error/invalid_document.rb +1 -1
  134. data/lib/mongo/error/invalid_file.rb +1 -1
  135. data/lib/mongo/error/invalid_file_revision.rb +1 -1
  136. data/lib/mongo/error/invalid_min_pool_size.rb +1 -1
  137. data/lib/mongo/error/invalid_nonce.rb +2 -2
  138. data/lib/mongo/error/invalid_read_option.rb +1 -1
  139. data/lib/mongo/error/invalid_replacement_document.rb +1 -1
  140. data/lib/mongo/error/invalid_server_auth_response.rb +23 -0
  141. data/lib/mongo/error/invalid_server_preference.rb +6 -1
  142. data/lib/mongo/error/invalid_session.rb +1 -1
  143. data/lib/mongo/error/invalid_signature.rb +1 -1
  144. data/lib/mongo/error/invalid_transaction_operation.rb +1 -1
  145. data/lib/mongo/error/invalid_txt_record.rb +1 -1
  146. data/lib/mongo/error/invalid_update_document.rb +1 -1
  147. data/lib/mongo/error/invalid_uri.rb +1 -1
  148. data/lib/mongo/error/invalid_write_concern.rb +1 -1
  149. data/lib/mongo/error/lint_error.rb +1 -1
  150. data/lib/mongo/error/max_bson_size.rb +1 -1
  151. data/lib/mongo/error/max_message_size.rb +1 -1
  152. data/lib/mongo/error/mismatched_domain.rb +1 -1
  153. data/lib/mongo/error/missing_file_chunk.rb +1 -1
  154. data/lib/mongo/error/missing_password.rb +1 -1
  155. data/lib/mongo/error/missing_resume_token.rb +1 -1
  156. data/lib/mongo/error/missing_scram_server_signature.rb +27 -0
  157. data/lib/mongo/error/multi_index_drop.rb +1 -1
  158. data/lib/mongo/error/need_primary_server.rb +1 -1
  159. data/lib/mongo/error/no_server_available.rb +1 -1
  160. data/lib/mongo/error/no_srv_records.rb +1 -1
  161. data/lib/mongo/error/notable.rb +18 -3
  162. data/lib/mongo/error/operation_failure.rb +62 -49
  163. data/lib/mongo/error/parser.rb +16 -5
  164. data/lib/mongo/error/pool_closed_error.rb +1 -1
  165. data/lib/mongo/error/raise_original_error.rb +29 -0
  166. data/lib/mongo/error/session_ended.rb +1 -1
  167. data/lib/mongo/error/socket_error.rb +1 -1
  168. data/lib/mongo/error/socket_timeout_error.rb +1 -1
  169. data/lib/mongo/error/unchangeable_collection_option.rb +1 -1
  170. data/lib/mongo/error/unexpected_chunk_length.rb +1 -1
  171. data/lib/mongo/error/unexpected_response.rb +1 -1
  172. data/lib/mongo/error/unknown_payload_type.rb +1 -1
  173. data/lib/mongo/error/unsupported_array_filters.rb +7 -2
  174. data/lib/mongo/error/unsupported_collation.rb +7 -2
  175. data/lib/mongo/error/unsupported_features.rb +1 -1
  176. data/lib/mongo/error/unsupported_message_type.rb +1 -1
  177. data/lib/mongo/error/unsupported_option.rb +99 -0
  178. data/lib/mongo/error/write_retryable.rb +1 -1
  179. data/lib/mongo/event.rb +1 -1
  180. data/lib/mongo/event/base.rb +1 -1
  181. data/lib/mongo/event/listeners.rb +1 -1
  182. data/lib/mongo/event/publisher.rb +1 -1
  183. data/lib/mongo/event/subscriber.rb +1 -1
  184. data/lib/mongo/grid.rb +1 -1
  185. data/lib/mongo/grid/file.rb +1 -6
  186. data/lib/mongo/grid/file/chunk.rb +1 -3
  187. data/lib/mongo/grid/file/info.rb +1 -1
  188. data/lib/mongo/grid/fs_bucket.rb +20 -17
  189. data/lib/mongo/grid/stream.rb +1 -1
  190. data/lib/mongo/grid/stream/read.rb +1 -1
  191. data/lib/mongo/grid/stream/write.rb +4 -10
  192. data/lib/mongo/id.rb +1 -1
  193. data/lib/mongo/index.rb +2 -1
  194. data/lib/mongo/index/view.rb +58 -11
  195. data/lib/mongo/lint.rb +10 -0
  196. data/lib/mongo/loggable.rb +1 -1
  197. data/lib/mongo/logger.rb +1 -1
  198. data/lib/mongo/monitoring.rb +1 -1
  199. data/lib/mongo/monitoring/cmap_log_subscriber.rb +1 -1
  200. data/lib/mongo/monitoring/command_log_subscriber.rb +12 -5
  201. data/lib/mongo/monitoring/event.rb +1 -1
  202. data/lib/mongo/monitoring/event/cmap.rb +1 -1
  203. data/lib/mongo/monitoring/event/cmap/base.rb +1 -1
  204. data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +1 -1
  205. data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +1 -1
  206. data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +1 -1
  207. data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +1 -1
  208. data/lib/mongo/monitoring/event/cmap/connection_closed.rb +1 -1
  209. data/lib/mongo/monitoring/event/cmap/connection_created.rb +1 -1
  210. data/lib/mongo/monitoring/event/cmap/connection_ready.rb +1 -1
  211. data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +1 -1
  212. data/lib/mongo/monitoring/event/cmap/pool_closed.rb +1 -1
  213. data/lib/mongo/monitoring/event/cmap/pool_created.rb +1 -1
  214. data/lib/mongo/monitoring/event/command_failed.rb +1 -1
  215. data/lib/mongo/monitoring/event/command_started.rb +9 -3
  216. data/lib/mongo/monitoring/event/command_succeeded.rb +1 -1
  217. data/lib/mongo/monitoring/event/secure.rb +8 -2
  218. data/lib/mongo/monitoring/event/server_closed.rb +1 -1
  219. data/lib/mongo/monitoring/event/server_description_changed.rb +1 -1
  220. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +1 -1
  221. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +1 -1
  222. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +1 -1
  223. data/lib/mongo/monitoring/event/server_opening.rb +1 -1
  224. data/lib/mongo/monitoring/event/topology_changed.rb +1 -1
  225. data/lib/mongo/monitoring/event/topology_closed.rb +1 -1
  226. data/lib/mongo/monitoring/event/topology_opening.rb +1 -1
  227. data/lib/mongo/monitoring/publishable.rb +5 -8
  228. data/lib/mongo/monitoring/sdam_log_subscriber.rb +1 -1
  229. data/lib/mongo/monitoring/server_closed_log_subscriber.rb +1 -1
  230. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +1 -1
  231. data/lib/mongo/monitoring/server_opening_log_subscriber.rb +1 -1
  232. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +1 -1
  233. data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +1 -1
  234. data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +1 -1
  235. data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +1 -1
  236. data/lib/mongo/operation.rb +1 -0
  237. data/lib/mongo/operation/aggregate.rb +1 -1
  238. data/lib/mongo/operation/aggregate/command.rb +5 -5
  239. data/lib/mongo/operation/aggregate/op_msg.rb +1 -1
  240. data/lib/mongo/operation/aggregate/result.rb +1 -1
  241. data/lib/mongo/operation/collections_info.rb +3 -36
  242. data/lib/mongo/operation/collections_info/command.rb +40 -0
  243. data/lib/mongo/operation/collections_info/result.rb +1 -1
  244. data/lib/mongo/operation/command.rb +1 -1
  245. data/lib/mongo/operation/command/command.rb +3 -3
  246. data/lib/mongo/operation/command/op_msg.rb +1 -1
  247. data/lib/mongo/operation/count.rb +1 -1
  248. data/lib/mongo/operation/count/command.rb +3 -3
  249. data/lib/mongo/operation/count/op_msg.rb +1 -1
  250. data/lib/mongo/operation/create.rb +1 -1
  251. data/lib/mongo/operation/create/command.rb +3 -3
  252. data/lib/mongo/operation/create/op_msg.rb +1 -1
  253. data/lib/mongo/operation/create_index.rb +1 -1
  254. data/lib/mongo/operation/create_index/command.rb +4 -4
  255. data/lib/mongo/operation/create_index/op_msg.rb +6 -3
  256. data/lib/mongo/operation/create_user.rb +1 -1
  257. data/lib/mongo/operation/create_user/command.rb +4 -4
  258. data/lib/mongo/operation/create_user/op_msg.rb +2 -2
  259. data/lib/mongo/operation/delete.rb +1 -1
  260. data/lib/mongo/operation/delete/bulk_result.rb +1 -1
  261. data/lib/mongo/operation/delete/command.rb +4 -4
  262. data/lib/mongo/operation/delete/legacy.rb +2 -2
  263. data/lib/mongo/operation/delete/op_msg.rb +4 -4
  264. data/lib/mongo/operation/delete/result.rb +2 -2
  265. data/lib/mongo/operation/distinct.rb +1 -1
  266. data/lib/mongo/operation/distinct/command.rb +3 -3
  267. data/lib/mongo/operation/distinct/op_msg.rb +1 -1
  268. data/lib/mongo/operation/drop.rb +1 -1
  269. data/lib/mongo/operation/drop/command.rb +3 -3
  270. data/lib/mongo/operation/drop/op_msg.rb +1 -1
  271. data/lib/mongo/operation/drop_database.rb +1 -1
  272. data/lib/mongo/operation/drop_database/command.rb +3 -3
  273. data/lib/mongo/operation/drop_database/op_msg.rb +1 -1
  274. data/lib/mongo/operation/drop_index.rb +1 -1
  275. data/lib/mongo/operation/drop_index/command.rb +4 -4
  276. data/lib/mongo/operation/drop_index/op_msg.rb +2 -2
  277. data/lib/mongo/operation/explain.rb +1 -1
  278. data/lib/mongo/operation/explain/command.rb +3 -3
  279. data/lib/mongo/operation/explain/legacy.rb +3 -3
  280. data/lib/mongo/operation/explain/op_msg.rb +1 -1
  281. data/lib/mongo/operation/explain/result.rb +1 -1
  282. data/lib/mongo/operation/find.rb +1 -1
  283. data/lib/mongo/operation/find/command.rb +3 -3
  284. data/lib/mongo/operation/find/legacy.rb +3 -3
  285. data/lib/mongo/operation/find/legacy/result.rb +1 -1
  286. data/lib/mongo/operation/find/op_msg.rb +2 -12
  287. data/lib/mongo/operation/find/result.rb +1 -1
  288. data/lib/mongo/operation/get_more.rb +1 -1
  289. data/lib/mongo/operation/get_more/command.rb +3 -3
  290. data/lib/mongo/operation/get_more/legacy.rb +2 -2
  291. data/lib/mongo/operation/get_more/op_msg.rb +2 -12
  292. data/lib/mongo/operation/get_more/result.rb +1 -1
  293. data/lib/mongo/operation/indexes.rb +1 -1
  294. data/lib/mongo/operation/indexes/command.rb +3 -3
  295. data/lib/mongo/operation/indexes/legacy.rb +4 -4
  296. data/lib/mongo/operation/indexes/op_msg.rb +1 -1
  297. data/lib/mongo/operation/indexes/result.rb +1 -1
  298. data/lib/mongo/operation/insert.rb +3 -2
  299. data/lib/mongo/operation/insert/bulk_result.rb +6 -2
  300. data/lib/mongo/operation/insert/command.rb +7 -7
  301. data/lib/mongo/operation/insert/legacy.rb +9 -5
  302. data/lib/mongo/operation/insert/op_msg.rb +6 -6
  303. data/lib/mongo/operation/insert/result.rb +7 -4
  304. data/lib/mongo/operation/kill_cursors.rb +1 -1
  305. data/lib/mongo/operation/kill_cursors/command.rb +3 -3
  306. data/lib/mongo/operation/kill_cursors/legacy.rb +2 -2
  307. data/lib/mongo/operation/kill_cursors/op_msg.rb +1 -1
  308. data/lib/mongo/operation/list_collections.rb +1 -1
  309. data/lib/mongo/operation/list_collections/command.rb +4 -4
  310. data/lib/mongo/operation/list_collections/op_msg.rb +2 -2
  311. data/lib/mongo/operation/list_collections/result.rb +1 -1
  312. data/lib/mongo/operation/map_reduce.rb +1 -1
  313. data/lib/mongo/operation/map_reduce/command.rb +3 -3
  314. data/lib/mongo/operation/map_reduce/op_msg.rb +1 -1
  315. data/lib/mongo/operation/map_reduce/result.rb +1 -1
  316. data/lib/mongo/operation/op_msg_base.rb +3 -3
  317. data/lib/mongo/operation/parallel_scan.rb +1 -1
  318. data/lib/mongo/operation/parallel_scan/command.rb +5 -5
  319. data/lib/mongo/operation/parallel_scan/op_msg.rb +2 -2
  320. data/lib/mongo/operation/parallel_scan/result.rb +1 -1
  321. data/lib/mongo/operation/remove_user.rb +1 -1
  322. data/lib/mongo/operation/remove_user/command.rb +4 -4
  323. data/lib/mongo/operation/remove_user/op_msg.rb +2 -2
  324. data/lib/mongo/operation/result.rb +28 -4
  325. data/lib/mongo/operation/shared/bypass_document_validation.rb +10 -4
  326. data/lib/mongo/operation/shared/causal_consistency_supported.rb +3 -3
  327. data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +56 -0
  328. data/lib/mongo/operation/shared/executable.rb +46 -28
  329. data/lib/mongo/operation/shared/executable_no_validate.rb +3 -3
  330. data/lib/mongo/operation/shared/executable_transaction_label.rb +1 -1
  331. data/lib/mongo/operation/shared/idable.rb +1 -1
  332. data/lib/mongo/operation/shared/limited.rb +10 -2
  333. data/lib/mongo/operation/shared/object_id_generator.rb +1 -1
  334. data/lib/mongo/operation/shared/op_msg_or_command.rb +7 -5
  335. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +8 -6
  336. data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +8 -6
  337. data/lib/mongo/operation/shared/polymorphic_lookup.rb +1 -1
  338. data/lib/mongo/operation/shared/polymorphic_result.rb +1 -1
  339. data/lib/mongo/operation/shared/read_preference_supported.rb +19 -16
  340. data/lib/mongo/operation/shared/response_handling.rb +83 -8
  341. data/lib/mongo/operation/shared/result/aggregatable.rb +1 -1
  342. data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +1 -1
  343. data/lib/mongo/operation/shared/sessions_supported.rb +50 -27
  344. data/lib/mongo/operation/shared/specifiable.rb +32 -20
  345. data/lib/mongo/operation/shared/write.rb +25 -19
  346. data/lib/mongo/operation/shared/write_concern_supported.rb +6 -6
  347. data/lib/mongo/operation/update.rb +1 -1
  348. data/lib/mongo/operation/update/bulk_result.rb +1 -1
  349. data/lib/mongo/operation/update/command.rb +4 -4
  350. data/lib/mongo/operation/update/legacy.rb +2 -2
  351. data/lib/mongo/operation/update/legacy/result.rb +1 -1
  352. data/lib/mongo/operation/update/op_msg.rb +4 -4
  353. data/lib/mongo/operation/update/result.rb +2 -2
  354. data/lib/mongo/operation/update_user.rb +1 -1
  355. data/lib/mongo/operation/update_user/command.rb +4 -4
  356. data/lib/mongo/operation/update_user/op_msg.rb +2 -2
  357. data/lib/mongo/operation/users_info.rb +1 -1
  358. data/lib/mongo/operation/users_info/command.rb +4 -4
  359. data/lib/mongo/operation/users_info/op_msg.rb +2 -2
  360. data/lib/mongo/operation/users_info/result.rb +1 -1
  361. data/lib/mongo/options.rb +1 -1
  362. data/lib/mongo/options/mapper.rb +1 -1
  363. data/lib/mongo/options/redacted.rb +1 -1
  364. data/lib/mongo/protocol/bit_vector.rb +1 -1
  365. data/lib/mongo/protocol/compressed.rb +1 -1
  366. data/lib/mongo/protocol/delete.rb +1 -1
  367. data/lib/mongo/protocol/get_more.rb +1 -1
  368. data/lib/mongo/protocol/insert.rb +1 -1
  369. data/lib/mongo/protocol/kill_cursors.rb +1 -1
  370. data/lib/mongo/protocol/message.rb +5 -14
  371. data/lib/mongo/protocol/msg.rb +5 -24
  372. data/lib/mongo/protocol/query.rb +1 -37
  373. data/lib/mongo/protocol/registry.rb +1 -1
  374. data/lib/mongo/protocol/reply.rb +1 -1
  375. data/lib/mongo/protocol/serializers.rb +3 -6
  376. data/lib/mongo/protocol/update.rb +1 -1
  377. data/lib/mongo/retryable.rb +23 -10
  378. data/lib/mongo/semaphore.rb +1 -1
  379. data/lib/mongo/server.rb +32 -7
  380. data/lib/mongo/server/app_metadata.rb +17 -4
  381. data/lib/mongo/server/connection.rb +35 -131
  382. data/lib/mongo/server/connection_base.rb +31 -42
  383. data/lib/mongo/server/connection_common.rb +75 -1
  384. data/lib/mongo/server/connection_pool.rb +20 -1
  385. data/lib/mongo/server/connection_pool/populator.rb +1 -1
  386. data/lib/mongo/server/context.rb +1 -1
  387. data/lib/mongo/server/description.rb +44 -2
  388. data/lib/mongo/server/description/features.rb +12 -3
  389. data/lib/mongo/server/monitor.rb +116 -72
  390. data/lib/mongo/server/monitor/app_metadata.rb +1 -1
  391. data/lib/mongo/server/monitor/connection.rb +62 -80
  392. data/lib/mongo/server/pending_connection.rb +205 -3
  393. data/lib/mongo/server/round_trip_time_averager.rb +12 -3
  394. data/lib/mongo/server_selector.rb +2 -1
  395. data/lib/mongo/server_selector/base.rb +40 -0
  396. data/lib/mongo/server_selector/nearest.rb +25 -15
  397. data/lib/mongo/server_selector/primary.rb +23 -22
  398. data/lib/mongo/server_selector/primary_preferred.rb +25 -15
  399. data/lib/mongo/server_selector/secondary.rb +25 -15
  400. data/lib/mongo/server_selector/secondary_preferred.rb +28 -27
  401. data/lib/mongo/server_selector/selectable.rb +30 -15
  402. data/lib/mongo/session.rb +12 -1
  403. data/lib/mongo/session/server_session.rb +1 -1
  404. data/lib/mongo/session/session_pool.rb +1 -1
  405. data/lib/mongo/socket.rb +103 -35
  406. data/lib/mongo/socket/ssl.rb +97 -34
  407. data/lib/mongo/socket/tcp.rb +39 -31
  408. data/lib/mongo/socket/unix.rb +14 -6
  409. data/lib/mongo/srv.rb +1 -1
  410. data/lib/mongo/srv/monitor.rb +1 -1
  411. data/lib/mongo/srv/resolver.rb +1 -1
  412. data/lib/mongo/srv/result.rb +1 -1
  413. data/lib/mongo/timeout.rb +9 -9
  414. data/lib/mongo/topology_version.rb +80 -0
  415. data/lib/mongo/uri.rb +61 -47
  416. data/lib/mongo/uri/srv_protocol.rb +9 -1
  417. data/lib/mongo/version.rb +2 -2
  418. data/lib/mongo/write_concern.rb +1 -1
  419. data/lib/mongo/write_concern/acknowledged.rb +1 -1
  420. data/lib/mongo/write_concern/base.rb +1 -1
  421. data/lib/mongo/write_concern/unacknowledged.rb +1 -1
  422. data/mongo.gemspec +1 -1
  423. data/spec/NOTES.aws-auth.md +291 -0
  424. data/spec/README.aws-auth.md +318 -0
  425. data/spec/README.md +64 -17
  426. data/spec/integration/auth_spec.rb +29 -9
  427. data/spec/integration/aws_auth_request_spec.rb +74 -0
  428. data/spec/integration/aws_credentials_retriever_spec.rb +103 -0
  429. data/spec/integration/change_stream_spec.rb +123 -51
  430. data/spec/integration/client_authentication_options_spec.rb +0 -37
  431. data/spec/integration/client_construction_aws_auth_spec.rb +191 -0
  432. data/spec/integration/client_construction_spec.rb +1 -1
  433. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +5 -9
  434. data/spec/integration/collection_indexes_prose_spec.rb +55 -0
  435. data/spec/integration/command_monitoring_spec.rb +30 -6
  436. data/spec/integration/command_spec.rb +11 -9
  437. data/spec/integration/connect_single_rs_name_spec.rb +5 -3
  438. data/spec/integration/connection_spec.rb +1 -0
  439. data/spec/integration/crud_spec.rb +28 -0
  440. data/spec/integration/cursor_reaping_spec.rb +14 -10
  441. data/spec/integration/fork_reconnect_spec.rb +143 -0
  442. data/spec/integration/get_more_spec.rb +10 -3
  443. data/spec/integration/heartbeat_events_spec.rb +1 -1
  444. data/spec/integration/read_preference_spec.rb +41 -11
  445. data/spec/integration/reconnect_spec.rb +2 -3
  446. data/spec/integration/retryable_errors_spec.rb +33 -14
  447. data/spec/integration/{retryable_writes_spec.rb → retryable_writes/retryable_writes_36_and_older_spec.rb} +55 -51
  448. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +401 -0
  449. data/spec/integration/retryable_writes/shared/adds_diagnostics.rb +15 -0
  450. data/spec/integration/retryable_writes/shared/does_not_support_retries.rb +24 -0
  451. data/spec/integration/retryable_writes/shared/only_supports_legacy_retries.rb +25 -0
  452. data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +215 -0
  453. data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +232 -0
  454. data/spec/integration/retryable_writes/shared/performs_no_retries.rb +110 -0
  455. data/spec/integration/retryable_writes/shared/supports_legacy_retries.rb +19 -0
  456. data/spec/integration/retryable_writes/shared/supports_modern_retries.rb +25 -0
  457. data/spec/integration/retryable_writes/shared/supports_retries.rb +16 -0
  458. data/spec/integration/sdam_error_handling_spec.rb +116 -18
  459. data/spec/integration/sdam_events_spec.rb +1 -0
  460. data/spec/integration/server_spec.rb +42 -26
  461. data/spec/integration/size_limit_spec.rb +2 -20
  462. data/spec/integration/step_down_spec.rb +15 -15
  463. data/spec/integration/transactions_api_examples_spec.rb +59 -0
  464. data/spec/integration/transactions_examples_spec.rb +5 -2
  465. data/spec/integration/x509_auth_spec.rb +109 -0
  466. data/spec/kerberos/kerberos_spec.rb +10 -6
  467. data/spec/lite_spec_helper.rb +21 -19
  468. data/spec/mongo/address/ipv4_spec.rb +1 -1
  469. data/spec/mongo/address_spec.rb +2 -2
  470. data/spec/mongo/auth/cr_spec.rb +7 -7
  471. data/spec/mongo/auth/gssapi/conversation_spec.rb +121 -0
  472. data/spec/mongo/auth/invalid_mechanism_spec.rb +1 -1
  473. data/spec/mongo/auth/ldap/conversation_spec.rb +1 -1
  474. data/spec/mongo/auth/ldap_spec.rb +3 -3
  475. data/spec/mongo/auth/scram/conversation_spec.rb +119 -334
  476. data/spec/mongo/auth/scram256/conversation_spec.rb +171 -0
  477. data/spec/mongo/auth/{scram/negotiation_spec.rb → scram_negotiation_spec.rb} +13 -8
  478. data/spec/mongo/auth/scram_spec.rb +28 -68
  479. data/spec/mongo/auth/user_spec.rb +1 -1
  480. data/spec/mongo/auth/x509/conversation_spec.rb +1 -1
  481. data/spec/mongo/auth/x509_spec.rb +8 -8
  482. data/spec/mongo/auth_spec.rb +4 -4
  483. data/spec/mongo/bulk_write_spec.rb +206 -2
  484. data/spec/mongo/client_construction_spec.rb +290 -86
  485. data/spec/mongo/client_spec.rb +21 -2
  486. data/spec/mongo/cluster_spec.rb +4 -2
  487. data/spec/mongo/collection/view/aggregation_spec.rb +6 -2
  488. data/spec/mongo/collection/view/builder/find_command_spec.rb +17 -6
  489. data/spec/mongo/collection/view/change_stream_resume_spec.rb +392 -0
  490. data/spec/mongo/collection/view/change_stream_spec.rb +0 -318
  491. data/spec/mongo/collection/view/iterable_spec.rb +38 -0
  492. data/spec/mongo/collection/view/map_reduce_spec.rb +6 -2
  493. data/spec/mongo/collection/view/readable_spec.rb +15 -1
  494. data/spec/mongo/collection/view/writable_spec.rb +208 -1
  495. data/spec/mongo/collection_spec.rb +31 -67
  496. data/spec/mongo/cursor/builder/get_more_command_spec.rb +6 -1
  497. data/spec/mongo/cursor/builder/op_get_more_spec.rb +6 -1
  498. data/spec/mongo/cursor/builder/op_kill_cursors_spec.rb +6 -1
  499. data/spec/mongo/cursor_spec.rb +9 -1
  500. data/spec/mongo/database_spec.rb +6 -2
  501. data/spec/mongo/error/operation_failure_heavy_spec.rb +58 -0
  502. data/spec/mongo/error/operation_failure_spec.rb +130 -72
  503. data/spec/mongo/error/unsupported_option_spec.rb +54 -0
  504. data/spec/mongo/grid/fs_bucket_spec.rb +18 -0
  505. data/spec/mongo/grid/stream/write_spec.rb +32 -0
  506. data/spec/mongo/index/view_spec.rb +166 -0
  507. data/spec/mongo/operation/aggregate/result_spec.rb +6 -1
  508. data/spec/mongo/operation/delete/bulk_spec.rb +18 -6
  509. data/spec/mongo/operation/delete/op_msg_spec.rb +22 -14
  510. data/spec/mongo/operation/find/legacy_spec.rb +27 -7
  511. data/spec/mongo/operation/get_more_spec.rb +6 -1
  512. data/spec/mongo/operation/insert/bulk_spec.rb +21 -7
  513. data/spec/mongo/operation/insert/command_spec.rb +4 -0
  514. data/spec/mongo/operation/insert/op_msg_spec.rb +22 -14
  515. data/spec/mongo/operation/limited_spec.rb +5 -3
  516. data/spec/mongo/operation/read_preference_legacy_spec.rb +16 -4
  517. data/spec/mongo/operation/read_preference_op_msg_spec.rb +115 -5
  518. data/spec/mongo/operation/result_spec.rb +6 -1
  519. data/spec/mongo/operation/update/bulk_spec.rb +18 -6
  520. data/spec/mongo/operation/update/command_spec.rb +4 -0
  521. data/spec/mongo/operation/update/op_msg_spec.rb +22 -14
  522. data/spec/mongo/retryable_spec.rb +71 -70
  523. data/spec/mongo/server/app_metadata_shared.rb +56 -0
  524. data/spec/mongo/server/app_metadata_spec.rb +8 -1
  525. data/spec/mongo/server/connection_auth_spec.rb +31 -12
  526. data/spec/mongo/server/connection_pool_spec.rb +0 -31
  527. data/spec/mongo/server/connection_spec.rb +118 -71
  528. data/spec/mongo/server/monitor/app_metadata_spec.rb +8 -1
  529. data/spec/mongo/server/monitor/connection_spec.rb +1 -82
  530. data/spec/mongo/server/monitor_spec.rb +76 -17
  531. data/spec/mongo/server/round_trip_time_averager_spec.rb +5 -3
  532. data/spec/mongo/server_selector/nearest_spec.rb +1 -0
  533. data/spec/mongo/server_selector/primary_preferred_spec.rb +1 -0
  534. data/spec/mongo/server_selector/primary_spec.rb +18 -0
  535. data/spec/mongo/server_selector/secondary_preferred_spec.rb +18 -1
  536. data/spec/mongo/server_selector/secondary_spec.rb +1 -0
  537. data/spec/mongo/server_selector_spec.rb +0 -1
  538. data/spec/mongo/session/session_pool_spec.rb +7 -3
  539. data/spec/mongo/socket/ssl_spec.rb +2 -2
  540. data/spec/mongo/socket/tcp_spec.rb +2 -2
  541. data/spec/mongo/socket/unix_spec.rb +2 -2
  542. data/spec/mongo/socket_spec.rb +9 -9
  543. data/spec/mongo/timeout_spec.rb +22 -68
  544. data/spec/mongo/uri_spec.rb +21 -6
  545. data/spec/runners/auth.rb +5 -6
  546. data/spec/runners/change_streams/outcome.rb +42 -0
  547. data/spec/runners/change_streams/spec.rb +57 -0
  548. data/spec/runners/change_streams/test.rb +229 -0
  549. data/spec/runners/cmap/verifier.rb +1 -1
  550. data/spec/runners/command_monitoring.rb +1 -1
  551. data/spec/runners/connection_string.rb +3 -2
  552. data/spec/runners/crud.rb +2 -2
  553. data/spec/runners/crud/context.rb +1 -1
  554. data/spec/runners/crud/operation.rb +120 -30
  555. data/spec/runners/crud/outcome.rb +1 -1
  556. data/spec/runners/crud/spec.rb +1 -0
  557. data/spec/runners/crud/test.rb +8 -26
  558. data/spec/runners/crud/test_base.rb +47 -0
  559. data/spec/runners/crud/verifier.rb +21 -3
  560. data/spec/runners/gridfs.rb +1 -1
  561. data/spec/runners/{server_discovery_and_monitoring.rb → sdam.rb} +41 -22
  562. data/spec/runners/sdam/verifier.rb +26 -8
  563. data/spec/runners/sdam_monitoring.rb +1 -1
  564. data/spec/runners/transactions.rb +1 -2
  565. data/spec/runners/transactions/context.rb +1 -1
  566. data/spec/runners/transactions/operation.rb +5 -1
  567. data/spec/runners/transactions/spec.rb +1 -1
  568. data/spec/runners/transactions/test.rb +48 -54
  569. data/spec/spec_tests/auth_spec.rb +2 -0
  570. data/spec/spec_tests/change_streams_spec.rb +39 -4
  571. data/spec/spec_tests/client_side_encryption_spec.rb +3 -0
  572. data/spec/spec_tests/cmap_spec.rb +5 -0
  573. data/spec/spec_tests/command_monitoring_spec.rb +3 -0
  574. data/spec/spec_tests/connection_string_spec.rb +2 -0
  575. data/spec/spec_tests/crud_spec.rb +2 -0
  576. data/spec/spec_tests/data/auth/connection-string.yml +57 -1
  577. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +30 -0
  578. data/spec/spec_tests/data/change_streams/change-streams-resume-errorLabels.yml +1105 -0
  579. data/spec/spec_tests/data/change_streams/change-streams-resume-whitelist.yml +1107 -0
  580. data/spec/spec_tests/data/change_streams/change-streams.yml +5 -4
  581. data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +1 -1
  582. data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +33 -11
  583. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-clientError.yml +63 -0
  584. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-serverError.yml +92 -0
  585. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint.yml +103 -0
  586. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-clientError.yml +90 -0
  587. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-serverError.yml +147 -0
  588. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint.yml +164 -0
  589. data/spec/spec_tests/data/crud_v2/deleteMany-hint-clientError.yml +43 -0
  590. data/spec/spec_tests/data/crud_v2/deleteMany-hint-serverError.yml +62 -0
  591. data/spec/spec_tests/data/crud_v2/deleteMany-hint.yml +58 -0
  592. data/spec/spec_tests/data/crud_v2/deleteOne-hint-clientError.yml +41 -0
  593. data/spec/spec_tests/data/crud_v2/deleteOne-hint-serverError.yml +60 -0
  594. data/spec/spec_tests/data/crud_v2/deleteOne-hint.yml +57 -0
  595. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-clientError.yml +28 -0
  596. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-serverError.yml +44 -0
  597. data/spec/spec_tests/data/crud_v2/find-allowdiskuse.yml +50 -0
  598. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-clientError.yml +45 -0
  599. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-serverError.yml +60 -0
  600. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint.yml +56 -0
  601. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-clientError.yml +40 -0
  602. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-serverError.yml +59 -0
  603. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint.yml +55 -0
  604. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-clientError.yml +40 -0
  605. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-serverError.yml +58 -0
  606. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint.yml +55 -0
  607. data/spec/spec_tests/data/crud_v2/replaceOne-hint.yml +61 -0
  608. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-delete-hint-clientError.yml +60 -0
  609. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-update-hint-clientError.yml +88 -0
  610. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteMany-hint-clientError.yml +40 -0
  611. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteOne-hint-clientError.yml +38 -0
  612. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndDelete-hint-clientError.yml +42 -0
  613. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndReplace-hint-clientError.yml +40 -0
  614. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndUpdate-hint-clientError.yml +40 -0
  615. data/spec/spec_tests/data/crud_v2/unacknowledged-replaceOne-hint-clientError.yml +40 -0
  616. data/spec/spec_tests/data/crud_v2/unacknowledged-updateMany-hint-clientError.yml +43 -0
  617. data/spec/spec_tests/data/crud_v2/unacknowledged-updateOne-hint-clientError.yml +40 -0
  618. data/spec/spec_tests/data/crud_v2/updateMany-hint-clientError.yml +45 -0
  619. data/spec/spec_tests/data/crud_v2/updateMany-hint-serverError.yml +66 -0
  620. data/spec/spec_tests/data/crud_v2/updateMany-hint.yml +65 -0
  621. data/spec/spec_tests/data/crud_v2/updateOne-hint-clientError.yml +43 -0
  622. data/spec/spec_tests/data/crud_v2/updateOne-hint-serverError.yml +62 -0
  623. data/spec/spec_tests/data/crud_v2/updateOne-hint.yml +61 -0
  624. data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +65 -0
  625. data/spec/spec_tests/data/dns_seedlist_discovery/direct-connection-false.yml +10 -0
  626. data/spec/spec_tests/data/dns_seedlist_discovery/direct-connection-true.yml +5 -0
  627. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-2.6.yml +215 -0
  628. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-3.2.yml +58 -0
  629. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-3.4.yml +95 -0
  630. data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-4.2.yml +36 -0
  631. data/spec/spec_tests/data/retryable_writes/bulkWrite-errorLabels.yml +77 -0
  632. data/spec/spec_tests/data/retryable_writes/bulkWrite-serverErrors.yml +37 -0
  633. data/spec/spec_tests/data/retryable_writes/deleteOne-errorLabels.yml +48 -0
  634. data/spec/spec_tests/data/retryable_writes/deleteOne-serverErrors.yml +22 -0
  635. data/spec/spec_tests/data/retryable_writes/findOneAndDelete-errorLabels.yml +49 -0
  636. data/spec/spec_tests/data/retryable_writes/findOneAndDelete-serverErrors.yml +23 -0
  637. data/spec/spec_tests/data/retryable_writes/findOneAndReplace-errorLabels.yml +52 -0
  638. data/spec/spec_tests/data/retryable_writes/findOneAndReplace-serverErrors.yml +25 -0
  639. data/spec/spec_tests/data/retryable_writes/findOneAndUpdate-errorLabels.yml +52 -0
  640. data/spec/spec_tests/data/retryable_writes/findOneAndUpdate-serverErrors.yml +24 -0
  641. data/spec/spec_tests/data/retryable_writes/insertMany-errorLabels.yml +54 -0
  642. data/spec/spec_tests/data/retryable_writes/insertMany-serverErrors.yml +24 -0
  643. data/spec/spec_tests/data/retryable_writes/insertOne-errorLabels.yml +44 -0
  644. data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +69 -0
  645. data/spec/spec_tests/data/retryable_writes/replaceOne-errorLabels.yml +53 -0
  646. data/spec/spec_tests/data/retryable_writes/replaceOne-serverErrors.yml +23 -0
  647. data/spec/spec_tests/data/retryable_writes/updateOne-errorLabels.yml +53 -0
  648. data/spec/spec_tests/data/retryable_writes/updateOne-serverErrors.yml +23 -0
  649. data/spec/spec_tests/data/sdam/errors/error_handling_handshake.yml +54 -0
  650. data/spec/spec_tests/data/sdam/errors/non-stale-network-error.yml +46 -0
  651. data/spec/spec_tests/data/sdam/errors/non-stale-network-timeout-error.yml +37 -0
  652. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedAtShutdown.yml +60 -0
  653. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedDueToReplStateChange.yml +60 -0
  654. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotMaster.yml +60 -0
  655. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotMasterNoSlaveOk.yml +60 -0
  656. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotMasterOrSecondary.yml +60 -0
  657. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-PrimarySteppedDown.yml +60 -0
  658. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-ShutdownInProgress.yml +60 -0
  659. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedAtShutdown.yml +51 -0
  660. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedDueToReplStateChange.yml +51 -0
  661. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotMaster.yml +51 -0
  662. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotMasterNoSlaveOk.yml +51 -0
  663. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotMasterOrSecondary.yml +51 -0
  664. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-PrimarySteppedDown.yml +51 -0
  665. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-ShutdownInProgress.yml +51 -0
  666. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedAtShutdown.yml +60 -0
  667. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedDueToReplStateChange.yml +60 -0
  668. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotMaster.yml +60 -0
  669. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotMasterNoSlaveOk.yml +60 -0
  670. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotMasterOrSecondary.yml +60 -0
  671. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-PrimarySteppedDown.yml +60 -0
  672. data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-ShutdownInProgress.yml +60 -0
  673. data/spec/spec_tests/data/sdam/errors/post-42-InterruptedAtShutdown.yml +46 -0
  674. data/spec/spec_tests/data/sdam/errors/post-42-InterruptedDueToReplStateChange.yml +46 -0
  675. data/spec/spec_tests/data/sdam/errors/post-42-NotMaster.yml +46 -0
  676. data/spec/spec_tests/data/sdam/errors/post-42-NotMasterNoSlaveOk.yml +46 -0
  677. data/spec/spec_tests/data/sdam/errors/post-42-NotMasterOrSecondary.yml +46 -0
  678. data/spec/spec_tests/data/sdam/errors/post-42-PrimarySteppedDown.yml +46 -0
  679. data/spec/spec_tests/data/sdam/errors/post-42-ShutdownInProgress.yml +46 -0
  680. data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedAtShutdown.yml +46 -0
  681. data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedDueToReplStateChange.yml +46 -0
  682. data/spec/spec_tests/data/sdam/errors/pre-42-NotMaster.yml +46 -0
  683. data/spec/spec_tests/data/sdam/errors/pre-42-NotMasterNoSlaveOk.yml +46 -0
  684. data/spec/spec_tests/data/sdam/errors/pre-42-NotMasterOrSecondary.yml +46 -0
  685. data/spec/spec_tests/data/sdam/errors/pre-42-PrimarySteppedDown.yml +46 -0
  686. data/spec/spec_tests/data/sdam/errors/pre-42-ShutdownInProgress.yml +46 -0
  687. data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedAtShutdown.yml +89 -0
  688. data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedDueToReplStateChange.yml +89 -0
  689. data/spec/spec_tests/data/sdam/errors/stale-generation-NotMaster.yml +89 -0
  690. data/spec/spec_tests/data/sdam/errors/stale-generation-NotMasterNoSlaveOk.yml +89 -0
  691. data/spec/spec_tests/data/sdam/errors/stale-generation-NotMasterOrSecondary.yml +89 -0
  692. data/spec/spec_tests/data/sdam/errors/stale-generation-PrimarySteppedDown.yml +89 -0
  693. data/spec/spec_tests/data/sdam/errors/stale-generation-ShutdownInProgress.yml +89 -0
  694. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedAtShutdown.yml +89 -0
  695. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedDueToReplStateChange.yml +89 -0
  696. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotMaster.yml +89 -0
  697. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotMasterNoSlaveOk.yml +89 -0
  698. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotMasterOrSecondary.yml +89 -0
  699. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-PrimarySteppedDown.yml +89 -0
  700. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-ShutdownInProgress.yml +89 -0
  701. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-network.yml +80 -0
  702. data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-timeout.yml +80 -0
  703. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedAtShutdown.yml +89 -0
  704. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedDueToReplStateChange.yml +89 -0
  705. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotMaster.yml +89 -0
  706. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotMasterNoSlaveOk.yml +89 -0
  707. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotMasterOrSecondary.yml +89 -0
  708. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-PrimarySteppedDown.yml +89 -0
  709. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-ShutdownInProgress.yml +89 -0
  710. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-network.yml +80 -0
  711. data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-timeout.yml +80 -0
  712. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedAtShutdown.yml +64 -0
  713. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedDueToReplStateChange.yml +64 -0
  714. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotMaster.yml +64 -0
  715. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotMasterNoSlaveOk.yml +64 -0
  716. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotMasterOrSecondary.yml +64 -0
  717. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-PrimarySteppedDown.yml +64 -0
  718. data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-ShutdownInProgress.yml +64 -0
  719. data/spec/spec_tests/data/sdam/rs/compatible.yml +2 -0
  720. data/spec/spec_tests/data/sdam/rs/compatible_unknown.yml +2 -0
  721. data/spec/spec_tests/data/sdam/rs/discover_arbiters.yml +2 -2
  722. data/spec/spec_tests/data/sdam/rs/discover_arbiters_replicaset.yml +43 -0
  723. data/spec/spec_tests/data/sdam/rs/discover_ghost.yml +35 -0
  724. data/spec/spec_tests/data/sdam/rs/{ghost_discovered.yml → discover_ghost_replicaset.yml} +1 -1
  725. data/spec/spec_tests/data/sdam/rs/discover_hidden.yml +50 -0
  726. data/spec/spec_tests/data/sdam/rs/discover_hidden_replicaset.yml +50 -0
  727. data/spec/spec_tests/data/sdam/rs/discover_passives.yml +2 -2
  728. data/spec/spec_tests/data/sdam/rs/discover_passives_replicaset.yml +81 -0
  729. data/spec/spec_tests/data/sdam/rs/discover_primary.yml +2 -2
  730. data/spec/spec_tests/data/sdam/rs/discover_primary_replicaset.yml +42 -0
  731. data/spec/spec_tests/data/sdam/rs/discover_rsother.yml +49 -0
  732. data/spec/spec_tests/data/sdam/rs/{rsother_discovered.yml → discover_rsother_replicaset.yml} +1 -1
  733. data/spec/spec_tests/data/sdam/rs/discover_secondary.yml +2 -2
  734. data/spec/spec_tests/data/sdam/rs/discover_secondary_replicaset.yml +43 -0
  735. data/spec/spec_tests/data/sdam/rs/incompatible_arbiter.yml +2 -0
  736. data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +2 -0
  737. data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +2 -0
  738. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me.yml +23 -27
  739. data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +79 -55
  740. data/spec/spec_tests/data/sdam/rs/replicaset_rsnp.yml +20 -0
  741. data/spec/spec_tests/data/sdam/rs/secondary_mismatched_me.yml +3 -2
  742. data/spec/spec_tests/data/sdam/rs/too_new.yml +2 -0
  743. data/spec/spec_tests/data/sdam/rs/topology_version_equal.yml +66 -0
  744. data/spec/spec_tests/data/sdam/rs/topology_version_greater.yml +189 -0
  745. data/spec/spec_tests/data/sdam/rs/topology_version_less.yml +62 -0
  746. data/spec/spec_tests/data/sdam/sharded/discover_single_mongos.yml +23 -0
  747. data/spec/spec_tests/data/sdam/single/direct_connection_external_ip.yml +1 -1
  748. data/spec/spec_tests/data/sdam/single/direct_connection_mongos.yml +2 -2
  749. data/spec/spec_tests/data/sdam/single/direct_connection_replicaset.yml +22 -0
  750. data/spec/spec_tests/data/sdam/single/direct_connection_rsarbiter.yml +2 -2
  751. data/spec/spec_tests/data/sdam/single/direct_connection_rsprimary.yml +2 -2
  752. data/spec/spec_tests/data/sdam/single/direct_connection_rssecondary.yml +2 -2
  753. data/spec/spec_tests/data/sdam/single/direct_connection_slave.yml +1 -1
  754. data/spec/spec_tests/data/sdam/single/direct_connection_standalone.yml +2 -2
  755. data/spec/spec_tests/data/sdam/single/{unavailable_seed.yml → direct_connection_unavailable_seed.yml} +2 -2
  756. data/spec/spec_tests/data/sdam/single/direct_connection_wrong_set_name.yml +38 -0
  757. data/spec/spec_tests/data/sdam/single/discover_standalone.yml +34 -0
  758. data/spec/spec_tests/data/sdam/single/discover_unavailable_seed.yml +28 -0
  759. data/spec/spec_tests/data/sdam/single/too_old_then_upgraded.yml +46 -0
  760. data/spec/spec_tests/data/transactions/create-collection.yml +131 -0
  761. data/spec/spec_tests/data/transactions/create-index.yml +152 -0
  762. data/spec/spec_tests/data/transactions/error-labels.yml +87 -21
  763. data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +1 -0
  764. data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +124 -0
  765. data/spec/spec_tests/data/transactions/retryable-abort.yml +17 -2
  766. data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +132 -0
  767. data/spec/spec_tests/data/transactions/retryable-commit.yml +24 -9
  768. data/spec/spec_tests/data/uri_options/connection-options.yml +43 -0
  769. data/spec/spec_tests/data/uri_options/ruby-auth-options.yml +12 -0
  770. data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +57 -0
  771. data/spec/spec_tests/dns_seedlist_discovery_spec.rb +3 -1
  772. data/spec/spec_tests/gridfs_spec.rb +2 -0
  773. data/spec/spec_tests/max_staleness_spec.rb +3 -1
  774. data/spec/spec_tests/read_write_concern_connection_string_spec.rb +2 -0
  775. data/spec/spec_tests/read_write_concern_operaton_spec.rb +10 -0
  776. data/spec/spec_tests/retryable_reads_spec.rb +2 -0
  777. data/spec/spec_tests/retryable_writes_spec.rb +8 -1
  778. data/spec/spec_tests/sdam_monitoring_spec.rb +3 -1
  779. data/spec/spec_tests/sdam_spec.rb +70 -1
  780. data/spec/spec_tests/server_selection_rtt_spec.rb +2 -0
  781. data/spec/spec_tests/server_selection_spec.rb +2 -0
  782. data/spec/spec_tests/transactions_api_spec.rb +5 -0
  783. data/spec/spec_tests/transactions_spec.rb +5 -0
  784. data/spec/spec_tests/uri_options_spec.rb +2 -0
  785. data/spec/stress/cleanup_spec.rb +43 -0
  786. data/spec/stress/connection_pool_stress_spec.rb +1 -5
  787. data/spec/stress/connection_pool_timing_spec.rb +3 -6
  788. data/spec/stress/fork_reconnect_stress_spec.rb +109 -0
  789. data/spec/support/authorization.rb +1 -11
  790. data/spec/support/aws_utils.rb +62 -0
  791. data/spec/support/aws_utils/base.rb +134 -0
  792. data/spec/support/aws_utils/inspector.rb +224 -0
  793. data/spec/support/aws_utils/orchestrator.rb +370 -0
  794. data/spec/support/aws_utils/provisioner.rb +360 -0
  795. data/spec/support/background_thread_registry.rb +6 -2
  796. data/spec/support/client_registry.rb +5 -24
  797. data/spec/support/cluster_config.rb +1 -0
  798. data/spec/support/common_shortcuts.rb +43 -0
  799. data/spec/support/constraints.rb +27 -7
  800. data/spec/support/crypt.rb +1 -1
  801. data/spec/support/event_subscriber.rb +94 -84
  802. data/spec/support/lite_constraints.rb +47 -0
  803. data/spec/support/shared/scram_conversation.rb +100 -0
  804. data/spec/support/shared/server_selector.rb +81 -1
  805. data/spec/support/shared/session.rb +29 -21
  806. data/spec/support/spec_config.rb +39 -9
  807. data/spec/support/spec_setup.rb +8 -4
  808. data/spec/support/utils.rb +115 -24
  809. metadata +1134 -744
  810. metadata.gz.sig +0 -0
  811. data/lib/mongo/server/connectable.rb +0 -107
  812. data/spec/integration/bulk_write_spec.rb +0 -19
  813. data/spec/integration/grid_fs_bucket_spec.rb +0 -48
  814. data/spec/integration/zlib_compression_spec.rb +0 -25
  815. data/spec/runners/change_streams.rb +0 -262
  816. data/spec/runners/change_streams/operation.rb +0 -89
  817. data/spec/spec_tests/data/sdam/sharded/ruby_discovered_single_mongos.yml +0 -27
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2019 MongoDB, Inc.
1
+ # Copyright (C) 2014-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -20,9 +20,6 @@ module Mongo
20
20
  # @since 2.0.0
21
21
  class Unix < Socket
22
22
 
23
- # @return [ String ] path The path to connect to.
24
- attr_reader :path
25
-
26
23
  # Initializes a new Unix socket.
27
24
  #
28
25
  # @example Create the Unix socket.
@@ -33,17 +30,28 @@ module Mongo
33
30
  # @param [ Hash ] options The options.
34
31
  #
35
32
  # @option options [ Float ] :connect_timeout Connect timeout (unused).
33
+ # @option options [ Address ] :connection_address Address of the
34
+ # connection that created this socket.
35
+ # @option options [ Integer ] :connection_generation Generation of the
36
+ # connection (for non-monitoring connections) that created this socket.
37
+ # @option options [ true | false ] :monitor Whether this socket was
38
+ # created by a monitoring connection.
36
39
  #
37
40
  # @since 2.0.0
41
+ # @api private
38
42
  def initialize(path, timeout, options = {})
39
- @path, @timeout, @options = path, timeout, options
43
+ super(timeout, options)
44
+ @path = path
40
45
  @socket = ::UNIXSocket.new(path)
41
46
  set_socket_options(@socket)
42
47
  end
43
48
 
49
+ # @return [ String ] path The path to connect to.
50
+ attr_reader :path
51
+
44
52
  private
45
53
 
46
- def address
54
+ def human_address
47
55
  path
48
56
  end
49
57
  end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2019 MongoDB, Inc.
1
+ # Copyright (C) 2019-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the 'License');
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2019 MongoDB, Inc.
1
+ # Copyright (C) 2014-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2017-2019 MongoDB, Inc.
1
+ # Copyright (C) 2017-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the 'License');
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2017-2019 MongoDB, Inc.
1
+ # Copyright (C) 2017-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the 'License');
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2020 MongoDB, Inc.
1
+ # Copyright (C) 2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -24,15 +24,15 @@ module Mongo
24
24
  # When no error exception is provided, Timeout::Error is raised.
25
25
  # @param [ String ] message The error message passed to the exception raised
26
26
  # on timeout, optional. When no error message is provided, the default
27
- # error message is "execution expired".
28
- #
29
- # @note Ruby versions older than 2.4.0 do not support specifying a custom
30
- # error message, and any error message passed in as an argument will be
31
- # ignored.
27
+ # error message for the exception class is used.
32
28
  def timeout(sec, klass=nil, message=nil)
33
- if RUBY_VERSION < '2.4.0'
34
- ::Timeout.timeout(sec, klass) do
35
- yield
29
+ if message && RUBY_VERSION < '2.94.0'
30
+ begin
31
+ ::Timeout.timeout(sec) do
32
+ yield
33
+ end
34
+ rescue ::Timeout::Error => e
35
+ raise klass, message
36
36
  end
37
37
  else
38
38
  # Jruby Timeout::timeout method does not support passing nil arguments.
@@ -0,0 +1,80 @@
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
+ # TopologyVersion encapsulates the topologyVersion document obtained from
17
+ # ismaster responses and not master-like OperationFailure errors.
18
+ #
19
+ # @api private
20
+ class TopologyVersion < BSON::Document
21
+ def initialize(doc)
22
+ if Lint.enabled?
23
+ unless doc['processId']
24
+ raise ArgumentError, 'Creating a topology version without processId field'
25
+ end
26
+ unless doc['counter']
27
+ raise ArgumentError, 'Creating a topology version without counter field'
28
+ end
29
+ end
30
+
31
+ super
32
+ end
33
+
34
+ # @return [ BSON::ObjectId ] The process id.
35
+ def process_id
36
+ self['processId']
37
+ end
38
+
39
+ # @return [ Integer ] The counter.
40
+ def counter
41
+ self['counter']
42
+ end
43
+
44
+ # Returns whether this topology version is potentially newer than another
45
+ # topology version.
46
+ #
47
+ # Note that there is no total ordering of topology versions - given
48
+ # two topology versions, each may be "potentially newer" than the other one.
49
+ #
50
+ # @param [ TopologyVersion ] other The other topology version.
51
+ #
52
+ # @return [ true | false ] Whether this topology version is potentially newer.
53
+ # @api private
54
+ def gt?(other)
55
+ if process_id != other.process_id
56
+ true
57
+ else
58
+ counter > other.counter
59
+ end
60
+ end
61
+
62
+ # Returns whether this topology version is potentially newer than or equal
63
+ # to another topology version.
64
+ #
65
+ # Note that there is no total ordering of topology versions - given
66
+ # two topology versions, each may be "potentially newer" than the other one.
67
+ #
68
+ # @param [ TopologyVersion ] other The other topology version.
69
+ #
70
+ # @return [ true | false ] Whether this topology version is potentially newer.
71
+ # @api private
72
+ def gte?(other)
73
+ if process_id != other.process_id
74
+ true
75
+ else
76
+ counter >= other.counter
77
+ end
78
+ end
79
+ end
80
+ end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2019 MongoDB, Inc.
1
+ # Copyright (C) 2014-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the 'License');
4
4
  # you may not use this file except in compliance with the License.
@@ -192,12 +192,13 @@ module Mongo
192
192
  # @since 2.0.0
193
193
  AUTH_MECH_MAP = {
194
194
  'GSSAPI' => :gssapi,
195
+ 'MONGODB-AWS' => :aws,
195
196
  # MONGODB-CR is deprecated and will be removed in driver version 3.0
196
197
  'MONGODB-CR' => :mongodb_cr,
197
198
  'MONGODB-X509' => :mongodb_x509,
198
199
  'PLAIN' => :plain,
199
200
  'SCRAM-SHA-1' => :scram,
200
- 'SCRAM-SHA-256' => :scram256
201
+ 'SCRAM-SHA-256' => :scram256,
201
202
  }.freeze
202
203
 
203
204
  # Options that are allowed to appear more than once in the uri.
@@ -295,42 +296,7 @@ module Mongo
295
296
  raise_invalid_error!('No hosts in the URI')
296
297
  end
297
298
  parse!(remaining)
298
-
299
- # The URI options spec requires that we raise an error if there are conflicting values of
300
- # 'tls' and 'ssl'. In order to fulfill this, we parse the values of each instance into an
301
- # array; assuming all values in the array are the same, we replace the array with that value.
302
- unless @uri_options[:ssl].nil? || @uri_options[:ssl].empty?
303
- unless @uri_options[:ssl].uniq.length == 1
304
- raise_invalid_error_no_fmt!("all instances of 'tls' and 'ssl' must have the same value")
305
- end
306
-
307
- @uri_options[:ssl] = @uri_options[:ssl].first
308
- end
309
-
310
- # Check for conflicting TLS insecure options.
311
- unless @uri_options[:ssl_verify].nil?
312
- unless @uri_options[:ssl_verify_certificate].nil?
313
- raise_invalid_error_no_fmt!("'tlsInsecure' and 'tlsAllowInvalidCertificates' cannot both be specified")
314
- end
315
-
316
- unless @uri_options[:ssl_verify_hostname].nil?
317
- raise_invalid_error_no_fmt!("tlsInsecure' and 'tlsAllowInvalidHostnames' cannot both be specified")
318
- end
319
- end
320
-
321
- # Since we know that the only URI option that sets :ssl_cert is "tlsCertificateKeyFile", any
322
- # value set for :ssl_cert must also be set for :ssl_key.
323
- if @uri_options[:ssl_cert]
324
- @uri_options[:ssl_key] = @uri_options[:ssl_cert]
325
- end
326
-
327
- if uri_options[:write_concern] && !uri_options[:write_concern].empty?
328
- begin
329
- WriteConcern.get(uri_options[:write_concern])
330
- rescue Error::InvalidWriteConcern => e
331
- raise_invalid_error_no_fmt!("#{e.class}: #{e}")
332
- end
333
- end
299
+ validate_uri_options!
334
300
  end
335
301
 
336
302
  # Get the credentials provided in the URI.
@@ -435,9 +401,6 @@ module Mongo
435
401
  if value.nil?
436
402
  raise_invalid_error!("Option #{key} has no value")
437
403
  end
438
- if value.index('=')
439
- raise_invalid_error!("Value for option #{key} contains the key/value delimiter (=): #{value}")
440
- end
441
404
  key = decode(key)
442
405
  value = decode(value)
443
406
  add_uri_option(key, value, uri_options)
@@ -487,7 +450,7 @@ module Mongo
487
450
  end
488
451
 
489
452
  def encode(value)
490
- ::URI.encode(value)
453
+ CGI.escape(value).gsub('+', '%20')
491
454
  end
492
455
 
493
456
  # Hash for storing map of URI option parameters to conversion strategies
@@ -544,6 +507,7 @@ module Mongo
544
507
  uri_option 'tlsinsecure', :ssl_verify, :type => :inverse_bool
545
508
 
546
509
  # Topology options
510
+ uri_option 'directconnection', :direct_connection, type: :bool
547
511
  uri_option 'connect', :connect, type: :symbol
548
512
 
549
513
  # Auth Options
@@ -680,7 +644,7 @@ module Mongo
680
644
  # @return [ Hash ] The auth mechanism properties hash.
681
645
  def auth_mech_props(value)
682
646
  properties = hash_extractor('authMechanismProperties', value)
683
- if properties[:canonicalize_host_name]
647
+ if properties && properties[:canonicalize_host_name]
684
648
  properties.merge!(canonicalize_host_name:
685
649
  properties[:canonicalize_host_name].downcase == 'true')
686
650
  end
@@ -855,15 +819,16 @@ module Mongo
855
819
  #
856
820
  # @return [ Hash ] The hash built from the string.
857
821
  def hash_extractor(name, value)
858
- value.split(',').reduce({}) do |set, tag|
822
+ h = {}
823
+ value.split(',').each do |tag|
859
824
  k, v = tag.split(':')
860
825
  if v.nil?
861
- log_warn("Invalid hash value for #{name}: #{value}")
862
- return nil
826
+ log_warn("Invalid hash value for #{name}: key `#{k}` does not have a value: #{value}")
863
827
  end
864
828
 
865
- set.merge(k.downcase.to_sym => v)
829
+ h[k.downcase.to_sym] = v
866
830
  end
831
+ h
867
832
  end
868
833
 
869
834
  # Extract values from the string and put them into an array.
@@ -874,6 +839,55 @@ module Mongo
874
839
  def array(value)
875
840
  value.split(',')
876
841
  end
842
+
843
+ def validate_uri_options!
844
+ # The URI options spec requires that we raise an error if there are conflicting values of
845
+ # 'tls' and 'ssl'. In order to fulfill this, we parse the values of each instance into an
846
+ # array; assuming all values in the array are the same, we replace the array with that value.
847
+ unless uri_options[:ssl].nil? || uri_options[:ssl].empty?
848
+ unless uri_options[:ssl].uniq.length == 1
849
+ raise_invalid_error_no_fmt!("all instances of 'tls' and 'ssl' must have the same value")
850
+ end
851
+
852
+ uri_options[:ssl] = uri_options[:ssl].first
853
+ end
854
+
855
+ # Check for conflicting TLS insecure options.
856
+ unless uri_options[:ssl_verify].nil?
857
+ unless uri_options[:ssl_verify_certificate].nil?
858
+ raise_invalid_error_no_fmt!("'tlsInsecure' and 'tlsAllowInvalidCertificates' cannot both be specified")
859
+ end
860
+
861
+ unless uri_options[:ssl_verify_hostname].nil?
862
+ raise_invalid_error_no_fmt!("tlsInsecure' and 'tlsAllowInvalidHostnames' cannot both be specified")
863
+ end
864
+ end
865
+
866
+ # Since we know that the only URI option that sets :ssl_cert is "tlsCertificateKeyFile", any
867
+ # value set for :ssl_cert must also be set for :ssl_key.
868
+ if uri_options[:ssl_cert]
869
+ uri_options[:ssl_key] = uri_options[:ssl_cert]
870
+ end
871
+
872
+ if uri_options[:write_concern] && !uri_options[:write_concern].empty?
873
+ begin
874
+ WriteConcern.get(uri_options[:write_concern])
875
+ rescue Error::InvalidWriteConcern => e
876
+ raise_invalid_error_no_fmt!("#{e.class}: #{e}")
877
+ end
878
+ end
879
+
880
+ if uri_options[:direct_connection]
881
+ if uri_options[:connect] && uri_options[:connect].to_s != 'direct'
882
+ raise_invalid_error_no_fmt!("directConnection=true cannot be used with connect=#{uri_options[:connect]}")
883
+ end
884
+ if servers.length > 1
885
+ raise_invalid_error_no_fmt!("directConnection=true cannot be used with multiple seeds")
886
+ end
887
+ elsif uri_options[:direct_connection] == false && uri_options[:connect].to_s == 'direct'
888
+ raise_invalid_error_no_fmt!("directConnection=false cannot be used with connect=direct")
889
+ end
890
+ end
877
891
  end
878
892
  end
879
893
 
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2017-2019 MongoDB, Inc.
1
+ # Copyright (C) 2017-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the 'License');
4
4
  # you may not use this file except in compliance with the License.
@@ -224,6 +224,14 @@ module Mongo
224
224
  txt_options
225
225
  end
226
226
  end
227
+
228
+ def validate_uri_options!
229
+ if uri_options[:direct_connection]
230
+ raise_invalid_error_no_fmt!("directConnection=true is incompatible with SRV URIs")
231
+ end
232
+
233
+ super
234
+ end
227
235
  end
228
236
  end
229
237
  end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2019 MongoDB, Inc.
1
+ # Copyright (C) 2014-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -17,5 +17,5 @@ module Mongo
17
17
  # The current version of the driver.
18
18
  #
19
19
  # @since 2.0.0
20
- VERSION = '2.12.4'.freeze
20
+ VERSION = '2.13.0.beta1'
21
21
  end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2015-2019 MongoDB, Inc.
1
+ # Copyright (C) 2015-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2019 MongoDB, Inc.
1
+ # Copyright (C) 2014-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the 'License');
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2019 MongoDB, Inc.
1
+ # Copyright (C) 2014-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the 'License');
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2014-2019 MongoDB, Inc.
1
+ # Copyright (C) 2014-2020 MongoDB Inc.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the 'License');
4
4
  # you may not use this file except in compliance with the License.
@@ -21,7 +21,7 @@ Gem::Specification.new do |s|
21
21
  'source_code_uri' => 'https://github.com/mongodb/mongo-ruby-driver',
22
22
  }
23
23
 
24
- if File.exists?('gem-private_key.pem')
24
+ if File.exist?('gem-private_key.pem')
25
25
  s.signing_key = 'gem-private_key.pem'
26
26
  s.cert_chain = ['gem-public_cert.pem']
27
27
  else
@@ -0,0 +1,291 @@
1
+ # AWS Authentication Implementation Notes
2
+
3
+ ## AWS Account
4
+
5
+ Per [its documentation](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetCallerIdentity.html,
6
+ the GetCallerIdentity API call that the server makes to STS to authenticate
7
+ the user using MONGODB-AWS auth mechanism requires no privileges. This means
8
+ in order to test authentication using non-temporary credentials (i.e.,
9
+ AWS access key id and secret access key only) it is sufficient to create an
10
+ IAM user that has no permissions but does have programmatic access enabled
11
+ (i.e. has an access key id and secret access key).
12
+
13
+ ## AWS Signature V4
14
+
15
+ The driver implements the AWS signature v4 internally rather than relying on
16
+ a third-party library (such as the
17
+ [AWS SDK for Ruby](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/index.html))
18
+ to provide the signature implementation. The implementation is quite compact
19
+ but getting it working took some effort due to:
20
+
21
+ 1. [The server not logging AWS responses when authentication fails
22
+ ](https://jira.mongodb.org/browse/SERVER-46909)
23
+ 2. Some of the messages from STS being quite cryptic (I could not figure out
24
+ what the problem was for either "Request is missing Authentication Token" or
25
+ "Request must contain a signature that conforms to AWS standards", and
26
+ ultimately resolved these problems by comparing my requests to those produced
27
+ by the AWS SDK).
28
+ 3. Amazon's own documentation not providing an example signature calculation
29
+ that could be followed to verify correctness, especially since this is a
30
+ multi-step process and all kinds of subtle errors are possible in many of the
31
+ steps like using a date instead of a time, hex-encoding a MAC in an
32
+ intermediate step or not separating header values from the list of signed
33
+ headers by two newlines.
34
+
35
+ ### Reference Implementation - AWS SDK
36
+
37
+ To see actual working STS requests I used Amazon's
38
+ [AWS SDK for Ruby](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/index.html)
39
+ ([API docs for STS client](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/EC2/Client.html),
40
+ [configuration documentation](https://docs.aws.amazon.com/sdk-for-ruby/v3/developer-guide/setup-config.html))
41
+ as follows:
42
+
43
+ 1. Set the credentials in the environment (note that the region must be
44
+ explicitly provided):
45
+
46
+ export AWS_ACCESS_KEY_ID=AKIAREALKEY
47
+ export AWS_SECRET_ACCESS_KEY=Sweee/realsecret
48
+ export AWS_REGION=us-east-1
49
+
50
+ 2. Install the correct gem and launch IRb:
51
+
52
+ gem install aws-sdk-core
53
+ irb -raws-sdk-core -Iaws/sts
54
+
55
+ 3. Send a GetCallerIdentity request, as used by MongoDB server:
56
+
57
+ Aws::STS::Client.new(
58
+ logger: Logger.new(STDERR, level: :debug),
59
+ http_wire_trace: true,
60
+ ).get_caller_identity
61
+
62
+ This call enables HTTP request and response logging and produces output
63
+ similar to the following:
64
+
65
+ opening connection to sts.amazonaws.com:443...
66
+ opened
67
+ starting SSL for sts.amazonaws.com:443...
68
+ SSL established, protocol: TLSv1.2, cipher: ECDHE-RSA-AES128-SHA
69
+ <- "POST / HTTP/1.1\r\nContent-Type: application/x-www-form-urlencoded; charset=utf-8\r\nAccept-Encoding: \r\nUser-Agent: aws-sdk-ruby3/3.91.1 ruby/2.7.0 x86_64-linux aws-sdk-core/3.91.1\r\nHost: sts.amazonaws.com\r\nX-Amz-Date: 20200317T194745Z\r\nX-Amz-Content-Sha256: ab821ae955788b0e33ebd34c208442ccfc2d406e2edc5e7a39bd6458fbb4f843\r\nAuthorization: AWS4-HMAC-SHA256 Credential=AKIAREALKEY/20200317/us-east-1/sts/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=6cd3a60a2d7dfba0dcd17f9c4c42d0186de5830cf99545332253a327bba14131\r\nContent-Length: 43\r\nAccept: */*\r\n\r\n"
70
+ -> "HTTP/1.1 200 OK\r\n"
71
+ -> "x-amzn-RequestId: c56f5d68-8763-4032-a835-fd95efd83fa6\r\n"
72
+ -> "Content-Type: text/xml\r\n"
73
+ -> "Content-Length: 401\r\n"
74
+ -> "Date: Tue, 17 Mar 2020 19:47:44 GMT\r\n"
75
+ -> "\r\n"
76
+ reading 401 bytes...
77
+ -> ""
78
+ -> "<GetCallerIdentityResponse xmlns=\"https://sts.amazonaws.com/doc/2011-06-15/\">\n <GetCallerIdentityResult>\n <Arn>arn:aws:iam::5851234356:user/test</Arn>\n <UserId>AIDAREALUSERID</UserId>\n <Account>5851234356</Account>\n </GetCallerIdentityResult>\n <ResponseMetadata>\n <RequestId>c56f5d68-8763-4032-a835-fd95efd83fa6</RequestId>\n </ResponseMetadata>\n</GetCallerIdentityResponse>\n"
79
+ read 401 bytes
80
+ Conn keep-alive
81
+ I, [2020-03-17T15:47:45.275421 #9815] INFO -- : [Aws::STS::Client 200 0.091573 0 retries] get_caller_identity()
82
+
83
+ => #<struct Aws::STS::Types::GetCallerIdentityResponse user_id="AIDAREALUSERID", account="5851234356", arn="arn:aws:iam::5851234356:user/test">
84
+
85
+ Note that:
86
+
87
+ 1. The set of headers sent by the AWS SDK differs from the set
88
+ of headers that the MONGODB-AWS auth mechanism specification mentions.
89
+ I used the AWS SDK implementation as a guide to determine the correct shape
90
+ of the request to STS and in particular the `Authorization` header.
91
+ The source code of Amazon's implementation is
92
+ [here](https://github.com/aws/aws-sdk-ruby/blob/master/gems/aws-sigv4/lib/aws-sigv4/signer.rb)
93
+ and it generates, in particular, the x-amz-content-sha256` header
94
+ which the MONGODB-AWS auth mechanism specification does not mention.
95
+ 2. This is a working request which can be replayed, making it possible
96
+ to send this request that was created by the AWS SDK repeatedly with minor
97
+ alterations to study STS error reporting behavior. STS as of this writing
98
+ allows a 15 minute window during which a request may be replayed.
99
+ 3. The printed request only shows the headers and not the request body.
100
+ In case of the GetCallerIdentity, the payload is fixed and is the same as
101
+ what the MONGODB-AWS auth mechanism specification requires
102
+ (`Action=GetCallerIdentity&Version=2011-06-15`).
103
+
104
+ Because the AWS SDK includes a different set of headers in its requests,
105
+ it not feasible to compare the canonical requests generated by AWS SDK
106
+ verbatim to the canonical requests generated by the driver.
107
+
108
+ ### Manual Requests
109
+
110
+ It is possible to manually send requests to STS using OpenSSL `s_client`
111
+ tool in combination with the [printf](https://linux.die.net/man/3/printf)
112
+ utility to transform the newline escapes. A sample command replaying the
113
+ request printed above is as follows:
114
+
115
+ (printf "POST / HTTP/1.1\r\nContent-Type: application/x-www-form-urlencoded; charset=utf-8\r\nAccept-Encoding: \r\nUser-Agent: aws-sdk-ruby3/3.91.1 ruby/2.7.0 x86_64-linux aws-sdk-core/3.91.1\r\nHost: sts.amazonaws.com\r\nX-Amz-Date: 20200317T194745Z\r\nX-Amz-Content-Sha256: ab821ae955788b0e33ebd34c208442ccfc2d406e2edc5e7a39bd6458fbb4f843\r\nAuthorization: AWS4-HMAC-SHA256 Credential=AKIAREALKEY/20200317/us-east-1/sts/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=6cd3a60a2d7dfba0dcd17f9c4c42d0186de5830cf99545332253a327bba14131\r\nContent-Length: 43\r\nAccept: */*\r\n\r\n" &&
116
+ echo "Action=GetCallerIdentity&Version=2011-06-15" &&
117
+ sleep 5) |openssl s_client -connect sts.amazonaws.com:443
118
+
119
+ Note the sleep call - `s_client` does not wait for the remote end to provide
120
+ a response before exiting, thus the sleep on the input side allows 5 seconds
121
+ for STS to process the request and respond.
122
+
123
+ For reference, Amazon provides [GetCallerIdentity API documentation
124
+ ](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetCallerIdentity.html).
125
+
126
+ ### Integration Test - Signature Generation
127
+
128
+ The Ruby driver includes an integration test for signature generation, where
129
+ the driver makes the call to `GetCallerIdentity` STS endpoint using the
130
+ provided AWS credentials. This test is in
131
+ `spec/integration/aws_auth_request_spec.rb`.
132
+
133
+ ### STS Error Responses
134
+
135
+ The error responses produced by STS sometimes do not clearly indicate the
136
+ problem. Below are some of the puzzling responses I encountered:
137
+
138
+ - *Request is missing Authentication Token*: request is missing the
139
+ `Authorization` header, or the value of the header does not begin with
140
+ `AWS4-`. For example, this error is produced if the signature algorithm
141
+ is erroneously given as `AWS-HMAC-SHA256` instead of `AWS4-HMAC-SHA256`
142
+ with the remainder of the header value being correctly constructed.
143
+ This error is also produced if the value of the header erroneously includes
144
+ the name of the header (i.e. the header name is specified twice in the header
145
+ line) but the value is otherwise completely valid. This error has no relation
146
+ to the "session token" or "security token" as used with temporary AWS
147
+ credentials.
148
+ - *The security token included in the request is invalid*: this error is
149
+ produced when the AWS access key id, as specified in the scope part of the
150
+ `Authorization` header, is not a valid access key id. In the case of
151
+ non-temporary credentials being used for authentication, the error refers to
152
+ a "security token" but the authentication process does not actually use a
153
+ security token as this term is used in the AWS documentation describing
154
+ temporary credentials.
155
+ - *Signature expired: 20200317T000000Z is now earlier than 20200317T222541Z
156
+ (20200317T224041Z - 15 min.)*: This error happens when `x-amz-date` header
157
+ value is the formatted date (`YYYYMMDD`) rather than the ISO8601 formatted
158
+ time (`YYYYMMDDTHHMMSSZ`). Note that the string `20200317T000000Z` is never
159
+ explicitly provided in the request - it is derived by AWS from the provided
160
+ header `x-amz-date: 20200317`.
161
+ - *The request signature we calculated does not match the signature
162
+ you provided. Check your AWS Secret Access Key and signing method. Consult
163
+ the service documentation for details*: this is the error produced when
164
+ the signature is not calculated correctly but everything else in the
165
+ request is valid. If a different error is produced, most likely the problem
166
+ is in something other than signature calculation.
167
+ - *The security token included in the request is expired*: this error is
168
+ produced when temporary credentials are used and the credentials have
169
+ expired.
170
+
171
+ ### Resources
172
+
173
+ Generally I found Amazon's own documentation to be the best for implementing
174
+ the signature calculation. The following documents should be read in order:
175
+
176
+ - [Signing AWS requests overview](https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html)
177
+ - [Creating canonical request](https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html)
178
+ - [Creating string to sign](https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html)
179
+ - [Calculating signature](https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html)
180
+
181
+ ### Signature Debugger
182
+
183
+ The most excellent [awssignature.com](http://www.awssignature.com/) was
184
+ indispensable in debugging the actual signature calculation process.
185
+
186
+ ### MongoDB Server
187
+
188
+ MongoDB server internally defines the set of headers that it is prepared to
189
+ handle when it is processing AWS authentication. Headers that are not part
190
+ of that set cause the server to reject driver's payloads.
191
+
192
+ The error reporting when additional headers are provided and when the
193
+ correct set of headers is provided but the headers are not ordered
194
+ lexicographically [can be misleading](https://jira.mongodb.org/browse/SERVER-47488).
195
+
196
+ ## Direct AWS Requests
197
+
198
+ [STS GetCallerIdentity API docs](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetCallerIdentity.html)
199
+
200
+ When making direct requests to AWS, adding `Accept: application/json`
201
+ header will return the results in the JSON format, including the errors.
202
+
203
+ ## AWS CLI
204
+
205
+ [Configuration reference](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html)
206
+
207
+ Note that AWS CLI uses `AWS_DEFAULT_REGION` environment variable to configure
208
+ the region used for operations.
209
+
210
+ ## AWS Ruby SDK
211
+
212
+ [Configuration reference](https://docs.aws.amazon.com/sdk-for-ruby/v3/developer-guide/setup-config.html)
213
+
214
+ Note that AWS Ruby SDK uses `AWS_REGION` environment variable to configure
215
+ the region used for operations.
216
+
217
+ [STS::Client#assume_role documentation](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/STS/Client.html#assume_role-instance_method)
218
+
219
+ ## IMDSv2
220
+
221
+ `X-aws-ec2-metadata-token-ttl-seconds` is a required header when using
222
+ IMDSv2 EC2 instance metadata requests. This header is used in the examples
223
+ on [Amazon's page describing
224
+ IMDSv2](https://aws.amazon.com/blogs/security/defense-in-depth-open-firewalls-reverse-proxies-ssrf-vulnerabilities-ec2-instance-metadata-service/),
225
+ but is not explicitly stated as being required.
226
+
227
+ Not providing this header fails the PUT requests with HTTP code 400.
228
+
229
+ ## IAM Roles For EC2 Instances
230
+
231
+ ### Metadata Rate Limit
232
+
233
+ [Amazon documentation](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html#instancedata-throttling)
234
+ states that the EC2 instance metadata endpoint is rate limited. Since the
235
+ driver accesses it to obtain credentials whenever a connection is established,
236
+ rate limits may adversely affect the driver's ability to establish connections.
237
+
238
+ ### Instance Profile Assignment
239
+
240
+ It can take over 5 seconds for an instance to see its instance profile change
241
+ reflected in the instance metadata. Evergreen test runs seem to experience
242
+ this delay to a significantly larger extent than testing in a standalone
243
+ AWS account.
244
+
245
+ ## IAM Roles For ECS Tasks
246
+
247
+ ### ECS Task Roles
248
+
249
+ When an ECS task (or more precisely, the task definition) is created,
250
+ it is possible to specify an *execution role* and a *task role*. The two are
251
+ completely separate; an execution role is required to, for example, be
252
+ able to send container logs to CloudWatch if the container is running in
253
+ Fargate, and a task role is required for AWS authentication purposes.
254
+
255
+ The ECS task role is also separate from EC2 instance role and the IAM role
256
+ for a user to assume a role - these roles all require different configuration.
257
+
258
+ ### `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI` Scope
259
+
260
+ As stated in [this Amazon support document](https://aws.amazon.com/premiumsupport/knowledge-center/ecs-iam-task-roles-config-errors/),
261
+ the `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI` environment variable is only
262
+ available to the PID 1 process in the container. Other processes need to
263
+ extract it from PID 1's environment:
264
+
265
+ strings /proc/1/environment
266
+
267
+ ### Other ECS Metadata
268
+
269
+ `strings /proc/1/environment` also shows a number of other enviroment
270
+ variables available in the container with metadata. For example a test
271
+ container yields:
272
+
273
+ HOSTNAME=f893c90ec4bd
274
+ ECS_CONTAINER_METADATA_URI=http://169.254.170.2/v3/5fb0b11b-c4c8-4cdb-b68b-edf70b3f4937
275
+ AWS_DEFAULT_REGION=us-east-2
276
+ AWS_EXECUTION_ENV=AWS_ECS_FARGATE
277
+ AWS_REGION=us-east-2
278
+ AWS_CONTAINER_CREDENTIALS_RELATIVE_URI=/v2/credentials/f17b5770-9a0d-498c-8d26-eea69f8d0924
279
+
280
+ ### Metadata Rate Limit
281
+
282
+ [Amazon documentation](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/troubleshoot-task-iam-roles.html)
283
+ states that ECS task metadata endpoint is subject to rate limiting,
284
+ which is configured via [ECS_TASK_METADATA_RPS_LIMIT container agent
285
+ parameter](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-config.html).
286
+ When the rate limit is reached, requests fail with `429 Too Many Requests`
287
+ HTTP status code.
288
+
289
+ Since the driver accesses this endpoint to obtain credentials whenever
290
+ a connection is established, rate limits may adversely affect the driver's
291
+ ability to establish connections.