mongo 2.14.1 → 2.15.0.alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +4 -1
  4. data/Rakefile +8 -15
  5. data/lib/mongo/auth/aws/conversation.rb +1 -4
  6. data/lib/mongo/auth/base.rb +13 -7
  7. data/lib/mongo/auth/conversation_base.rb +32 -0
  8. data/lib/mongo/auth/cr/conversation.rb +6 -29
  9. data/lib/mongo/auth/gssapi/conversation.rb +4 -15
  10. data/lib/mongo/auth/ldap/conversation.rb +3 -14
  11. data/lib/mongo/auth/sasl_conversation_base.rb +1 -13
  12. data/lib/mongo/auth/scram_conversation_base.rb +7 -34
  13. data/lib/mongo/auth/user/view.rb +16 -9
  14. data/lib/mongo/auth/x509/conversation.rb +4 -25
  15. data/lib/mongo/bulk_write.rb +21 -18
  16. data/lib/mongo/client.rb +82 -6
  17. data/lib/mongo/cluster/reapers/cursor_reaper.rb +6 -2
  18. data/lib/mongo/cluster.rb +19 -2
  19. data/lib/mongo/collection/view/aggregation.rb +1 -1
  20. data/lib/mongo/collection/view/change_stream.rb +1 -1
  21. data/lib/mongo/collection/view/iterable.rb +7 -17
  22. data/lib/mongo/collection/view/map_reduce.rb +2 -2
  23. data/lib/mongo/collection/view/readable.rb +42 -20
  24. data/lib/mongo/collection/view/writable.rb +14 -14
  25. data/lib/mongo/collection.rb +6 -6
  26. data/lib/mongo/cursor.rb +2 -12
  27. data/lib/mongo/database/view.rb +1 -1
  28. data/lib/mongo/database.rb +8 -3
  29. data/lib/mongo/error/bulk_write_error.rb +17 -3
  30. data/lib/mongo/error/internal_driver_error.rb +22 -0
  31. data/lib/mongo/error/operation_failure.rb +21 -2
  32. data/lib/mongo/error/parser.rb +65 -12
  33. data/lib/mongo/error/server_api_conflict.rb +23 -0
  34. data/lib/mongo/error/server_api_not_supported.rb +24 -0
  35. data/lib/mongo/error/unmet_dependency.rb +21 -0
  36. data/lib/mongo/error.rb +9 -1
  37. data/lib/mongo/index/view.rb +21 -11
  38. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +27 -16
  39. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +26 -15
  40. data/lib/mongo/monitoring.rb +13 -4
  41. data/lib/mongo/operation/collections_info/command.rb +2 -2
  42. data/lib/mongo/operation/collections_info.rb +18 -1
  43. data/lib/mongo/operation/context.rb +99 -0
  44. data/lib/mongo/operation/indexes.rb +15 -1
  45. data/lib/mongo/operation/insert/command.rb +2 -2
  46. data/lib/mongo/operation/insert/legacy.rb +2 -2
  47. data/lib/mongo/operation/insert/op_msg.rb +2 -2
  48. data/lib/mongo/operation/list_collections/result.rb +4 -1
  49. data/lib/mongo/operation/parallel_scan/command.rb +2 -1
  50. data/lib/mongo/operation/result.rb +2 -0
  51. data/lib/mongo/operation/shared/executable.rb +24 -14
  52. data/lib/mongo/operation/shared/executable_no_validate.rb +2 -2
  53. data/lib/mongo/operation/shared/op_msg_or_command.rb +1 -7
  54. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +1 -7
  55. data/lib/mongo/operation/shared/polymorphic_operation.rb +39 -0
  56. data/lib/mongo/operation/shared/read_preference_supported.rb +36 -38
  57. data/lib/mongo/operation/shared/response_handling.rb +23 -23
  58. data/lib/mongo/operation/shared/sessions_supported.rb +15 -5
  59. data/lib/mongo/operation/shared/write.rb +8 -18
  60. data/lib/mongo/operation.rb +2 -2
  61. data/lib/mongo/protocol/compressed.rb +51 -5
  62. data/lib/mongo/protocol/message.rb +20 -2
  63. data/lib/mongo/protocol/msg.rb +38 -13
  64. data/lib/mongo/protocol/query.rb +11 -11
  65. data/lib/mongo/query_cache.rb +30 -0
  66. data/lib/mongo/retryable.rb +1 -1
  67. data/lib/mongo/server/app_metadata.rb +52 -18
  68. data/lib/mongo/server/connection.rb +5 -0
  69. data/lib/mongo/server/connection_base.rb +13 -10
  70. data/lib/mongo/server/connection_pool.rb +6 -2
  71. data/lib/mongo/server/description/features.rb +9 -8
  72. data/lib/mongo/server/description.rb +4 -0
  73. data/lib/mongo/server/monitor/app_metadata.rb +1 -1
  74. data/lib/mongo/server/monitor/connection.rb +9 -10
  75. data/lib/mongo/server/monitor.rb +20 -1
  76. data/lib/mongo/server/pending_connection.rb +24 -6
  77. data/lib/mongo/server/push_monitor.rb +11 -1
  78. data/lib/mongo/server.rb +7 -1
  79. data/lib/mongo/server_selector/secondary_preferred.rb +7 -2
  80. data/lib/mongo/session/session_pool.rb +4 -2
  81. data/lib/mongo/session.rb +2 -2
  82. data/lib/mongo/socket/ssl.rb +8 -0
  83. data/lib/mongo/socket.rb +29 -4
  84. data/lib/mongo/uri/options_mapper.rb +38 -0
  85. data/lib/mongo/utils.rb +15 -0
  86. data/lib/mongo/version.rb +1 -1
  87. data/lib/mongo.rb +23 -0
  88. data/spec/README.md +24 -1
  89. data/spec/integration/auth_spec.rb +25 -15
  90. data/spec/integration/bulk_write_error_message_spec.rb +41 -0
  91. data/spec/integration/change_stream_spec.rb +4 -4
  92. data/spec/integration/command_monitoring_spec.rb +2 -2
  93. data/spec/integration/connection_spec.rb +2 -0
  94. data/spec/integration/docs_examples_spec.rb +8 -1
  95. data/spec/integration/fork_reconnect_spec.rb +4 -1
  96. data/spec/integration/ocsp_verifier_spec.rb +13 -7
  97. data/spec/integration/operation_failure_code_spec.rb +1 -1
  98. data/spec/integration/operation_failure_message_spec.rb +90 -0
  99. data/spec/integration/query_cache_spec.rb +0 -45
  100. data/spec/integration/reconnect_spec.rb +1 -1
  101. data/spec/integration/snappy_compression_spec.rb +25 -0
  102. data/spec/integration/srv_monitoring_spec.rb +1 -1
  103. data/spec/integration/transactions_examples_spec.rb +6 -0
  104. data/spec/integration/zlib_compression_spec.rb +1 -1
  105. data/spec/integration/zstd_compression_spec.rb +26 -0
  106. data/spec/lite_spec_helper.rb +7 -1
  107. data/spec/mongo/address_spec.rb +15 -11
  108. data/spec/mongo/auth/ldap/conversation_spec.rb +1 -1
  109. data/spec/mongo/auth/ldap_spec.rb +5 -1
  110. data/spec/mongo/auth/scram_negotiation_spec.rb +1 -1
  111. data/spec/mongo/auth/scram_spec.rb +1 -1
  112. data/spec/mongo/auth/x509/conversation_spec.rb +3 -3
  113. data/spec/mongo/client_construction_spec.rb +207 -33
  114. data/spec/mongo/client_spec.rb +17 -0
  115. data/spec/mongo/cluster_spec.rb +1 -0
  116. data/spec/mongo/collection/view/explainable_spec.rb +1 -1
  117. data/spec/mongo/collection/view/readable_spec.rb +33 -19
  118. data/spec/mongo/collection_crud_spec.rb +4357 -0
  119. data/spec/mongo/collection_ddl_spec.rb +534 -0
  120. data/spec/mongo/collection_spec.rb +5 -4859
  121. data/spec/mongo/database_spec.rb +66 -4
  122. data/spec/mongo/error/bulk_write_error_spec.rb +3 -3
  123. data/spec/mongo/error/parser_spec.rb +37 -6
  124. data/spec/mongo/index/view_spec.rb +4 -0
  125. data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +1 -1
  126. data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +1 -1
  127. data/spec/mongo/operation/aggregate_spec.rb +2 -1
  128. data/spec/mongo/operation/collections_info_spec.rb +4 -1
  129. data/spec/mongo/operation/command_spec.rb +6 -3
  130. data/spec/mongo/operation/create_index_spec.rb +6 -3
  131. data/spec/mongo/operation/create_user_spec.rb +6 -3
  132. data/spec/mongo/operation/delete/bulk_spec.rb +9 -6
  133. data/spec/mongo/operation/delete_spec.rb +11 -7
  134. data/spec/mongo/operation/drop_index_spec.rb +6 -2
  135. data/spec/mongo/operation/find/legacy_spec.rb +3 -1
  136. data/spec/mongo/operation/get_more_spec.rb +3 -1
  137. data/spec/mongo/operation/indexes_spec.rb +5 -1
  138. data/spec/mongo/operation/insert/bulk_spec.rb +10 -7
  139. data/spec/mongo/operation/insert_spec.rb +15 -12
  140. data/spec/mongo/operation/map_reduce_spec.rb +5 -2
  141. data/spec/mongo/operation/read_preference_legacy_spec.rb +19 -9
  142. data/spec/mongo/operation/read_preference_op_msg_spec.rb +3 -3
  143. data/spec/mongo/operation/remove_user_spec.rb +6 -3
  144. data/spec/mongo/operation/result_spec.rb +1 -1
  145. data/spec/mongo/operation/update/bulk_spec.rb +9 -6
  146. data/spec/mongo/operation/update_spec.rb +10 -7
  147. data/spec/mongo/operation/update_user_spec.rb +4 -1
  148. data/spec/mongo/protocol/compressed_spec.rb +26 -12
  149. data/spec/mongo/query_cache_middleware_spec.rb +55 -0
  150. data/spec/mongo/retryable_spec.rb +3 -2
  151. data/spec/mongo/server/app_metadata_shared.rb +7 -33
  152. data/spec/mongo/server/app_metadata_spec.rb +2 -0
  153. data/spec/mongo/server/connection_pool/populator_spec.rb +3 -1
  154. data/spec/mongo/server/connection_pool_spec.rb +1 -1
  155. data/spec/mongo/server/connection_spec.rb +24 -17
  156. data/spec/mongo/server/monitor/connection_spec.rb +17 -7
  157. data/spec/mongo/server/monitor_spec.rb +9 -1
  158. data/spec/mongo/server_selector/secondary_preferred_spec.rb +6 -6
  159. data/spec/mongo/server_spec.rb +15 -2
  160. data/spec/mongo/socket/ssl_spec.rb +40 -0
  161. data/spec/mongo/socket_spec.rb +2 -2
  162. data/spec/mongo/tls_context_hooks_spec.rb +37 -0
  163. data/spec/runners/connection_string.rb +0 -4
  164. data/spec/runners/crud/requirement.rb +40 -3
  165. data/spec/runners/crud/verifier.rb +8 -0
  166. data/spec/runners/transactions/operation.rb +1 -1
  167. data/spec/runners/transactions/test.rb +1 -0
  168. data/spec/runners/unified/assertions.rb +249 -0
  169. data/spec/runners/unified/change_stream_operations.rb +26 -0
  170. data/spec/runners/unified/crud_operations.rb +199 -0
  171. data/spec/runners/unified/ddl_operations.rb +96 -0
  172. data/spec/runners/unified/entity_map.rb +39 -0
  173. data/spec/runners/unified/error.rb +25 -0
  174. data/spec/runners/unified/event_subscriber.rb +91 -0
  175. data/spec/runners/unified/exceptions.rb +21 -0
  176. data/spec/runners/unified/grid_fs_operations.rb +55 -0
  177. data/spec/runners/unified/support_operations.rb +250 -0
  178. data/spec/runners/unified/test.rb +393 -0
  179. data/spec/runners/unified/test_group.rb +28 -0
  180. data/spec/runners/unified/using_hash.rb +31 -0
  181. data/spec/runners/unified.rb +96 -0
  182. data/spec/shared/lib/mrss/cluster_config.rb +0 -3
  183. data/spec/shared/lib/mrss/docker_runner.rb +0 -3
  184. data/spec/shared/lib/mrss/lite_constraints.rb +0 -16
  185. data/spec/shared/lib/mrss/server_version_registry.rb +0 -3
  186. data/spec/shared/lib/mrss/spec_organizer.rb +0 -3
  187. data/spec/shared/shlib/server.sh +1 -1
  188. data/spec/spec_helper.rb +4 -1
  189. data/spec/spec_tests/crud_unified_spec.rb +10 -0
  190. data/spec/spec_tests/data/change_streams/change-streams.yml +0 -1
  191. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +267 -0
  192. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +60 -0
  193. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount.yml → estimatedDocumentCount-pre4.9.yml} +2 -0
  194. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +146 -0
  195. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-serverErrors.yml → estimatedDocumentCount-serverErrors-pre4.9.yml} +2 -0
  196. data/spec/spec_tests/data/retryable_reads/listIndexNames.yml +1 -1
  197. data/spec/spec_tests/data/unified/valid-fail/operation-failure.yml +31 -0
  198. data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +220 -0
  199. data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +102 -0
  200. data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +184 -0
  201. data/spec/spec_tests/data/unified/valid-pass/poc-gridfs.yml +155 -0
  202. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +193 -0
  203. data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +210 -0
  204. data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +215 -0
  205. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +235 -0
  206. data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +169 -0
  207. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +170 -0
  208. data/spec/spec_tests/data/uri_options/compression-options.yml +1 -1
  209. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +416 -0
  210. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +409 -0
  211. data/spec/spec_tests/data/versioned_api/runcommand-helper-no-api-version-declared.yml +67 -0
  212. data/spec/spec_tests/data/versioned_api/test-commands-deprecation-errors.yml +47 -0
  213. data/spec/spec_tests/data/versioned_api/test-commands-strict-mode.yml +44 -0
  214. data/spec/spec_tests/data/versioned_api/transaction-handling.yml +180 -0
  215. data/spec/spec_tests/unified_spec.rb +15 -0
  216. data/spec/spec_tests/uri_options_spec.rb +16 -0
  217. data/spec/spec_tests/versioned_api_spec.rb +10 -0
  218. data/spec/support/client_registry.rb +4 -8
  219. data/spec/support/client_registry_macros.rb +4 -4
  220. data/spec/support/common_shortcuts.rb +15 -1
  221. data/spec/support/shared/session.rb +2 -2
  222. data/spec/support/spec_config.rb +42 -11
  223. data/spec/support/utils.rb +64 -3
  224. data.tar.gz.sig +0 -0
  225. metadata +1005 -915
  226. metadata.gz.sig +0 -0
  227. data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +0 -58
  228. data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +0 -47
  229. data/spec/integration/secondary_reads_spec.rb +0 -102
  230. data/spec/support/cluster_config.rb +0 -207
