mongo 2.13.3 → 2.14.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (197) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/lib/mongo/address/ipv4.rb +1 -1
  4. data/lib/mongo/address/ipv6.rb +1 -1
  5. data/lib/mongo/address.rb +1 -1
  6. data/lib/mongo/bulk_write.rb +17 -0
  7. data/lib/mongo/caching_cursor.rb +74 -0
  8. data/lib/mongo/client.rb +47 -8
  9. data/lib/mongo/cluster/topology/single.rb +1 -1
  10. data/lib/mongo/cluster.rb +3 -3
  11. data/lib/mongo/collection/view/aggregation.rb +25 -4
  12. data/lib/mongo/collection/view/builder/find_command.rb +38 -18
  13. data/lib/mongo/collection/view/explainable.rb +27 -8
  14. data/lib/mongo/collection/view/iterable.rb +72 -12
  15. data/lib/mongo/collection/view/readable.rb +12 -2
  16. data/lib/mongo/collection/view/writable.rb +15 -1
  17. data/lib/mongo/collection/view.rb +24 -20
  18. data/lib/mongo/collection.rb +26 -2
  19. data/lib/mongo/crypt/encryption_io.rb +6 -6
  20. data/lib/mongo/cursor.rb +1 -0
  21. data/lib/mongo/database/view.rb +1 -1
  22. data/lib/mongo/database.rb +8 -14
  23. data/lib/mongo/error/invalid_read_concern.rb +28 -0
  24. data/lib/mongo/error/server_certificate_revoked.rb +22 -0
  25. data/lib/mongo/error/unsupported_option.rb +14 -12
  26. data/lib/mongo/error.rb +2 -0
  27. data/lib/mongo/grid/fs_bucket.rb +37 -37
  28. data/lib/mongo/lint.rb +2 -1
  29. data/lib/mongo/logger.rb +3 -3
  30. data/lib/mongo/operation/aggregate/result.rb +9 -8
  31. data/lib/mongo/operation/collections_info/command.rb +0 -5
  32. data/lib/mongo/operation/collections_info/result.rb +3 -16
  33. data/lib/mongo/operation/delete/bulk_result.rb +2 -0
  34. data/lib/mongo/operation/delete/result.rb +3 -0
  35. data/lib/mongo/operation/explain/command.rb +4 -0
  36. data/lib/mongo/operation/explain/legacy.rb +4 -0
  37. data/lib/mongo/operation/explain/op_msg.rb +6 -0
  38. data/lib/mongo/operation/explain/result.rb +3 -0
  39. data/lib/mongo/operation/find/legacy/result.rb +2 -0
  40. data/lib/mongo/operation/find/result.rb +3 -0
  41. data/lib/mongo/operation/get_more/result.rb +3 -0
  42. data/lib/mongo/operation/indexes/result.rb +5 -0
  43. data/lib/mongo/operation/insert/bulk_result.rb +5 -0
  44. data/lib/mongo/operation/insert/result.rb +5 -0
  45. data/lib/mongo/operation/list_collections/result.rb +5 -0
  46. data/lib/mongo/operation/map_reduce/result.rb +10 -0
  47. data/lib/mongo/operation/parallel_scan/command.rb +2 -1
  48. data/lib/mongo/operation/parallel_scan/result.rb +4 -0
  49. data/lib/mongo/operation/result.rb +35 -6
  50. data/lib/mongo/operation/shared/bypass_document_validation.rb +1 -0
  51. data/lib/mongo/operation/shared/causal_consistency_supported.rb +1 -0
  52. data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +2 -0
  53. data/lib/mongo/operation/shared/executable.rb +1 -0
  54. data/lib/mongo/operation/shared/idable.rb +2 -1
  55. data/lib/mongo/operation/shared/limited.rb +1 -0
  56. data/lib/mongo/operation/shared/object_id_generator.rb +1 -0
  57. data/lib/mongo/operation/shared/read_preference_supported.rb +36 -38
  58. data/lib/mongo/operation/shared/result/aggregatable.rb +1 -0
  59. data/lib/mongo/operation/shared/sessions_supported.rb +3 -3
  60. data/lib/mongo/operation/shared/specifiable.rb +1 -0
  61. data/lib/mongo/operation/shared/write.rb +1 -0
  62. data/lib/mongo/operation/shared/write_concern_supported.rb +1 -0
  63. data/lib/mongo/operation/update/legacy/result.rb +7 -0
  64. data/lib/mongo/operation/update/result.rb +8 -0
  65. data/lib/mongo/operation/users_info/result.rb +3 -0
  66. data/lib/mongo/operation.rb +2 -0
  67. data/lib/mongo/protocol/msg.rb +2 -2
  68. data/lib/mongo/protocol/query.rb +11 -11
  69. data/lib/mongo/query_cache.rb +242 -0
  70. data/lib/mongo/retryable.rb +8 -1
  71. data/lib/mongo/server/connection_common.rb +2 -2
  72. data/lib/mongo/server/connection_pool.rb +3 -0
  73. data/lib/mongo/server/monitor/connection.rb +3 -3
  74. data/lib/mongo/server/monitor.rb +1 -1
  75. data/lib/mongo/server/pending_connection.rb +2 -2
  76. data/lib/mongo/server/push_monitor.rb +1 -1
  77. data/lib/mongo/server.rb +5 -1
  78. data/lib/mongo/server_selector/base.rb +5 -1
  79. data/lib/mongo/server_selector/secondary_preferred.rb +7 -2
  80. data/lib/mongo/session.rb +3 -0
  81. data/lib/mongo/socket/ocsp_cache.rb +97 -0
  82. data/lib/mongo/socket/ocsp_verifier.rb +368 -0
  83. data/lib/mongo/socket/ssl.rb +45 -24
  84. data/lib/mongo/socket.rb +6 -4
  85. data/lib/mongo/srv/monitor.rb +7 -13
  86. data/lib/mongo/srv/resolver.rb +14 -10
  87. data/lib/mongo/timeout.rb +2 -0
  88. data/lib/mongo/uri/options_mapper.rb +582 -0
  89. data/lib/mongo/uri/srv_protocol.rb +3 -2
  90. data/lib/mongo/uri.rb +21 -390
  91. data/lib/mongo/utils.rb +12 -1
  92. data/lib/mongo/version.rb +1 -1
  93. data/lib/mongo.rb +9 -0
  94. data/spec/NOTES.aws-auth.md +12 -7
  95. data/spec/README.md +56 -1
  96. data/spec/integration/bson_symbol_spec.rb +2 -4
  97. data/spec/integration/bulk_write_spec.rb +48 -0
  98. data/spec/integration/client_authentication_options_spec.rb +55 -28
  99. data/spec/integration/connection_pool_populator_spec.rb +3 -1
  100. data/spec/integration/cursor_reaping_spec.rb +53 -17
  101. data/spec/integration/ocsp_connectivity_spec.rb +26 -0
  102. data/spec/integration/ocsp_verifier_cache_spec.rb +188 -0
  103. data/spec/integration/ocsp_verifier_spec.rb +334 -0
  104. data/spec/integration/query_cache_spec.rb +1045 -0
  105. data/spec/integration/query_cache_transactions_spec.rb +179 -0
  106. data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +1 -0
  107. data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +2 -0
  108. data/spec/integration/sdam_error_handling_spec.rb +69 -18
  109. data/spec/integration/sdam_events_spec.rb +7 -8
  110. data/spec/integration/server_selection_spec.rb +36 -0
  111. data/spec/integration/srv_monitoring_spec.rb +38 -3
  112. data/spec/integration/srv_spec.rb +56 -0
  113. data/spec/lite_spec_helper.rb +4 -2
  114. data/spec/mongo/address_spec.rb +1 -1
  115. data/spec/mongo/caching_cursor_spec.rb +70 -0
  116. data/spec/mongo/client_construction_spec.rb +54 -1
  117. data/spec/mongo/client_encryption_spec.rb +10 -16
  118. data/spec/mongo/client_spec.rb +40 -0
  119. data/spec/mongo/cluster/topology/single_spec.rb +14 -5
  120. data/spec/mongo/cluster_spec.rb +3 -0
  121. data/spec/mongo/collection/view/explainable_spec.rb +87 -4
  122. data/spec/mongo/collection/view/map_reduce_spec.rb +2 -0
  123. data/spec/mongo/collection_spec.rb +60 -0
  124. data/spec/mongo/crypt/auto_decryption_context_spec.rb +1 -1
  125. data/spec/mongo/crypt/auto_encryption_context_spec.rb +1 -1
  126. data/spec/mongo/crypt/data_key_context_spec.rb +1 -1
  127. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +1 -1
  128. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +1 -1
  129. data/spec/mongo/database_spec.rb +44 -64
  130. data/spec/mongo/error/no_server_available_spec.rb +1 -1
  131. data/spec/mongo/index/view_spec.rb +2 -4
  132. data/spec/mongo/logger_spec.rb +13 -11
  133. data/spec/mongo/operation/read_preference_legacy_spec.rb +19 -9
  134. data/spec/mongo/operation/read_preference_op_msg_spec.rb +3 -3
  135. data/spec/mongo/query_cache_spec.rb +279 -0
  136. data/spec/mongo/server/app_metadata_shared.rb +7 -33
  137. data/spec/mongo/server/connection_pool_spec.rb +7 -3
  138. data/spec/mongo/server/connection_spec.rb +14 -7
  139. data/spec/mongo/server_selector/secondary_preferred_spec.rb +6 -6
  140. data/spec/mongo/socket/ssl_spec.rb +1 -1
  141. data/spec/mongo/socket_spec.rb +1 -1
  142. data/spec/mongo/uri/srv_protocol_spec.rb +64 -33
  143. data/spec/mongo/uri_option_parsing_spec.rb +11 -11
  144. data/spec/mongo/uri_spec.rb +68 -41
  145. data/spec/mongo/utils_spec.rb +39 -0
  146. data/spec/runners/auth.rb +3 -0
  147. data/spec/runners/connection_string.rb +35 -124
  148. data/spec/runners/transactions/operation.rb +2 -13
  149. data/spec/spec_tests/cmap_spec.rb +7 -3
  150. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +0 -1
  151. data/spec/spec_tests/data/change_streams/change-streams.yml +0 -1
  152. data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +6 -2
  153. data/spec/spec_tests/data/cmap/pool-create-min-size.yml +3 -0
  154. data/spec/spec_tests/data/connection_string/valid-warnings.yml +24 -0
  155. data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +1 -3
  156. data/spec/spec_tests/data/sdam_monitoring/standalone.yml +2 -2
  157. data/spec/spec_tests/data/sdam_monitoring/standalone_repeated.yml +2 -2
  158. data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +2 -2
  159. data/spec/spec_tests/data/sdam_monitoring/standalone_to_rs_with_me_mismatch.yml +2 -2
  160. data/spec/spec_tests/data/uri_options/auth-options.yml +25 -0
  161. data/spec/spec_tests/data/uri_options/compression-options.yml +6 -3
  162. data/spec/spec_tests/data/uri_options/read-preference-options.yml +24 -0
  163. data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +1 -0
  164. data/spec/spec_tests/data/uri_options/tls-options.yml +160 -4
  165. data/spec/spec_tests/dns_seedlist_discovery_spec.rb +9 -1
  166. data/spec/spec_tests/uri_options_spec.rb +31 -33
  167. data/spec/support/certificates/atlas-ocsp-ca.crt +28 -0
  168. data/spec/support/certificates/atlas-ocsp.crt +41 -0
  169. data/spec/support/client_registry.rb +4 -8
  170. data/spec/support/client_registry_macros.rb +4 -4
  171. data/spec/support/common_shortcuts.rb +45 -0
  172. data/spec/support/constraints.rb +23 -0
  173. data/spec/support/lite_constraints.rb +24 -0
  174. data/spec/support/matchers.rb +16 -0
  175. data/spec/support/ocsp +1 -0
  176. data/spec/support/session_registry.rb +52 -0
  177. data/spec/support/spec_config.rb +22 -12
  178. data/spec/support/spec_setup.rb +38 -48
  179. data/spec/support/utils.rb +19 -1
  180. data.tar.gz.sig +1 -3
  181. metadata +938 -933
  182. metadata.gz.sig +0 -0
  183. data/spec/integration/secondary_reads_spec.rb +0 -102
  184. data/spec/shared/LICENSE +0 -20
  185. data/spec/shared/bin/get-mongodb-download-url +0 -17
  186. data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
  187. data/spec/shared/lib/mrss/cluster_config.rb +0 -221
  188. data/spec/shared/lib/mrss/constraints.rb +0 -346
  189. data/spec/shared/lib/mrss/docker_runner.rb +0 -265
  190. data/spec/shared/lib/mrss/lite_constraints.rb +0 -191
  191. data/spec/shared/lib/mrss/server_version_registry.rb +0 -115
  192. data/spec/shared/lib/mrss/spec_organizer.rb +0 -152
  193. data/spec/shared/lib/mrss/utils.rb +0 -15
  194. data/spec/shared/share/Dockerfile.erb +0 -231
  195. data/spec/shared/shlib/distro.sh +0 -73
  196. data/spec/shared/shlib/server.sh +0 -290
  197. data/spec/shared/shlib/set_env.sh +0 -128
