mongo 2.13.2 → 2.13.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/lib/mongo/collection.rb +2 -0
  4. data/lib/mongo/database.rb +14 -2
  5. data/lib/mongo/grid/fs_bucket.rb +37 -37
  6. data/lib/mongo/operation/parallel_scan/command.rb +1 -2
  7. data/lib/mongo/operation/shared/read_preference_supported.rb +38 -36
  8. data/lib/mongo/operation/shared/sessions_supported.rb +3 -2
  9. data/lib/mongo/protocol/msg.rb +2 -2
  10. data/lib/mongo/protocol/query.rb +11 -11
  11. data/lib/mongo/server_selector/secondary_preferred.rb +2 -7
  12. data/lib/mongo/version.rb +1 -1
  13. data/spec/integration/sdam_error_handling_spec.rb +1 -1
  14. data/spec/integration/sdam_events_spec.rb +3 -5
  15. data/spec/integration/secondary_reads_spec.rb +102 -0
  16. data/spec/mongo/index/view_spec.rb +4 -2
  17. data/spec/mongo/operation/read_preference_legacy_spec.rb +9 -19
  18. data/spec/mongo/operation/read_preference_op_msg_spec.rb +3 -3
  19. data/spec/mongo/server/app_metadata_shared.rb +33 -7
  20. data/spec/mongo/server_selector/secondary_preferred_spec.rb +6 -6
  21. data/spec/runners/transactions/operation.rb +13 -2
  22. data/spec/shared/bin/get-mongodb-download-url +17 -0
  23. data/spec/shared/lib/mrss/cluster_config.rb +221 -0
  24. data/spec/shared/lib/mrss/constraints.rb +43 -0
  25. data/spec/shared/lib/mrss/docker_runner.rb +265 -0
  26. data/spec/shared/lib/mrss/lite_constraints.rb +16 -0
  27. data/spec/shared/lib/mrss/server_version_registry.rb +115 -0
  28. data/spec/shared/lib/mrss/spec_organizer.rb +3 -0
  29. data/spec/shared/lib/mrss/utils.rb +15 -0
  30. data/spec/shared/share/Dockerfile.erb +231 -0
  31. data/spec/shared/shlib/distro.sh +73 -0
  32. data/spec/shared/shlib/server.sh +290 -0
  33. data/spec/shared/shlib/set_env.sh +128 -0
  34. data/spec/support/client_registry.rb +8 -4
  35. data/spec/support/client_registry_macros.rb +14 -5
  36. data/spec/support/spec_config.rb +12 -0
  37. data/spec/support/spec_setup.rb +48 -38
  38. data.tar.gz.sig +0 -0
  39. metadata +998 -978
  40. metadata.gz.sig +0 -0
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
1
4
  autoload :JSON, 'json'
2
5
  autoload :FileUtils, 'fileutils'
3
6
  autoload :Find, 'find'