metadata.gz.sig CHANGED
Binary file
@@ -1,58 +0,0 @@
1
- # Copyright (C) 2020 MongoDB Inc.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
- module Mongo
16
- module Operation
17
-
18
- # @api private
19
- module CollectionsInfoOrListCollections
20
- include PolymorphicLookup
21
-
22
- # Execute the operation.
23
- #
24
- # @example
25
- # operation.execute(server, client: nil)
26
- #
27
- # @param [ Mongo::Server ] server The server to send the operation to.
28
- # @param [ Mongo::Client ] client The client that will be used to
29
- # perform auto-encryption if it is necessary to encrypt the command
30
- # being executed (optional).
31
- #
32
- # @return [ Mongo::Operation::CollectionsInfo::Result,
33
- # Mongo::Operation::ListCollections::Result ] The operation result.
34
- def execute(server, client:)
35
- server.with_connection do |connection|
36
- operation = final_operation(connection)
37
- operation.execute(connection, client: client)
38
- end
39
- end
40
-
41
- private
42
-
43
- def final_operation(connection)
44
- op_class = if connection.features.list_collections_enabled?
45
- if connection.features.op_msg_enabled?
46
- ListCollections::OpMsg
47
- else
48
- ListCollections::Command
49
- end
50
- else
51
- CollectionsInfo::Command
52
- end
53
-
54
- op_class.new(spec)
55
- end
56
- end
57
- end
58
- end
@@ -1,47 +0,0 @@
1
- # Copyright (C) 2018-2020 MongoDB Inc.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
- module Mongo
16
- module Operation
17
-
18
- # Shared behavior of executing the operation as an OpMsg when supported,
19
- # as a Command when list indxes command is supported by the server, and as
20
- # Legacy otherwise.
21
- #
22
- # @api private
23
- module OpMsgOrListIndexesCommand
24
- include PolymorphicLookup
25
-
26
- def execute(server, client:)
27
- server.with_connection do |connection|
28
- operation = final_operation(connection)
29
- operation.execute(connection, client: client)
30
- end
31
- end
32
-
33
- private
34
-
35
- def final_operation(connection)
36
- cls = if connection.features.op_msg_enabled?
37
- polymorphic_class(self.class.name, :OpMsg)
38
- elsif connection.features.list_indexes_enabled?
39
- polymorphic_class(self.class.name, :Command)
40
- else
41
- polymorphic_class(self.class.name, :Legacy)
42
- end
43
- cls.new(spec)
44
- end
45
- end
46
- end
47
- end
@@ -1,102 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'Secondary reads' do
4
- before do
5
- root_authorized_client.use('sr')['secondary_reads'].drop
6
- root_authorized_client.use('sr')['secondary_reads'].insert_one(test: 1)
7
- end
8
-
9
- shared_examples 'performs reads as per read preference' do
10
-
11
- %i(primary primary_preferred).each do |mode|
12
-
13
- context mode.inspect do
14
-
15
- let(:client) do
16
- root_authorized_client.with(read: {mode: mode}).use('sr')
17
- end
18
-
19
- it 'reads from primary' do
20
- start_stats = get_read_counters
21
-
22
- 30.times do
23
- client['secondary_reads'].find.to_a
24
- end
25
-
26
- end_stats = get_read_counters
27
-
28
- end_stats[:secondary].should be_within(10).of(start_stats[:secondary])
29
- end_stats[:primary].should >= start_stats[:primary] + 30
30
- end
31
- end
32
- end
33
-
34
- %i(secondary secondary_preferred).each do |mode|
35
-
36
- context mode.inspect do
37
- let(:client) do
38
- root_authorized_client.with(read: {mode: mode}).use('sr')
39
- end
40
-
41
- it 'reads from secondaries' do
42
- start_stats = get_read_counters
43
-
44
- 30.times do
45
- client['secondary_reads'].find.to_a
46
- end
47
-
48
- end_stats = get_read_counters
49
-
50
- end_stats[:primary].should be_within(10).of(start_stats[:primary])
51
- end_stats[:secondary].should >= start_stats[:secondary] + 30
52
- end
53
- end
54
- end
55
- end
56
-
57
- context 'replica set' do
58
- require_topology :replica_set
59
-
60
- include_examples 'performs reads as per read preference'
61
- end
62
-
63
- context 'sharded cluster' do
64
- require_topology :sharded
65
-
66
- include_examples 'performs reads as per read preference'
67
- end
68
-
69
- def get_read_counters
70
- client = ClientRegistry.instance.global_client('root_authorized')
71
- addresses = []
72
- if client.cluster.sharded?
73
- doc = client.use('admin').command(listShards: 1).documents.first
74
- doc['shards'].each do |shard|
75
- addresses += shard['host'].split('/').last.split(',')
76
- end
77
- else
78
- client.cluster.servers.each do |server|
79
- next unless server.primary? || server.secondary?
80
- addresses << server.address.seed
81
- end
82
- end
83
- stats = Hash.new(0)
84
- addresses.each do |address|
85
- ClientRegistry.instance.new_local_client(
86
- [address],
87
- SpecConfig.instance.all_test_options.merge(connect: :direct),
88
- ) do |c|
89
- server = c.cluster.servers.first
90
- next unless server.primary? || server.secondary?
91
- stat = c.command(serverStatus: 1).documents.first
92
- queries = stat['opcounters']['query']
93
- if server.primary?
94
- stats[:primary] += queries
95
- else
96
- stats[:secondary] += queries
97
- end
98
- end
99
- end
100
- stats
101
- end
102
- end
@@ -1,207 +0,0 @@
1
- require 'singleton'
2
-
3
- class ClusterConfig
4
- include Singleton
5
- include RSpec::Core::Pending
6
-
7
- def single_server?
8
- determine_cluster_config
9
- @single_server
10
- end
11
-
12
- def replica_set_name
13
- determine_cluster_config
14
- @replica_set_name
15
- end
16
-
17
- def server_version
18
- determine_cluster_config
19
- @server_version
20
- end
21
-
22
- def enterprise?
23
- determine_cluster_config
24
- @enterprise
25
- end
26
-
27
- def short_server_version
28
- server_version.split('.')[0..1].join('.')
29
- end
30
-
31
- def fcv
32
- determine_cluster_config
33
- @fcv
34
- end
35
-
36
- # Per https://jira.mongodb.org/browse/SERVER-39052, working with FCV
37
- # in sharded topologies is annoying. Also, FCV doesn't exist in servers
38
- # less than 3.4. This method returns FCV on 3.4+ servers when in single
39
- # or RS topologies, and otherwise returns the major.minor server version.
40
- def fcv_ish
41
- if server_version.nil?
42
- raise "Deployment server version not known - check that connection to deployment succeeded"
43
- end
44
-
45
- if server_version >= '3.4' && topology != :sharded
46
- fcv
47
- else
48
- if short_server_version == '4.1'
49
- '4.2'
50
- else
51
- short_server_version
52
- end
53
- end
54
- end
55
-
56
- # @return [ Mongo::Address ] The address of the primary in the deployment.
57
- def primary_address
58
- determine_cluster_config
59
- @primary_address
60
- end
61
-
62
- def primary_address_str
63
- determine_cluster_config
64
- @primary_address.seed
65
- end
66
-
67
- def primary_address_host
68
- both = primary_address_str
69
- both.split(':').first
70
- end
71
-
72
- def primary_address_port
73
- both = primary_address_str
74
- both.split(':')[1] || 27017
75
- end
76
-
77
- def primary_description
78
- determine_cluster_config
79
- @primary_description
80
- end
81
-
82
- # Try running a command on the admin database to see if the mongod was
83
- # started with auth.
84
- def auth_enabled?
85
- if @auth_enabled.nil?
86
- @auth_enabled = begin
87
- basic_client.use(:admin).command(getCmdLineOpts: 1).first["argv"].include?("--auth")
88
- rescue => e
89
- e.message =~ /(not authorized)|(unauthorized)|(no users authenticated)|(requires authentication)/
90
- end
91
- end
92
- @auth_enabled
93
- end
94
-
95
- def topology
96
- determine_cluster_config
97
- @topology
98
- end
99
-
100
- def storage_engine
101
- @storage_engine ||= begin
102
- # 2.6 does not have wired tiger
103
- if short_server_version == '2.6'
104
- :mmapv1
105
- else
106
- client = ClientRegistry.instance.global_client('root_authorized')
107
- if topology == :sharded
108
- shards = client.use(:admin).command(listShards: 1).first
109
- if shards['shards'].empty?
110
- raise 'Shards are empty'
111
- end
112
- shard = shards['shards'].first
113
- address_str = shard['host'].sub(/^.*\//, '').sub(/,.*/, '')
114
- client = ClusterTools.instance.direct_client(address_str,
115
- SpecConfig.instance.test_options.merge(SpecConfig.instance.auth_options).merge(connect: :direct))
116
- end
117
- rv = client.use(:admin).command(serverStatus: 1).first
118
- rv = rv['storageEngine']['name']
119
- rv_map = {
120
- 'wiredTiger' => :wired_tiger,
121
- 'mmapv1' => :mmapv1,
122
- }
123
- rv_map[rv] || rv
124
- end
125
- end
126
- end
127
-
128
- # This method returns an alternate address for connecting to the configured
129
- # deployment. For example, if the replica set is configured with nodes at
130
- # of localhost:27017 and so on, this method will return 127.0.0.:27017.
131
- #
132
- # Note that the "alternate" refers to replica set configuration, not the
133
- # addresses specified in test suite configuration. If the deployment topology
134
- # is not a replica set, "alternate" refers to test suite configuration as
135
- # this is the only configuration available.
136
- def alternate_address
137
- @alternate_address ||= begin
138
- address = primary_address_host
139
- str = case address
140
- when '127.0.0.1'
141
- 'localhost'
142
- when /^(\d+\.){3}\d+$/
143
- skip 'This test requires a hostname or 127.0.0.1 as address'
144
- else
145
- # We don't know if mongod is listening on ipv4 or ipv6, in principle.
146
- # Our tests use ipv4, so hardcode that for now.
147
- # To support both we need to try both addresses which will make this
148
- # test more complicated.
149
- #
150
- # JRuby chokes on primary_address_port as the port (e.g. 27017).
151
- # Since the port does not actually matter, use a common port like 80.
152
- resolved_address = Addrinfo.getaddrinfo(address, 80, Socket::PF_INET).first.ip_address
153
- if resolved_address.include?(':')
154
- "[#{resolved_address}]"
155
- else
156
- resolved_address
157
- end
158
- end + ":#{primary_address_port}"
159
- Mongo::Address.new(str)
160
- end
161
- end
162
-
163
- private
164
-
165
- def determine_cluster_config
166
- return if @primary_address
167
-
168
- # Run all commands to figure out the cluster configuration from the same
169
- # client. This is somewhat wasteful when running a single test, but reduces
170
- # test runtime for the suite overall because all commands are sent on the
171
- # same connection rather than each command connecting to the cluster by
172
- # itself.
173
- client = ClientRegistry.instance.global_client('root_authorized')
174
-
175
- primary = client.cluster.next_primary
176
- @primary_address = primary.address
177
- @primary_description = primary.description
178
- @replica_set_name = client.cluster.topology.replica_set_name
179
-
180
- @topology ||= begin
181
- topology = client.cluster.topology.class.name.sub(/.*::/, '')
182
- topology = topology.gsub(/([A-Z])/) { |match| '_' + match.downcase }.sub(/^_/, '')
183
- if topology =~ /^replica_set/
184
- topology = 'replica_set'
185
- end
186
- topology.to_sym
187
- end
188
-
189
- @single_server = client.cluster.servers_list.length == 1
190
-
191
- build_info = client.database.command(buildInfo: 1).first
192
-
193
- @server_version = build_info['version']
194
- @enterprise = build_info['modules'] && build_info['modules'].include?('enterprise')
195
-
196
- if @topology != :sharded && short_server_version >= '3.4'
197
- rv = client.use(:admin).command(getParameter: 1, featureCompatibilityVersion: 1).first['featureCompatibilityVersion']
198
- @fcv = rv['version'] || rv
199
- end
200
- end
201
-
202
- def basic_client
203
- # Do not cache the result here so that if the client gets closed,
204
- # client registry reconnects it in subsequent tests
205
- ClientRegistry.instance.global_client('basic')
206
- end
207
- end