@@ -1,191 +0,0 @@
1
- # frozen_string_literal: true
2
- # encoding: utf-8
3
-
4
- module Mrss
5
- module LiteConstraints
6
-
7
- # Constrain tests that use TimeoutInterrupt to MRI (and Unix).
8
- def require_mri
9
- before(:all) do
10
- unless SpecConfig.instance.mri?
11
- skip "MRI required, we have #{SpecConfig.instance.platform}"
12
- end
13
- end
14
- end
15
-
16
- def require_jruby
17
- before(:all) do
18
- unless BSON::Environment.jruby?
19
- skip "JRuby required, we have #{SpecConfig.instance.platform}"
20
- end
21
- end
22
- end
23
-
24
- # This is for marking tests that fail on JRuby that should
25
- # in principle work (as opposed to being fundamentally incompatible
26
- # with JRuby).
27
- # Often times these failures happen only in Evergreen.
28
- def fails_on_jruby(version=nil)
29
- before(:all) do
30
- if BSON::Environment.jruby?
31
- if version
32
- min_parts = version.split('.').map(&:to_i)
33
- actual_parts = JRUBY_VERSION.split('.').map(&:to_i)[0...min_parts.length]
34
- actual = actual_parts.join('.')
35
- if actual <= version
36
- skip "Fails on jruby through #{version}"
37
- end
38
- else
39
- skip "Fails on jruby"
40
- end
41
- end
42
- end
43
- end
44
-
45
- # Indicates that the respective test uses the internet in some capacity,
46
- # for example the test resolves SRV DNS records.
47
- def require_external_connectivity
48
- before(:all) do
49
- if ENV['EXTERNAL_DISABLED']
50
- skip "Test requires external connectivity"
51
- end
52
- end
53
- end
54
-
55
- def require_mongo_kerberos
56
- before(:all) do
57
- # TODO Use a more generic environment variable name if/when
58
- # Mongoid tests get Kerberos configurations.
59
- unless %w(1 yes true).include?(ENV['MONGO_RUBY_DRIVER_KERBEROS']&.downcase)
60
- skip 'Set MONGO_RUBY_DRIVER_KERBEROS=1 in environment to run Kerberos unit tests'
61
- end
62
- require 'mongo_kerberos'
63
- end
64
- end
65
-
66
- def require_linting
67
- before(:all) do
68
- unless Mongo::Lint.enabled?
69
- skip "Linting is not enabled"
70
- end
71
- end
72
- end
73
-
74
- # Some tests will fail if linting is enabled:
75
- # 1. Tests that pass invalid options to client, etc. which the linter
76
- # rejects.
77
- # 2. Tests that set expectations on topologies, server descriptions, etc.
78
- # (since setting expectations requires mutating said objects, and when
79
- # linting is on those objects are frozen).
80
- def require_no_linting
81
- before(:all) do
82
- if Mongo::Lint.enabled?
83
- skip "Linting is enabled"
84
- end
85
- end
86
- end
87
-
88
- def require_libmongocrypt
89
- before(:all) do
90
- unless ENV['LIBMONGOCRYPT_PATH']
91
- skip 'Test requires path to libmongocrypt to be specified in LIBMONGOCRYPT_PATH env variable'
92
- end
93
- end
94
- end
95
-
96
- def require_no_libmongocrypt
97
- before(:all) do
98
- if ENV['LIBMONGOCRYPT_PATH']
99
- skip 'Test requires libmongocrypt to not be configured'
100
- end
101
- end
102
- end
103
-
104
- def require_aws_auth
105
- before(:all) do
106
- unless (ENV['AUTH'] || '') =~ /^aws/
107
- skip 'This test requires AUTH=aws* and an appropriately configured runtime environment'
108
- end
109
- end
110
- end
111
-
112
- def require_ec2_host
113
- before(:all) do
114
- if $have_aws.nil?
115
- $have_aws = begin
116
- require 'open-uri'
117
- begin
118
- Timeout.timeout(3.81) do
119
- URI.parse('http://169.254.169.254/latest/meta-data/profile').open.read
120
- end
121
- true
122
- # When trying to use the EC2 metadata endpoint on ECS:
123
- # Errno::EINVAL: Failed to open TCP connection to 169.254.169.254:80 (Invalid argument - connect(2) for "169.254.169.254" port 80)
124
- rescue Timeout::Error, Errno::ETIMEDOUT, Errno::EINVAL, OpenURI::HTTPError => $aws_error
125
- false
126
- end
127
- end
128
- end
129
- unless $have_aws
130
- skip "EC2 instance metadata is not available - assuming not running on an EC2 instance: #{$aws_error.class}: #{$aws_error}"
131
- end
132
- end
133
- end
134
-
135
- def require_stress
136
- before(:all) do
137
- if !SpecConfig.instance.stress?
138
- skip 'Set STRESS=1 in environment to run stress tests'
139
- end
140
- end
141
- end
142
-
143
- def require_fork
144
- before(:all) do
145
- if !SpecConfig.instance.fork?
146
- skip 'Set FORK=1 in environment to run fork tests'
147
- end
148
- end
149
- end
150
-
151
- def require_ocsp
152
- before(:all) do
153
- if !SpecConfig.instance.ocsp?
154
- skip 'Set OCSP=1 in environment to run OCSP tests'
155
- end
156
- end
157
- end
158
-
159
- def require_ocsp_verifier
160
- before(:all) do
161
- if !SpecConfig.instance.ocsp_verifier?
162
- skip 'Set OCSP_VERIFIER=1 in environment to run OCSP verifier tests'
163
- end
164
- end
165
- end
166
-
167
- def require_ocsp_connectivity
168
- before(:all) do
169
- if !SpecConfig.instance.ocsp_connectivity?
170
- skip 'Set OCSP_CONNECTIVITY=pass or OCSP_CONNECTIVITY=fail in environment to run OCSP connectivity tests'
171
- end
172
- end
173
- end
174
-
175
- def require_active_support
176
- before(:all) do
177
- if !SpecConfig.instance.active_support?
178
- skip 'This test requires ActiveSupport; set WITH_ACTIVE_SUPPORT=1 in environment'
179
- end
180
- end
181
- end
182
-
183
- def no_active_support
184
- before(:all) do
185
- if SpecConfig.instance.active_support?
186
- skip 'This test requires no ActiveSupport; unset WITH_ACTIVE_SUPPORT in environment'
187
- end
188
- end
189
- end
190
- end
191
- end
@@ -1,115 +0,0 @@
1
- # frozen_string_literal: true
2
- # encoding: utf-8
3
-
4
- autoload :JSON, 'json'
5
- require 'open-uri'
6
-
7
- module Mrss
8
- class ServerVersionRegistry
9
- class Error < StandardError
10
- end
11
-
12
- class UnknownVersion < Error
13
- end
14
-
15
- class MissingDownloadUrl < Error
16
- end
17
-
18
- class BrokenDownloadUrl < Error
19
- end
20
-
21
- def initialize(desired_version, arch)
22
- @desired_version, @arch = desired_version, arch
23
- end
24
-
25
- attr_reader :desired_version, :arch
26
-
27
- def download_url
28
- @download_url ||= begin
29
- version, version_ok = detect_version(current_catalog)
30
- if version.nil?
31
- version, full_version_ok = detect_version(full_catalog)
32
- version_ok ||= full_version_ok
33
- end
34
- if version.nil?
35
- if version_ok
36
- raise MissingDownloadUrl, "No downloads for version #{desired_version}"
37
- else
38
- raise UnknownVersion, "No version #{desired_version}"
39
- end
40
- end
41
- dl = version['downloads'].detect do |dl|
42
- dl['archive']['url'].index("enterprise-#{arch}") &&
43
- dl['arch'] == 'x86_64'
44
- end
45
- unless dl
46
- raise MissingDownloadUrl, "No download for #{arch} for #{version['version']}"
47
- end
48
- url = dl['archive']['url']
49
- end
50
- rescue MissingDownloadUrl
51
- if %w(4.7 4.7.0).include?(desired_version)
52
- # 4.7.0 has no advertised downloads but it is downloadable and
53
- # we do need it. Dirty hack below.
54
- registry = self.class.new('4.4.3', arch)
55
- registry.download_url.sub('4.4.3', '4.7.0').tap do |url|
56
- # Sanity check - ensure the URL we hacked up is a valid one
57
- io = uri_open(url)
58
- begin
59
- io.read(1)
60
- ensure
61
- io.close
62
- end
63
- end
64
- else
65
- raise
66
- end
67
- end
68
-
69
- private
70
-
71
- def uri_open(*args)
72
- if RUBY_VERSION < '2.5'
73
- open(*args)
74
- else
75
- URI.open(*args)
76
- end
77
- end
78
-
79
- def detect_version(catalog)
80
- candidate_versions = catalog['versions'].select do |version|
81
- version['version'].start_with?(desired_version) &&
82
- !version['version'].include?('-')
83
- end
84
- version_ok = !candidate_versions.empty?
85
- # Sometimes the download situation is borked and there is a release
86
- # with no downloads... skip those.
87
- version = candidate_versions.detect do |version|
88
- !version['downloads'].empty?
89
- end
90
- # Allow RC releases if there isn't a GA release.
91
- if version.nil?
92
- candidate_versions = catalog['versions'].select do |version|
93
- version['version'].start_with?(desired_version)
94
- end
95
- version_ok ||= !candidate_versions.empty?
96
- version = candidate_versions.detect do |version|
97
- !version['downloads'].empty?
98
- end
99
- end
100
- [version, version_ok]
101
- end
102
-
103
- def current_catalog
104
- @current_catalog ||= begin
105
- JSON.load(uri_open('http://downloads.mongodb.org/current.json').read)
106
- end
107
- end
108
-
109
- def full_catalog
110
- @full_catalog ||= begin
111
- JSON.load(uri_open('http://downloads.mongodb.org/full.json').read)
112
- end
113
- end
114
- end
115
- end
@@ -1,152 +0,0 @@
1
- # frozen_string_literal: true
2
- # encoding: utf-8
3
-
4
- autoload :JSON, 'json'
5
- autoload :FileUtils, 'fileutils'
6
- autoload :Find, 'find'
7
-
8
- module Mrss
9
-
10
- autoload :ChildProcessHelper, 'mrss/child_process_helper'
11
-
12
- # Organizes and runs all of the tests in the test suite in batches.
13
- #
14
- # Organizing the tests in batches serves two purposes:
15
- #
16
- # 1. This allows running unit tests before integration tests, therefore
17
- # in theory revealing failures quicker on average.
18
- # 2. This allows running some tests that have high intermittent failure rate
19
- # in their own test process.
20
- #
21
- # This class aggregates RSpec results after the test runs.
22
- class SpecOrganizer
23
-
24
- class BucketsNotPrioritized < StandardError
25
- end
26
-
27
- def initialize(root: nil, classifiers:, priority_order:,
28
- spec_root: nil, rspec_json_path: nil, rspec_all_json_path: nil
29
- )
30
- @spec_root = spec_root || File.join(root, 'spec')
31
- @classifiers = classifiers
32
- @priority_order = priority_order
33
- @rspec_json_path = rspec_json_path || File.join(root, 'tmp/rspec.json')
34
- @rspec_all_json_path = rspec_all_json_path || File.join(root, 'tmp/rspec-all.json')
35
- end
36
-
37
- attr_reader :spec_root, :classifiers, :priority_order
38
- attr_reader :rspec_json_path, :rspec_all_json_path
39
-
40
- def buckets
41
- @buckets ||= {}.tap do |buckets|
42
- Find.find(spec_root) do |path|
43
- next unless File.file?(path)
44
- next unless path =~ /_spec\.rb\z/
45
- rel_path = path[(spec_root.length + 1)..path.length]
46
-
47
- found = false
48
- classifiers.each do |(regexp, category)|
49
- if regexp =~ rel_path
50
- buckets[category] ||= []
51
- buckets[category] << File.join('spec', rel_path)
52
- found = true
53
- break
54
- end
55
- end
56
-
57
- unless found
58
- buckets[nil] ||= []
59
- buckets[nil] << File.join('spec', rel_path)
60
- end
61
- end
62
- end.freeze
63
- end
64
-
65
- def ordered_buckets
66
- @ordered_buckets ||= {}.tap do |ordered_buckets|
67
- buckets = self.buckets.dup
68
- priority_order.each do |category|
69
- files = buckets.delete(category)
70
- ordered_buckets[category] = files
71
- end
72
-
73
- if files = buckets.delete(nil)
74
- ordered_buckets[nil] = files
75
- end
76
-
77
- unless buckets.empty?
78
- raise BucketsNotPrioritized, "Some buckets were not prioritized: #{buckets.keys.map(&:to_s).join(', ')}"
79
- end
80
- end.freeze
81
- end
82
-
83
- def run
84
- FileUtils.rm_f(rspec_all_json_path)
85
-
86
- failed = []
87
- buckets = self.buckets.dup
88
-
89
- priority_order.each do |category|
90
- if files = buckets.delete(category)
91
- unless run_files(category, files)
92
- failed << category
93
- end
94
- end
95
- end
96
- if files = buckets.delete(nil)
97
- unless run_files('remaining', files)
98
- failed << 'remaining'
99
- end
100
- end
101
-
102
- unless buckets.empty?
103
- raise "Some buckets were not executed: #{buckets.keys.map(&:to_s).join(', ')}"
104
- end
105
-
106
- if failed.any?
107
- raise "The following buckets failed: #{failed.map(&:to_s).join(', ')}"
108
- end
109
- end
110
-
111
- def run_files(category, paths)
112
- puts "Running #{category.to_s.gsub('_', ' ')} tests"
113
- FileUtils.rm_f(rspec_json_path)
114
- cmd = %w(rspec) + paths
115
-
116
- begin
117
- ChildProcessHelper.check_call(cmd)
118
- ensure
119
- if File.exist?(rspec_json_path)
120
- if File.exist?(rspec_all_json_path)
121
- merge_rspec_results
122
- else
123
- FileUtils.cp(rspec_json_path, rspec_all_json_path)
124
- end
125
- end
126
- end
127
-
128
- true
129
- rescue ChildProcessHelper::SpawnError
130
- false
131
- end
132
-
133
- def merge_rspec_results
134
- all = JSON.parse(File.read(rspec_all_json_path))
135
- new = JSON.parse(File.read(rspec_json_path))
136
- all['examples'] += new.delete('examples')
137
- new.delete('summary').each do |k, v|
138
- all['summary'][k] += v
139
- end
140
- new.delete('version')
141
- new.delete('summary_line')
142
- unless new.empty?
143
- raise "Unhandled rspec results keys: #{new.keys.join(', ')}"
144
- end
145
- # We do not merge summary lines, delete them from aggregated results
146
- all.delete('summary_line')
147
- File.open(rspec_all_json_path, 'w') do |f|
148
- f << JSON.dump(all)
149
- end
150
- end
151
- end
152
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
- # encoding: utf-8
3
-
4
- module Mrss
5
- module Utils
6
-
7
- module_function def print_backtrace(dest=STDERR)
8
- begin
9
- hello world
10
- rescue => e
11
- dest.puts e.backtrace.join("\n")
12
- end
13
- end
14
- end
15
- end
@@ -1,231 +0,0 @@
1
- # Python toolchain as of this writing is available on rhel62, debian92 and
2
- # ubuntu1604.
3
- #
4
- # To run rhel62 in docker, host system must be configured to emulate syscalls:
5
- # https://github.com/CentOS/sig-cloud-instance-images/issues/103
6
-
7
- <%
8
-
9
- python_toolchain_url = "https://s3.amazonaws.com//mciuploads/mongo-python-driver-toolchain/#{distro}/ba92de2700c04ee2d4f82c3ffdfc33105140cb04/mongo_python_driver_toolchain_#{distro.gsub('-', '_')}_ba92de2700c04ee2d4f82c3ffdfc33105140cb04_19_11_14_15_33_33.tar.gz"
10
- server_version = '4.3.3'
11
- server_url = "http://downloads.10gen.com/linux/mongodb-linux-x86_64-enterprise-#{distro}-#{server_version}.tgz"
12
- server_archive_basename = File.basename(server_url)
13
- server_extracted_dir = server_archive_basename.sub(/\.(tar\.gz|tgz)$/, '')
14
-
15
- toolchain_upper='291ba4a4e8297f142796e70eee71b99f333e35e1'
16
-
17
- ruby_toolchain_url = "http://boxes.10gen.com/build/toolchain-drivers/mongo-ruby-driver/ruby-toolchain-#{distro}-#{toolchain_upper}.tar.xz"
18
- #ruby_toolchain_url = "https://s3.amazonaws.com//mciuploads/mongo-ruby-toolchain/#{distro}/#{toolchain_upper}/mongo_ruby_driver_toolchain_#{distro.gsub('-', '_')}_patch_#{toolchain_upper}_#{toolchain_lower}.tar.gz"
19
-
20
- %>
21
-
22
- FROM <%= base_image %>
23
-
24
- <% if debian? %>
25
-
26
- ENV DEBIAN_FRONTEND=noninteractive
27
-
28
- <% else %>
29
-
30
- RUN echo assumeyes=1 |tee -a /etc/yum.conf
31
-
32
- <% end %>
33
-
34
- <% if ruby_head? %>
35
-
36
- # To use current versions of mlaunch, Python 3.6+ is required.
37
- # Most distros ship with older Pythons, therefore we need to install
38
- # a newer Python from somewhere. This section installs the Python
39
- # toolhcain which comes with recent Pythons.
40
- # Alternatively, Ruby toolchain compiles its own copy of Python 3 but
41
- # this is currently incomplete in that on older distros with old OpenSSL,
42
- # the built Python has no ssl module and hence practically is unusable.
43
- # Currently Ruby driver uses mtools-legacy which supports Python 2,
44
- # avoiding this entire issue for the time being.
45
-
46
- #RUN curl --retry 3 -fL <%= python_toolchain_url %> -o python-toolchain.tar.gz
47
- #RUN tar -xC /opt -zf python-toolchain.tar.gz
48
-
49
- <% end %>
50
-
51
- <% if debian? %>
52
-
53
- # zsh is not required for any scripts but it is a better interactive shell
54
- # than bash.
55
- # Ruby runtime dependencies: libyaml-0-2
56
- # Compiling ruby libraries: gcc make
57
- # Compiling pyhton packages: python2.7-dev
58
- # JRuby: openjdk-8-jre-headless
59
- # Server dependencies: libsnmp30 libcurl3/libcurl4
60
- # Determining OS we are running on: lsb-release
61
- # Kerberos testing: krb5-user
62
- # Local Kerberos server: krb5-kdc krb5-admin-server
63
- # Installing mlaunch from git: git
64
- # ruby-head archive: bzip2
65
- # nio4r on JRuby: libgmp-dev
66
- # Snappy compression: libsnappy-dev
67
- # nokogiri: zlib1g-dev
68
- # Mongoid testing: tzdata
69
- # Mongoid application testing: nodejs (8.x or newer)
70
- #
71
- # We currently use Python 2-compatible version of mtools, which
72
- # is installable via pip (which uses Python 2). All of the MongoDB
73
- # distros have pip installed (but none as of this writing have pip3)
74
- # therefore install python-pip in all configurations here.
75
-
76
- <% packages = %w(
77
- lsb-release bzip2 curl zsh
78
- git make gcc libyaml-0-2 libgmp-dev zlib1g-dev libsnappy-dev
79
- libsnmp30
80
- krb5-user krb5-kdc krb5-admin-server libsasl2-dev libsasl2-modules-gssapi-mit
81
- python-pip python2.7-dev python3-pip
82
- tzdata
83
- ) %>
84
-
85
- # ubuntu1404 only has openjdk-7-jre-headless
86
- <% if distro !~ /ubuntu1404/ %>
87
- <% packages << 'openjdk-8-jre-headless' %>
88
- <% end %>
89
-
90
- # ubuntu1404, ubuntu1604: libcurl3
91
- # ubuntu1804: libcurl4
92
- <% if distro =~ /ubuntu1804/ %>
93
- <% packages << 'libcurl4' %>
94
- <% else %>
95
- <% packages << 'libcurl3' %>
96
- <% end %>
97
-
98
- <% if distro =~ /ubuntu1804/ %>
99
- <% packages << 'nodejs' %>
100
- <% end %>
101
-
102
- RUN apt-get update && apt-get install -y <%= packages.join(' ') %>
103
- <% else %>
104
-
105
- # Enterprise server: net-snmp
106
- # lsb_release: redhat-lsb-core
107
- # our runner scripts: which
108
- # Ruby dependency: libyaml
109
- # compiling python packages: gcc python-devel
110
- # Kerberos tests: krb5-workstation + cyrus-sasl-devel to build the
111
- # mongo_kerberos gem + cyrus-sasl-gssapi for authentication to work
112
- # Local Kerberos server: krb5-server
113
- # JRuby: java-1.8.0-openjdk
114
- #
115
- # Note: lacking cyrus-sasl-gssapi produces a cryptic message
116
- # "SASL(-4): no mechanism available: No worthy mechs found"
117
- # https://github.com/farorm/python-ad/issues/10
118
-
119
- RUN yum install -y redhat-lsb-core which git gcc libyaml krb5-server \
120
- krb5-workstation cyrus-sasl-devel cyrus-sasl-gssapi java-1.8.0-openjdk \
121
- net-snmp
122
-
123
- <% if distro =~ /rhel6/ %>
124
-
125
- # RHEL 6 ships with Python 2.6.
126
-
127
- RUN yum install -y centos-release-scl && \
128
- yum install -y python27-python python27-python-devel
129
- ENV PATH=/opt/rh/python27/root/usr/bin:$PATH \
130
- LD_LIBRARY_PATH=/opt/rh/python27/root/usr/lib64
131
-
132
- <% else %>
133
-
134
- RUN yum install -y python-devel
135
-
136
- <% end %>
137
-
138
- <% end %>
139
-
140
- <% if preload? %>
141
-
142
- # Current virtualenv fails with
143
- # https://github.com/pypa/virtualenv/issues/1630
144
- RUN python2 -m pip install 'virtualenv<20' 'mtools-legacy[mlaunch]'
145
-
146
- RUN pip --version && \
147
- pip install mtools-legacy[mlaunch]
148
-
149
- <% if @env.fetch('MONGODB_VERSION') >= '4.4' %>
150
- RUN python3 -mpip install asn1crypto oscrypto flask
151
- <% end %>
152
-
153
- <% unless ruby_head? %>
154
-
155
- RUN curl --retry 3 -fL <%= ruby_toolchain_url %> |tar -xC /opt -Jf -
156
- ENV PATH=/opt/rubies/<%= ruby %>/bin:$PATH \
157
- USE_OPT_TOOLCHAIN=1
158
- #ENV PATH=/opt/rubies/python/3/bin:$PATH
159
-
160
- <% end %>
161
-
162
- <% if distro =~ /rhel|ubuntu1604/ %>
163
-
164
- # Ubuntu 12.04 ships pip 1.0 which is ancient and does not work.
165
- #
166
- # Ubuntu 16.04 apparently also ships a pip that does not work:
167
- # https://stackoverflow.com/questions/37495375/python-pip-install-throws-typeerror-unsupported-operand-types-for-retry
168
- # Potentially this only affects environments with less than ideal
169
- # connectivity (or, perhaps, when python package registry is experiencing
170
- # availability issues) when pip must retry to install packages.
171
- #
172
- # rhel apparently does not package pip at all in core repoitories,
173
- # therefore install it the manual way.
174
- #
175
- # https://pip.pypa.io/en/stable/installing/
176
- RUN curl --retry 3 -fL https://bootstrap.pypa.io/pip/2.7/get-pip.py | python
177
-
178
- <% end %>
179
-
180
- RUN curl --retry 3 -fL <%= server_download_url %> |tar xzf - && \
181
- mv mongo*/ /opt/mongodb
182
- ENV USE_OPT_MONGODB=1 USE_SYSTEM_PYTHON_PACKAGES=1
183
-
184
- <% end %>
185
-
186
- WORKDIR /app
187
-
188
- <% if preload? && !ruby_head? %>
189
-
190
- COPY Gemfile .
191
- COPY gemfiles gemfiles
192
- COPY *.gemspec .
193
- COPY lib/<%= project_lib_subdir %>/version.rb lib/<%= project_lib_subdir %>/version.rb
194
- RUN bundle install
195
- COPY .evergreen/patch-debuggers .evergreen/patch-debuggers
196
- RUN .evergreen/patch-debuggers /opt/rubies
197
-
198
- <% end %>
199
-
200
- <% if fle? %>
201
- RUN curl --retry 3 -fLo libmongocrypt-all.tar.gz "https://s3.amazonaws.com/mciuploads/libmongocrypt/all/master/latest/libmongocrypt-all.tar.gz"
202
- RUN tar xf libmongocrypt-all.tar.gz
203
-
204
- <%= "ENV LIBMONGOCRYPT_PATH #{libmongocrypt_path}" %>
205
- <% end %>
206
-
207
- ENV MONGO_ORCHESTRATION_HOME=/tmpfs \
208
- PROJECT_DIRECTORY=/app \
209
- <%= @env.map { |k, v| %Q`#{k}="#{v.gsub('$', "\\$").gsub('"', "\\\"")}"` }.join(" \\\n ") %>
210
-
211
- <% if interactive? %>
212
- ENV INTERACTIVE=1
213
- <% end %>
214
-
215
- COPY . .
216
-
217
- <% if expose? %>
218
-
219
- <% ports = [] %>
220
-
221
- <% 0.upto(num_exposed_ports-1) do |i| %>
222
- <% ports << 27017 + i %>
223
- <% end %>
224
-
225
- <% if @env['OCSP_ALGORITHM'] %>
226
- <% ports << 8100 %>
227
- <% end %>
228
-
229
- EXPOSE <%= ports.map(&:to_s).join(' ') %>
230
-
231
- <% end %>