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
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
# Testing AWS Authentication
|
|
2
|
+
|
|
3
|
+
## Server Configuration
|
|
4
|
+
|
|
5
|
+
AWS authentication requires the following to be done on the server side:
|
|
6
|
+
|
|
7
|
+
1. The AWS authentication mechanism must be enabled on the server. This
|
|
8
|
+
is done by adding `MONGODB-AWS` to the values in `authenticationMechanisms`
|
|
9
|
+
server parameter.
|
|
10
|
+
|
|
11
|
+
2. A user must be created in the `$external` database with the ARN matching
|
|
12
|
+
the IAM user or role that the client will authenticate as.
|
|
13
|
+
|
|
14
|
+
Note that the server does not need to have AWS keys provided to it - it
|
|
15
|
+
uses the keys that the client provides during authentication.
|
|
16
|
+
|
|
17
|
+
An easy way to configure the deployment in the required fashion is to
|
|
18
|
+
configure the deployment to accept both password authentication and
|
|
19
|
+
AWS authentication, and add a bootstrap user:
|
|
20
|
+
|
|
21
|
+
mlaunch init --single --auth --username root --password toor \
|
|
22
|
+
--setParameter authenticationMechanisms=MONGODB-AWS,SCRAM-SHA-1,SCRAM-SHA-256 \
|
|
23
|
+
--dir /tmp/db
|
|
24
|
+
|
|
25
|
+
Then connect as the bootstrap user and create AWS-mapped users:
|
|
26
|
+
|
|
27
|
+
mongo mongodb://root:toor@localhost:27017
|
|
28
|
+
|
|
29
|
+
# In the mongo shell:
|
|
30
|
+
use $external
|
|
31
|
+
db.createUser({
|
|
32
|
+
user: 'arn:aws:iam::1234567890:user/test',
|
|
33
|
+
roles: [{role:'root', db:'admin'}]})
|
|
34
|
+
|
|
35
|
+
The ARN can be retrieved from the AWS management console. Alternatively,
|
|
36
|
+
if the IAM user's access and secret keys are known, trying to authenticate
|
|
37
|
+
as the user will log the user's ARN into the server log when authentication
|
|
38
|
+
fails; this ARN can be then used to create the server user.
|
|
39
|
+
|
|
40
|
+
With the server user created, it is possible to authenticate using AWS.
|
|
41
|
+
The following example uses regular user credentials for an IAM user
|
|
42
|
+
created as described in the next section;
|
|
43
|
+
|
|
44
|
+
mongo 'mongodb://AKIAAAAAAAAAAAA:t9t2mawssecretkey@localhost:27017/?authMechanism=MONGODB-AWS&authsource=$external'
|
|
45
|
+
|
|
46
|
+
To authenticate, provide the IAM user's access key id as the username and
|
|
47
|
+
secret access key as the password. Note that the username and the password
|
|
48
|
+
must be percent-escaped when they are passed in the URI as the examples here
|
|
49
|
+
show. Also note that the user's ARN is not explicitly specified by the client
|
|
50
|
+
during authentication - the server determines the ARN from the acess
|
|
51
|
+
key id and the secret access key provided by the client.
|
|
52
|
+
|
|
53
|
+
## Provisioning Tools
|
|
54
|
+
|
|
55
|
+
The Ruby driver includes tools that set up the resources needed to test
|
|
56
|
+
AWS authentication. These are exposed by the `.evergreen/aws` script.
|
|
57
|
+
To use this script, it must be provided AWS credentials and the region
|
|
58
|
+
to operate in. The credentials and region can be given as command-line
|
|
59
|
+
arguments or set in the environment, as follows:
|
|
60
|
+
|
|
61
|
+
export AWS_ACCESS_KEY_ID=AKIAYOURACCESSKEY
|
|
62
|
+
export AWS_SECRET_ACCESS_KEY=YOURSECRETACCESSKEY
|
|
63
|
+
export AWS_REGION=us-east-1
|
|
64
|
+
|
|
65
|
+
If you also perform manual testing (for example by following some of the
|
|
66
|
+
instructions in this file), ensure AWS_SESSION_TOKEN is not set
|
|
67
|
+
unless you are intending to invoke the `.evergreen/aws` script with
|
|
68
|
+
temporary credentials:
|
|
69
|
+
|
|
70
|
+
unset AWS_SESSION_TOKEN
|
|
71
|
+
|
|
72
|
+
Note that [AWS CLI](https://aws.amazon.com/cli/) uses a different environment
|
|
73
|
+
variable for the region - `AWS_DEFAULT_REGION` rather than `AWS_REGION`.
|
|
74
|
+
If you also intend to use the AWS CLI, execute:
|
|
75
|
+
|
|
76
|
+
export AWS_DEFAULT_REGION=$AWS_REGION
|
|
77
|
+
|
|
78
|
+
To verify that credentials are correctly set in the environment, you can
|
|
79
|
+
perform the following operations:
|
|
80
|
+
|
|
81
|
+
# Test driver tooling
|
|
82
|
+
./.evergreen/aws key-pairs
|
|
83
|
+
|
|
84
|
+
# Test AWS CLI
|
|
85
|
+
aws sts get-caller-identity
|
|
86
|
+
|
|
87
|
+
Alternatively, to provide the credentials on each call to the driver's
|
|
88
|
+
`aws` script, use the `-a` and `-s` arguments as follows:
|
|
89
|
+
|
|
90
|
+
./.evergreen/aws -a KEY-ID -s SECRET-KEY key-pairs
|
|
91
|
+
|
|
92
|
+
## Common Setup
|
|
93
|
+
|
|
94
|
+
In order to test all AWS authentication scenarios, a large number of AWS
|
|
95
|
+
objects needs to be configured. This configuration is split into two parts:
|
|
96
|
+
common setup and scenario-specific setup.
|
|
97
|
+
|
|
98
|
+
The common setup is performed by running:
|
|
99
|
+
|
|
100
|
+
./.evergreen/aws setup-resources
|
|
101
|
+
|
|
102
|
+
This creates resources like security groups, IAM users and CloudWatch
|
|
103
|
+
log groups that do not cost money. It is possible to test authentication
|
|
104
|
+
with regular credentials and temporary credentials obtained via an
|
|
105
|
+
AssumeRole request using these resources. In order to test authentication
|
|
106
|
+
from an EC2 instance or an ECS task, the instance and/or the task need
|
|
107
|
+
to be started which costs money and is performed as separate steps as
|
|
108
|
+
detailed below.
|
|
109
|
+
|
|
110
|
+
## Regular Credentials - IAM User
|
|
111
|
+
|
|
112
|
+
AWS authentication as a regular IAM user requires having an IAM user to
|
|
113
|
+
authenticate as. This user can be created using the AWS management console.
|
|
114
|
+
The IAM user requires no permissions, but it must have the programmatic
|
|
115
|
+
access enabled (i.e. have an access key ID and the secret access key).
|
|
116
|
+
|
|
117
|
+
An IAM user is created as part of the common setup described earlier.
|
|
118
|
+
To reset and retrieve the access key ID and secret access key for the
|
|
119
|
+
created user, run:
|
|
120
|
+
|
|
121
|
+
./.evergreen/aws reset-keys
|
|
122
|
+
|
|
123
|
+
Note that if the user already had an access key, the old credentials are
|
|
124
|
+
removed and replaced with new credentials.
|
|
125
|
+
|
|
126
|
+
Given the credentials for the test user, the URI for running the driver
|
|
127
|
+
test suite can be formed as follows:
|
|
128
|
+
|
|
129
|
+
export "MONGODB_URI=mongodb://$AWS_ACCESS_KEY_ID:$AWS_SECRET_ACCESS_KEY@localhost:27017/?authMechanism=MONGODB-AWS&authsource=$external"
|
|
130
|
+
|
|
131
|
+
## Temporary Credentials - AssumeRole Request
|
|
132
|
+
|
|
133
|
+
To test a user authenticating with an assumed role, you can follow
|
|
134
|
+
[the example provided in Amazon documentation](https://aws.amazon.com/premiumsupport/knowledge-center/iam-assume-role-cli/)
|
|
135
|
+
to set up the assumed role and related objects and obtain temporary credentials
|
|
136
|
+
or use the driver's tooling using the commands given below.
|
|
137
|
+
Since the temporary credentials expire, the role needs to be re-assumed
|
|
138
|
+
periodically during testing and the new credentials and session token retrieved.
|
|
139
|
+
|
|
140
|
+
If following the example in Amazon's documentation,
|
|
141
|
+
[jq](https://stedolan.github.io/jq/) can be used to efficiently place the
|
|
142
|
+
credentials from the AssumeRole request into the environment, as follows:
|
|
143
|
+
|
|
144
|
+
# Call given in the example guide
|
|
145
|
+
aws sts assume-role --role-arn arn:aws:iam::YOUR-ACCOUNT-ID:role/example-role --role-session-name AWSCLI-Session >~/.aws-assumed-role.json
|
|
146
|
+
|
|
147
|
+
# Extract the credentials
|
|
148
|
+
export AWS_ACCESS_KEY_ID=`jq .Credentials.AccessKeyId ~/.aws-assumed-role.json -r`
|
|
149
|
+
export AWS_SECRET_ACCESS_KEY=`jq .Credentials.SecretAccessKey ~/.aws-assumed-role.json -r`
|
|
150
|
+
export AWS_SESSION_TOKEN=`jq .Credentials.SessionToken ~/.aws-assumed-role.json -r`
|
|
151
|
+
|
|
152
|
+
Alternatively, the `./evergreen/aws` script can be used to assume the role.
|
|
153
|
+
By default, it will assume the role that `setup-resources` action configured.
|
|
154
|
+
|
|
155
|
+
Note: The ability to assume this role is granted to the
|
|
156
|
+
[IAM user](#regular-credentials-iam-user) that the provisioning tool creates.
|
|
157
|
+
Therefore the shell must be configured with credentials of the test user,
|
|
158
|
+
not with credentials of the master user that performed the provisioning.
|
|
159
|
+
|
|
160
|
+
To assume the role created by the common setup, run:
|
|
161
|
+
|
|
162
|
+
./.evergreen/aws assume-role
|
|
163
|
+
|
|
164
|
+
It is also possible to specify the ARN of the role to assume manually, if
|
|
165
|
+
you created the role using other means:
|
|
166
|
+
|
|
167
|
+
./.evergreen/aws assume-role ASSUME-ROLE-ARN
|
|
168
|
+
|
|
169
|
+
To place the credentials into the environment:
|
|
170
|
+
|
|
171
|
+
eval $(./.evergreen/aws assume-role)
|
|
172
|
+
export AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN
|
|
173
|
+
|
|
174
|
+
With the credentials in the environment, to verify that the role was assumed
|
|
175
|
+
and the credentials are complete and correct, perform a `GetCallerIdentity`
|
|
176
|
+
call:
|
|
177
|
+
|
|
178
|
+
aws sts get-caller-identity
|
|
179
|
+
|
|
180
|
+
Given the credentials for the test user, the URI for running the driver
|
|
181
|
+
test suite can be formed as follows:
|
|
182
|
+
|
|
183
|
+
export "MONGODB_URI=mongodb://$AWS_ACCESS_KEY_ID:$AWS_SECRET_ACCESS_KEY@localhost:27017/?authMechanism=MONGODB-AWS&authsource=$external&authMechanismProperties=AWS_SESSION_TOKEN:$AWS_SESSION_TOKEN"
|
|
184
|
+
|
|
185
|
+
## Temporary Credentials - EC2 Instance Role
|
|
186
|
+
|
|
187
|
+
To test authentication [using temporary credentials for an EC2 instance
|
|
188
|
+
role](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2.html),
|
|
189
|
+
an EC2 instance launched with an IAM role or an EC2 instance configured
|
|
190
|
+
with an instance profile is required. No permissions are needed for the
|
|
191
|
+
IAM role used with the EC2 instance.
|
|
192
|
+
|
|
193
|
+
To create an EC2 instance with an attached role using the AWS console:
|
|
194
|
+
|
|
195
|
+
1. Crate an IAM role that the instance will use. It is not necessary to
|
|
196
|
+
specify any permissions.
|
|
197
|
+
2. Launch an instance, choosing the IAM role created in the launch wizard.
|
|
198
|
+
|
|
199
|
+
To define an instance profile which allows adding and removing an IAM role
|
|
200
|
+
to/from an instance at runtime, follow Amazon documentation
|
|
201
|
+
[here](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#attach-iam-role).
|
|
202
|
+
To test temporary credentials obtained via an EC2 instance role in Evergreen,
|
|
203
|
+
an instance profile must be associated with the running instance as per
|
|
204
|
+
this guide.
|
|
205
|
+
|
|
206
|
+
The driver provides tooling to configure a suitable instance profile and
|
|
207
|
+
launch an EC2 instance that can have this instance profile attached to it.
|
|
208
|
+
|
|
209
|
+
The instance profile and associated IAM role are created by the common
|
|
210
|
+
setup described above. To launch an EC2 instance suitable for testing
|
|
211
|
+
authentication via an EC2 role, run:
|
|
212
|
+
|
|
213
|
+
./.evergreen/aws launch-ec2 path/to/ssh.key.pub
|
|
214
|
+
|
|
215
|
+
The `launch-ec2` command takes one argument which is the path to the
|
|
216
|
+
public key for the key pair to use for SSH access to the instance.
|
|
217
|
+
|
|
218
|
+
This script will output the instance ID of the launched instance. The
|
|
219
|
+
instance initially does not have an instance profile assigned; to assign
|
|
220
|
+
the instance profile created in the common setup to the instance, run:
|
|
221
|
+
|
|
222
|
+
./.evergreen/aws set-instance-profile i-instanceid
|
|
223
|
+
|
|
224
|
+
To remove the instance profile from the instance, run:
|
|
225
|
+
|
|
226
|
+
./.evergreen/aws clear-instance-profile i-instanceid
|
|
227
|
+
|
|
228
|
+
To provision the instance for running the driver's test suite via Docker, run:
|
|
229
|
+
|
|
230
|
+
ip=12.34.56.78
|
|
231
|
+
./.evergreen/provision-remote ubuntu@$ip docker
|
|
232
|
+
|
|
233
|
+
To run the AWS auth tests using the EC2 instance role credentials, run:
|
|
234
|
+
|
|
235
|
+
./.evergreen/test-docker-remote ubuntu@$ip \
|
|
236
|
+
MONGODB_VERSION=4.3 AUTH=aws-ec2 \
|
|
237
|
+
-s .evergreen/run-tests-aws-auth.sh \
|
|
238
|
+
-a .env.private
|
|
239
|
+
|
|
240
|
+
Note that if if you are not using MongoDB AWS account for testing, you
|
|
241
|
+
would need to specify MONGO_RUBY_DRIVER_AWS_AUTH_USER_ARN in your
|
|
242
|
+
`.env.private` file with the ARN of the user to add to MongoDB. The easiest
|
|
243
|
+
way to find out this value is to run the tests and note which username the
|
|
244
|
+
test suite is trying to authenticate as.
|
|
245
|
+
|
|
246
|
+
To terminate the instance, run:
|
|
247
|
+
|
|
248
|
+
./.evergreen/aws stop-ec2
|
|
249
|
+
|
|
250
|
+
## Temporary Credentials - ECS Task Role
|
|
251
|
+
|
|
252
|
+
The basic procedure for setting up an ECS cluster is described in
|
|
253
|
+
[this guide](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ECS_AWSCLI_Fargate.html).
|
|
254
|
+
For testing AWS auth, the ECS task must have a role assigned to it which is
|
|
255
|
+
covered in [this guide](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html)
|
|
256
|
+
and additionally [here](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_execution_IAM_role.html).
|
|
257
|
+
|
|
258
|
+
Although not required for testing AWS auth specifically, it is very helpful
|
|
259
|
+
for general troubleshooting of ECS provisioning to have log output from the
|
|
260
|
+
tasks. Logging to CloudWatch is covered by [this Amazon guide](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/QuickStartEC2Instance.html)
|
|
261
|
+
with these potentially helpful [additional](https://stackoverflow.com/questions/50397217/how-to-determine-the-cloudwatch-log-stream-for-a-fargate-service#50704804)
|
|
262
|
+
[resources](https://help.sumologic.com/03Send-Data/Collect-from-Other-Data-Sources/AWS_Fargate_log_collection).
|
|
263
|
+
A log group must be manually created, the steps for which are described
|
|
264
|
+
[here](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html).
|
|
265
|
+
|
|
266
|
+
Additional references:
|
|
267
|
+
|
|
268
|
+
- [Task definition CPU and memory values](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-task-definition.html)
|
|
269
|
+
|
|
270
|
+
The common setup creates all of the necessary prerequisites to test
|
|
271
|
+
authentication using ECS task credentials, which includes an empty ECS
|
|
272
|
+
cluster. To test authentication, a service needs to be created in the
|
|
273
|
+
ECS cluster that runs the SSH daemon, which can be done by running:
|
|
274
|
+
|
|
275
|
+
./.evergreen/aws launch-ecs path/to/ssh.key.pub
|
|
276
|
+
|
|
277
|
+
The `launch-ecs` command takes one argument which is the path to the
|
|
278
|
+
public key for the key pair to use for SSH access to the instance.
|
|
279
|
+
|
|
280
|
+
This script generally produces no output if it succeeds. As the service takes
|
|
281
|
+
some time to start, run the following command to check its status:
|
|
282
|
+
|
|
283
|
+
./.evergreen/aws ecs-status
|
|
284
|
+
|
|
285
|
+
The status output shows the tasks running in the ECS cluster ordered by their
|
|
286
|
+
generation, with the newest ones first. Event log for the cluster is displayed,
|
|
287
|
+
as well as event stream for the running task of the latest available generation
|
|
288
|
+
which includes the Docker execution output collected via CloudWatch.
|
|
289
|
+
The status output includes the public IP of the running task once it is
|
|
290
|
+
available, which can be used to SSH into the container and run the tests.
|
|
291
|
+
|
|
292
|
+
Note that when AWS auth from an ECS task is tested in Evergreen, the task is
|
|
293
|
+
accessed via its private IP; when the test is performed using the provisioning
|
|
294
|
+
tooling described in this document, the task is accessed via its public IP.
|
|
295
|
+
|
|
296
|
+
If the public IP address is in the `IP` shell variable, provision the task:
|
|
297
|
+
|
|
298
|
+
./.evergreen/provision-remote root@$IP local
|
|
299
|
+
|
|
300
|
+
To run the credentials retrieval test on the ECS task, execute:
|
|
301
|
+
|
|
302
|
+
./.evergreen/test-remote root@$IP env AUTH=aws-ecs RVM_RUBY=ruby-2.7 MONGODB_VERSION=4.3 TEST_CMD='rspec spec/integration/aws*spec.rb' .evergreen/run-tests.sh
|
|
303
|
+
|
|
304
|
+
To run the test again without rebuilding the remote environment, execute:
|
|
305
|
+
|
|
306
|
+
./.evergreen/test-remote -e root@$IP \
|
|
307
|
+
env AUTH=aws-ecs RVM_RUBY=ruby-2.7 sh -c '\
|
|
308
|
+
export PATH=`pwd`/rubies/ruby-2.7/bin:$PATH && \
|
|
309
|
+
eval export `strings /proc/1/environ |grep ^AWS_CONTAINER_CREDENTIALS_RELATIVE_URI` && \
|
|
310
|
+
bundle exec rspec spec/integration/aws*spec.rb'
|
|
311
|
+
|
|
312
|
+
Note that this command retrieves the value of `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`
|
|
313
|
+
from the PID 1 environment and places it into the current environment prior to
|
|
314
|
+
running the tests.
|
|
315
|
+
|
|
316
|
+
To terminate the AWS auth-related ECS tasks, run:
|
|
317
|
+
|
|
318
|
+
./.evergreen/aws stop-ecs
|
data/spec/README.md
CHANGED
|
@@ -20,8 +20,13 @@ configuration are given later in this document.
|
|
|
20
20
|
## MongoDB Server Deployment
|
|
21
21
|
|
|
22
22
|
The tests require a running MongoDB deployment, configured and started
|
|
23
|
-
externally to the test suite.
|
|
24
|
-
|
|
23
|
+
externally to the test suite.
|
|
24
|
+
|
|
25
|
+
Tests that are not appropriate for the running deployment will be skipped,
|
|
26
|
+
with one exception: the test suite assumes that fail points are enabled in
|
|
27
|
+
the deployment (see the Fail Points section below). Not every test uses fail
|
|
28
|
+
points, therefore it is possible to launch the server without fail points
|
|
29
|
+
being enabled and still pass many of the tests in the test suite.
|
|
25
30
|
|
|
26
31
|
## Starting MongoDB Deployment
|
|
27
32
|
|
|
@@ -41,7 +46,7 @@ launched as follows:
|
|
|
41
46
|
|
|
42
47
|
# Launch mongod in one terminal
|
|
43
48
|
mkdir /tmp/mdb
|
|
44
|
-
mongod --dbpath /tmp/mdb
|
|
49
|
+
mongod --dbpath /tmp/mdb --setParameter enableTestCommands=1
|
|
45
50
|
|
|
46
51
|
# Run tests in another terminal
|
|
47
52
|
rake
|
|
@@ -133,7 +138,7 @@ the top of the driver source tree:
|
|
|
133
138
|
|
|
134
139
|
mlaunch init --single --dir /tmp/mdb-ssl --sslMode requireSSL \
|
|
135
140
|
--sslPEMKeyFile `pwd`/spec/support/certificates/server.pem \
|
|
136
|
-
--sslCAFile `pwd`/spec/support/certificates/ca.
|
|
141
|
+
--sslCAFile `pwd`/spec/support/certificates/ca.crt \
|
|
137
142
|
--sslClientCertificate `pwd`/spec/support/certificates/client.pem
|
|
138
143
|
|
|
139
144
|
To test that the driver works when the server's certificate is signed by an
|
|
@@ -142,7 +147,7 @@ server certificate bundle:
|
|
|
142
147
|
|
|
143
148
|
mlaunch init --single --dir /tmp/mdb-ssl --sslMode requireSSL \
|
|
144
149
|
--sslPEMKeyFile `pwd`/spec/support/certificates/server-second-level-bundle.pem \
|
|
145
|
-
--sslCAFile `pwd`/spec/support/certificates/ca.
|
|
150
|
+
--sslCAFile `pwd`/spec/support/certificates/ca.crt \
|
|
146
151
|
--sslClientCertificate `pwd`/spec/support/certificates/client.pem
|
|
147
152
|
|
|
148
153
|
The driver's test suite is configured to verify certificates by default.
|
|
@@ -168,7 +173,7 @@ case a standalone server can be started as follows:
|
|
|
168
173
|
|
|
169
174
|
mlaunch init --single --dir /tmp/mdb-ssl --sslMode requireSSL \
|
|
170
175
|
--sslPEMKeyFile `pwd`/spec/support/certificates/server.pem \
|
|
171
|
-
--sslCAFile `pwd`/spec/support/certificates/ca.
|
|
176
|
+
--sslCAFile `pwd`/spec/support/certificates/ca.crt \
|
|
172
177
|
--sslAllowConnectionsWithoutCertificates \
|
|
173
178
|
--sslAllowInvalidCertificates
|
|
174
179
|
|
|
@@ -264,9 +269,203 @@ To run the test suite against such a server, run:
|
|
|
264
269
|
|
|
265
270
|
MONGODB_URI="mongodb://localhost:27017/?authMechanism=MONGODB-X509&tls=true&tlsCAFile=spec/support/certificates/ca.crt&tlsCertificateKeyFile=spec/support/certificates/client-x509.pem" rake
|
|
266
271
|
|
|
272
|
+
## Kerberos
|
|
273
|
+
|
|
274
|
+
The Kerberos-related functionality is packaged in a separate gem,
|
|
275
|
+
`mongo_kerberos`. To run any of the Kerberos tests, a special gemfile must
|
|
276
|
+
be used that references `mongo_kerberos`:
|
|
277
|
+
|
|
278
|
+
export BUNDLE_GEMFILE=gemfiles/mongo_kerberos.gemfile
|
|
279
|
+
bundle install
|
|
280
|
+
|
|
281
|
+
Ensure that BUNDLE_GEMFILE is set in the environment for both the
|
|
282
|
+
`bundle install` invocation and the `rake` / `rspec` invocation.
|
|
283
|
+
|
|
284
|
+
### Unit Tests
|
|
285
|
+
|
|
286
|
+
The driver test suite includes a number of Kerberos-related unit tests that
|
|
287
|
+
are skipped by default. To run them as part of the test suite, set the
|
|
288
|
+
`MONGO_RUBY_DRIVER_KERBEROS` environment variable to `1`, `yes` or `true`
|
|
289
|
+
as follows:
|
|
290
|
+
|
|
291
|
+
export MONGO_RUBY_DRIVER_KERBEROS=1
|
|
292
|
+
rake
|
|
293
|
+
|
|
294
|
+
Note that running the full test suite requires a MongoDB deployment. It is
|
|
295
|
+
possible to run just the Kerberos-related unit tests without provisioning a
|
|
296
|
+
MongoDB deployment; consult the `.evergreen/run-tests-kerberos-unit.sh` file
|
|
297
|
+
for the full list of relevant test files.
|
|
298
|
+
|
|
299
|
+
### Integration Tests
|
|
300
|
+
|
|
301
|
+
The driver test suite includes a number of Kerberos-related integration tests
|
|
302
|
+
in the `spec/kerberos` directory. These require a provisioned Kerberos
|
|
303
|
+
deployment and appropriately configured MongoDB deployment. One such deployment
|
|
304
|
+
is provided internally by MongoDB and is used in the driver's Evergreen
|
|
305
|
+
configuration; it is also possible to provision a test deployment locally,
|
|
306
|
+
either via the Docker tooling provided by the driver test suite or manually.
|
|
307
|
+
|
|
308
|
+
#### Via Docker
|
|
309
|
+
|
|
310
|
+
Run:
|
|
311
|
+
|
|
312
|
+
./.evergreen/test-on-docker -s .evergreen/run-tests-kerberos-integration.sh -pd rhel70
|
|
313
|
+
|
|
314
|
+
When `SASL_HOST` environment variable is not set, the Kerberos integration
|
|
315
|
+
test script `.evergreen/run-tests-kerberos-integration.sh` provisions a
|
|
316
|
+
local Kerberos deployment in the Docker container and configures the test suite
|
|
317
|
+
to use it.
|
|
318
|
+
|
|
319
|
+
Note: the tooling is currently set up to provision a working `rhel70`
|
|
320
|
+
container. Ubuntu distros are not presently supported.
|
|
321
|
+
|
|
322
|
+
#### Locally
|
|
323
|
+
|
|
324
|
+
The following additional environment variables must be set to run the
|
|
325
|
+
Kerberos integration tests:
|
|
326
|
+
|
|
327
|
+
- `MONGO_RUBY_DRIVER_KERBEROS_INTEGRATION=1`
|
|
328
|
+
- `SASL_HOST`: the FQDN host name of the MongoDB server that is configured to
|
|
329
|
+
use Kerberos. Note that this is NOT the Kerberos domain controller (KDC).
|
|
330
|
+
- `SASL_REALM`: the Kerberos realm. Depending on how Kerberos is configured,
|
|
331
|
+
this can be the same as or different from `SASL_HOST`. The Evergreen
|
|
332
|
+
configuration uses the same host and realm; Docker configuration provided
|
|
333
|
+
by the Ruby driver uses different host and realm.
|
|
334
|
+
- `SASL_PORT`: the port number that the Kerberized MongoDB server is
|
|
335
|
+
listening on.
|
|
336
|
+
- `SASL_USER`: the username to provide to MongoDB for authentication.
|
|
337
|
+
This must match the username of the principal.
|
|
338
|
+
- `SASL_DB`: the database that stores the user used for authentication. This
|
|
339
|
+
is the "auth soure" in MongoDB parlance. Normally this should be `$external`.
|
|
340
|
+
- `PRINCIPAL`: the Kerberos principal to use for authentication, in the
|
|
341
|
+
form of `username@realm`. Note that the realm is commonly uppercased.
|
|
342
|
+
- `KERBEROS_DB`: the database that the user has access to.
|
|
343
|
+
|
|
344
|
+
Note that the driver does not directly provide a password to the MongoDB
|
|
345
|
+
server when using Kerberos authentication, and because of this there is no
|
|
346
|
+
user password provided to the test suite either when Kerberos authentication
|
|
347
|
+
is used. Instead, there must be a local session established via e.g. `kinit`.
|
|
348
|
+
Consult the `.evergreen/run-tests-kerberos-integration.sh` file for details.
|
|
349
|
+
|
|
350
|
+
## Client-Side Encryption
|
|
351
|
+
|
|
352
|
+
NOTE: Client-side encryption tests require an enterprise build of MongoDB
|
|
353
|
+
server version 4.2 or higher. These builds of the MongoDB server come packaged with
|
|
354
|
+
mongocryptd, a daemon that is spawned by the driver during automatic encryption.
|
|
355
|
+
The client-side encryption tests require the mongocryptd binary to be in the
|
|
356
|
+
system path.
|
|
357
|
+
|
|
358
|
+
Download enterprise versions of MongoDB here: https://www.mongodb.com/download-center/enterprise
|
|
359
|
+
Read more about installing mongocryptd here: https://docs.mongodb.com/manual/reference/security-client-side-encryption-appendix/#mongocryptd
|
|
360
|
+
|
|
361
|
+
Install libmongocrypt on your machine:
|
|
362
|
+
|
|
363
|
+
Option 1: Download a pre-built binary
|
|
364
|
+
- Download a tarball of all libmongocrypt variations from this link:
|
|
365
|
+
https://s3.amazonaws.com/mciuploads/libmongocrypt/all/master/latest/libmongocrypt-all.tar.gz
|
|
366
|
+
- Unzip the file you downloaded. You will see a list of folders, each
|
|
367
|
+
corresponding to an operating system. Find the folder that matches
|
|
368
|
+
your operating system and open it.
|
|
369
|
+
- Inside that folder, open the folder called "nocrypto." In either the
|
|
370
|
+
lib or lb64 folder, you will find the libmongocrypt.so or
|
|
371
|
+
libmongocrypt.dylib or libmongocrypt.dll file, depending on your OS.
|
|
372
|
+
- Move that file to wherever you want to keep it on your machine.
|
|
373
|
+
|
|
374
|
+
Option 2: Build from source
|
|
375
|
+
- To build libmongocrypt from source, follow the instructions in the README on the libmongocrypt GitHub repo: https://github.com/mongodb/libmongocrypt
|
|
376
|
+
|
|
377
|
+
Create AWS KMS keys
|
|
378
|
+
Many of the Client-Side Encryption tests require that you have an encryption
|
|
379
|
+
master key hosted on AWS's Key Management Service. Set up a master key by following
|
|
380
|
+
these steps:
|
|
381
|
+
|
|
382
|
+
1. Sign up for an AWS account at this link if you don't already have one: https://aws.amazon.com/resources/create-account/
|
|
383
|
+
|
|
384
|
+
2. Create a new IAM user that you want to have permissions to access your new
|
|
385
|
+
master key by following this guide: the "Creating an Administrator IAM User and Group (Console)"
|
|
386
|
+
section of this guide: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html
|
|
387
|
+
|
|
388
|
+
3. Create an access key for your new IAM user and store the access key credentials
|
|
389
|
+
in environment variables on your local machine. Create an access key by following the
|
|
390
|
+
"Managing Access Keys (Console)" instructions in this guide:
|
|
391
|
+
https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_CreateAccessKey
|
|
392
|
+
Once an access key has been created, store the access key id and the access key
|
|
393
|
+
secret in environment variables. If you plan to frequently run Client-Side
|
|
394
|
+
Encryption tests, it may be a good idea to put these lines in your .bash_profile
|
|
395
|
+
or .bashrc file. Otherwise, you can run them in the terminal window where you
|
|
396
|
+
plan to run your tests.
|
|
397
|
+
|
|
398
|
+
```
|
|
399
|
+
export MONGO_RUBY_DRIVER_AWS_KEY="YOUR-ACCESS-KEY-ID"
|
|
400
|
+
export MONGO_RUBY_DRIVER_AWS_SECRET="YOUR-ACCESS-KEY-SECRET"
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
4. Create a new symmetric Customer Master Key (CMK) by following the "Creating Symmetric CMKs (Console)"
|
|
404
|
+
section of this guide: https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html
|
|
405
|
+
|
|
406
|
+
5. Store information about your CMK in the following environment variables:
|
|
407
|
+
|
|
408
|
+
a. **Region:** Find your AWS region by following this guide: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#using-regions-availability-zones-describe
|
|
409
|
+
(for example, your region might be "us-east-1" or "ap-south-2").
|
|
410
|
+
|
|
411
|
+
b. **Amazon Resource Name (ARN):** Read the following guide to learn more about ARNs
|
|
412
|
+
and how to view your key's ARN: https://docs.aws.amazon.com/kms/latest/developerguide/viewing-keys-console.html
|
|
413
|
+
|
|
414
|
+
Store these two pieces of information in environment variables. If you plan
|
|
415
|
+
to frequently run Client-Side Encryption tests, it may be a good idea to put
|
|
416
|
+
these lines in your .bash_profile or .bashrc file. Otherwise, you can run
|
|
417
|
+
them in the terminal window where you plan to run your tests.
|
|
418
|
+
|
|
419
|
+
```
|
|
420
|
+
export MONGO_RUBY_DRIVER_AWS_REGION="YOUR-AWS-REGION"
|
|
421
|
+
export MONGO_RUBY_DRIVER_AWS_ARN="YOUR-AWS-ARN"
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
6. Give your IAM user "Key administrator" and "Key user" privileges on your new CMK
|
|
425
|
+
by following the "Using the AWS Management Console Default View" section of this guide:
|
|
426
|
+
https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying.html
|
|
427
|
+
|
|
428
|
+
In one terminal, launch MongoDB:
|
|
429
|
+
|
|
430
|
+
```
|
|
431
|
+
mkdir /tmp/mdb
|
|
432
|
+
mongod --dbpath /tmp/mdb --setParameter enableTestCommands=1
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
In another terminal run the tests, making sure to set the `LIBMONGOCRYPT_PATH`
|
|
436
|
+
environment variable to the full path to the .so/.dll/.dylib
|
|
437
|
+
```
|
|
438
|
+
LIBMONGOCRYPT_PATH=/path/to/your/libmongocrypt/nocrypto/libmongocrypt.so bundle exec rake
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
If you would like to run the client-side encryption tests on a replica set or
|
|
442
|
+
sharded cluster, be aware that the driver will try to spawn the mongocryptd daemon on
|
|
443
|
+
port 27020 by default. If port 27020 is already in use by a mongod or mongos
|
|
444
|
+
process, spawning mongocryptd will fail, causing the tests to fail as well.
|
|
445
|
+
|
|
446
|
+
To avoid this problem, set the MONGO_RUBY_DRIVER_MONGOCRYPTD_PORT environment
|
|
447
|
+
variable to the port at which you would like the driver to spawn mongocryptd.
|
|
448
|
+
For example, to always have the mongocryptd process listen on port 27090:
|
|
449
|
+
|
|
450
|
+
```
|
|
451
|
+
export MONGO_RUBY_DRIVER_MONGOCRYPTD_PORT=27090
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
Keep in mind that this will only impact the behavior of the Ruby Driver test suite,
|
|
455
|
+
not the behavior of the driver itself.
|
|
456
|
+
|
|
267
457
|
## Compression
|
|
268
458
|
|
|
269
|
-
To
|
|
459
|
+
To test compression, set the `compressors` URI option:
|
|
460
|
+
|
|
461
|
+
MONGODB_URI="mongodb://localhost:27017/?compressors=zlib" rake
|
|
462
|
+
|
|
463
|
+
Note that as of this writing, the driver only supports zlib compression.
|
|
464
|
+
Servers 4.2+ enable zlib by default; to test older servers, explicitly enable
|
|
465
|
+
zlib compression when launching the server:
|
|
466
|
+
|
|
467
|
+
mongod --dbpath /tmp/mdb --setParameter enableTestCommands=1 \
|
|
468
|
+
--networkMessageCompressors snappy,zlib
|
|
270
469
|
|
|
271
470
|
## Other Options
|
|
272
471
|
|
|
@@ -291,11 +490,44 @@ set names:
|
|
|
291
490
|
However, as noted in the caveats section, changing the database name used by
|
|
292
491
|
the test suite is not supported.
|
|
293
492
|
|
|
493
|
+
## Special Tests
|
|
494
|
+
|
|
294
495
|
Some tests require internet connectivity, for example to test DNS seed lists
|
|
295
496
|
and SRV URIs. These tests can be skipped by setting the following environment
|
|
296
497
|
variable:
|
|
297
498
|
|
|
298
|
-
EXTERNAL_DISABLED=
|
|
499
|
+
EXTERNAL_DISABLED=1
|
|
500
|
+
|
|
501
|
+
Some tests are designed to validate the driver's behavior under load, or
|
|
502
|
+
otherwise execute a large number of operations which may take a sizable amount
|
|
503
|
+
of time. Such tests are skipped by default and can be run by setting the
|
|
504
|
+
following environment variable:
|
|
505
|
+
|
|
506
|
+
STRESS=1
|
|
507
|
+
|
|
508
|
+
Some tests fork the process to validate the driver's behavior when forking is
|
|
509
|
+
involved. These tests are skipped by default and can be run by setting the
|
|
510
|
+
following environment variable:
|
|
511
|
+
|
|
512
|
+
FORK=1
|
|
513
|
+
|
|
514
|
+
## Debug Logging
|
|
515
|
+
|
|
516
|
+
The test suite is run with the driver log level set to `WARN` by default.
|
|
517
|
+
This produces a fair amount of output as many tests trigger various conditions
|
|
518
|
+
resulting in the driver outputting warnings. This is expected behavior.
|
|
519
|
+
|
|
520
|
+
To increase the driver log level to `DEBUG`, set the
|
|
521
|
+
`MONGO_RUBY_DRIVER_CLIENT_DEBUG` environment variable to `1`, `true` or `yes`.
|
|
522
|
+
This will produce additional log output pertaining to, for example, SDAM
|
|
523
|
+
events and transitions performed by the driver, as well as log all
|
|
524
|
+
commands sent to and responses received from the database.
|
|
525
|
+
|
|
526
|
+
To debug authentication and user management commands, set the
|
|
527
|
+
`MONGO_RUBY_DRIVER_UNREDACT_EVENTS` environment variable to `1`, `true` or
|
|
528
|
+
`yes`. This will disable redaction of command monitoring payloads for sensitive
|
|
529
|
+
commands. Normally this environment variable should be used with
|
|
530
|
+
`MONGO_RUBY_DRIVER_CLIENT_DEBUG` to see the command payloads.
|
|
299
531
|
|
|
300
532
|
## Caveats
|
|
301
533
|
|
|
@@ -336,12 +568,6 @@ enabled. This is accomplished by starting `mongod` with the following option:
|
|
|
336
568
|
|
|
337
569
|
--setParameter enableTestCommands=1
|
|
338
570
|
|
|
339
|
-
### Log Output
|
|
340
|
-
|
|
341
|
-
The test suite is run with the driver log level set to WARN by default.
|
|
342
|
-
This produces a fair amount of output as many tests trigger various conditions
|
|
343
|
-
resulting in the driver outputting warnings. This is expected behavior.
|
|
344
|
-
|
|
345
571
|
## Running Individual Examples
|
|
346
572
|
|
|
347
573
|
Individual examples can be run by invoking `rspec` instead of `rake`. Prior
|
|
@@ -360,3 +586,45 @@ Then, any of the standard RSpec invocations will work:
|
|
|
360
586
|
To have the test suite report its current configuration, run:
|
|
361
587
|
|
|
362
588
|
rake spec:config
|
|
589
|
+
|
|
590
|
+
## Color Output
|
|
591
|
+
|
|
592
|
+
The test suite uses color output by default. To view the output in `less`
|
|
593
|
+
with color, use the `-R` option:
|
|
594
|
+
|
|
595
|
+
rake 2>&1 | tee rake.log
|
|
596
|
+
less -R rake.log
|
|
597
|
+
|
|
598
|
+
## Debugging
|
|
599
|
+
|
|
600
|
+
The test suite is configured to use [Byebug](https://github.com/deivid-rodriguez/byebug)
|
|
601
|
+
for debugging on MRI and [ruby-debug](https://github.com/jruby/jruby/wiki/UsingTheJRubyDebugger)
|
|
602
|
+
on JRuby.
|
|
603
|
+
|
|
604
|
+
### MRI
|
|
605
|
+
|
|
606
|
+
Call `byebug` anywhere in the test suite to break into Byebug.
|
|
607
|
+
|
|
608
|
+
### JRuby
|
|
609
|
+
|
|
610
|
+
To debug on JRuby, the test suite must be started with the `--debug` argument
|
|
611
|
+
to `jruby`. This can be achieved by starting the test suite as follows:
|
|
612
|
+
|
|
613
|
+
jruby --debug -S rspec [rspec args...]
|
|
614
|
+
|
|
615
|
+
Call `debugger` anywhere in the test suite to break into the debugger.
|
|
616
|
+
|
|
617
|
+
### Docker
|
|
618
|
+
|
|
619
|
+
By default, when the test suite is running in a CI environment the debuggers
|
|
620
|
+
are not loaded. The Docker runner emulates the CI environment, therefore
|
|
621
|
+
to debug in Docker the debugger must be explicitly loaded first. To break
|
|
622
|
+
into the debugger on MRI, call:
|
|
623
|
+
|
|
624
|
+
require 'byebug'
|
|
625
|
+
byebug
|
|
626
|
+
|
|
627
|
+
To break into the debugger on JRuby, call:
|
|
628
|
+
|
|
629
|
+
require 'ruby-debug'
|
|
630
|
+
debugger
|