mongoid 7.0.11 → 7.0.12

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.
@@ -0,0 +1,149 @@
1
+ autoload :JSON, 'json'
2
+ autoload :FileUtils, 'fileutils'
3
+ autoload :Find, 'find'
4
+
5
+ module Mrss
6
+
7
+ autoload :ChildProcessHelper, 'mrss/child_process_helper'
8
+
9
+ # Organizes and runs all of the tests in the test suite in batches.
10
+ #
11
+ # Organizing the tests in batches serves two purposes:
12
+ #
13
+ # 1. This allows running unit tests before integration tests, therefore
14
+ # in theory revealing failures quicker on average.
15
+ # 2. This allows running some tests that have high intermittent failure rate
16
+ # in their own test process.
17
+ #
18
+ # This class aggregates RSpec results after the test runs.
19
+ class SpecOrganizer
20
+
21
+ class BucketsNotPrioritized < StandardError
22
+ end
23
+
24
+ def initialize(root: nil, classifiers:, priority_order:,
25
+ spec_root: nil, rspec_json_path: nil, rspec_all_json_path: nil
26
+ )
27
+ @spec_root = spec_root || File.join(root, 'spec')
28
+ @classifiers = classifiers
29
+ @priority_order = priority_order
30
+ @rspec_json_path = rspec_json_path || File.join(root, 'tmp/rspec.json')
31
+ @rspec_all_json_path = rspec_all_json_path || File.join(root, 'tmp/rspec-all.json')
32
+ end
33
+
34
+ attr_reader :spec_root, :classifiers, :priority_order
35
+ attr_reader :rspec_json_path, :rspec_all_json_path
36
+
37
+ def buckets
38
+ @buckets ||= {}.tap do |buckets|
39
+ Find.find(spec_root) do |path|
40
+ next unless File.file?(path)
41
+ next unless path =~ /_spec\.rb\z/
42
+ rel_path = path[(spec_root.length + 1)..path.length]
43
+
44
+ found = false
45
+ classifiers.each do |(regexp, category)|
46
+ if regexp =~ rel_path
47
+ buckets[category] ||= []
48
+ buckets[category] << File.join('spec', rel_path)
49
+ found = true
50
+ break
51
+ end
52
+ end
53
+
54
+ unless found
55
+ buckets[nil] ||= []
56
+ buckets[nil] << File.join('spec', rel_path)
57
+ end
58
+ end
59
+ end.freeze
60
+ end
61
+
62
+ def ordered_buckets
63
+ @ordered_buckets ||= {}.tap do |ordered_buckets|
64
+ buckets = self.buckets.dup
65
+ priority_order.each do |category|
66
+ files = buckets.delete(category)
67
+ ordered_buckets[category] = files
68
+ end
69
+
70
+ if files = buckets.delete(nil)
71
+ ordered_buckets[nil] = files
72
+ end
73
+
74
+ unless buckets.empty?
75
+ raise BucketsNotPrioritized, "Some buckets were not prioritized: #{buckets.keys.map(&:to_s).join(', ')}"
76
+ end
77
+ end.freeze
78
+ end
79
+
80
+ def run
81
+ FileUtils.rm_f(rspec_all_json_path)
82
+
83
+ failed = []
84
+ buckets = self.buckets.dup
85
+
86
+ priority_order.each do |category|
87
+ if files = buckets.delete(category)
88
+ unless run_files(category, files)
89
+ failed << category
90
+ end
91
+ end
92
+ end
93
+ if files = buckets.delete(nil)
94
+ unless run_files('remaining', files)
95
+ failed << 'remaining'
96
+ end
97
+ end
98
+
99
+ unless buckets.empty?
100
+ raise "Some buckets were not executed: #{buckets.keys.map(&:to_s).join(', ')}"
101
+ end
102
+
103
+ if failed.any?
104
+ raise "The following buckets failed: #{failed.map(&:to_s).join(', ')}"
105
+ end
106
+ end
107
+
108
+ def run_files(category, paths)
109
+ puts "Running #{category.to_s.gsub('_', ' ')} tests"
110
+ FileUtils.rm_f(rspec_json_path)
111
+ cmd = %w(rspec) + paths
112
+
113
+ begin
114
+ ChildProcessHelper.check_call(cmd)
115
+ ensure
116
+ if File.exist?(rspec_json_path)
117
+ if File.exist?(rspec_all_json_path)
118
+ merge_rspec_results
119
+ else
120
+ FileUtils.cp(rspec_json_path, rspec_all_json_path)
121
+ end
122
+ end
123
+ end
124
+
125
+ true
126
+ rescue ChildProcessHelper::SpawnError
127
+ false
128
+ end
129
+
130
+ def merge_rspec_results
131
+ all = JSON.parse(File.read(rspec_all_json_path))
132
+ new = JSON.parse(File.read(rspec_json_path))
133
+ all['examples'] += new.delete('examples')
134
+ new.delete('summary').each do |k, v|
135
+ all['summary'][k] += v
136
+ end
137
+ new.delete('version')
138
+ new.delete('summary_line')
139
+ unless new.empty?
140
+ raise "Unhandled rspec results keys: #{new.keys.join(', ')}"
141
+ end
142
+ # We do not merge summary lines, delete them from aggregated results
143
+ all.delete('summary_line')
144
+ File.open(rspec_all_json_path, 'w') do |f|
145
+ f << JSON.dump(all)
146
+ end
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,229 @@
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
+ WORKDIR /app
143
+
144
+ RUN curl --retry 3 -fL <%= server_download_url %> |tar xzf - && \
145
+ mv mongo*/ /opt/mongodb
146
+ ENV USE_OPT_MONGODB=1
147
+
148
+ <% unless ruby_head? %>
149
+
150
+ RUN curl --retry 3 -fL <%= ruby_toolchain_url %> |tar -xC /opt -Jf -
151
+ ENV PATH=/opt/rubies/<%= ruby %>/bin:$PATH \
152
+ USE_OPT_TOOLCHAIN=1
153
+ #ENV PATH=/opt/rubies/python/3/bin:$PATH
154
+
155
+ <% end %>
156
+
157
+ <% if distro =~ /rhel|ubuntu1604/ %>
158
+
159
+ # Ubuntu 12.04 ships pip 1.0 which is ancient and does not work.
160
+ #
161
+ # Ubuntu 16.04 apparently also ships a pip that does not work:
162
+ # https://stackoverflow.com/questions/37495375/python-pip-install-throws-typeerror-unsupported-operand-types-for-retry
163
+ # Potentially this only affects environments with less than ideal
164
+ # connectivity (or, perhaps, when python package registry is experiencing
165
+ # availability issues) when pip must retry to install packages.
166
+ #
167
+ # rhel apparently does not package pip at all in core repoitories,
168
+ # therefore install it the manual way.
169
+ #
170
+ # https://pip.pypa.io/en/stable/installing/
171
+ RUN curl --retry 3 -fL https://raw.githubusercontent.com/pypa/get-pip/master/2.7/get-pip.py | python
172
+
173
+ <% end %>
174
+
175
+ RUN pip --version && \
176
+ pip install mtools-legacy[mlaunch]
177
+
178
+ <% if @env.fetch('MONGODB_VERSION') >= '4.4' %>
179
+ RUN python3 -mpip install asn1crypto oscrypto flask
180
+ <% end %>
181
+
182
+ <% end %>
183
+
184
+ WORKDIR /app
185
+
186
+ <% if preload? && !ruby_head? %>
187
+
188
+ COPY Gemfile .
189
+ COPY gemfiles gemfiles
190
+ COPY *.gemspec .
191
+ COPY lib/<%= project_lib_subdir %>/version.rb lib/<%= project_lib_subdir %>/version.rb
192
+ RUN bundle install
193
+ COPY .evergreen/patch-debuggers .evergreen/patch-debuggers
194
+ RUN .evergreen/patch-debuggers /opt/rubies
195
+
196
+ <% end %>
197
+
198
+ <% if fle? %>
199
+ RUN curl --retry 3 -fLo libmongocrypt-all.tar.gz "https://s3.amazonaws.com/mciuploads/libmongocrypt/all/master/latest/libmongocrypt-all.tar.gz"
200
+ RUN tar xf libmongocrypt-all.tar.gz
201
+
202
+ <%= "ENV LIBMONGOCRYPT_PATH #{libmongocrypt_path}" %>
203
+ <% end %>
204
+
205
+ ENV MONGO_ORCHESTRATION_HOME=/tmpfs \
206
+ PROJECT_DIRECTORY=/app \
207
+ <%= @env.map { |k, v| %Q`#{k}="#{v.gsub('$', "\\$").gsub('"', "\\\"")}"` }.join(" \\\n ") %>
208
+
209
+ <% if interactive? %>
210
+ ENV INTERACTIVE=1
211
+ <% end %>
212
+
213
+ COPY . .
214
+
215
+ <% if expose? %>
216
+
217
+ <% ports = [] %>
218
+
219
+ <% 0.upto(num_exposed_ports-1) do |i| %>
220
+ <% ports << 27017 + i %>
221
+ <% end %>
222
+
223
+ <% if @env['OCSP_ALGORITHM'] %>
224
+ <% ports << 8100 %>
225
+ <% end %>
226
+
227
+ EXPOSE <%= ports.map(&:to_s).join(' ') %>
228
+
229
+ <% end %>
@@ -0,0 +1,73 @@
1
+ detected_distro=
2
+
3
+ host_distro() {
4
+ if test -z "$detected_distro"; then
5
+ detected_distro=`_detect_distro`
6
+ fi
7
+ echo "$detected_distro"
8
+ }
9
+
10
+ _detect_distro() {
11
+ local distro
12
+ distro=
13
+ if test -f /etc/debian_version; then
14
+ # Debian or Ubuntu
15
+ if test "`uname -m`" = aarch64; then
16
+ distro=ubuntu1604-arm
17
+ elif lsb_release -is |grep -q Debian; then
18
+ release=`lsb_release -rs |tr -d .`
19
+ # In docker, release is something like 9.11.
20
+ # In evergreen, release is 9.2.
21
+ release=`echo $release |sed -e 's/^9.*/92/'`
22
+ distro="debian$release"
23
+ elif lsb_release -is |grep -q Ubuntu; then
24
+ if test "`uname -m`" = ppc64le; then
25
+ release=`lsb_release -rs |tr -d .`
26
+ distro="ubuntu$release-ppc"
27
+ else
28
+ release=`lsb_release -rs |tr -d .`
29
+ distro="ubuntu$release"
30
+ fi
31
+ else
32
+ echo 'Unknown Debian flavor' 1>&2
33
+ exit 1
34
+ fi
35
+ elif lsb_release -is |grep -qi suse; then
36
+ if test "`uname -m`" = s390x; then
37
+ release=`lsb_release -rs |sed -e 's/\..*//'`
38
+ distro="suse$release-s390x"
39
+ else
40
+ echo 'Unknown Suse arch' 1>&2
41
+ exit 1
42
+ fi
43
+ elif test -f /etc/redhat-release; then
44
+ # RHEL or CentOS
45
+ if test "`uname -m`" = s390x; then
46
+ distro=rhel72-s390x
47
+ elif test "`uname -m`" = ppc64le; then
48
+ distro=rhel71-ppc
49
+ elif lsb_release >/dev/null 2>&1; then
50
+ if lsb_release -is |grep -q RedHat; then
51
+ release=`lsb_release -rs |tr -d .`
52
+ distro="rhel$release"
53
+ elif lsb_release -is |grep -q CentOS; then
54
+ release=`lsb_release -rs |cut -c 1 |sed -e s/7/70/ -e s/6/62/ -e s/8/80/`
55
+ distro="rhel$release"
56
+ else
57
+ echo 'Unknown RHEL flavor' 1>&2
58
+ exit 1
59
+ fi
60
+ else
61
+ echo lsb_release missing, using /etc/redhat-release 1>&2
62
+ release=`grep -o 'release [0-9]' /etc/redhat-release |awk '{print $2}'`
63
+ release=`echo $release |sed -e s/7/70/ -e s/6/62/ -e s/8/80/`
64
+ distro=rhel$release
65
+ fi
66
+ else
67
+ lsb_release -a
68
+ echo 'Unknown distro' 1>&2
69
+ exit 1
70
+ fi
71
+ echo "Detected distro: $distro" 1>&2
72
+ echo $distro
73
+ }