mongoid 8.0.3 → 8.1.0
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/CHANGELOG.md +3 -3
- data/README.md +3 -3
- data/lib/config/locales/en.yml +46 -14
- data/lib/mongoid/association/accessors.rb +2 -2
- data/lib/mongoid/association/builders.rb +1 -1
- data/lib/mongoid/association/embedded/batchable.rb +2 -2
- data/lib/mongoid/association/embedded/embedded_in/buildable.rb +2 -2
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +2 -1
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +3 -2
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +23 -21
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +1 -1
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +1 -1
- data/lib/mongoid/association/nested/one.rb +40 -2
- data/lib/mongoid/association/proxy.rb +1 -1
- data/lib/mongoid/association/referenced/counter_cache.rb +2 -2
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +5 -1
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +2 -2
- data/lib/mongoid/association/referenced/has_many/proxy.rb +7 -3
- data/lib/mongoid/association/reflections.rb +2 -2
- data/lib/mongoid/attributes/dynamic.rb +1 -1
- data/lib/mongoid/attributes/nested.rb +2 -2
- data/lib/mongoid/attributes/projector.rb +1 -1
- data/lib/mongoid/attributes/readonly.rb +1 -1
- data/lib/mongoid/attributes.rb +8 -2
- data/lib/mongoid/changeable.rb +104 -4
- data/lib/mongoid/clients/storage_options.rb +2 -5
- data/lib/mongoid/clients/validators/storage.rb +1 -13
- data/lib/mongoid/collection_configurable.rb +58 -0
- data/lib/mongoid/composable.rb +2 -0
- data/lib/mongoid/config/defaults.rb +60 -0
- data/lib/mongoid/config/validators/async_query_executor.rb +24 -0
- data/lib/mongoid/config/validators.rb +1 -0
- data/lib/mongoid/config.rb +101 -0
- data/lib/mongoid/contextual/atomic.rb +1 -1
- data/lib/mongoid/contextual/memory.rb +233 -33
- data/lib/mongoid/contextual/mongo/documents_loader.rb +177 -0
- data/lib/mongoid/contextual/mongo.rb +373 -113
- data/lib/mongoid/contextual/none.rb +162 -7
- data/lib/mongoid/contextual.rb +12 -0
- data/lib/mongoid/criteria/findable.rb +2 -2
- data/lib/mongoid/criteria/includable.rb +4 -3
- data/lib/mongoid/criteria/queryable/extensions/array.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +0 -8
- data/lib/mongoid/criteria/queryable/extensions/string.rb +1 -11
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +0 -10
- data/lib/mongoid/criteria/queryable/key.rb +1 -1
- data/lib/mongoid/criteria/queryable/mergeable.rb +1 -1
- data/lib/mongoid/criteria/queryable/optional.rb +8 -8
- data/lib/mongoid/criteria/queryable/selectable.rb +43 -12
- data/lib/mongoid/criteria/translator.rb +45 -0
- data/lib/mongoid/criteria.rb +7 -5
- data/lib/mongoid/deprecable.rb +1 -1
- data/lib/mongoid/document.rb +50 -13
- data/lib/mongoid/errors/create_collection_failure.rb +33 -0
- data/lib/mongoid/errors/drop_collection_failure.rb +27 -0
- data/lib/mongoid/errors/immutable_attribute.rb +26 -0
- data/lib/mongoid/errors/invalid_async_query_executor.rb +25 -0
- data/lib/mongoid/errors/invalid_global_executor_concurrency.rb +22 -0
- data/lib/mongoid/errors/invalid_storage_parent.rb +2 -0
- data/lib/mongoid/errors.rb +4 -1
- data/lib/mongoid/extensions/object.rb +2 -2
- data/lib/mongoid/extensions/time.rb +2 -0
- data/lib/mongoid/factory.rb +21 -8
- data/lib/mongoid/fields/localized.rb +10 -0
- data/lib/mongoid/fields/standard.rb +10 -0
- data/lib/mongoid/fields.rb +69 -13
- data/lib/mongoid/findable.rb +27 -3
- data/lib/mongoid/interceptable.rb +7 -6
- data/lib/mongoid/matcher/eq_impl.rb +1 -1
- data/lib/mongoid/matcher/type.rb +1 -1
- data/lib/mongoid/matcher.rb +21 -6
- data/lib/mongoid/persistable/creatable.rb +1 -0
- data/lib/mongoid/persistable/deletable.rb +1 -1
- data/lib/mongoid/persistable/savable.rb +13 -1
- data/lib/mongoid/persistable/unsettable.rb +2 -2
- data/lib/mongoid/persistable/updatable.rb +51 -1
- data/lib/mongoid/persistable/upsertable.rb +20 -1
- data/lib/mongoid/persistable.rb +3 -0
- data/lib/mongoid/query_cache.rb +5 -1
- data/lib/mongoid/railties/database.rake +7 -2
- data/lib/mongoid/shardable.rb +35 -11
- data/lib/mongoid/stateful.rb +22 -1
- data/lib/mongoid/tasks/database.rake +12 -0
- data/lib/mongoid/tasks/database.rb +20 -0
- data/lib/mongoid/threaded.rb +30 -0
- data/lib/mongoid/traversable.rb +1 -1
- data/lib/mongoid/utils.rb +22 -0
- data/lib/mongoid/validatable/macros.rb +5 -5
- data/lib/mongoid/validatable.rb +4 -1
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/warnings.rb +17 -1
- data/lib/mongoid.rb +16 -3
- data/spec/integration/app_spec.rb +2 -2
- data/spec/integration/callbacks_models.rb +37 -0
- data/spec/integration/callbacks_spec.rb +134 -0
- data/spec/integration/discriminator_key_spec.rb +4 -5
- data/spec/integration/i18n_fallbacks_spec.rb +3 -2
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +27 -0
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +57 -57
- data/spec/mongoid/association/embedded/embeds_many_models.rb +1 -0
- data/spec/mongoid/association/embedded/embeds_one/proxy_spec.rb +15 -2
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -18
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +148 -224
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +111 -164
- data/spec/mongoid/association/syncable_spec.rb +1 -1
- data/spec/mongoid/attributes_spec.rb +5 -8
- data/spec/mongoid/changeable_spec.rb +299 -24
- data/spec/mongoid/clients_spec.rb +122 -13
- data/spec/mongoid/collection_configurable_spec.rb +158 -0
- data/spec/mongoid/config/defaults_spec.rb +160 -0
- data/spec/mongoid/config_spec.rb +154 -18
- data/spec/mongoid/contextual/memory_spec.rb +332 -76
- data/spec/mongoid/contextual/mongo/documents_loader_spec.rb +187 -0
- data/spec/mongoid/contextual/mongo_spec.rb +995 -36
- data/spec/mongoid/contextual/none_spec.rb +49 -2
- data/spec/mongoid/copyable_spec.rb +3 -11
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +4 -69
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
- data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -0
- data/spec/mongoid/criteria/queryable/options_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +419 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +1 -1
- data/spec/mongoid/criteria/queryable/selector_spec.rb +1 -1
- data/spec/mongoid/criteria/translator_spec.rb +132 -0
- data/spec/mongoid/criteria_projection_spec.rb +1 -4
- data/spec/mongoid/criteria_spec.rb +5 -9
- data/spec/mongoid/errors/readonly_document_spec.rb +2 -2
- data/spec/mongoid/extensions/time_spec.rb +8 -43
- data/spec/mongoid/extensions/time_with_zone_spec.rb +7 -52
- data/spec/mongoid/fields/localized_spec.rb +46 -28
- data/spec/mongoid/fields_spec.rb +136 -34
- data/spec/mongoid/findable_spec.rb +391 -34
- data/spec/mongoid/indexable_spec.rb +16 -10
- data/spec/mongoid/interceptable_spec.rb +15 -3
- data/spec/mongoid/persistable/deletable_spec.rb +26 -6
- data/spec/mongoid/persistable/destroyable_spec.rb +26 -6
- data/spec/mongoid/persistable/incrementable_spec.rb +37 -0
- data/spec/mongoid/persistable/logical_spec.rb +37 -0
- data/spec/mongoid/persistable/poppable_spec.rb +36 -0
- data/spec/mongoid/persistable/pullable_spec.rb +72 -0
- data/spec/mongoid/persistable/pushable_spec.rb +72 -0
- data/spec/mongoid/persistable/renamable_spec.rb +36 -0
- data/spec/mongoid/persistable/savable_spec.rb +96 -0
- data/spec/mongoid/persistable/settable_spec.rb +37 -0
- data/spec/mongoid/persistable/unsettable_spec.rb +36 -0
- data/spec/mongoid/persistable/updatable_spec.rb +20 -28
- data/spec/mongoid/persistable/upsertable_spec.rb +80 -6
- data/spec/mongoid/persistence_context_spec.rb +7 -57
- data/spec/mongoid/query_cache_spec.rb +56 -61
- data/spec/mongoid/reloadable_spec.rb +24 -4
- data/spec/mongoid/scopable_spec.rb +70 -0
- data/spec/mongoid/serializable_spec.rb +9 -30
- data/spec/mongoid/shardable_models.rb +14 -0
- data/spec/mongoid/shardable_spec.rb +153 -61
- data/spec/mongoid/stateful_spec.rb +122 -8
- data/spec/mongoid/tasks/database_rake_spec.rb +74 -0
- data/spec/mongoid/tasks/database_spec.rb +127 -0
- data/spec/mongoid/timestamps_spec.rb +9 -11
- data/spec/mongoid/touchable_spec.rb +277 -5
- data/spec/mongoid/touchable_spec_models.rb +3 -1
- data/spec/mongoid/traversable_spec.rb +9 -24
- data/spec/mongoid/validatable/uniqueness_spec.rb +2 -3
- data/spec/mongoid_spec.rb +35 -9
- data/spec/shared/lib/mrss/docker_runner.rb +7 -0
- data/spec/shared/lib/mrss/event_subscriber.rb +15 -5
- data/spec/shared/lib/mrss/lite_constraints.rb +10 -2
- data/spec/shared/lib/mrss/server_version_registry.rb +16 -23
- data/spec/shared/lib/mrss/utils.rb +28 -6
- data/spec/shared/share/Dockerfile.erb +36 -40
- data/spec/shared/shlib/server.sh +32 -8
- data/spec/shared/shlib/set_env.sh +4 -4
- data/spec/spec_helper.rb +5 -0
- data/spec/support/immutable_ids.rb +118 -0
- data/spec/support/macros.rb +47 -15
- data/spec/support/models/artist.rb +0 -1
- data/spec/support/models/band.rb +1 -0
- data/spec/support/models/book.rb +1 -0
- data/spec/support/models/building.rb +2 -0
- data/spec/support/models/cover.rb +10 -0
- data/spec/support/models/product.rb +1 -0
- data.tar.gz.sig +0 -0
- metadata +700 -656
- metadata.gz.sig +0 -0
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +0 -60
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +0 -60
|
@@ -195,12 +195,15 @@ module Mrss
|
|
|
195
195
|
'debian81' => 'debian:jessie',
|
|
196
196
|
'debian92' => 'debian:stretch',
|
|
197
197
|
'debian10' => 'debian:buster',
|
|
198
|
+
'debian11' => 'debian:bullseye',
|
|
198
199
|
'ubuntu1404' => 'ubuntu:trusty',
|
|
199
200
|
'ubuntu1604' => 'ubuntu:xenial',
|
|
200
201
|
'ubuntu1804' => 'ubuntu:bionic',
|
|
201
202
|
'ubuntu2004' => 'ubuntu:focal',
|
|
203
|
+
'ubuntu2204' => 'ubuntu:jammy',
|
|
202
204
|
'rhel62' => 'centos:6',
|
|
203
205
|
'rhel70' => 'centos:7',
|
|
206
|
+
'rhel80' => 'rockylinux:8',
|
|
204
207
|
}.freeze
|
|
205
208
|
|
|
206
209
|
def base_image
|
|
@@ -231,6 +234,10 @@ module Mrss
|
|
|
231
234
|
distro =~ /debian|ubuntu/
|
|
232
235
|
end
|
|
233
236
|
|
|
237
|
+
def ubuntu?
|
|
238
|
+
distro=~ /ubuntu/
|
|
239
|
+
end
|
|
240
|
+
|
|
234
241
|
def preload?
|
|
235
242
|
!!@options[:preload]
|
|
236
243
|
end
|
|
@@ -84,22 +84,32 @@ module Mrss
|
|
|
84
84
|
|
|
85
85
|
# Locates command stated events for the specified command name,
|
|
86
86
|
# asserts that there is exactly one such event, and returns it.
|
|
87
|
-
def single_command_started_event(command_name, include_auth: false)
|
|
87
|
+
def single_command_started_event(command_name, include_auth: false, database_name: nil)
|
|
88
88
|
events = if include_auth
|
|
89
89
|
started_events
|
|
90
90
|
else
|
|
91
91
|
non_auth_command_started_events
|
|
92
92
|
end
|
|
93
|
-
events
|
|
94
|
-
|
|
93
|
+
get_one_event(events, command_name, 'started', database_name: database_name)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Locates command succeeded events for the specified command name,
|
|
97
|
+
# asserts that there is exactly one such event, and returns it.
|
|
98
|
+
def single_command_succeeded_event(command_name, database_name: nil)
|
|
99
|
+
get_one_event(succeeded_events, command_name, 'succeeded', database_name: database_name)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def get_one_event(events, command_name, kind, database_name: nil)
|
|
103
|
+
events = events.select do |event|
|
|
104
|
+
event.command_name == command_name and
|
|
105
|
+
database_name.nil? || database_name == event.database_name
|
|
95
106
|
end
|
|
96
107
|
if events.length != 1
|
|
97
|
-
raise "Expected a single #{command_name} event but we have #{events.length}"
|
|
108
|
+
raise "Expected a single '#{command_name}' #{kind} event#{database_name ? " for '#{database_name}'" : ''} but we have #{events.length}"
|
|
98
109
|
end
|
|
99
110
|
events.first
|
|
100
111
|
end
|
|
101
112
|
|
|
102
|
-
|
|
103
113
|
# Get the first succeeded event published for the name, and then delete it.
|
|
104
114
|
#
|
|
105
115
|
# @param [ String ] name The event name.
|
|
@@ -98,8 +98,8 @@ module Mrss
|
|
|
98
98
|
def min_libmongocrypt_version(version)
|
|
99
99
|
require_libmongocrypt
|
|
100
100
|
before(:all) do
|
|
101
|
-
actual_version =
|
|
102
|
-
min_version =
|
|
101
|
+
actual_version = Utils.parse_version(Mongo::Crypt::Binding.mongocrypt_version(nil))
|
|
102
|
+
min_version = Utils.parse_version(version)
|
|
103
103
|
unless actual_version >= min_version
|
|
104
104
|
skip "libmongocrypt version #{min_version} required, but version #{actual_version} is available"
|
|
105
105
|
end
|
|
@@ -209,6 +209,14 @@ module Mrss
|
|
|
209
209
|
end
|
|
210
210
|
end
|
|
211
211
|
|
|
212
|
+
def require_no_fallbacks
|
|
213
|
+
before(:all) do
|
|
214
|
+
if %w(yes true 1).include?((ENV['TEST_I18N_FALLBACKS'] || '').downcase)
|
|
215
|
+
skip 'Set TEST_I18N_FALLBACKS=0 environment variable to run these tests'
|
|
216
|
+
end
|
|
217
|
+
end
|
|
218
|
+
end
|
|
219
|
+
|
|
212
220
|
# This is a macro for retrying flaky tests on CI that occasionally fail.
|
|
213
221
|
# Note that the tests will only be retried on CI.
|
|
214
222
|
#
|
|
@@ -24,6 +24,21 @@ module Mrss
|
|
|
24
24
|
|
|
25
25
|
attr_reader :desired_version, :arch
|
|
26
26
|
|
|
27
|
+
def target_arch
|
|
28
|
+
# can't use RbConfig::CONFIG["arch"] because JRuby doesn't
|
|
29
|
+
# return anything meaningful there.
|
|
30
|
+
#
|
|
31
|
+
# also, need to use `uname -a` instead of (e.g.) `uname -p`
|
|
32
|
+
# because debian (at least) does not return anything meaningful
|
|
33
|
+
# for `uname -p`.
|
|
34
|
+
uname = `uname -a`.strip
|
|
35
|
+
@target_arch ||= case uname
|
|
36
|
+
when /aarch/ then "aarch64"
|
|
37
|
+
when /x86/ then "x86_64"
|
|
38
|
+
else raise "unsupported architecture #{uname.inspect}"
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
27
42
|
def download_url
|
|
28
43
|
@download_url ||= begin
|
|
29
44
|
version, version_ok = detect_version(current_catalog)
|
|
@@ -40,35 +55,13 @@ module Mrss
|
|
|
40
55
|
end
|
|
41
56
|
dl = version['downloads'].detect do |dl|
|
|
42
57
|
dl['archive']['url'].index("enterprise-#{arch}") &&
|
|
43
|
-
dl['arch'] ==
|
|
58
|
+
dl['arch'] == target_arch
|
|
44
59
|
end
|
|
45
60
|
unless dl
|
|
46
61
|
raise MissingDownloadUrl, "No download for #{arch} for #{version['version']}"
|
|
47
62
|
end
|
|
48
63
|
url = dl['archive']['url']
|
|
49
64
|
end
|
|
50
|
-
rescue MissingDownloadUrl
|
|
51
|
-
if %w(2.6 3.0).include?(desired_version) && arch == 'ubuntu1604'
|
|
52
|
-
# 2.6 and 3.0 are only available for ubuntu1204 and ubuntu1404.
|
|
53
|
-
# Those ubuntus have ancient Pythons that don't work due to not
|
|
54
|
-
# implementing recent TLS protocols.
|
|
55
|
-
# Because of this we test on ubuntu1604 which has a newer Python.
|
|
56
|
-
# But we still need to retrieve ubuntu1404-targeting builds.
|
|
57
|
-
url = self.class.new('3.2', arch).download_url
|
|
58
|
-
unless url.include?('3.2.')
|
|
59
|
-
raise 'URL not in expected format'
|
|
60
|
-
end
|
|
61
|
-
url = case desired_version
|
|
62
|
-
when '2.6'
|
|
63
|
-
url.sub(/\b3\.2\.\d+/, '2.6.12')
|
|
64
|
-
when '3.0'
|
|
65
|
-
url.sub(/\b3\.2\.\d+/, '3.0.15')
|
|
66
|
-
else
|
|
67
|
-
raise NotImplementedError
|
|
68
|
-
end.sub('ubuntu1604', 'ubuntu1404')
|
|
69
|
-
else
|
|
70
|
-
raise
|
|
71
|
-
end
|
|
72
65
|
end
|
|
73
66
|
|
|
74
67
|
private
|
|
@@ -3,13 +3,35 @@
|
|
|
3
3
|
|
|
4
4
|
module Mrss
|
|
5
5
|
module Utils
|
|
6
|
+
extend self
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
def print_backtrace(dest=STDERR)
|
|
9
|
+
raise
|
|
10
|
+
rescue => e
|
|
11
|
+
dest.puts e.backtrace.join("\n")
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# Parses the given version string, accounting for suffix information that
|
|
15
|
+
# Gem::Version cannot successfully parse.
|
|
16
|
+
#
|
|
17
|
+
# @param [ String ] version the version to parse
|
|
18
|
+
#
|
|
19
|
+
# @return [ Gem::Version ] the parsed version
|
|
20
|
+
#
|
|
21
|
+
# @raise [ ArgumentError ] if the string cannot be parsed.
|
|
22
|
+
def parse_version(version)
|
|
23
|
+
Gem::Version.new(version)
|
|
24
|
+
rescue ArgumentError
|
|
25
|
+
match = version.match(/\A(?<major>\d+)\.(?<minor>\d+)\.(?<patch>\d+)?(-[A-Za-z\+\d]+)?\z/)
|
|
26
|
+
raise ArgumentError.new("Malformed version number string #{version}") if match.nil?
|
|
27
|
+
|
|
28
|
+
Gem::Version.new(
|
|
29
|
+
[
|
|
30
|
+
match[:major],
|
|
31
|
+
match[:minor],
|
|
32
|
+
match[:patch]
|
|
33
|
+
].join('.')
|
|
34
|
+
)
|
|
13
35
|
end
|
|
14
36
|
end
|
|
15
37
|
end
|
|
@@ -7,13 +7,13 @@
|
|
|
7
7
|
<%
|
|
8
8
|
|
|
9
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'
|
|
10
|
+
# server_version = '4.3.3'
|
|
11
11
|
server_url = "http://downloads.10gen.com/linux/mongodb-linux-x86_64-enterprise-#{distro}-#{server_version}.tgz"
|
|
12
12
|
server_archive_basename = File.basename(server_url)
|
|
13
13
|
server_extracted_dir = server_archive_basename.sub(/\.(tar\.gz|tgz)$/, '')
|
|
14
14
|
|
|
15
15
|
# When changing, also update the hash in shlib/set_env.sh.
|
|
16
|
-
TOOLCHAIN_VERSION='
|
|
16
|
+
TOOLCHAIN_VERSION='e8c60866f54bed7e336a37df3a97d6ae1b971b7d'
|
|
17
17
|
|
|
18
18
|
def ruby_toolchain_url(ruby)
|
|
19
19
|
"http://boxes.10gen.com/build/toolchain-drivers/mongo-ruby-driver/#{TOOLCHAIN_VERSION}/#{distro}/#{ruby}.tar.xz"
|
|
@@ -77,25 +77,31 @@ ENV DOCKER=1
|
|
|
77
77
|
# therefore install python-pip in all configurations here.
|
|
78
78
|
|
|
79
79
|
<% packages = %w(
|
|
80
|
-
procps lsb-release bzip2 curl zsh
|
|
80
|
+
procps lsb-release bzip2 curl wget gpg zsh
|
|
81
81
|
git make gcc libyaml-0-2 libgmp-dev zlib1g-dev libsnappy-dev
|
|
82
82
|
krb5-user krb5-kdc krb5-admin-server libsasl2-dev libsasl2-modules-gssapi-mit
|
|
83
83
|
haproxy
|
|
84
84
|
python3-pip
|
|
85
|
-
tzdata shared-mime-info
|
|
85
|
+
tzdata shared-mime-info software-properties-common
|
|
86
86
|
) %>
|
|
87
87
|
|
|
88
88
|
<% if distro =~ /ubuntu2004/ %>
|
|
89
89
|
<% packages << 'libsnmp35' %>
|
|
90
|
+
<% elsif distro =~ /ubuntu2204|debian11/ %>
|
|
91
|
+
<% packages << 'libsnmp40' %>
|
|
90
92
|
<% else %>
|
|
91
93
|
<% packages << 'libsnmp30' %>
|
|
92
94
|
<% end %>
|
|
93
95
|
|
|
94
|
-
<% if distro !~ /ubuntu2004/ %>
|
|
96
|
+
<% if distro !~ /ubuntu2004|ubuntu2204|debian11/ %>
|
|
95
97
|
<% packages << 'python-pip' %>
|
|
96
98
|
<% end %>
|
|
97
99
|
|
|
98
|
-
<% if distro =~ /
|
|
100
|
+
<% if distro =~ /ubuntu2204|debian11/ %>
|
|
101
|
+
<% packages << 'python3-venv' %>
|
|
102
|
+
<% end %>
|
|
103
|
+
|
|
104
|
+
<% if distro =~ /debian10|ubuntu2204|debian11/ %>
|
|
99
105
|
<% packages << 'openjdk-11-jdk-headless' %>
|
|
100
106
|
<% elsif distro =~ /ubuntu1404/ %>
|
|
101
107
|
# Ubuntu 14.04 only has openjdk 7, this is too old to be useful
|
|
@@ -105,31 +111,37 @@ ENV DOCKER=1
|
|
|
105
111
|
|
|
106
112
|
# ubuntu1404, ubuntu1604: libcurl3
|
|
107
113
|
# ubuntu1804, ubuntu2004, debian10: libcurl4
|
|
108
|
-
<% if distro =~ /ubuntu1804|ubuntu2004|debian10/ %>
|
|
114
|
+
<% if distro =~ /ubuntu1804|ubuntu2004|ubuntu2204|debian10|debian11/ %>
|
|
109
115
|
<% packages << 'libcurl4' %>
|
|
110
116
|
<% else %>
|
|
111
117
|
<% packages << 'libcurl3' %>
|
|
112
118
|
<% end %>
|
|
113
119
|
|
|
114
|
-
<% if distro =~ /ubuntu1804|ubuntu2004/ %>
|
|
120
|
+
<% if distro =~ /ubuntu1804|ubuntu2004|ubuntu2204/ %>
|
|
115
121
|
<% packages << 'nodejs' %>
|
|
116
122
|
<% end %>
|
|
117
123
|
|
|
118
|
-
<% if distro =~ /ubuntu2004/ %>
|
|
119
|
-
<% packages += %w(ruby
|
|
124
|
+
<% if distro =~ /ubuntu2004|ubuntu2204/ %>
|
|
125
|
+
<% packages += %w(ruby bundler) %>
|
|
120
126
|
<% end %>
|
|
121
127
|
|
|
122
128
|
RUN apt-get update && apt-get install -y <%= packages.join(' ') %>
|
|
123
|
-
|
|
129
|
+
|
|
130
|
+
<% if ubuntu? %>
|
|
131
|
+
RUN wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | tee /usr/share/keyrings/kitware-archive-keyring.gpg >/dev/null
|
|
132
|
+
RUN echo "deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/kitware.list >/dev/null
|
|
133
|
+
<% end %>
|
|
134
|
+
RUN apt-get update && apt-get install -y cmake
|
|
135
|
+
|
|
124
136
|
<% else %>
|
|
125
137
|
|
|
126
138
|
<% if distro =~ /rhel6/ %>
|
|
127
|
-
|
|
139
|
+
|
|
128
140
|
# CentOS 6 is dead - to use it retrieve the packages from vault:
|
|
129
141
|
# https://stackoverflow.com/questions/53562691/error-cannot-retrieve-repository-metadata-repomd-xml-for-repository-base-pl
|
|
130
|
-
|
|
142
|
+
|
|
131
143
|
<%
|
|
132
|
-
|
|
144
|
+
|
|
133
145
|
cfg = <<-CFG
|
|
134
146
|
[base]
|
|
135
147
|
name=CentOS-$releasever - Base
|
|
@@ -141,11 +153,11 @@ gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
|
|
|
141
153
|
CFG
|
|
142
154
|
|
|
143
155
|
%>
|
|
144
|
-
|
|
156
|
+
|
|
145
157
|
RUN printf "<%= cfg.gsub("\n", "\\n") %>" >/etc/yum.repos.d/CentOS-Base.repo
|
|
146
|
-
|
|
158
|
+
|
|
147
159
|
<% end %>
|
|
148
|
-
|
|
160
|
+
|
|
149
161
|
# Enterprise server: net-snmp
|
|
150
162
|
# lsb_release: redhat-lsb-core
|
|
151
163
|
# our runner scripts: which
|
|
@@ -162,23 +174,8 @@ CFG
|
|
|
162
174
|
|
|
163
175
|
RUN yum install -y redhat-lsb-core which git gcc libyaml krb5-server \
|
|
164
176
|
krb5-workstation cyrus-sasl-devel cyrus-sasl-gssapi java-1.8.0-openjdk \
|
|
165
|
-
net-snmp
|
|
177
|
+
net-snmp python38 python38-devel cmake nodejs
|
|
166
178
|
|
|
167
|
-
<% if distro =~ /rhel6/ %>
|
|
168
|
-
|
|
169
|
-
# RHEL 6 ships with Python 2.6.
|
|
170
|
-
|
|
171
|
-
RUN yum install -y centos-release-scl && \
|
|
172
|
-
yum install -y python27-python python27-python-devel
|
|
173
|
-
ENV PATH=/opt/rh/python27/root/usr/bin:$PATH \
|
|
174
|
-
LD_LIBRARY_PATH=/opt/rh/python27/root/usr/lib64
|
|
175
|
-
|
|
176
|
-
<% else %>
|
|
177
|
-
|
|
178
|
-
RUN yum install -y python-devel
|
|
179
|
-
|
|
180
|
-
<% end %>
|
|
181
|
-
|
|
182
179
|
<% end %>
|
|
183
180
|
|
|
184
181
|
<% if preload? %>
|
|
@@ -220,7 +217,7 @@ CFG
|
|
|
220
217
|
<% when 'git' %>
|
|
221
218
|
# dateutil dependency is missing in mtools: https://github.com/rueckstiess/mtools/issues/864
|
|
222
219
|
RUN python3 -m pip install virtualenv 'pymongo>=4' python-dateutil psutil
|
|
223
|
-
|
|
220
|
+
|
|
224
221
|
# Install mtools from git because released versions do not work with pymongo 4.0
|
|
225
222
|
RUN git clone https://github.com/p-mongodb/mtools && \
|
|
226
223
|
cd mtools && \
|
|
@@ -234,7 +231,7 @@ CFG
|
|
|
234
231
|
<% if @env.fetch('MONGODB_VERSION') >= '4.4' %>
|
|
235
232
|
# ubuntu1604 installs MarkupSafe 0.0.0 here instead of 2.0.0+
|
|
236
233
|
# as specified by dependencies, causing OCSP mock to not work.
|
|
237
|
-
RUN python3 -mpip install asn1crypto oscrypto flask --upgrade
|
|
234
|
+
RUN python3 -mpip install asn1crypto oscrypto flask --upgrade --ignore-installed
|
|
238
235
|
<% end %>
|
|
239
236
|
|
|
240
237
|
# FLE is tested against 4.0+ servers.
|
|
@@ -243,7 +240,7 @@ CFG
|
|
|
243
240
|
# boto3~=1.19 cryptography~=3.4.8 pykmip~=0.10.0
|
|
244
241
|
# cryptography does not install due to lacking setuptools_rust
|
|
245
242
|
# (either that version or anything that isn't part of system packages)
|
|
246
|
-
RUN python3 -mpip install boto3~=1.19 cryptography pykmip~=0.10.0
|
|
243
|
+
RUN python3 -mpip install boto3~=1.19 cryptography pykmip~=0.10.0 'sqlalchemy<2.0.0'
|
|
247
244
|
<% end %>
|
|
248
245
|
|
|
249
246
|
<% unless ruby_head? || system_ruby? %>
|
|
@@ -255,10 +252,6 @@ CFG
|
|
|
255
252
|
|
|
256
253
|
<% end %>
|
|
257
254
|
|
|
258
|
-
RUN curl --retry 3 -fL <%= server_download_url %> |tar xzf - && \
|
|
259
|
-
mv mongo*/ /opt/mongodb
|
|
260
|
-
ENV USE_OPT_MONGODB=1 USE_SYSTEM_PYTHON_PACKAGES=1
|
|
261
|
-
|
|
262
255
|
<% end %>
|
|
263
256
|
|
|
264
257
|
<% if distro =~ /debian|ubuntu/ %>
|
|
@@ -308,6 +301,9 @@ ENV MONGO_ORCHESTRATION_HOME=/tmpfs \
|
|
|
308
301
|
|
|
309
302
|
COPY . .
|
|
310
303
|
|
|
304
|
+
RUN bash -c '. .evergreen/download-mongodb.sh && get_distro && get_mongodb_download_url_for "$DISTRO" "<%= server_version %>" && curl --retry 3 -fL $MONGODB_DOWNLOAD_URL |tar xzf - && mv mongo*/ /opt/mongodb'
|
|
305
|
+
ENV USE_OPT_MONGODB=1 USE_SYSTEM_PYTHON_PACKAGES=1
|
|
306
|
+
|
|
311
307
|
<% if expose? %>
|
|
312
308
|
|
|
313
309
|
<% ports = [] %>
|
data/spec/shared/shlib/server.sh
CHANGED
|
@@ -71,12 +71,18 @@ prepare_server_from_url() {
|
|
|
71
71
|
export PATH="$BINDIR":$PATH
|
|
72
72
|
}
|
|
73
73
|
|
|
74
|
-
|
|
74
|
+
install_mlaunch_venv() {
|
|
75
75
|
python3 -V || true
|
|
76
|
-
if ! python3 -m
|
|
76
|
+
if ! python3 -m venv -h >/dev/null; then
|
|
77
77
|
# Current virtualenv fails with
|
|
78
78
|
# https://github.com/pypa/virtualenv/issues/1630
|
|
79
|
-
python3 -m pip install
|
|
79
|
+
python3 -m pip install venv --user
|
|
80
|
+
fi
|
|
81
|
+
if ! python3 -m ensurepip -h > /dev/null; then
|
|
82
|
+
# Debian11/Ubuntu2204 have venv installed, but it is nonfunctional unless
|
|
83
|
+
# the python3-venv package is also installed (it lacks the ensurepip
|
|
84
|
+
# module).
|
|
85
|
+
sudo apt-get install --yes python3-venv
|
|
80
86
|
fi
|
|
81
87
|
if test "$USE_SYSTEM_PYTHON_PACKAGES" = 1 &&
|
|
82
88
|
python3 -m pip list |grep mtools
|
|
@@ -84,14 +90,19 @@ install_mlaunch_virtualenv() {
|
|
|
84
90
|
# Use the existing mtools-legacy
|
|
85
91
|
:
|
|
86
92
|
else
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
93
|
+
# Spawn a virtual environment, but only if one is not already
|
|
94
|
+
# active...
|
|
95
|
+
if test -z "$VIRTUAL_ENV"; then
|
|
96
|
+
venvpath="$MONGO_ORCHESTRATION_HOME"/venv
|
|
97
|
+
python3 -m venv $venvpath
|
|
98
|
+
. $venvpath/bin/activate
|
|
99
|
+
fi
|
|
100
|
+
|
|
90
101
|
# [mlaunch] does not work:
|
|
91
102
|
# https://github.com/rueckstiess/mtools/issues/856
|
|
92
103
|
# dateutil dependency is missing in mtools: https://github.com/rueckstiess/mtools/issues/864
|
|
93
104
|
#pip install 'mtools==1.7' 'pymongo==4.1' python-dateutil psutil
|
|
94
|
-
|
|
105
|
+
|
|
95
106
|
# dateutil dependency is missing in mtools: https://github.com/rueckstiess/mtools/issues/864
|
|
96
107
|
pip install 'mtools-legacy[mlaunch]' 'pymongo<4' python-dateutil
|
|
97
108
|
fi
|
|
@@ -158,6 +169,19 @@ install_mlaunch_git() {
|
|
|
158
169
|
fi
|
|
159
170
|
}
|
|
160
171
|
|
|
172
|
+
install_cmake() {
|
|
173
|
+
if ! command -v cmake &> /dev/null; then
|
|
174
|
+
if ! command -v apt-get &> /dev/null; then
|
|
175
|
+
# no apt-get; assume RHEL
|
|
176
|
+
sudo yum -y install cmake libarchive
|
|
177
|
+
else
|
|
178
|
+
sudo apt-get install --yes cmake
|
|
179
|
+
fi
|
|
180
|
+
else
|
|
181
|
+
echo 'cmake is present'
|
|
182
|
+
fi
|
|
183
|
+
}
|
|
184
|
+
|
|
161
185
|
# This function sets followong global variables:
|
|
162
186
|
# server_cert_path
|
|
163
187
|
# server_ca_path
|
|
@@ -173,7 +197,7 @@ calculate_server_args() {
|
|
|
173
197
|
fi
|
|
174
198
|
|
|
175
199
|
if test $mongo_version = latest; then
|
|
176
|
-
mongo_version=
|
|
200
|
+
mongo_version=70
|
|
177
201
|
fi
|
|
178
202
|
|
|
179
203
|
local args="--setParameter enableTestCommands=1"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# When changing, also update the hash in share/Dockerfile.
|
|
2
|
-
TOOLCHAIN_VERSION=
|
|
2
|
+
TOOLCHAIN_VERSION=e8c60866f54bed7e336a37df3a97d6ae1b971b7d
|
|
3
3
|
|
|
4
4
|
set_env_java() {
|
|
5
5
|
ls -l /opt || true
|
|
@@ -53,7 +53,7 @@ set_env_python() {
|
|
|
53
53
|
curl -fL --retry 3 https://github.com/p-mongodb/deps/raw/main/"$arch"-python37.tar.xz | \
|
|
54
54
|
tar xfJ - -C /opt
|
|
55
55
|
fi
|
|
56
|
-
|
|
56
|
+
|
|
57
57
|
if test -d /opt/python/3.7/bin; then
|
|
58
58
|
# Most Evergreen configurations.
|
|
59
59
|
export PATH=/opt/python/3.7/bin:$PATH
|
|
@@ -61,7 +61,7 @@ set_env_python() {
|
|
|
61
61
|
# Configurations that use Docker in Evergreen - these don't preload.
|
|
62
62
|
export PATH=/opt/python37/bin:$PATH
|
|
63
63
|
fi
|
|
64
|
-
|
|
64
|
+
|
|
65
65
|
python3 -V
|
|
66
66
|
fi
|
|
67
67
|
}
|
|
@@ -78,7 +78,7 @@ set_env_node() {
|
|
|
78
78
|
# Node from toolchain in Evergreen
|
|
79
79
|
export PATH=/opt/node/bin:$PATH
|
|
80
80
|
fi
|
|
81
|
-
|
|
81
|
+
|
|
82
82
|
node -v
|
|
83
83
|
}
|
|
84
84
|
|
data/spec/spec_helper.rb
CHANGED
|
@@ -124,6 +124,11 @@ end
|
|
|
124
124
|
|
|
125
125
|
I18n.config.enforce_available_locales = false
|
|
126
126
|
|
|
127
|
+
|
|
128
|
+
if %w(yes true 1).include?((ENV['TEST_I18N_FALLBACKS'] || '').downcase)
|
|
129
|
+
require "i18n/backend/fallbacks"
|
|
130
|
+
end
|
|
131
|
+
|
|
127
132
|
# The user must be created before any of the tests are loaded, until
|
|
128
133
|
# https://jira.mongodb.org/browse/MONGOID-4827 is implemented.
|
|
129
134
|
client = Mongo::Client.new(SpecConfig.instance.addresses, server_selection_timeout: 3.03)
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
module Mongoid
|
|
2
|
+
module ImmutableIds
|
|
3
|
+
def immutable_id_examples_as(name)
|
|
4
|
+
shared_examples_for name do
|
|
5
|
+
shared_examples 'a persisted document' do
|
|
6
|
+
it 'should ignore the change and issue a warning' do
|
|
7
|
+
expect(Mongoid::Warnings).to receive(:warn_mutable_ids)
|
|
8
|
+
expect { invoke_operation! }.not_to raise_error
|
|
9
|
+
expect(id_is_unchanged).not_to be legacy_behavior_expects_id_to_change
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
context 'when immutable_ids is true' do
|
|
13
|
+
before { Mongoid::Config.immutable_ids = true }
|
|
14
|
+
after { Mongoid::Config.immutable_ids = false }
|
|
15
|
+
|
|
16
|
+
it 'should disallow _id to be updated' do
|
|
17
|
+
expect { invoke_operation! }
|
|
18
|
+
.to raise_error(Mongoid::Errors::ImmutableAttribute)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
context 'when id is set to the existing value' do
|
|
22
|
+
let(:new_id_value) { object._id }
|
|
23
|
+
|
|
24
|
+
it 'should allow the update to proceed' do
|
|
25
|
+
expect { invoke_operation! }
|
|
26
|
+
.not_to raise_error
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
context 'when the field is _id' do
|
|
33
|
+
let(:new_id_value) { 1234 }
|
|
34
|
+
|
|
35
|
+
context 'when the document is top-level' do
|
|
36
|
+
let(:legacy_behavior_expects_id_to_change) { false }
|
|
37
|
+
|
|
38
|
+
context 'when the document is new' do
|
|
39
|
+
let(:object) { Person.new }
|
|
40
|
+
|
|
41
|
+
it 'should allow _id to be updated' do
|
|
42
|
+
invoke_operation!
|
|
43
|
+
expect(object.new_record?).to be false
|
|
44
|
+
expect(object.reload._id).to be == new_id_value
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
context 'when the document has been persisted' do
|
|
49
|
+
let(:object) { Person.create }
|
|
50
|
+
let!(:original_id) { object._id }
|
|
51
|
+
let(:id_is_unchanged) { Person.exists?(original_id) }
|
|
52
|
+
|
|
53
|
+
it_behaves_like 'a persisted document'
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
context 'when the document is embedded' do
|
|
58
|
+
let(:parent) { Person.create }
|
|
59
|
+
let(:legacy_behavior_expects_id_to_change) { true }
|
|
60
|
+
|
|
61
|
+
context 'when the document is new' do
|
|
62
|
+
let(:object) { parent.favorites.new }
|
|
63
|
+
|
|
64
|
+
it 'should allow _id to be updated' do
|
|
65
|
+
invoke_operation!
|
|
66
|
+
expect(object.new_record?).to be false
|
|
67
|
+
expect(parent.reload.favorites.first._id).to be == new_id_value
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
context 'when the document has been persisted' do
|
|
72
|
+
let(:object) { parent.favorites.create }
|
|
73
|
+
let!(:original_id) { object._id }
|
|
74
|
+
let(:id_is_unchanged) { parent.favorites.where(_id: original_id).exists? }
|
|
75
|
+
|
|
76
|
+
it_behaves_like 'a persisted document'
|
|
77
|
+
|
|
78
|
+
context 'updating embeds_one via parent' do
|
|
79
|
+
context 'when immutable_ids is false' do
|
|
80
|
+
before { expect(Mongoid::Config.immutable_ids).to be false }
|
|
81
|
+
|
|
82
|
+
it 'should ignore the change' do
|
|
83
|
+
expect(Mongoid::Warnings).to receive(:warn_mutable_ids)
|
|
84
|
+
|
|
85
|
+
parent.pet = pet = Pet.new
|
|
86
|
+
parent.save
|
|
87
|
+
|
|
88
|
+
original_id = pet._id
|
|
89
|
+
new_id = BSON::ObjectId.new
|
|
90
|
+
|
|
91
|
+
expect { parent.update(pet: { _id: new_id }) }.not_to raise_error
|
|
92
|
+
expect(parent.reload.pet._id.to_s).to be == original_id.to_s
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
context 'when immutable_ids is true' do
|
|
97
|
+
before { Mongoid::Config.immutable_ids = true }
|
|
98
|
+
after { Mongoid::Config.immutable_ids = false }
|
|
99
|
+
|
|
100
|
+
it 'should raise an exception' do
|
|
101
|
+
parent.pet = pet = Pet.new
|
|
102
|
+
parent.save
|
|
103
|
+
|
|
104
|
+
original_id = pet._id
|
|
105
|
+
new_id = BSON::ObjectId.new
|
|
106
|
+
|
|
107
|
+
expect { parent.update(pet: { _id: new_id }) }
|
|
108
|
+
.to raise_error(Mongoid::Errors::ImmutableAttribute)
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|