@@ -0,0 +1,15 @@
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
@@ -0,0 +1,231 @@
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 %>
@@ -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
+ }
@@ -0,0 +1,290 @@
1
+ # This file contains functions pertaining to downloading, starting and
2
+ # configuring a MongoDB server.
3
+
4
+ set_fcv() {
5
+ if test -n "$FCV"; then
6
+ mongo --eval 'assert.commandWorked(db.adminCommand( { setFeatureCompatibilityVersion: "'"$FCV"'" } ));' "$MONGODB_URI"
7
+ mongo --quiet --eval 'db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )' |grep "version.*$FCV"
8
+ fi
9
+ }
10
+
11
+ add_uri_option() {
12
+ opt=$1
13
+
14
+ if ! echo $MONGODB_URI |sed -e s,//,, |grep -q /; then
15
+ MONGODB_URI="$MONGODB_URI/"
16
+ fi
17
+
18
+ if ! echo $MONGODB_URI |grep -q '?'; then
19
+ MONGODB_URI="$MONGODB_URI?"
20
+ fi
21
+
22
+ MONGODB_URI="$MONGODB_URI&$opt"
23
+ }
24
+
25
+ prepare_server() {
26
+ arch=$1
27
+
28
+ if test -n "$USE_OPT_MONGODB"; then
29
+ export BINDIR=/opt/mongodb/bin
30
+ export PATH=$BINDIR:$PATH
31
+ return
32
+ fi
33
+
34
+ if test "$MONGODB_VERSION" = latest; then
35
+ # Test on the most recent published 4.3 release.
36
+ # https://jira.mongodb.org/browse/RUBY-1724
37
+ echo 'Using "latest" server is not currently implemented' 1>&2
38
+ exit 1
39
+ else
40
+ download_version="$MONGODB_VERSION"
41
+ fi
42
+
43
+ url=`$(dirname $0)/get-mongodb-download-url $download_version $arch`
44
+
45
+ prepare_server_from_url $url
46
+ }
47
+
48
+ prepare_server_from_url() {
49
+ url=$1
50
+
51
+ mongodb_dir="$MONGO_ORCHESTRATION_HOME"/mdb
52
+ mkdir -p "$mongodb_dir"
53
+ curl --retry 3 $url |tar xz -C "$mongodb_dir" -f -
54
+ BINDIR="$mongodb_dir"/`basename $url |sed -e s/.tgz//`/bin
55
+ export PATH="$BINDIR":$PATH
56
+ }
57
+
58
+ install_mlaunch_virtualenv() {
59
+ python2 -V || true
60
+ if ! python2 -m virtualenv -h >/dev/null; then
61
+ # Current virtualenv fails with
62
+ # https://github.com/pypa/virtualenv/issues/1630
63
+ python2 -m pip install 'virtualenv<20' --user
64
+ fi
65
+ if test "$USE_SYSTEM_PYTHON_PACKAGES" = 1 &&
66
+ python2 -m pip list |grep mtools-legacy
67
+ then
68
+ # Use the existing mtools-legacy
69
+ :
70
+ else
71
+ venvpath="$MONGO_ORCHESTRATION_HOME"/venv
72
+ python2 -m virtualenv -p python2 $venvpath
73
+ . $venvpath/bin/activate
74
+ pip install 'mtools-legacy[mlaunch]'
75
+ fi
76
+ }
77
+
78
+ install_mlaunch_pip() {
79
+ if test -n "$USE_OPT_MONGODB" && which mlaunch >/dev/null 2>&1; then
80
+ # mlaunch is preinstalled in the docker image, do not install it here
81
+ return
82
+ fi
83
+
84
+ python -V || true
85
+ python3 -V || true
86
+ pythonpath="$MONGO_ORCHESTRATION_HOME"/python
87
+ pip install -t "$pythonpath" 'mtools-legacy[mlaunch]'
88
+ export PATH="$pythonpath/bin":$PATH
89
+ export PYTHONPATH="$pythonpath"
90
+ }
91
+
92
+ install_mlaunch_git() {
93
+ repo=$1
94
+ branch=$2
95
+ python -V || true
96
+ python3 -V || true
97
+ which pip || true
98
+ which pip3 || true
99
+
100
+ if false; then
101
+ if ! virtualenv --version; then
102
+ python3 `which pip3` install --user virtualenv
103
+ export PATH=$HOME/.local/bin:$PATH
104
+ virtualenv --version
105
+ fi
106
+
107
+ venvpath="$MONGO_ORCHESTRATION_HOME"/venv
108
+ virtualenv -p python3 $venvpath
109
+ . $venvpath/bin/activate
110
+
111
+ pip3 install psutil pymongo
112
+
113
+ git clone $repo mlaunch
114
+ cd mlaunch
115
+ git checkout origin/$branch
116
+ python3 setup.py install
117
+ cd ..
118
+ else
119
+ pip install --user 'virtualenv==13'
120
+ export PATH=$HOME/.local/bin:$PATH
121
+
122
+ venvpath="$MONGO_ORCHESTRATION_HOME"/venv
123
+ virtualenv $venvpath
124
+ . $venvpath/bin/activate
125
+
126
+ pip install psutil pymongo
127
+
128
+ git clone $repo mlaunch
129
+ (cd mlaunch &&
130
+ git checkout origin/$branch &&
131
+ python setup.py install
132
+ )
133
+ fi
134
+ }
135
+
136
+ calculate_server_args() {
137
+ local mongo_version=`echo $MONGODB_VERSION |tr -d .`
138
+
139
+ if test -z "$mongo_version"; then
140
+ echo "$MONGODB_VERSION must be set and not contain only dots" 1>&2
141
+ exit 3
142
+ fi
143
+
144
+ if test $mongo_version = latest; then
145
+ mongo_version=49
146
+ fi
147
+
148
+ local args="--setParameter enableTestCommands=1"
149
+
150
+ if test $mongo_version -ge 47; then
151
+ args="$args --setParameter acceptAPIVersion2=1"
152
+ fi
153
+
154
+ # diagnosticDataCollectionEnabled is a mongod-only parameter on server 3.2,
155
+ # and mlaunch does not support specifying mongod-only parameters:
156
+ # https://github.com/rueckstiess/mtools/issues/696
157
+ # Pass it to 3.4 and newer servers where it is accepted by all daemons.
158
+ if test $mongo_version -ge 34; then
159
+ args="$args --setParameter diagnosticDataCollectionEnabled=false"
160
+ fi
161
+ local uri_options=
162
+ if test "$TOPOLOGY" = replica-set; then
163
+ args="$args --replicaset --name ruby-driver-rs --nodes 2 --arbiter"
164
+ export HAVE_ARBITER=1
165
+ elif test "$TOPOLOGY" = sharded-cluster; then
166
+ args="$args --replicaset --nodes 2 --sharded 1 --name ruby-driver-rs"
167
+ if test -z "$SINGLE_MONGOS"; then
168
+ args="$args --mongos 2"
169
+ fi
170
+ else
171
+ args="$args --single"
172
+ fi
173
+ if test -n "$MMAPV1"; then
174
+ args="$args --storageEngine mmapv1 --smallfiles --noprealloc"
175
+ uri_options="$uri_options&retryReads=false&retryWrites=false"
176
+ fi
177
+ if test "$AUTH" = auth; then
178
+ args="$args --auth --username bob --password pwd123"
179
+ elif test "$AUTH" = x509; then
180
+ args="$args --auth --username bootstrap --password bootstrap"
181
+ elif echo "$AUTH" |grep -q ^aws; then
182
+ args="$args --auth --username bootstrap --password bootstrap"
183
+ args="$args --setParameter authenticationMechanisms=MONGODB-AWS,SCRAM-SHA-1,SCRAM-SHA-256"
184
+ uri_options="$uri_options&authMechanism=MONGODB-AWS&authSource=\$external"
185
+ fi
186
+
187
+ if test -n "$OCSP"; then
188
+ if test -z "$OCSP_ALGORITHM"; then
189
+ echo "OCSP_ALGORITHM must be set if OCSP is set" 1>&2
190
+ exit 1
191
+ fi
192
+ fi
193
+
194
+ local server_cert_path server_ca_path server_client_cert_path
195
+ if test "$SSL" = ssl || test -n "$OCSP_ALGORITHM"; then
196
+ if test -n "$OCSP_ALGORITHM"; then
197
+ if test "$OCSP_MUST_STAPLE" = 1; then
198
+ server_cert_path=spec/support/ocsp/$OCSP_ALGORITHM/server-mustStaple.pem
199
+ else
200
+ server_cert_path=spec/support/ocsp/$OCSP_ALGORITHM/server.pem
201
+ fi
202
+ server_ca_path=spec/support/ocsp/$OCSP_ALGORITHM/ca.crt
203
+ server_client_cert_path=spec/support/ocsp/$OCSP_ALGORITHM/server.pem
204
+ else
205
+ server_cert_path=spec/support/certificates/server-second-level-bundle.pem
206
+ server_ca_path=spec/support/certificates/ca.crt
207
+ server_client_cert_path=spec/support/certificates/client.pem
208
+ fi
209
+
210
+ if test -n "$OCSP_ALGORITHM"; then
211
+ client_cert_path=spec/support/ocsp/$OCSP_ALGORITHM/server.pem
212
+ elif test "$AUTH" = x509; then
213
+ client_cert_path=spec/support/certificates/client-x509.pem
214
+
215
+ uri_options="$uri_options&authMechanism=MONGODB-X509"
216
+ elif echo $RVM_RUBY |grep -q jruby; then
217
+ # JRuby does not grok chained certificate bundles -
218
+ # https://github.com/jruby/jruby-openssl/issues/181
219
+ client_cert_path=spec/support/certificates/client.pem
220
+ else
221
+ client_cert_path=spec/support/certificates/client-second-level-bundle.pem
222
+ fi
223
+
224
+ uri_options="$uri_options&tls=true&"\
225
+ "tlsCAFile=$server_ca_path&"\
226
+ "tlsCertificateKeyFile=$client_cert_path"
227
+
228
+ args="$args --sslMode requireSSL"\
229
+ " --sslPEMKeyFile $server_cert_path"\
230
+ " --sslCAFile $server_ca_path"\
231
+ " --sslClientCertificate $server_client_cert_path"
232
+ fi
233
+
234
+ # Docker forwards ports to the external interface, not to the loopback.
235
+ # Hence we must bind to all interfaces here.
236
+ if test -n "$BIND_ALL"; then
237
+ args="$args --bind_ip_all"
238
+ fi
239
+
240
+ # MongoDB servers pre-4.2 do not enable zlib compression by default
241
+ if test "$COMPRESSOR" = snappy; then
242
+ args="$args --networkMessageCompressors snappy"
243
+ elif test "$COMPRESSOR" = zlib; then
244
+ args="$args --networkMessageCompressors zlib"
245
+ fi
246
+
247
+ if test -n "$OCSP_ALGORITHM" || test -n "$OCSP_VERIFIER"; then
248
+ python3 -m pip install asn1crypto oscrypto flask
249
+ fi
250
+
251
+ local ocsp_args=
252
+ if test -n "$OCSP_ALGORITHM"; then
253
+ if test -z "$server_ca_path"; then
254
+ echo "server_ca_path must have been set" 1>&2
255
+ exit 1
256
+ fi
257
+ ocsp_args="--ca_file $server_ca_path"
258
+ if test "$OCSP_DELEGATE" = 1; then
259
+ ocsp_args="$ocsp_args \
260
+ --ocsp_responder_cert spec/support/ocsp/$OCSP_ALGORITHM/ocsp-responder.crt \
261
+ --ocsp_responder_key spec/support/ocsp/$OCSP_ALGORITHM/ocsp-responder.key \
262
+ "
263
+ else
264
+ ocsp_args="$ocsp_args \
265
+ --ocsp_responder_cert spec/support/ocsp/$OCSP_ALGORITHM/ca.crt \
266
+ --ocsp_responder_key spec/support/ocsp/$OCSP_ALGORITHM/ca.key \
267
+ "
268
+ fi
269
+ if test -n "$OCSP_STATUS"; then
270
+ ocsp_args="$ocsp_args --fault $OCSP_STATUS"
271
+ fi
272
+ fi
273
+
274
+ OCSP_ARGS="$ocsp_args"
275
+ SERVER_ARGS="$args"
276
+ URI_OPTIONS="$uri_options"
277
+ }
278
+
279
+ launch_ocsp_mock() {
280
+ if test -n "$OCSP_ARGS"; then
281
+ # Bind to 0.0.0.0 for Docker
282
+ python3 spec/support/ocsp/ocsp_mock.py $OCSP_ARGS -b 0.0.0.0 -p 8100 &
283
+ OCSP_MOCK_PID=$!
284
+ fi
285
+ }
286
+
287
+ launch_server() {
288
+ local dbdir="$1"
289
+ python -m mtools.mlaunch.mlaunch --dir "$dbdir" --binarypath "$BINDIR" $SERVER_ARGS
290
+ }