mongo 2.13.3 → 2.14.0.rc1
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/lib/mongo/address/ipv4.rb +1 -1
- data/lib/mongo/address/ipv6.rb +1 -1
- data/lib/mongo/address.rb +1 -1
- data/lib/mongo/bulk_write.rb +17 -0
- data/lib/mongo/caching_cursor.rb +74 -0
- data/lib/mongo/client.rb +47 -8
- data/lib/mongo/cluster/topology/single.rb +1 -1
- data/lib/mongo/cluster.rb +3 -3
- data/lib/mongo/collection/view/aggregation.rb +25 -4
- data/lib/mongo/collection/view/builder/find_command.rb +38 -18
- data/lib/mongo/collection/view/explainable.rb +27 -8
- data/lib/mongo/collection/view/iterable.rb +72 -12
- data/lib/mongo/collection/view/readable.rb +12 -2
- data/lib/mongo/collection/view/writable.rb +15 -1
- data/lib/mongo/collection/view.rb +24 -20
- data/lib/mongo/collection.rb +26 -2
- data/lib/mongo/crypt/encryption_io.rb +6 -6
- data/lib/mongo/cursor.rb +1 -0
- data/lib/mongo/database/view.rb +1 -1
- data/lib/mongo/database.rb +8 -14
- data/lib/mongo/error/invalid_read_concern.rb +28 -0
- data/lib/mongo/error/server_certificate_revoked.rb +22 -0
- data/lib/mongo/error/unsupported_option.rb +14 -12
- data/lib/mongo/error.rb +2 -0
- data/lib/mongo/grid/fs_bucket.rb +37 -37
- data/lib/mongo/lint.rb +2 -1
- data/lib/mongo/logger.rb +3 -3
- data/lib/mongo/operation/aggregate/result.rb +9 -8
- data/lib/mongo/operation/collections_info/command.rb +0 -5
- data/lib/mongo/operation/collections_info/result.rb +3 -16
- data/lib/mongo/operation/delete/bulk_result.rb +2 -0
- data/lib/mongo/operation/delete/result.rb +3 -0
- data/lib/mongo/operation/explain/command.rb +4 -0
- data/lib/mongo/operation/explain/legacy.rb +4 -0
- data/lib/mongo/operation/explain/op_msg.rb +6 -0
- data/lib/mongo/operation/explain/result.rb +3 -0
- data/lib/mongo/operation/find/legacy/result.rb +2 -0
- data/lib/mongo/operation/find/result.rb +3 -0
- data/lib/mongo/operation/get_more/result.rb +3 -0
- data/lib/mongo/operation/indexes/result.rb +5 -0
- data/lib/mongo/operation/insert/bulk_result.rb +5 -0
- data/lib/mongo/operation/insert/result.rb +5 -0
- data/lib/mongo/operation/list_collections/result.rb +5 -0
- data/lib/mongo/operation/map_reduce/result.rb +10 -0
- data/lib/mongo/operation/parallel_scan/command.rb +2 -1
- data/lib/mongo/operation/parallel_scan/result.rb +4 -0
- data/lib/mongo/operation/result.rb +35 -6
- data/lib/mongo/operation/shared/bypass_document_validation.rb +1 -0
- data/lib/mongo/operation/shared/causal_consistency_supported.rb +1 -0
- data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +2 -0
- data/lib/mongo/operation/shared/executable.rb +1 -0
- data/lib/mongo/operation/shared/idable.rb +2 -1
- data/lib/mongo/operation/shared/limited.rb +1 -0
- data/lib/mongo/operation/shared/object_id_generator.rb +1 -0
- data/lib/mongo/operation/shared/read_preference_supported.rb +36 -38
- data/lib/mongo/operation/shared/result/aggregatable.rb +1 -0
- data/lib/mongo/operation/shared/sessions_supported.rb +3 -3
- data/lib/mongo/operation/shared/specifiable.rb +1 -0
- data/lib/mongo/operation/shared/write.rb +1 -0
- data/lib/mongo/operation/shared/write_concern_supported.rb +1 -0
- data/lib/mongo/operation/update/legacy/result.rb +7 -0
- data/lib/mongo/operation/update/result.rb +8 -0
- data/lib/mongo/operation/users_info/result.rb +3 -0
- data/lib/mongo/operation.rb +2 -0
- data/lib/mongo/protocol/msg.rb +2 -2
- data/lib/mongo/protocol/query.rb +11 -11
- data/lib/mongo/query_cache.rb +242 -0
- data/lib/mongo/retryable.rb +8 -1
- data/lib/mongo/server/connection_common.rb +2 -2
- data/lib/mongo/server/connection_pool.rb +3 -0
- data/lib/mongo/server/monitor/connection.rb +3 -3
- data/lib/mongo/server/monitor.rb +1 -1
- data/lib/mongo/server/pending_connection.rb +2 -2
- data/lib/mongo/server/push_monitor.rb +1 -1
- data/lib/mongo/server.rb +5 -1
- data/lib/mongo/server_selector/base.rb +5 -1
- data/lib/mongo/server_selector/secondary_preferred.rb +7 -2
- data/lib/mongo/session.rb +3 -0
- data/lib/mongo/socket/ocsp_cache.rb +97 -0
- data/lib/mongo/socket/ocsp_verifier.rb +368 -0
- data/lib/mongo/socket/ssl.rb +45 -24
- data/lib/mongo/socket.rb +6 -4
- data/lib/mongo/srv/monitor.rb +7 -13
- data/lib/mongo/srv/resolver.rb +14 -10
- data/lib/mongo/timeout.rb +2 -0
- data/lib/mongo/uri/options_mapper.rb +582 -0
- data/lib/mongo/uri/srv_protocol.rb +3 -2
- data/lib/mongo/uri.rb +21 -390
- data/lib/mongo/utils.rb +12 -1
- data/lib/mongo/version.rb +1 -1
- data/lib/mongo.rb +9 -0
- data/spec/NOTES.aws-auth.md +12 -7
- data/spec/README.md +56 -1
- data/spec/integration/bson_symbol_spec.rb +2 -4
- data/spec/integration/bulk_write_spec.rb +48 -0
- data/spec/integration/client_authentication_options_spec.rb +55 -28
- data/spec/integration/connection_pool_populator_spec.rb +3 -1
- data/spec/integration/cursor_reaping_spec.rb +53 -17
- data/spec/integration/ocsp_connectivity_spec.rb +26 -0
- data/spec/integration/ocsp_verifier_cache_spec.rb +188 -0
- data/spec/integration/ocsp_verifier_spec.rb +334 -0
- data/spec/integration/query_cache_spec.rb +1045 -0
- data/spec/integration/query_cache_transactions_spec.rb +179 -0
- data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +1 -0
- data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +2 -0
- data/spec/integration/sdam_error_handling_spec.rb +69 -18
- data/spec/integration/sdam_events_spec.rb +7 -8
- data/spec/integration/server_selection_spec.rb +36 -0
- data/spec/integration/srv_monitoring_spec.rb +38 -3
- data/spec/integration/srv_spec.rb +56 -0
- data/spec/lite_spec_helper.rb +4 -2
- data/spec/mongo/address_spec.rb +1 -1
- data/spec/mongo/caching_cursor_spec.rb +70 -0
- data/spec/mongo/client_construction_spec.rb +54 -1
- data/spec/mongo/client_encryption_spec.rb +10 -16
- data/spec/mongo/client_spec.rb +40 -0
- data/spec/mongo/cluster/topology/single_spec.rb +14 -5
- data/spec/mongo/cluster_spec.rb +3 -0
- data/spec/mongo/collection/view/explainable_spec.rb +87 -4
- data/spec/mongo/collection/view/map_reduce_spec.rb +2 -0
- data/spec/mongo/collection_spec.rb +60 -0
- data/spec/mongo/crypt/auto_decryption_context_spec.rb +1 -1
- data/spec/mongo/crypt/auto_encryption_context_spec.rb +1 -1
- data/spec/mongo/crypt/data_key_context_spec.rb +1 -1
- data/spec/mongo/crypt/explicit_decryption_context_spec.rb +1 -1
- data/spec/mongo/crypt/explicit_encryption_context_spec.rb +1 -1
- data/spec/mongo/database_spec.rb +44 -64
- data/spec/mongo/error/no_server_available_spec.rb +1 -1
- data/spec/mongo/index/view_spec.rb +2 -4
- data/spec/mongo/logger_spec.rb +13 -11
- data/spec/mongo/operation/read_preference_legacy_spec.rb +19 -9
- data/spec/mongo/operation/read_preference_op_msg_spec.rb +3 -3
- data/spec/mongo/query_cache_spec.rb +279 -0
- data/spec/mongo/server/app_metadata_shared.rb +7 -33
- data/spec/mongo/server/connection_pool_spec.rb +7 -3
- data/spec/mongo/server/connection_spec.rb +14 -7
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +6 -6
- data/spec/mongo/socket/ssl_spec.rb +1 -1
- data/spec/mongo/socket_spec.rb +1 -1
- data/spec/mongo/uri/srv_protocol_spec.rb +64 -33
- data/spec/mongo/uri_option_parsing_spec.rb +11 -11
- data/spec/mongo/uri_spec.rb +68 -41
- data/spec/mongo/utils_spec.rb +39 -0
- data/spec/runners/auth.rb +3 -0
- data/spec/runners/connection_string.rb +35 -124
- data/spec/runners/transactions/operation.rb +2 -13
- data/spec/spec_tests/cmap_spec.rb +7 -3
- data/spec/spec_tests/data/change_streams/change-streams-errors.yml +0 -1
- data/spec/spec_tests/data/change_streams/change-streams.yml +0 -1
- data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +6 -2
- data/spec/spec_tests/data/cmap/pool-create-min-size.yml +3 -0
- data/spec/spec_tests/data/connection_string/valid-warnings.yml +24 -0
- data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +1 -3
- data/spec/spec_tests/data/sdam_monitoring/standalone.yml +2 -2
- data/spec/spec_tests/data/sdam_monitoring/standalone_repeated.yml +2 -2
- data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +2 -2
- data/spec/spec_tests/data/sdam_monitoring/standalone_to_rs_with_me_mismatch.yml +2 -2
- data/spec/spec_tests/data/uri_options/auth-options.yml +25 -0
- data/spec/spec_tests/data/uri_options/compression-options.yml +6 -3
- data/spec/spec_tests/data/uri_options/read-preference-options.yml +24 -0
- data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +1 -0
- data/spec/spec_tests/data/uri_options/tls-options.yml +160 -4
- data/spec/spec_tests/dns_seedlist_discovery_spec.rb +9 -1
- data/spec/spec_tests/uri_options_spec.rb +31 -33
- data/spec/support/certificates/atlas-ocsp-ca.crt +28 -0
- data/spec/support/certificates/atlas-ocsp.crt +41 -0
- data/spec/support/client_registry.rb +4 -8
- data/spec/support/client_registry_macros.rb +4 -4
- data/spec/support/common_shortcuts.rb +45 -0
- data/spec/support/constraints.rb +23 -0
- data/spec/support/lite_constraints.rb +24 -0
- data/spec/support/matchers.rb +16 -0
- data/spec/support/ocsp +1 -0
- data/spec/support/session_registry.rb +52 -0
- data/spec/support/spec_config.rb +22 -12
- data/spec/support/spec_setup.rb +38 -48
- data/spec/support/utils.rb +19 -1
- data.tar.gz.sig +1 -3
- metadata +938 -933
- metadata.gz.sig +0 -0
- data/spec/integration/secondary_reads_spec.rb +0 -102
- data/spec/shared/LICENSE +0 -20
- data/spec/shared/bin/get-mongodb-download-url +0 -17
- data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
- data/spec/shared/lib/mrss/cluster_config.rb +0 -221
- data/spec/shared/lib/mrss/constraints.rb +0 -346
- data/spec/shared/lib/mrss/docker_runner.rb +0 -265
- data/spec/shared/lib/mrss/lite_constraints.rb +0 -191
- data/spec/shared/lib/mrss/server_version_registry.rb +0 -115
- data/spec/shared/lib/mrss/spec_organizer.rb +0 -152
- data/spec/shared/lib/mrss/utils.rb +0 -15
- data/spec/shared/share/Dockerfile.erb +0 -231
- data/spec/shared/shlib/distro.sh +0 -73
- data/spec/shared/shlib/server.sh +0 -290
- 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,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 %>
|