mongo 2.11.2 → 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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/CONTRIBUTING.md +8 -36
- data/LICENSE +1 -1
- data/README.md +54 -53
- data/Rakefile +1 -1
- data/lib/mongo.rb +7 -1
- data/lib/mongo/active_support.rb +1 -1
- data/lib/mongo/address.rb +114 -46
- data/lib/mongo/address/ipv4.rb +32 -5
- data/lib/mongo/address/ipv6.rb +32 -5
- data/lib/mongo/address/unix.rb +3 -3
- data/lib/mongo/address/validator.rb +1 -1
- data/lib/mongo/auth.rb +37 -13
- data/lib/mongo/auth/aws.rb +37 -0
- data/lib/mongo/auth/aws/conversation.rb +128 -0
- data/lib/mongo/auth/aws/credentials_retriever.rb +219 -0
- data/lib/mongo/auth/aws/request.rb +257 -0
- data/lib/mongo/auth/base.rb +129 -0
- data/lib/mongo/auth/conversation_base.rb +52 -0
- data/lib/mongo/auth/cr.rb +9 -36
- data/lib/mongo/auth/cr/conversation.rb +24 -69
- data/lib/mongo/auth/credential_cache.rb +51 -0
- data/lib/mongo/auth/gssapi.rb +38 -0
- data/lib/mongo/auth/gssapi/conversation.rb +108 -0
- data/lib/mongo/auth/ldap.rb +9 -34
- data/lib/mongo/auth/ldap/conversation.rb +3 -43
- data/lib/mongo/auth/roles.rb +1 -1
- data/lib/mongo/auth/sasl_conversation_base.rb +111 -0
- data/lib/mongo/auth/scram.rb +39 -51
- data/lib/mongo/auth/scram/conversation.rb +12 -502
- data/lib/mongo/auth/scram256.rb +31 -0
- data/lib/mongo/auth/scram256/conversation.rb +63 -0
- data/lib/mongo/auth/scram_conversation_base.rb +402 -0
- data/lib/mongo/auth/stringprep.rb +5 -4
- data/lib/mongo/auth/stringprep/profiles/sasl.rb +2 -1
- data/lib/mongo/auth/stringprep/tables.rb +2 -1
- data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +1 -0
- data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +1 -0
- data/lib/mongo/auth/user.rb +9 -11
- data/lib/mongo/auth/user/view.rb +5 -5
- data/lib/mongo/auth/x509.rb +14 -32
- data/lib/mongo/auth/x509/conversation.rb +15 -42
- data/lib/mongo/background_thread.rb +12 -3
- data/lib/mongo/bson.rb +1 -1
- data/lib/mongo/bulk_write.rb +61 -26
- data/lib/mongo/bulk_write/combineable.rb +20 -8
- data/lib/mongo/bulk_write/ordered_combiner.rb +1 -1
- data/lib/mongo/bulk_write/result.rb +1 -1
- data/lib/mongo/bulk_write/result_combiner.rb +1 -1
- data/lib/mongo/bulk_write/transformable.rb +9 -10
- data/lib/mongo/bulk_write/unordered_combiner.rb +1 -1
- data/lib/mongo/bulk_write/validatable.rb +5 -1
- data/lib/mongo/client.rb +178 -23
- data/lib/mongo/client_encryption.rb +103 -0
- data/lib/mongo/cluster.rb +130 -52
- data/lib/mongo/cluster/periodic_executor.rb +1 -1
- data/lib/mongo/cluster/reapers/cursor_reaper.rb +19 -7
- data/lib/mongo/cluster/reapers/socket_reaper.rb +1 -1
- data/lib/mongo/cluster/sdam_flow.rb +74 -62
- data/lib/mongo/cluster/topology.rb +19 -2
- data/lib/mongo/cluster/topology/base.rb +1 -1
- data/lib/mongo/cluster/topology/no_replica_set_options.rb +1 -1
- data/lib/mongo/cluster/topology/replica_set_no_primary.rb +1 -1
- data/lib/mongo/cluster/topology/replica_set_with_primary.rb +1 -1
- data/lib/mongo/cluster/topology/sharded.rb +1 -1
- data/lib/mongo/cluster/topology/single.rb +1 -1
- data/lib/mongo/cluster/topology/unknown.rb +1 -1
- data/lib/mongo/cluster_time.rb +1 -1
- data/lib/mongo/collection.rb +25 -5
- data/lib/mongo/collection/view.rb +7 -3
- data/lib/mongo/collection/view/aggregation.rb +7 -4
- data/lib/mongo/collection/view/builder.rb +1 -1
- data/lib/mongo/collection/view/builder/aggregation.rb +1 -1
- data/lib/mongo/collection/view/builder/find_command.rb +9 -1
- data/lib/mongo/collection/view/builder/flags.rb +1 -1
- data/lib/mongo/collection/view/builder/map_reduce.rb +1 -1
- data/lib/mongo/collection/view/builder/modifiers.rb +1 -1
- data/lib/mongo/collection/view/builder/op_query.rb +1 -1
- data/lib/mongo/collection/view/change_stream.rb +15 -9
- data/lib/mongo/collection/view/change_stream/retryable.rb +1 -1
- data/lib/mongo/collection/view/explainable.rb +1 -1
- data/lib/mongo/collection/view/immutable.rb +1 -1
- data/lib/mongo/collection/view/iterable.rb +22 -7
- data/lib/mongo/collection/view/map_reduce.rb +9 -6
- data/lib/mongo/collection/view/readable.rb +16 -8
- data/lib/mongo/collection/view/writable.rb +62 -18
- data/lib/mongo/crypt.rb +33 -0
- data/lib/mongo/crypt/auto_decryption_context.rb +40 -0
- data/lib/mongo/crypt/auto_encrypter.rb +179 -0
- data/lib/mongo/crypt/auto_encryption_context.rb +44 -0
- data/lib/mongo/crypt/binary.rb +155 -0
- data/lib/mongo/crypt/binding.rb +1229 -0
- data/lib/mongo/crypt/context.rb +135 -0
- data/lib/mongo/crypt/data_key_context.rb +162 -0
- data/lib/mongo/crypt/encryption_io.rb +306 -0
- data/lib/mongo/crypt/explicit_decryption_context.rb +40 -0
- data/lib/mongo/crypt/explicit_encrypter.rb +117 -0
- data/lib/mongo/crypt/explicit_encryption_context.rb +89 -0
- data/lib/mongo/crypt/handle.rb +315 -0
- data/lib/mongo/crypt/hooks.rb +90 -0
- data/lib/mongo/crypt/kms_context.rb +67 -0
- data/lib/mongo/crypt/status.rb +131 -0
- data/lib/mongo/cursor.rb +67 -35
- data/lib/mongo/cursor/builder.rb +1 -1
- data/lib/mongo/cursor/builder/get_more_command.rb +1 -1
- data/lib/mongo/cursor/builder/kill_cursors_command.rb +9 -2
- data/lib/mongo/cursor/builder/op_get_more.rb +1 -1
- data/lib/mongo/cursor/builder/op_kill_cursors.rb +9 -2
- data/lib/mongo/database.rb +27 -7
- data/lib/mongo/database/view.rb +15 -6
- data/lib/mongo/dbref.rb +10 -3
- data/lib/mongo/error.rb +30 -3
- data/lib/mongo/error/auth_error.rb +1 -1
- data/lib/mongo/error/bulk_write_error.rb +17 -15
- data/lib/mongo/error/change_stream_resumable.rb +1 -1
- data/lib/mongo/error/closed_stream.rb +1 -1
- data/lib/mongo/error/connection_check_out_timeout.rb +1 -1
- data/lib/mongo/error/connection_perished.rb +23 -0
- data/lib/mongo/error/credential_check_error.rb +26 -0
- data/lib/mongo/error/crypt_error.rb +31 -0
- data/lib/mongo/error/extra_file_chunk.rb +1 -1
- data/lib/mongo/error/{failed_stringprep_validation.rb → failed_string_prep_validation.rb} +0 -0
- data/lib/mongo/error/file_not_found.rb +1 -1
- data/lib/mongo/error/handshake_error.rb +1 -1
- data/lib/mongo/error/insufficient_iteration_count.rb +1 -1
- data/lib/mongo/error/invalid_address.rb +1 -1
- data/lib/mongo/error/invalid_application_name.rb +1 -1
- data/lib/mongo/error/invalid_bulk_operation.rb +1 -1
- data/lib/mongo/error/invalid_bulk_operation_type.rb +1 -1
- data/lib/mongo/error/invalid_collection_name.rb +1 -1
- data/lib/mongo/error/invalid_cursor_operation.rb +27 -0
- data/lib/mongo/error/invalid_database_name.rb +1 -1
- data/lib/mongo/error/invalid_document.rb +1 -1
- data/lib/mongo/error/invalid_file.rb +1 -1
- data/lib/mongo/error/invalid_file_revision.rb +1 -1
- data/lib/mongo/error/invalid_min_pool_size.rb +1 -1
- data/lib/mongo/error/invalid_nonce.rb +2 -2
- data/lib/mongo/error/invalid_read_option.rb +1 -1
- data/lib/mongo/error/invalid_replacement_document.rb +1 -1
- data/lib/mongo/error/invalid_server_auth_response.rb +23 -0
- data/lib/mongo/error/invalid_server_preference.rb +6 -1
- data/lib/mongo/error/invalid_session.rb +1 -1
- data/lib/mongo/error/invalid_signature.rb +1 -1
- data/lib/mongo/error/invalid_transaction_operation.rb +1 -1
- data/lib/mongo/error/invalid_txt_record.rb +1 -1
- data/lib/mongo/error/invalid_update_document.rb +1 -1
- data/lib/mongo/error/invalid_uri.rb +1 -1
- data/lib/mongo/error/invalid_write_concern.rb +1 -1
- data/lib/mongo/error/kms_error.rb +22 -0
- data/lib/mongo/error/lint_error.rb +1 -1
- data/lib/mongo/error/max_bson_size.rb +15 -4
- data/lib/mongo/error/max_message_size.rb +1 -1
- data/lib/mongo/error/mismatched_domain.rb +1 -1
- data/lib/mongo/error/missing_file_chunk.rb +1 -1
- data/lib/mongo/error/missing_password.rb +1 -1
- data/lib/mongo/error/missing_resume_token.rb +1 -1
- data/lib/mongo/error/missing_scram_server_signature.rb +27 -0
- data/lib/mongo/error/mongocryptd_spawn_error.rb +22 -0
- data/lib/mongo/error/multi_index_drop.rb +1 -1
- data/lib/mongo/error/need_primary_server.rb +1 -1
- data/lib/mongo/error/no_server_available.rb +9 -4
- data/lib/mongo/error/no_srv_records.rb +1 -1
- data/lib/mongo/error/notable.rb +17 -17
- data/lib/mongo/error/operation_failure.rb +57 -43
- data/lib/mongo/error/parser.rb +17 -6
- data/lib/mongo/error/pool_closed_error.rb +1 -1
- data/lib/mongo/error/raise_original_error.rb +29 -0
- data/lib/mongo/error/session_ended.rb +1 -1
- data/lib/mongo/error/socket_error.rb +1 -1
- data/lib/mongo/error/socket_timeout_error.rb +1 -1
- data/lib/mongo/error/unchangeable_collection_option.rb +1 -1
- data/lib/mongo/error/unexpected_chunk_length.rb +1 -1
- data/lib/mongo/error/unexpected_response.rb +1 -1
- data/lib/mongo/error/unknown_payload_type.rb +1 -1
- data/lib/mongo/error/unsupported_array_filters.rb +7 -2
- data/lib/mongo/error/unsupported_collation.rb +7 -2
- data/lib/mongo/error/unsupported_features.rb +1 -1
- data/lib/mongo/error/unsupported_message_type.rb +1 -1
- data/lib/mongo/error/unsupported_option.rb +99 -0
- data/lib/mongo/error/write_retryable.rb +1 -1
- data/lib/mongo/event.rb +1 -1
- data/lib/mongo/event/base.rb +1 -1
- data/lib/mongo/event/listeners.rb +1 -1
- data/lib/mongo/event/publisher.rb +1 -1
- data/lib/mongo/event/subscriber.rb +1 -1
- data/lib/mongo/grid.rb +1 -1
- data/lib/mongo/grid/file.rb +1 -1
- data/lib/mongo/grid/file/chunk.rb +1 -1
- data/lib/mongo/grid/file/info.rb +4 -3
- data/lib/mongo/grid/fs_bucket.rb +7 -2
- data/lib/mongo/grid/stream.rb +1 -1
- data/lib/mongo/grid/stream/read.rb +1 -1
- data/lib/mongo/grid/stream/write.rb +1 -1
- data/lib/mongo/id.rb +1 -1
- data/lib/mongo/index.rb +2 -1
- data/lib/mongo/index/view.rb +61 -14
- data/lib/mongo/lint.rb +10 -0
- data/lib/mongo/loggable.rb +1 -1
- data/lib/mongo/logger.rb +1 -1
- data/lib/mongo/monitoring.rb +1 -1
- data/lib/mongo/monitoring/cmap_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/command_log_subscriber.rb +12 -5
- data/lib/mongo/monitoring/event.rb +1 -1
- data/lib/mongo/monitoring/event/cmap.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/base.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +2 -2
- data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/connection_closed.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/connection_created.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/connection_ready.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/pool_closed.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/pool_created.rb +1 -1
- data/lib/mongo/monitoring/event/command_failed.rb +1 -1
- data/lib/mongo/monitoring/event/command_started.rb +15 -4
- data/lib/mongo/monitoring/event/command_succeeded.rb +1 -1
- data/lib/mongo/monitoring/event/secure.rb +8 -2
- data/lib/mongo/monitoring/event/server_closed.rb +1 -1
- data/lib/mongo/monitoring/event/server_description_changed.rb +1 -1
- data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +1 -1
- data/lib/mongo/monitoring/event/server_heartbeat_started.rb +1 -1
- data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +1 -1
- data/lib/mongo/monitoring/event/server_opening.rb +1 -1
- data/lib/mongo/monitoring/event/topology_changed.rb +1 -1
- data/lib/mongo/monitoring/event/topology_closed.rb +1 -1
- data/lib/mongo/monitoring/event/topology_opening.rb +1 -1
- data/lib/mongo/monitoring/publishable.rb +5 -8
- data/lib/mongo/monitoring/sdam_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/server_closed_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/server_opening_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +1 -1
- data/lib/mongo/operation.rb +1 -0
- data/lib/mongo/operation/aggregate.rb +1 -1
- data/lib/mongo/operation/aggregate/command.rb +5 -5
- data/lib/mongo/operation/aggregate/op_msg.rb +1 -1
- data/lib/mongo/operation/aggregate/result.rb +1 -1
- data/lib/mongo/operation/collections_info.rb +3 -33
- data/lib/mongo/operation/collections_info/command.rb +40 -0
- data/lib/mongo/operation/collections_info/result.rb +1 -1
- data/lib/mongo/operation/command.rb +1 -1
- data/lib/mongo/operation/command/command.rb +3 -3
- data/lib/mongo/operation/command/op_msg.rb +1 -1
- data/lib/mongo/operation/count.rb +1 -1
- data/lib/mongo/operation/count/command.rb +3 -3
- data/lib/mongo/operation/count/op_msg.rb +1 -1
- data/lib/mongo/operation/create.rb +1 -1
- data/lib/mongo/operation/create/command.rb +3 -3
- data/lib/mongo/operation/create/op_msg.rb +1 -1
- data/lib/mongo/operation/create_index.rb +1 -1
- data/lib/mongo/operation/create_index/command.rb +4 -4
- data/lib/mongo/operation/create_index/op_msg.rb +6 -3
- data/lib/mongo/operation/create_user.rb +1 -1
- data/lib/mongo/operation/create_user/command.rb +4 -4
- data/lib/mongo/operation/create_user/op_msg.rb +2 -2
- data/lib/mongo/operation/delete.rb +1 -1
- data/lib/mongo/operation/delete/bulk_result.rb +1 -1
- data/lib/mongo/operation/delete/command.rb +4 -4
- data/lib/mongo/operation/delete/legacy.rb +2 -2
- data/lib/mongo/operation/delete/op_msg.rb +5 -5
- data/lib/mongo/operation/delete/result.rb +2 -2
- data/lib/mongo/operation/distinct.rb +1 -1
- data/lib/mongo/operation/distinct/command.rb +3 -3
- data/lib/mongo/operation/distinct/op_msg.rb +1 -1
- data/lib/mongo/operation/drop.rb +1 -1
- data/lib/mongo/operation/drop/command.rb +3 -3
- data/lib/mongo/operation/drop/op_msg.rb +1 -1
- data/lib/mongo/operation/drop_database.rb +1 -1
- data/lib/mongo/operation/drop_database/command.rb +3 -3
- data/lib/mongo/operation/drop_database/op_msg.rb +1 -1
- data/lib/mongo/operation/drop_index.rb +1 -1
- data/lib/mongo/operation/drop_index/command.rb +4 -4
- data/lib/mongo/operation/drop_index/op_msg.rb +2 -2
- data/lib/mongo/operation/explain.rb +1 -1
- data/lib/mongo/operation/explain/command.rb +3 -3
- data/lib/mongo/operation/explain/legacy.rb +3 -3
- data/lib/mongo/operation/explain/op_msg.rb +1 -1
- data/lib/mongo/operation/explain/result.rb +1 -1
- data/lib/mongo/operation/find.rb +1 -1
- data/lib/mongo/operation/find/command.rb +3 -3
- data/lib/mongo/operation/find/legacy.rb +3 -3
- data/lib/mongo/operation/find/legacy/result.rb +1 -1
- data/lib/mongo/operation/find/op_msg.rb +2 -9
- data/lib/mongo/operation/find/result.rb +1 -1
- data/lib/mongo/operation/get_more.rb +1 -1
- data/lib/mongo/operation/get_more/command.rb +3 -3
- data/lib/mongo/operation/get_more/legacy.rb +2 -2
- data/lib/mongo/operation/get_more/op_msg.rb +2 -9
- data/lib/mongo/operation/get_more/result.rb +1 -1
- data/lib/mongo/operation/indexes.rb +1 -1
- data/lib/mongo/operation/indexes/command.rb +3 -3
- data/lib/mongo/operation/indexes/legacy.rb +4 -4
- data/lib/mongo/operation/indexes/op_msg.rb +1 -1
- data/lib/mongo/operation/indexes/result.rb +1 -1
- data/lib/mongo/operation/insert.rb +3 -2
- data/lib/mongo/operation/insert/bulk_result.rb +6 -2
- data/lib/mongo/operation/insert/command.rb +8 -7
- data/lib/mongo/operation/insert/legacy.rb +10 -5
- data/lib/mongo/operation/insert/op_msg.rb +7 -7
- data/lib/mongo/operation/insert/result.rb +7 -4
- data/lib/mongo/operation/kill_cursors.rb +1 -1
- data/lib/mongo/operation/kill_cursors/command.rb +3 -3
- data/lib/mongo/operation/kill_cursors/legacy.rb +2 -2
- data/lib/mongo/operation/kill_cursors/op_msg.rb +1 -1
- data/lib/mongo/operation/list_collections.rb +1 -1
- data/lib/mongo/operation/list_collections/command.rb +4 -4
- data/lib/mongo/operation/list_collections/op_msg.rb +2 -2
- data/lib/mongo/operation/list_collections/result.rb +1 -1
- data/lib/mongo/operation/map_reduce.rb +1 -1
- data/lib/mongo/operation/map_reduce/command.rb +3 -3
- data/lib/mongo/operation/map_reduce/op_msg.rb +1 -1
- data/lib/mongo/operation/map_reduce/result.rb +1 -1
- data/lib/mongo/operation/op_msg_base.rb +3 -3
- data/lib/mongo/operation/parallel_scan.rb +1 -1
- data/lib/mongo/operation/parallel_scan/command.rb +5 -5
- data/lib/mongo/operation/parallel_scan/op_msg.rb +2 -2
- data/lib/mongo/operation/parallel_scan/result.rb +1 -1
- data/lib/mongo/operation/remove_user.rb +1 -1
- data/lib/mongo/operation/remove_user/command.rb +4 -4
- data/lib/mongo/operation/remove_user/op_msg.rb +2 -2
- data/lib/mongo/operation/result.rb +64 -31
- data/lib/mongo/operation/shared/bypass_document_validation.rb +10 -4
- data/lib/mongo/operation/shared/causal_consistency_supported.rb +3 -3
- data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +56 -0
- data/lib/mongo/operation/shared/executable.rb +47 -27
- data/lib/mongo/operation/shared/executable_no_validate.rb +3 -3
- data/lib/mongo/operation/shared/executable_transaction_label.rb +1 -1
- data/lib/mongo/operation/shared/idable.rb +1 -1
- data/lib/mongo/operation/shared/limited.rb +10 -2
- data/lib/mongo/operation/shared/object_id_generator.rb +1 -1
- data/lib/mongo/operation/shared/op_msg_or_command.rb +8 -6
- data/lib/mongo/operation/shared/op_msg_or_find_command.rb +9 -7
- data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +9 -7
- data/lib/mongo/operation/shared/polymorphic_lookup.rb +1 -1
- data/lib/mongo/operation/shared/polymorphic_result.rb +1 -1
- data/lib/mongo/operation/shared/read_preference_supported.rb +74 -22
- data/lib/mongo/operation/shared/response_handling.rb +84 -9
- data/lib/mongo/operation/shared/result/aggregatable.rb +1 -1
- data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +1 -1
- data/lib/mongo/operation/shared/sessions_supported.rb +86 -22
- data/lib/mongo/operation/shared/specifiable.rb +32 -20
- data/lib/mongo/operation/shared/write.rb +33 -20
- data/lib/mongo/operation/shared/write_concern_supported.rb +6 -6
- data/lib/mongo/operation/update.rb +1 -1
- data/lib/mongo/operation/update/bulk_result.rb +1 -1
- data/lib/mongo/operation/update/command.rb +4 -4
- data/lib/mongo/operation/update/legacy.rb +2 -2
- data/lib/mongo/operation/update/legacy/result.rb +1 -1
- data/lib/mongo/operation/update/op_msg.rb +5 -5
- data/lib/mongo/operation/update/result.rb +2 -2
- data/lib/mongo/operation/update_user.rb +1 -1
- data/lib/mongo/operation/update_user/command.rb +4 -4
- data/lib/mongo/operation/update_user/op_msg.rb +2 -2
- data/lib/mongo/operation/users_info.rb +1 -1
- data/lib/mongo/operation/users_info/command.rb +4 -4
- data/lib/mongo/operation/users_info/op_msg.rb +2 -2
- data/lib/mongo/operation/users_info/result.rb +1 -1
- data/lib/mongo/options.rb +1 -1
- data/lib/mongo/options/mapper.rb +1 -1
- data/lib/mongo/options/redacted.rb +1 -1
- data/lib/mongo/protocol/bit_vector.rb +3 -2
- data/lib/mongo/protocol/compressed.rb +7 -6
- data/lib/mongo/protocol/delete.rb +1 -1
- data/lib/mongo/protocol/get_more.rb +1 -1
- data/lib/mongo/protocol/insert.rb +4 -2
- data/lib/mongo/protocol/kill_cursors.rb +1 -1
- data/lib/mongo/protocol/message.rb +95 -16
- data/lib/mongo/protocol/msg.rb +189 -38
- data/lib/mongo/protocol/query.rb +8 -10
- data/lib/mongo/protocol/registry.rb +1 -1
- data/lib/mongo/protocol/reply.rb +1 -1
- data/lib/mongo/protocol/serializers.rb +51 -16
- data/lib/mongo/protocol/update.rb +1 -1
- data/lib/mongo/retryable.rb +24 -11
- data/lib/mongo/semaphore.rb +1 -1
- data/lib/mongo/server.rb +42 -11
- data/lib/mongo/server/app_metadata.rb +17 -4
- data/lib/mongo/server/connection.rb +40 -126
- data/lib/mongo/server/connection_base.rb +106 -19
- data/lib/mongo/server/connection_common.rb +135 -0
- data/lib/mongo/server/connection_pool.rb +57 -2
- data/lib/mongo/server/connection_pool/populator.rb +2 -2
- data/lib/mongo/server/context.rb +1 -1
- data/lib/mongo/server/description.rb +53 -13
- data/lib/mongo/server/description/features.rb +12 -3
- data/lib/mongo/server/monitor.rb +118 -72
- data/lib/mongo/server/monitor/app_metadata.rb +1 -1
- data/lib/mongo/server/monitor/connection.rb +62 -96
- data/lib/mongo/server/pending_connection.rb +204 -1
- data/lib/mongo/server/round_trip_time_averager.rb +12 -3
- data/lib/mongo/server_selector.rb +2 -1
- data/lib/mongo/server_selector/base.rb +40 -0
- data/lib/mongo/server_selector/nearest.rb +25 -15
- data/lib/mongo/server_selector/primary.rb +23 -22
- data/lib/mongo/server_selector/primary_preferred.rb +25 -15
- data/lib/mongo/server_selector/secondary.rb +25 -15
- data/lib/mongo/server_selector/secondary_preferred.rb +28 -27
- data/lib/mongo/server_selector/selectable.rb +30 -15
- data/lib/mongo/session.rb +15 -4
- data/lib/mongo/session/server_session.rb +1 -1
- data/lib/mongo/session/session_pool.rb +9 -4
- data/lib/mongo/socket.rb +120 -30
- data/lib/mongo/socket/ssl.rb +110 -32
- data/lib/mongo/socket/tcp.rb +41 -24
- data/lib/mongo/socket/unix.rb +14 -6
- data/lib/mongo/srv.rb +1 -1
- data/lib/mongo/srv/monitor.rb +74 -43
- data/lib/mongo/srv/resolver.rb +1 -1
- data/lib/mongo/srv/result.rb +1 -2
- data/lib/mongo/timeout.rb +49 -0
- data/lib/mongo/topology_version.rb +80 -0
- data/lib/mongo/uri.rb +84 -41
- data/lib/mongo/uri/srv_protocol.rb +10 -2
- data/lib/mongo/version.rb +2 -2
- data/lib/mongo/write_concern.rb +1 -1
- data/lib/mongo/write_concern/acknowledged.rb +1 -1
- data/lib/mongo/write_concern/base.rb +1 -1
- data/lib/mongo/write_concern/unacknowledged.rb +1 -1
- data/mongo.gemspec +2 -4
- data/spec/NOTES.aws-auth.md +291 -0
- data/spec/README.aws-auth.md +318 -0
- data/spec/README.md +282 -14
- data/spec/integration/auth_spec.rb +74 -1
- data/spec/integration/aws_auth_request_spec.rb +74 -0
- data/spec/integration/aws_credentials_retriever_spec.rb +103 -0
- data/spec/integration/bson_symbol_spec.rb +34 -0
- data/spec/integration/change_stream_spec.rb +123 -51
- data/spec/integration/{client_options_spec.rb → client_authentication_options_spec.rb} +15 -15
- data/spec/integration/client_construction_aws_auth_spec.rb +191 -0
- data/spec/integration/client_construction_spec.rb +101 -2
- data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +353 -0
- data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +303 -0
- data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +72 -0
- data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +79 -0
- data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +221 -0
- data/spec/integration/client_side_encryption/auto_encryption_spec.rb +601 -0
- data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +187 -0
- data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +78 -0
- data/spec/integration/client_side_encryption/client_close_spec.rb +63 -0
- data/spec/integration/client_side_encryption/corpus_spec.rb +233 -0
- data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +132 -0
- data/spec/integration/client_side_encryption/data_key_spec.rb +165 -0
- data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +114 -0
- data/spec/integration/client_side_encryption/external_key_vault_spec.rb +141 -0
- data/spec/integration/client_side_encryption/views_spec.rb +44 -0
- data/spec/integration/client_update_spec.rb +154 -0
- data/spec/integration/collection_indexes_prose_spec.rb +55 -0
- data/spec/integration/command_monitoring_spec.rb +33 -7
- data/spec/integration/command_spec.rb +55 -19
- data/spec/integration/connect_single_rs_name_spec.rb +5 -3
- data/spec/integration/connection_spec.rb +115 -9
- data/spec/integration/crud_spec.rb +162 -0
- data/spec/integration/cursor_reaping_spec.rb +16 -11
- data/spec/integration/fork_reconnect_spec.rb +143 -0
- data/spec/integration/get_more_spec.rb +10 -3
- data/spec/integration/heartbeat_events_spec.rb +1 -1
- data/spec/integration/read_preference_spec.rb +67 -11
- data/spec/integration/reconnect_spec.rb +7 -7
- data/spec/integration/retryable_errors_spec.rb +35 -16
- data/spec/integration/{retryable_writes_spec.rb → retryable_writes/retryable_writes_36_and_older_spec.rb} +55 -51
- data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +401 -0
- data/spec/integration/retryable_writes/shared/adds_diagnostics.rb +15 -0
- data/spec/integration/retryable_writes/shared/does_not_support_retries.rb +24 -0
- data/spec/integration/retryable_writes/shared/only_supports_legacy_retries.rb +25 -0
- data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +215 -0
- data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +232 -0
- data/spec/integration/retryable_writes/shared/performs_no_retries.rb +110 -0
- data/spec/integration/retryable_writes/shared/supports_legacy_retries.rb +19 -0
- data/spec/integration/retryable_writes/shared/supports_modern_retries.rb +25 -0
- data/spec/integration/retryable_writes/shared/supports_retries.rb +16 -0
- data/spec/integration/sdam_error_handling_spec.rb +116 -18
- data/spec/integration/sdam_events_spec.rb +1 -0
- data/spec/integration/server_spec.rb +42 -26
- data/spec/integration/size_limit_spec.rb +94 -0
- data/spec/integration/srv_monitoring_spec.rb +16 -8
- data/spec/integration/step_down_spec.rb +15 -15
- data/spec/integration/transactions_api_examples_spec.rb +59 -0
- data/spec/integration/transactions_examples_spec.rb +5 -2
- data/spec/integration/x509_auth_spec.rb +109 -0
- data/spec/kerberos/kerberos_spec.rb +91 -0
- data/spec/lite_spec_helper.rb +41 -33
- data/spec/mongo/address/ipv4_spec.rb +1 -1
- data/spec/mongo/address_spec.rb +20 -14
- data/spec/mongo/auth/cr_spec.rb +15 -7
- data/spec/mongo/auth/gssapi/conversation_spec.rb +121 -0
- data/spec/mongo/auth/invalid_mechanism_spec.rb +1 -1
- data/spec/mongo/auth/ldap/conversation_spec.rb +1 -1
- data/spec/mongo/auth/ldap_spec.rb +8 -4
- data/spec/mongo/auth/scram/conversation_spec.rb +120 -334
- data/spec/mongo/auth/scram256/conversation_spec.rb +171 -0
- data/spec/mongo/auth/{scram/negotiation_spec.rb → scram_negotiation_spec.rb} +79 -75
- data/spec/mongo/auth/scram_spec.rb +55 -85
- data/spec/mongo/auth/user/view_spec.rb +39 -7
- data/spec/mongo/auth/user_spec.rb +13 -1
- data/spec/mongo/auth/x509/conversation_spec.rb +1 -1
- data/spec/mongo/auth/x509_spec.rb +13 -9
- data/spec/mongo/auth_spec.rb +4 -4
- data/spec/mongo/bulk_write/result_spec.rb +11 -7
- data/spec/mongo/bulk_write_spec.rb +208 -4
- data/spec/mongo/client_construction_spec.rb +496 -88
- data/spec/mongo/client_encryption_spec.rb +405 -0
- data/spec/mongo/client_spec.rb +21 -2
- data/spec/mongo/cluster/cursor_reaper_spec.rb +12 -8
- data/spec/mongo/cluster/socket_reaper_spec.rb +14 -3
- data/spec/mongo/cluster_spec.rb +23 -2
- data/spec/mongo/collection/view/aggregation_spec.rb +6 -4
- data/spec/mongo/collection/view/builder/find_command_spec.rb +17 -6
- data/spec/mongo/collection/view/change_stream_resume_spec.rb +392 -0
- data/spec/mongo/collection/view/change_stream_spec.rb +3 -321
- data/spec/mongo/collection/view/iterable_spec.rb +38 -0
- data/spec/mongo/collection/view/map_reduce_spec.rb +9 -5
- data/spec/mongo/collection/view/readable_spec.rb +15 -1
- data/spec/mongo/collection/view/writable_spec.rb +208 -1
- data/spec/mongo/collection/view_spec.rb +1 -1
- data/spec/mongo/collection_spec.rb +35 -52
- data/spec/mongo/crypt/auto_decryption_context_spec.rb +90 -0
- data/spec/mongo/crypt/auto_encrypter_spec.rb +187 -0
- data/spec/mongo/crypt/auto_encryption_context_spec.rb +107 -0
- data/spec/mongo/crypt/binary_spec.rb +115 -0
- data/spec/mongo/crypt/binding/binary_spec.rb +56 -0
- data/spec/mongo/crypt/binding/context_spec.rb +257 -0
- data/spec/mongo/crypt/binding/helpers_spec.rb +46 -0
- data/spec/mongo/crypt/binding/mongocrypt_spec.rb +144 -0
- data/spec/mongo/crypt/binding/status_spec.rb +99 -0
- data/spec/mongo/crypt/binding/version_spec.rb +22 -0
- data/spec/mongo/crypt/binding_unloaded_spec.rb +20 -0
- data/spec/mongo/crypt/data_key_context_spec.rb +213 -0
- data/spec/mongo/crypt/encryption_io_spec.rb +136 -0
- data/spec/mongo/crypt/explicit_decryption_context_spec.rb +72 -0
- data/spec/mongo/crypt/explicit_encryption_context_spec.rb +170 -0
- data/spec/mongo/crypt/handle_spec.rb +232 -0
- data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +108 -0
- data/spec/mongo/crypt/status_spec.rb +152 -0
- data/spec/mongo/cursor/builder/get_more_command_spec.rb +6 -1
- data/spec/mongo/cursor/builder/op_get_more_spec.rb +6 -1
- data/spec/mongo/cursor/builder/op_kill_cursors_spec.rb +61 -0
- data/spec/mongo/cursor_spec.rb +33 -5
- data/spec/mongo/database_spec.rb +26 -2
- data/spec/mongo/error/bulk_write_error_spec.rb +49 -0
- data/spec/mongo/error/crypt_error_spec.rb +26 -0
- data/spec/mongo/error/max_bson_size_spec.rb +35 -0
- data/spec/mongo/error/no_server_available_spec.rb +11 -1
- data/spec/mongo/error/notable_spec.rb +59 -0
- data/spec/mongo/error/operation_failure_heavy_spec.rb +58 -0
- data/spec/mongo/error/operation_failure_spec.rb +130 -72
- data/spec/mongo/error/unsupported_option_spec.rb +54 -0
- data/spec/mongo/grid/fs_bucket_spec.rb +18 -0
- data/spec/mongo/grid/stream/write_spec.rb +32 -0
- data/spec/mongo/index/view_spec.rb +166 -0
- data/spec/mongo/operation/aggregate/result_spec.rb +6 -1
- data/spec/mongo/operation/aggregate_spec.rb +1 -1
- data/spec/mongo/operation/collections_info_spec.rb +1 -1
- data/spec/mongo/operation/command_spec.rb +3 -3
- data/spec/mongo/operation/create_index_spec.rb +3 -3
- data/spec/mongo/operation/create_user_spec.rb +3 -3
- data/spec/mongo/operation/delete/bulk_spec.rb +18 -6
- data/spec/mongo/operation/delete/op_msg_spec.rb +23 -20
- data/spec/mongo/operation/delete_spec.rb +7 -7
- data/spec/mongo/operation/drop_index_spec.rb +2 -2
- data/spec/mongo/operation/find/legacy_spec.rb +27 -6
- data/spec/mongo/operation/get_more_spec.rb +6 -1
- data/spec/mongo/operation/indexes_spec.rb +1 -1
- data/spec/mongo/operation/insert/bulk_spec.rb +21 -7
- data/spec/mongo/operation/insert/command_spec.rb +4 -0
- data/spec/mongo/operation/insert/op_msg_spec.rb +25 -20
- data/spec/mongo/operation/insert_spec.rb +12 -12
- data/spec/mongo/operation/limited_spec.rb +5 -3
- data/spec/mongo/operation/map_reduce_spec.rb +2 -2
- data/spec/mongo/operation/read_preference_legacy_spec.rb +363 -0
- data/spec/mongo/operation/read_preference_op_msg_spec.rb +304 -0
- data/spec/mongo/operation/remove_user_spec.rb +3 -3
- data/spec/mongo/operation/result_spec.rb +6 -1
- data/spec/mongo/operation/update/bulk_spec.rb +18 -6
- data/spec/mongo/operation/update/command_spec.rb +4 -0
- data/spec/mongo/operation/update/op_msg_spec.rb +25 -20
- data/spec/mongo/operation/update_spec.rb +7 -7
- data/spec/mongo/operation/update_user_spec.rb +1 -1
- data/spec/mongo/protocol/compressed_spec.rb +2 -3
- data/spec/mongo/protocol/delete_spec.rb +9 -8
- data/spec/mongo/protocol/get_more_spec.rb +9 -8
- data/spec/mongo/protocol/insert_spec.rb +9 -8
- data/spec/mongo/protocol/kill_cursors_spec.rb +6 -5
- data/spec/mongo/protocol/msg_spec.rb +57 -53
- data/spec/mongo/protocol/query_spec.rb +12 -12
- data/spec/mongo/protocol/registry_spec.rb +1 -1
- data/spec/mongo/protocol/reply_spec.rb +1 -1
- data/spec/mongo/protocol/update_spec.rb +10 -9
- data/spec/mongo/retryable_spec.rb +71 -70
- data/spec/mongo/server/app_metadata_shared.rb +56 -0
- data/spec/mongo/server/app_metadata_spec.rb +8 -1
- data/spec/mongo/server/connection_auth_spec.rb +31 -12
- data/spec/mongo/server/connection_pool_spec.rb +1 -32
- data/spec/mongo/server/connection_spec.rb +143 -74
- data/spec/mongo/server/monitor/app_metadata_spec.rb +8 -1
- data/spec/mongo/server/monitor/connection_spec.rb +7 -81
- data/spec/mongo/server/monitor_spec.rb +76 -17
- data/spec/mongo/server/round_trip_time_averager_spec.rb +5 -3
- data/spec/mongo/server_selector/nearest_spec.rb +1 -0
- data/spec/mongo/server_selector/primary_preferred_spec.rb +1 -0
- data/spec/mongo/server_selector/primary_spec.rb +18 -0
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +18 -1
- data/spec/mongo/server_selector/secondary_spec.rb +1 -0
- data/spec/mongo/server_selector_spec.rb +0 -1
- data/spec/mongo/session/session_pool_spec.rb +7 -3
- data/spec/mongo/socket/ssl_spec.rb +134 -100
- data/spec/mongo/socket/tcp_spec.rb +3 -11
- data/spec/mongo/socket/unix_spec.rb +2 -2
- data/spec/mongo/socket_spec.rb +9 -9
- data/spec/mongo/srv/monitor_spec.rb +88 -69
- data/spec/mongo/timeout_spec.rb +39 -0
- data/spec/mongo/uri/srv_protocol_spec.rb +2 -2
- data/spec/mongo/uri_spec.rb +74 -12
- data/spec/mongo/write_concern_spec.rb +13 -1
- data/spec/{support → runners}/auth.rb +19 -7
- data/spec/runners/change_streams/outcome.rb +42 -0
- data/spec/runners/change_streams/spec.rb +57 -0
- data/spec/runners/change_streams/test.rb +229 -0
- data/spec/{support → runners}/cmap.rb +1 -1
- data/spec/{support → runners}/cmap/verifier.rb +1 -1
- data/spec/{support → runners}/command_monitoring.rb +2 -2
- data/spec/runners/connection_string.rb +359 -4
- data/spec/{support → runners}/crud.rb +11 -11
- data/spec/{support → runners}/crud/context.rb +1 -1
- data/spec/{support → runners}/crud/operation.rb +127 -33
- data/spec/{support → runners}/crud/outcome.rb +1 -1
- data/spec/{support → runners}/crud/requirement.rb +1 -1
- data/spec/{support → runners}/crud/spec.rb +13 -1
- data/spec/{support → runners}/crud/test.rb +8 -26
- data/spec/runners/crud/test_base.rb +69 -0
- data/spec/{support → runners}/crud/verifier.rb +29 -13
- data/spec/{support → runners}/gridfs.rb +1 -1
- data/spec/{support/server_discovery_and_monitoring.rb → runners/sdam.rb} +41 -22
- data/spec/runners/sdam/verifier.rb +26 -8
- data/spec/{support → runners}/sdam_monitoring.rb +1 -1
- data/spec/{support → runners}/server_selection.rb +0 -0
- data/spec/{support → runners}/server_selection_rtt.rb +0 -0
- data/spec/{support → runners}/transactions.rb +10 -13
- data/spec/{support → runners}/transactions/context.rb +1 -1
- data/spec/{support → runners}/transactions/operation.rb +5 -1
- data/spec/{support → runners}/transactions/spec.rb +1 -1
- data/spec/{support → runners}/transactions/test.rb +82 -56
- data/spec/spec_helper.rb +0 -5
- data/spec/spec_tests/auth_spec.rb +5 -3
- data/spec/spec_tests/change_streams_spec.rb +39 -4
- data/spec/spec_tests/client_side_encryption_spec.rb +11 -0
- data/spec/spec_tests/cmap_spec.rb +5 -0
- data/spec/spec_tests/command_monitoring_spec.rb +3 -0
- data/spec/spec_tests/connection_string_spec.rb +3 -1
- data/spec/spec_tests/crud_spec.rb +2 -0
- data/spec/spec_tests/data/auth/connection-string.yml +69 -0
- data/spec/spec_tests/data/change_streams/change-streams-errors.yml +30 -0
- data/spec/spec_tests/data/change_streams/change-streams-resume-errorLabels.yml +1105 -0
- data/spec/spec_tests/data/change_streams/change-streams-resume-whitelist.yml +1107 -0
- data/spec/spec_tests/data/change_streams/change-streams.yml +5 -4
- data/spec/spec_tests/data/client_side_encryption/aggregate.yml +134 -0
- data/spec/spec_tests/data/client_side_encryption/badQueries.yml +526 -0
- data/spec/spec_tests/data/client_side_encryption/badSchema.yml +73 -0
- data/spec/spec_tests/data/client_side_encryption/basic.yml +116 -0
- data/spec/spec_tests/data/client_side_encryption/bulk.yml +88 -0
- data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +100 -0
- data/spec/spec_tests/data/client_side_encryption/bypassedCommand.yml +42 -0
- data/spec/spec_tests/data/client_side_encryption/count.yml +61 -0
- data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +59 -0
- data/spec/spec_tests/data/client_side_encryption/delete.yml +105 -0
- data/spec/spec_tests/data/client_side_encryption/distinct.yml +73 -0
- data/spec/spec_tests/data/client_side_encryption/explain.yml +64 -0
- data/spec/spec_tests/data/client_side_encryption/find.yml +119 -0
- data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +57 -0
- data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +57 -0
- data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +57 -0
- data/spec/spec_tests/data/client_side_encryption/getMore.yml +68 -0
- data/spec/spec_tests/data/client_side_encryption/insert.yml +102 -0
- data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +71 -0
- data/spec/spec_tests/data/client_side_encryption/localKMS.yml +54 -0
- data/spec/spec_tests/data/client_side_encryption/localSchema.yml +72 -0
- data/spec/spec_tests/data/client_side_encryption/malformedCiphertext.yml +69 -0
- data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +20 -0
- data/spec/spec_tests/data/client_side_encryption/missingKey.yml +49 -0
- data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +64 -0
- data/spec/spec_tests/data/client_side_encryption/types.yml +527 -0
- data/spec/spec_tests/data/client_side_encryption/unsupportedCommand.yml +25 -0
- data/spec/spec_tests/data/client_side_encryption/updateMany.yml +77 -0
- data/spec/spec_tests/data/client_side_encryption/updateOne.yml +171 -0
- data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +1 -1
- data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +33 -11
- data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-clientError.yml +63 -0
- data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-serverError.yml +92 -0
- data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint.yml +103 -0
- data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-clientError.yml +90 -0
- data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-serverError.yml +147 -0
- data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint.yml +164 -0
- data/spec/spec_tests/data/crud_v2/deleteMany-hint-clientError.yml +43 -0
- data/spec/spec_tests/data/crud_v2/deleteMany-hint-serverError.yml +62 -0
- data/spec/spec_tests/data/crud_v2/deleteMany-hint.yml +58 -0
- data/spec/spec_tests/data/crud_v2/deleteOne-hint-clientError.yml +41 -0
- data/spec/spec_tests/data/crud_v2/deleteOne-hint-serverError.yml +60 -0
- data/spec/spec_tests/data/crud_v2/deleteOne-hint.yml +57 -0
- data/spec/spec_tests/data/crud_v2/find-allowdiskuse-clientError.yml +28 -0
- data/spec/spec_tests/data/crud_v2/find-allowdiskuse-serverError.yml +44 -0
- data/spec/spec_tests/data/crud_v2/find-allowdiskuse.yml +50 -0
- data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-clientError.yml +45 -0
- data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-serverError.yml +60 -0
- data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint.yml +56 -0
- data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-clientError.yml +40 -0
- data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-serverError.yml +59 -0
- data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint.yml +55 -0
- data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-clientError.yml +40 -0
- data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-serverError.yml +58 -0
- data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint.yml +55 -0
- data/spec/spec_tests/data/crud_v2/replaceOne-hint.yml +61 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-delete-hint-clientError.yml +60 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-update-hint-clientError.yml +88 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-deleteMany-hint-clientError.yml +40 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-deleteOne-hint-clientError.yml +38 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndDelete-hint-clientError.yml +42 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndReplace-hint-clientError.yml +40 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndUpdate-hint-clientError.yml +40 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-replaceOne-hint-clientError.yml +40 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-updateMany-hint-clientError.yml +43 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-updateOne-hint-clientError.yml +40 -0
- data/spec/spec_tests/data/crud_v2/updateMany-hint-clientError.yml +45 -0
- data/spec/spec_tests/data/crud_v2/updateMany-hint-serverError.yml +66 -0
- data/spec/spec_tests/data/crud_v2/updateMany-hint.yml +65 -0
- data/spec/spec_tests/data/crud_v2/updateOne-hint-clientError.yml +43 -0
- data/spec/spec_tests/data/crud_v2/updateOne-hint-serverError.yml +62 -0
- data/spec/spec_tests/data/crud_v2/updateOne-hint.yml +61 -0
- data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +65 -0
- data/spec/spec_tests/data/dns_seedlist_discovery/direct-connection-false.yml +10 -0
- data/spec/spec_tests/data/dns_seedlist_discovery/direct-connection-true.yml +5 -0
- data/spec/spec_tests/data/read_write_concern/connection-string/write-concern.yml +1 -4
- data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-2.6.yml +215 -0
- data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-3.2.yml +58 -0
- data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-3.4.yml +95 -0
- data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-4.2.yml +36 -0
- data/spec/spec_tests/data/retryable_writes/bulkWrite-errorLabels.yml +77 -0
- data/spec/spec_tests/data/retryable_writes/bulkWrite-serverErrors.yml +37 -0
- data/spec/spec_tests/data/retryable_writes/deleteOne-errorLabels.yml +48 -0
- data/spec/spec_tests/data/retryable_writes/deleteOne-serverErrors.yml +22 -0
- data/spec/spec_tests/data/retryable_writes/findOneAndDelete-errorLabels.yml +49 -0
- data/spec/spec_tests/data/retryable_writes/findOneAndDelete-serverErrors.yml +23 -0
- data/spec/spec_tests/data/retryable_writes/findOneAndReplace-errorLabels.yml +52 -0
- data/spec/spec_tests/data/retryable_writes/findOneAndReplace-serverErrors.yml +25 -0
- data/spec/spec_tests/data/retryable_writes/findOneAndUpdate-errorLabels.yml +52 -0
- data/spec/spec_tests/data/retryable_writes/findOneAndUpdate-serverErrors.yml +24 -0
- data/spec/spec_tests/data/retryable_writes/insertMany-errorLabels.yml +54 -0
- data/spec/spec_tests/data/retryable_writes/insertMany-serverErrors.yml +24 -0
- data/spec/spec_tests/data/retryable_writes/insertOne-errorLabels.yml +44 -0
- data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +90 -0
- data/spec/spec_tests/data/retryable_writes/replaceOne-errorLabels.yml +53 -0
- data/spec/spec_tests/data/retryable_writes/replaceOne-serverErrors.yml +23 -0
- data/spec/spec_tests/data/retryable_writes/updateOne-errorLabels.yml +53 -0
- data/spec/spec_tests/data/retryable_writes/updateOne-serverErrors.yml +23 -0
- data/spec/spec_tests/data/sdam/errors/error_handling_handshake.yml +54 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-network-error.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-network-timeout-error.yml +37 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedAtShutdown.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedDueToReplStateChange.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotMaster.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotMasterNoSlaveOk.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotMasterOrSecondary.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-PrimarySteppedDown.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-ShutdownInProgress.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedAtShutdown.yml +51 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedDueToReplStateChange.yml +51 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotMaster.yml +51 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotMasterNoSlaveOk.yml +51 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotMasterOrSecondary.yml +51 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-PrimarySteppedDown.yml +51 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-ShutdownInProgress.yml +51 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedAtShutdown.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedDueToReplStateChange.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotMaster.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotMasterNoSlaveOk.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotMasterOrSecondary.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-PrimarySteppedDown.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-ShutdownInProgress.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/post-42-InterruptedAtShutdown.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/post-42-InterruptedDueToReplStateChange.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/post-42-NotMaster.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/post-42-NotMasterNoSlaveOk.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/post-42-NotMasterOrSecondary.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/post-42-PrimarySteppedDown.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/post-42-ShutdownInProgress.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedAtShutdown.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedDueToReplStateChange.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-NotMaster.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-NotMasterNoSlaveOk.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-NotMasterOrSecondary.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-PrimarySteppedDown.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-ShutdownInProgress.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedAtShutdown.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedDueToReplStateChange.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-NotMaster.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-NotMasterNoSlaveOk.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-NotMasterOrSecondary.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-PrimarySteppedDown.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-ShutdownInProgress.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedAtShutdown.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedDueToReplStateChange.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotMaster.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotMasterNoSlaveOk.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotMasterOrSecondary.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-PrimarySteppedDown.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-ShutdownInProgress.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-network.yml +80 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-timeout.yml +80 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedAtShutdown.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedDueToReplStateChange.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotMaster.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotMasterNoSlaveOk.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotMasterOrSecondary.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-PrimarySteppedDown.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-ShutdownInProgress.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-network.yml +80 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-timeout.yml +80 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedAtShutdown.yml +64 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedDueToReplStateChange.yml +64 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotMaster.yml +64 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotMasterNoSlaveOk.yml +64 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotMasterOrSecondary.yml +64 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-PrimarySteppedDown.yml +64 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-ShutdownInProgress.yml +64 -0
- data/spec/spec_tests/data/sdam/rs/compatible.yml +2 -0
- data/spec/spec_tests/data/sdam/rs/compatible_unknown.yml +2 -0
- data/spec/spec_tests/data/sdam/rs/discover_arbiters.yml +2 -2
- data/spec/spec_tests/data/sdam/rs/discover_arbiters_replicaset.yml +43 -0
- data/spec/spec_tests/data/sdam/rs/discover_ghost.yml +35 -0
- data/spec/spec_tests/data/sdam/rs/{ghost_discovered.yml → discover_ghost_replicaset.yml} +1 -1
- data/spec/spec_tests/data/sdam/rs/discover_hidden.yml +50 -0
- data/spec/spec_tests/data/sdam/rs/discover_hidden_replicaset.yml +50 -0
- data/spec/spec_tests/data/sdam/rs/discover_passives.yml +2 -2
- data/spec/spec_tests/data/sdam/rs/discover_passives_replicaset.yml +81 -0
- data/spec/spec_tests/data/sdam/rs/discover_primary.yml +2 -2
- data/spec/spec_tests/data/sdam/rs/discover_primary_replicaset.yml +42 -0
- data/spec/spec_tests/data/sdam/rs/discover_rsother.yml +49 -0
- data/spec/spec_tests/data/sdam/rs/{rsother_discovered.yml → discover_rsother_replicaset.yml} +1 -1
- data/spec/spec_tests/data/sdam/rs/discover_secondary.yml +2 -2
- data/spec/spec_tests/data/sdam/rs/discover_secondary_replicaset.yml +43 -0
- data/spec/spec_tests/data/sdam/rs/incompatible_arbiter.yml +2 -0
- data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +4 -4
- data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +3 -1
- data/spec/spec_tests/data/sdam/rs/primary_mismatched_me.yml +23 -27
- data/spec/spec_tests/data/sdam/rs/primary_mismatched_me_not_removed.yml +73 -0
- data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +79 -56
- data/spec/spec_tests/data/sdam/rs/repeated.yml +101 -0
- data/spec/spec_tests/data/sdam/rs/replicaset_rsnp.yml +20 -0
- data/spec/spec_tests/data/sdam/rs/{primary_address_change.yml → ruby_primary_address_change.yml} +2 -0
- 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
- data/spec/spec_tests/data/sdam/rs/secondary_mismatched_me.yml +3 -2
- data/spec/spec_tests/data/sdam/rs/too_new.yml +2 -0
- data/spec/spec_tests/data/sdam/rs/topology_version_equal.yml +66 -0
- data/spec/spec_tests/data/sdam/rs/topology_version_greater.yml +189 -0
- data/spec/spec_tests/data/sdam/rs/topology_version_less.yml +62 -0
- data/spec/spec_tests/data/sdam/sharded/discover_single_mongos.yml +23 -0
- data/spec/spec_tests/data/sdam/sharded/{primary_address_change.yml → ruby_primary_different_address.yml} +1 -1
- data/spec/spec_tests/data/sdam/sharded/{primary_mismatched_me.yml → ruby_primary_mismatched_me.yml} +1 -1
- data/spec/spec_tests/data/sdam/single/direct_connection_external_ip.yml +1 -1
- data/spec/spec_tests/data/sdam/single/direct_connection_mongos.yml +2 -2
- data/spec/spec_tests/data/sdam/single/direct_connection_replicaset.yml +22 -0
- data/spec/spec_tests/data/sdam/single/direct_connection_rsarbiter.yml +2 -2
- data/spec/spec_tests/data/sdam/single/direct_connection_rsprimary.yml +2 -2
- data/spec/spec_tests/data/sdam/single/direct_connection_rssecondary.yml +2 -2
- data/spec/spec_tests/data/sdam/single/direct_connection_slave.yml +1 -1
- data/spec/spec_tests/data/sdam/single/direct_connection_standalone.yml +2 -2
- data/spec/spec_tests/data/sdam/single/{unavailable_seed.yml → direct_connection_unavailable_seed.yml} +2 -2
- data/spec/spec_tests/data/sdam/single/direct_connection_wrong_set_name.yml +38 -0
- data/spec/spec_tests/data/sdam/{sharded/single_mongos.yml → single/discover_standalone.yml} +7 -6
- data/spec/spec_tests/data/sdam/single/discover_unavailable_seed.yml +28 -0
- data/spec/spec_tests/data/sdam/single/{primary_address_change.yml → ruby_primary_different_address.yml} +1 -1
- data/spec/spec_tests/data/sdam/single/{primary_mismatched_me.yml → ruby_primary_mismatched_me.yml} +1 -1
- data/spec/spec_tests/data/sdam/single/too_old_then_upgraded.yml +46 -0
- data/spec/spec_tests/data/sdam_monitoring/{replica_set_with_primary_change.yml → replica_set_primary_address_change.yml} +27 -5
- data/spec/spec_tests/data/sdam_monitoring/replica_set_with_me_mismatch.yml +26 -74
- data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +20 -16
- data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +73 -0
- data/spec/spec_tests/data/transactions/create-collection.yml +131 -0
- data/spec/spec_tests/data/transactions/create-index.yml +152 -0
- data/spec/spec_tests/data/transactions/error-labels.yml +87 -21
- data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +1 -0
- data/spec/spec_tests/data/transactions/pin-mongos.yml +2 -3
- data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +124 -0
- data/spec/spec_tests/data/transactions/retryable-abort.yml +17 -2
- data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +132 -0
- data/spec/spec_tests/data/transactions/retryable-commit.yml +24 -9
- data/spec/spec_tests/data/uri_options/auth-options.yml +10 -0
- data/spec/spec_tests/data/uri_options/connection-options.yml +43 -0
- data/spec/spec_tests/data/uri_options/ruby-auth-options.yml +12 -0
- data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +57 -0
- data/spec/spec_tests/data/uri_options/tls-options.yml +75 -4
- data/spec/spec_tests/dns_seedlist_discovery_spec.rb +3 -1
- data/spec/spec_tests/gridfs_spec.rb +2 -0
- data/spec/spec_tests/max_staleness_spec.rb +3 -1
- data/spec/spec_tests/read_write_concern_connection_string_spec.rb +3 -1
- data/spec/spec_tests/read_write_concern_operaton_spec.rb +10 -0
- data/spec/spec_tests/retryable_reads_spec.rb +2 -0
- data/spec/spec_tests/retryable_writes_spec.rb +8 -1
- data/spec/spec_tests/sdam_monitoring_spec.rb +3 -1
- data/spec/spec_tests/sdam_spec.rb +70 -1
- data/spec/spec_tests/server_selection_rtt_spec.rb +2 -0
- data/spec/spec_tests/server_selection_spec.rb +2 -0
- data/spec/spec_tests/transactions_api_spec.rb +5 -0
- data/spec/spec_tests/transactions_spec.rb +5 -0
- data/spec/spec_tests/uri_options_spec.rb +8 -8
- data/spec/stress/cleanup_spec.rb +43 -0
- data/spec/stress/connection_pool_stress_spec.rb +1 -5
- data/spec/stress/connection_pool_timing_spec.rb +9 -9
- data/spec/stress/fork_reconnect_stress_spec.rb +109 -0
- data/spec/support/authorization.rb +1 -11
- data/spec/support/aws_utils.rb +62 -0
- data/spec/support/aws_utils/base.rb +134 -0
- data/spec/support/aws_utils/inspector.rb +224 -0
- data/spec/support/aws_utils/orchestrator.rb +370 -0
- data/spec/support/aws_utils/provisioner.rb +360 -0
- data/spec/support/background_thread_registry.rb +6 -2
- data/spec/support/certificates/README.md +4 -0
- data/spec/support/certificates/server-second-level-bundle.pem +77 -77
- data/spec/support/certificates/server-second-level.crt +52 -52
- data/spec/support/certificates/server-second-level.key +25 -25
- data/spec/support/certificates/server-second-level.pem +77 -77
- data/spec/support/client_registry.rb +24 -27
- data/spec/support/cluster_config.rb +10 -1
- data/spec/support/cluster_tools.rb +11 -4
- data/spec/support/common_shortcuts.rb +55 -0
- data/spec/support/constraints.rb +43 -7
- data/spec/support/crypt.rb +154 -0
- data/spec/support/crypt/corpus/corpus-key-aws.json +33 -0
- data/spec/support/crypt/corpus/corpus-key-local.json +31 -0
- data/spec/support/crypt/corpus/corpus-schema.json +2057 -0
- data/spec/support/crypt/corpus/corpus.json +3657 -0
- data/spec/support/crypt/corpus/corpus_encrypted.json +4152 -0
- data/spec/support/crypt/data_keys/key_document_aws.json +34 -0
- data/spec/support/crypt/data_keys/key_document_local.json +31 -0
- data/spec/support/crypt/external/external-key.json +31 -0
- data/spec/support/crypt/external/external-schema.json +19 -0
- data/spec/support/crypt/limits/limits-doc.json +102 -0
- data/spec/support/crypt/limits/limits-key.json +31 -0
- data/spec/support/crypt/limits/limits-schema.json +1405 -0
- data/spec/support/crypt/schema_maps/schema_map_aws.json +17 -0
- data/spec/support/crypt/schema_maps/schema_map_aws_key_alt_names.json +12 -0
- data/spec/support/crypt/schema_maps/schema_map_local.json +18 -0
- data/spec/support/crypt/schema_maps/schema_map_local_key_alt_names.json +12 -0
- data/spec/support/event_subscriber.rb +94 -84
- data/spec/support/lite_constraints.rb +74 -1
- data/spec/support/matchers.rb +19 -0
- data/spec/support/shared/protocol.rb +2 -0
- data/spec/support/shared/scram_conversation.rb +100 -0
- data/spec/support/shared/server_selector.rb +81 -1
- data/spec/support/shared/session.rb +29 -21
- data/spec/support/spec_config.rb +92 -22
- data/spec/support/spec_setup.rb +8 -4
- data/spec/support/utils.rb +263 -32
- metadata +1285 -682
- metadata.gz.sig +0 -0
- data/lib/mongo/cluster/srv_monitor.rb +0 -127
- data/lib/mongo/server/connectable.rb +0 -107
- data/lib/mongo/srv/warning_result.rb +0 -35
- data/spec/enterprise_auth/kerberos_spec.rb +0 -58
- data/spec/mongo/cluster/srv_monitor_spec.rb +0 -214
- data/spec/mongo/operation/read_preference_spec.rb +0 -245
- data/spec/support/change_streams.rb +0 -262
- data/spec/support/change_streams/operation.rb +0 -89
- data/spec/support/connection_string.rb +0 -354
- data/spec/support/crud/test_base.rb +0 -22
data/lib/mongo/uri.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright (C) 2014-
|
|
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.
|
|
@@ -215,10 +216,22 @@ module Mongo
|
|
|
215
216
|
# @example Get the uri object.
|
|
216
217
|
# URI.get(string)
|
|
217
218
|
#
|
|
219
|
+
# @param [ String ] string The URI to parse.
|
|
220
|
+
# @param [ Hash ] opts The options.
|
|
221
|
+
#
|
|
222
|
+
# @option options [ Logger ] :logger A custom logger to use.
|
|
223
|
+
#
|
|
218
224
|
# @return [URI, URI::SRVProtocol] The uri object.
|
|
219
225
|
#
|
|
220
226
|
# @since 2.5.0
|
|
221
227
|
def self.get(string, opts = {})
|
|
228
|
+
unless string
|
|
229
|
+
raise Error::InvalidURI.new(string, 'URI must be a string, not nil.')
|
|
230
|
+
end
|
|
231
|
+
if string.empty?
|
|
232
|
+
raise Error::InvalidURI.new(string, 'Cannot parse an empty URI.')
|
|
233
|
+
end
|
|
234
|
+
|
|
222
235
|
scheme, _, remaining = string.partition(SCHEME_DELIM)
|
|
223
236
|
case scheme
|
|
224
237
|
when MONGODB_SCHEME
|
|
@@ -257,13 +270,22 @@ module Mongo
|
|
|
257
270
|
# @example Create the new URI.
|
|
258
271
|
# URI.new('mongodb://localhost:27017')
|
|
259
272
|
#
|
|
260
|
-
# @param [ String ] string The
|
|
273
|
+
# @param [ String ] string The URI to parse.
|
|
261
274
|
# @param [ Hash ] options The options.
|
|
262
275
|
#
|
|
276
|
+
# @option options [ Logger ] :logger A custom logger to use.
|
|
277
|
+
#
|
|
263
278
|
# @raise [ Error::InvalidURI ] If the uri does not match the spec.
|
|
264
279
|
#
|
|
265
280
|
# @since 2.0.0
|
|
266
281
|
def initialize(string, options = {})
|
|
282
|
+
unless string
|
|
283
|
+
raise Error::InvalidURI.new(string, 'URI must be a string, not nil.')
|
|
284
|
+
end
|
|
285
|
+
if string.empty?
|
|
286
|
+
raise Error::InvalidURI.new(string, 'Cannot parse an empty URI.')
|
|
287
|
+
end
|
|
288
|
+
|
|
267
289
|
@string = string
|
|
268
290
|
@options = options
|
|
269
291
|
parsed_scheme, _, remaining = string.partition(SCHEME_DELIM)
|
|
@@ -274,34 +296,7 @@ module Mongo
|
|
|
274
296
|
raise_invalid_error!('No hosts in the URI')
|
|
275
297
|
end
|
|
276
298
|
parse!(remaining)
|
|
277
|
-
|
|
278
|
-
# The URI options spec requires that we raise an error if there are conflicting values of
|
|
279
|
-
# 'tls' and 'ssl'. In order to fulfill this, we parse the values of each instance into an
|
|
280
|
-
# array; assuming all values in the array are the same, we replace the array with that value.
|
|
281
|
-
unless @uri_options[:ssl].nil? || @uri_options[:ssl].empty?
|
|
282
|
-
unless @uri_options[:ssl].uniq.length == 1
|
|
283
|
-
raise_invalid_error_no_fmt!("all instances of 'tls' and 'ssl' must have the same value")
|
|
284
|
-
end
|
|
285
|
-
|
|
286
|
-
@uri_options[:ssl] = @uri_options[:ssl].first
|
|
287
|
-
end
|
|
288
|
-
|
|
289
|
-
# Check for conflicting TLS insecure options.
|
|
290
|
-
unless @uri_options[:ssl_verify].nil?
|
|
291
|
-
unless @uri_options[:ssl_verify_certificate].nil?
|
|
292
|
-
raise_invalid_error_no_fmt!("'tlsInsecure' and 'tlsAllowInvalidCertificates' cannot both be specified")
|
|
293
|
-
end
|
|
294
|
-
|
|
295
|
-
unless @uri_options[:ssl_verify_hostname].nil?
|
|
296
|
-
raise_invalid_error_no_fmt!("tlsInsecure' and 'tlsAllowInvalidHostnames' cannot both be specified")
|
|
297
|
-
end
|
|
298
|
-
end
|
|
299
|
-
|
|
300
|
-
# Since we know that the only URI option that sets :ssl_cert is "tlsCertificateKeyFile", any
|
|
301
|
-
# value set for :ssl_cert must also be set for :ssl_key.
|
|
302
|
-
if @uri_options[:ssl_cert]
|
|
303
|
-
@uri_options[:ssl_key] = @uri_options[:ssl_cert]
|
|
304
|
-
end
|
|
299
|
+
validate_uri_options!
|
|
305
300
|
end
|
|
306
301
|
|
|
307
302
|
# Get the credentials provided in the URI.
|
|
@@ -406,9 +401,6 @@ module Mongo
|
|
|
406
401
|
if value.nil?
|
|
407
402
|
raise_invalid_error!("Option #{key} has no value")
|
|
408
403
|
end
|
|
409
|
-
if value.index('=')
|
|
410
|
-
raise_invalid_error!("Value for option #{key} contains the key/value delimiter (=): #{value}")
|
|
411
|
-
end
|
|
412
404
|
key = decode(key)
|
|
413
405
|
value = decode(value)
|
|
414
406
|
add_uri_option(key, value, uri_options)
|
|
@@ -454,11 +446,11 @@ module Mongo
|
|
|
454
446
|
end
|
|
455
447
|
|
|
456
448
|
def decode(value)
|
|
457
|
-
::URI.
|
|
449
|
+
::URI::DEFAULT_PARSER.unescape(value)
|
|
458
450
|
end
|
|
459
451
|
|
|
460
452
|
def encode(value)
|
|
461
|
-
|
|
453
|
+
CGI.escape(value).gsub('+', '%20')
|
|
462
454
|
end
|
|
463
455
|
|
|
464
456
|
# Hash for storing map of URI option parameters to conversion strategies
|
|
@@ -515,6 +507,7 @@ module Mongo
|
|
|
515
507
|
uri_option 'tlsinsecure', :ssl_verify, :type => :inverse_bool
|
|
516
508
|
|
|
517
509
|
# Topology options
|
|
510
|
+
uri_option 'directconnection', :direct_connection, type: :bool
|
|
518
511
|
uri_option 'connect', :connect, type: :symbol
|
|
519
512
|
|
|
520
513
|
# Auth Options
|
|
@@ -651,7 +644,7 @@ module Mongo
|
|
|
651
644
|
# @return [ Hash ] The auth mechanism properties hash.
|
|
652
645
|
def auth_mech_props(value)
|
|
653
646
|
properties = hash_extractor('authMechanismProperties', value)
|
|
654
|
-
if properties[:canonicalize_host_name]
|
|
647
|
+
if properties && properties[:canonicalize_host_name]
|
|
655
648
|
properties.merge!(canonicalize_host_name:
|
|
656
649
|
properties[:canonicalize_host_name].downcase == 'true')
|
|
657
650
|
end
|
|
@@ -826,15 +819,16 @@ module Mongo
|
|
|
826
819
|
#
|
|
827
820
|
# @return [ Hash ] The hash built from the string.
|
|
828
821
|
def hash_extractor(name, value)
|
|
829
|
-
|
|
822
|
+
h = {}
|
|
823
|
+
value.split(',').each do |tag|
|
|
830
824
|
k, v = tag.split(':')
|
|
831
825
|
if v.nil?
|
|
832
|
-
log_warn("Invalid hash value for #{name}: #{value}")
|
|
833
|
-
return nil
|
|
826
|
+
log_warn("Invalid hash value for #{name}: key `#{k}` does not have a value: #{value}")
|
|
834
827
|
end
|
|
835
828
|
|
|
836
|
-
|
|
829
|
+
h[k.downcase.to_sym] = v
|
|
837
830
|
end
|
|
831
|
+
h
|
|
838
832
|
end
|
|
839
833
|
|
|
840
834
|
# Extract values from the string and put them into an array.
|
|
@@ -845,6 +839,55 @@ module Mongo
|
|
|
845
839
|
def array(value)
|
|
846
840
|
value.split(',')
|
|
847
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
|
|
848
891
|
end
|
|
849
892
|
end
|
|
850
893
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright (C) 2017-
|
|
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.
|
|
@@ -17,7 +17,7 @@ module Mongo
|
|
|
17
17
|
class URI
|
|
18
18
|
|
|
19
19
|
# Parser for a URI using the mongodb+srv protocol, which specifies a DNS to query for SRV records.
|
|
20
|
-
# The driver will query the DNS server for SRV records on
|
|
20
|
+
# The driver will query the DNS server for SRV records on <hostname>.<domainname>,
|
|
21
21
|
# prefixed with _mongodb._tcp
|
|
22
22
|
# The SRV records can then be used as the seedlist for a Mongo::Client.
|
|
23
23
|
# The driver also queries for a TXT record providing default connection string options.
|
|
@@ -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
|
data/lib/mongo/version.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright (C) 2014-
|
|
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.
|
|
20
|
+
VERSION = '2.13.0.beta1'
|
|
21
21
|
end
|
data/lib/mongo/write_concern.rb
CHANGED
data/mongo.gemspec
CHANGED
|
@@ -8,7 +8,6 @@ Gem::Specification.new do |s|
|
|
|
8
8
|
s.platform = Gem::Platform::RUBY
|
|
9
9
|
|
|
10
10
|
s.authors = ['Tyler Brock', 'Emily Stolfo', 'Durran Jordan']
|
|
11
|
-
s.email = 'mongodb-dev@googlegroups.com'
|
|
12
11
|
s.homepage = 'https://docs.mongodb.com/ruby-driver/'
|
|
13
12
|
s.summary = 'Ruby driver for MongoDB'
|
|
14
13
|
s.description = 'A Ruby driver for MongoDB'
|
|
@@ -19,11 +18,10 @@ Gem::Specification.new do |s|
|
|
|
19
18
|
'changelog_uri' => 'https://github.com/mongodb/mongo-ruby-driver/releases',
|
|
20
19
|
'documentation_uri' => 'https://docs.mongodb.com/ruby-driver/',
|
|
21
20
|
'homepage_uri' => 'https://docs.mongodb.com/ruby-driver/',
|
|
22
|
-
'mailing_list_uri' => 'https://groups.google.com/group/mongodb-user',
|
|
23
21
|
'source_code_uri' => 'https://github.com/mongodb/mongo-ruby-driver',
|
|
24
22
|
}
|
|
25
23
|
|
|
26
|
-
if File.
|
|
24
|
+
if File.exist?('gem-private_key.pem')
|
|
27
25
|
s.signing_key = 'gem-private_key.pem'
|
|
28
26
|
s.cert_chain = ['gem-public_cert.pem']
|
|
29
27
|
else
|
|
@@ -40,5 +38,5 @@ Gem::Specification.new do |s|
|
|
|
40
38
|
|
|
41
39
|
s.required_ruby_version = ">= 2.3"
|
|
42
40
|
|
|
43
|
-
s.add_dependency 'bson', '>=4.
|
|
41
|
+
s.add_dependency 'bson', '>=4.8.2', '<5.0.0'
|
|
44
42
|
end
|
|
@@ -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.
|