bson 5.0.2-java → 5.1.1-java
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
- data/Rakefile +16 -26
- data/lib/bson/binary.rb +126 -4
- data/lib/bson/document.rb +8 -0
- data/lib/bson/object_id.rb +1 -1
- data/lib/bson/regexp.rb +3 -3
- data/lib/bson/vector.rb +44 -0
- data/lib/bson/version.rb +5 -16
- data/lib/bson-ruby.jar +0 -0
- data/lib/bson.rb +1 -0
- data/spec/bson/document_as_spec.rb +14 -0
- data/spec/bson/vector_spec.rb +33 -0
- data/spec/runners/binary_vector.rb +78 -0
- data/spec/shared/LICENSE +20 -0
- data/spec/shared/bin/get-mongodb-download-url +17 -0
- data/spec/shared/bin/s3-copy +45 -0
- data/spec/shared/bin/s3-upload +69 -0
- data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
- data/spec/shared/lib/mrss/cluster_config.rb +231 -0
- data/spec/shared/lib/mrss/constraints.rb +378 -0
- data/spec/shared/lib/mrss/docker_runner.rb +298 -0
- data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
- data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +238 -0
- data/spec/shared/lib/mrss/release/candidate.rb +281 -0
- data/spec/shared/lib/mrss/release/product_data.rb +144 -0
- data/spec/shared/lib/mrss/server_version_registry.rb +113 -0
- data/spec/shared/lib/mrss/session_registry.rb +69 -0
- data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
- data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
- data/spec/shared/lib/mrss/utils.rb +37 -0
- data/spec/shared/lib/tasks/candidate.rake +64 -0
- data/spec/shared/share/Dockerfile.erb +251 -0
- data/spec/shared/share/haproxy-1.conf +16 -0
- data/spec/shared/share/haproxy-2.conf +17 -0
- data/spec/shared/shlib/config.sh +27 -0
- data/spec/shared/shlib/distro.sh +84 -0
- data/spec/shared/shlib/server.sh +423 -0
- data/spec/shared/shlib/set_env.sh +110 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/spec_tests/binary_vector_spec.rb +82 -0
- data/spec/spec_tests/data/binary_vector/README.md +61 -0
- data/spec/spec_tests/data/binary_vector/float32.json +65 -0
- data/spec/spec_tests/data/binary_vector/int8.json +57 -0
- data/spec/spec_tests/data/binary_vector/packed_bit.json +83 -0
- data/spec/spec_tests/data/corpus/binary.json +30 -0
- metadata +70 -6
@@ -0,0 +1,179 @@
|
|
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
|
+
randomize: false
|
30
|
+
)
|
31
|
+
@spec_root = spec_root || File.join(root, 'spec')
|
32
|
+
@classifiers = classifiers
|
33
|
+
@priority_order = priority_order
|
34
|
+
@rspec_json_path = rspec_json_path || File.join(root, 'tmp/rspec.json')
|
35
|
+
@rspec_all_json_path = rspec_all_json_path || File.join(root, 'tmp/rspec-all.json')
|
36
|
+
@randomize = !!randomize
|
37
|
+
end
|
38
|
+
|
39
|
+
attr_reader :spec_root, :classifiers, :priority_order
|
40
|
+
attr_reader :rspec_json_path, :rspec_all_json_path
|
41
|
+
|
42
|
+
def randomize?
|
43
|
+
@randomize
|
44
|
+
end
|
45
|
+
|
46
|
+
def seed
|
47
|
+
@seed ||= (rand * 100_000).to_i
|
48
|
+
end
|
49
|
+
|
50
|
+
def buckets
|
51
|
+
@buckets ||= {}.tap do |buckets|
|
52
|
+
Find.find(spec_root) do |path|
|
53
|
+
next unless File.file?(path)
|
54
|
+
next unless path =~ /_spec\.rb\z/
|
55
|
+
rel_path = path[(spec_root.length + 1)..path.length]
|
56
|
+
|
57
|
+
found = false
|
58
|
+
classifiers.each do |(regexp, category)|
|
59
|
+
if regexp =~ rel_path
|
60
|
+
buckets[category] ||= []
|
61
|
+
buckets[category] << File.join('spec', rel_path)
|
62
|
+
found = true
|
63
|
+
break
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
unless found
|
68
|
+
buckets[nil] ||= []
|
69
|
+
buckets[nil] << File.join('spec', rel_path)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end.freeze
|
73
|
+
end
|
74
|
+
|
75
|
+
def ordered_buckets
|
76
|
+
@ordered_buckets ||= {}.tap do |ordered_buckets|
|
77
|
+
buckets = self.buckets.dup
|
78
|
+
priority_order.each do |category|
|
79
|
+
files = buckets.delete(category)
|
80
|
+
ordered_buckets[category] = files
|
81
|
+
end
|
82
|
+
|
83
|
+
if files = buckets.delete(nil)
|
84
|
+
ordered_buckets[nil] = files
|
85
|
+
end
|
86
|
+
|
87
|
+
unless buckets.empty?
|
88
|
+
raise BucketsNotPrioritized, "Some buckets were not prioritized: #{buckets.keys.map(&:to_s).join(', ')}"
|
89
|
+
end
|
90
|
+
end.freeze
|
91
|
+
end
|
92
|
+
|
93
|
+
def run
|
94
|
+
run_buckets(*buckets.keys)
|
95
|
+
end
|
96
|
+
|
97
|
+
def run_buckets(*buckets)
|
98
|
+
FileUtils.rm_f(rspec_all_json_path)
|
99
|
+
|
100
|
+
buckets.each do |bucket|
|
101
|
+
if bucket && !self.buckets[bucket]
|
102
|
+
raise "Unknown bucket #{bucket}"
|
103
|
+
end
|
104
|
+
end
|
105
|
+
buckets = Hash[self.buckets.select { |k, v| buckets.include?(k) }]
|
106
|
+
|
107
|
+
failed = []
|
108
|
+
|
109
|
+
priority_order.each do |category|
|
110
|
+
if files = buckets.delete(category)
|
111
|
+
unless run_files(category, files)
|
112
|
+
failed << category
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
if files = buckets.delete(nil)
|
117
|
+
unless run_files('remaining', files)
|
118
|
+
failed << 'remaining'
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
unless buckets.empty?
|
123
|
+
raise "Some buckets were not executed: #{buckets.keys.map(&:to_s).join(', ')}"
|
124
|
+
end
|
125
|
+
|
126
|
+
if failed.any?
|
127
|
+
raise "The following buckets failed: #{failed.map(&:to_s).join(', ')}"
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def run_files(category, paths)
|
132
|
+
puts "Running #{category.to_s.gsub('_', ' ')} tests"
|
133
|
+
FileUtils.rm_f(rspec_json_path)
|
134
|
+
cmd = %w(rspec) + paths
|
135
|
+
if randomize?
|
136
|
+
cmd += %W(--order rand:#{seed})
|
137
|
+
end
|
138
|
+
|
139
|
+
begin
|
140
|
+
puts "Running #{cmd.join(' ')}"
|
141
|
+
ChildProcessHelper.check_call(cmd)
|
142
|
+
ensure
|
143
|
+
if File.exist?(rspec_json_path)
|
144
|
+
if File.exist?(rspec_all_json_path)
|
145
|
+
merge_rspec_results
|
146
|
+
else
|
147
|
+
FileUtils.cp(rspec_json_path, rspec_all_json_path)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
true
|
153
|
+
rescue ChildProcessHelper::SpawnError
|
154
|
+
false
|
155
|
+
end
|
156
|
+
|
157
|
+
def merge_rspec_results
|
158
|
+
all = JSON.parse(File.read(rspec_all_json_path))
|
159
|
+
new = JSON.parse(File.read(rspec_json_path))
|
160
|
+
all['examples'] += new.delete('examples')
|
161
|
+
new.delete('summary').each do |k, v|
|
162
|
+
all['summary'][k] += v
|
163
|
+
end
|
164
|
+
new.delete('version')
|
165
|
+
new.delete('summary_line')
|
166
|
+
# The spec organizer runs all buckets with the same seed, hence
|
167
|
+
# we can drop the seed from new results.
|
168
|
+
new.delete('seed')
|
169
|
+
unless new.empty?
|
170
|
+
raise "Unhandled rspec results keys: #{new.keys.join(', ')}"
|
171
|
+
end
|
172
|
+
# We do not merge summary lines, delete them from aggregated results
|
173
|
+
all.delete('summary_line')
|
174
|
+
File.open(rspec_all_json_path, 'w') do |f|
|
175
|
+
f << JSON.dump(all)
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
module Mrss
|
5
|
+
module Utils
|
6
|
+
extend self
|
7
|
+
|
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
|
+
)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../mrss/release/candidate'
|
4
|
+
|
5
|
+
namespace :candidate do
|
6
|
+
desc 'Initialize a new product.yml file'
|
7
|
+
task :init do
|
8
|
+
Mrss::Release::ProductData.init!
|
9
|
+
puts "product.yml file created"
|
10
|
+
end
|
11
|
+
|
12
|
+
desc 'Print the release notes for the next candidate release'
|
13
|
+
task :preview do
|
14
|
+
Mrss::Release::Candidate.instance do |candidate|
|
15
|
+
# load the pending changes before bumping the version, since it
|
16
|
+
# depends on the value of the current version.
|
17
|
+
candidate.pending_changes
|
18
|
+
candidate.bump_version
|
19
|
+
puts candidate.release_notes
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
desc 'List the pull requests to be included in the next release'
|
24
|
+
task :prs do
|
25
|
+
Mrss::Release::Candidate.instance.decorated_prs.each do |pr|
|
26
|
+
print "\##{pr['number']}[#{pr['type-code']}] "
|
27
|
+
print "#{pr['jira']} " if pr['jira']
|
28
|
+
puts pr['short-title']
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
desc 'Create a new branch and pull request for the candidate'
|
33
|
+
task create: :check_branch_status do
|
34
|
+
Mrss::Release::Candidate.instance do |candidate|
|
35
|
+
origin = `git config get remote.origin.url`
|
36
|
+
match = origin.match(/:(.*?)\//) or raise "origin url is not in expected format: #{origin.inspect}"
|
37
|
+
user = match[1]
|
38
|
+
|
39
|
+
puts 'gathering candidate info and bumping version...'
|
40
|
+
candidate.bump_version!
|
41
|
+
|
42
|
+
puts 'writing release notes to /tmp/pr-body.md...'
|
43
|
+
File.write('/tmp/pr-body.md', candidate.release_notes)
|
44
|
+
|
45
|
+
sh 'git', 'checkout', '-b', candidate.branch_name
|
46
|
+
sh 'git', 'commit', '-am', "Bump version to #{candidate.product.version}"
|
47
|
+
sh 'git', 'push', 'origin', candidate.branch_name
|
48
|
+
|
49
|
+
sh 'gh', 'pr', 'create',
|
50
|
+
'--head', "#{user}:#{candidate.branch_name}",
|
51
|
+
'--base', candidate.product.base_branch,
|
52
|
+
'--title', "Release candidate for #{candidate.product.version}",
|
53
|
+
'--label', 'release-candidate',
|
54
|
+
'--body-file', '/tmp/pr-body.md'
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# Ensures the current branch is up-to-date with no uncommitted changes
|
59
|
+
task :check_branch_status do
|
60
|
+
sh 'git pull >/dev/null', verbose: false
|
61
|
+
changes = `git status --short --untracked-files=no`.strip
|
62
|
+
abort "There are uncommitted changes. Commit (or revert) the changes and try again." if changes.length > 0
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,251 @@
|
|
1
|
+
<%
|
2
|
+
|
3
|
+
def ruby_toolchain_url(ruby)
|
4
|
+
"http://boxes.10gen.com/build/toolchain-drivers/mongo-ruby-toolchain/library/#{distro}/#{ruby}.tar.xz"
|
5
|
+
end
|
6
|
+
|
7
|
+
%>
|
8
|
+
|
9
|
+
FROM <%= base_image %>
|
10
|
+
|
11
|
+
ENV DOCKER=1
|
12
|
+
|
13
|
+
<% if debian? %>
|
14
|
+
|
15
|
+
ENV DEBIAN_FRONTEND=noninteractive
|
16
|
+
|
17
|
+
<% else %>
|
18
|
+
|
19
|
+
RUN echo assumeyes=1 |tee -a /etc/yum.conf
|
20
|
+
|
21
|
+
<% end %>
|
22
|
+
|
23
|
+
<% if debian? %>
|
24
|
+
|
25
|
+
# zsh is not required for any scripts but it is a better interactive shell
|
26
|
+
# than bash.
|
27
|
+
# Ruby runtime dependencies: libyaml-0-2
|
28
|
+
# Compiling ruby libraries: gcc make
|
29
|
+
# Compiling python packages: python3-dev
|
30
|
+
# JRuby: openjdk-17-jdk-headless
|
31
|
+
# Server dependencies: libsnmp30 libcurl3/libcurl4
|
32
|
+
# Determining OS we are running on: lsb-release
|
33
|
+
# Load balancer testing: haproxy
|
34
|
+
# Kerberos testing: krb5-user
|
35
|
+
# Local Kerberos server: krb5-kdc krb5-admin-server
|
36
|
+
# Installing mlaunch from git: git
|
37
|
+
# ruby-head archive: bzip2
|
38
|
+
# nio4r on JRuby: libgmp-dev
|
39
|
+
# Snappy compression: libsnappy-dev
|
40
|
+
# nokogiri: zlib1g-dev
|
41
|
+
# Mongoid testing: tzdata shared-mime-info
|
42
|
+
# Mongoid application testing: nodejs (8.x or newer)
|
43
|
+
# Test suite: procps for ps (to kill JRubies)
|
44
|
+
#
|
45
|
+
# We currently use Python 2-compatible version of mtools, which
|
46
|
+
# is installable via pip (which uses Python 2). All of the MongoDB
|
47
|
+
# distros have pip installed (but none as of this writing have pip3)
|
48
|
+
# therefore install python-pip in all configurations here.
|
49
|
+
|
50
|
+
<% packages = %w(
|
51
|
+
procps lsb-release bzip2 curl wget gpg zsh
|
52
|
+
git make gcc g++ libyaml-dev libgmp-dev zlib1g-dev libsnappy-dev
|
53
|
+
krb5-user krb5-kdc krb5-admin-server libsasl2-dev libsasl2-modules-gssapi-mit
|
54
|
+
haproxy libcurl4
|
55
|
+
tzdata shared-mime-info software-properties-common xz-utils nodejs npm
|
56
|
+
openjdk-17-jdk-headless
|
57
|
+
) %>
|
58
|
+
|
59
|
+
<% if distro =~ /ubuntu2004/ %>
|
60
|
+
<% packages << 'libsnmp35' %>
|
61
|
+
<% elsif distro =~ /ubuntu2204|debian11/ %>
|
62
|
+
<% packages << 'libsnmp40' %>
|
63
|
+
<% else %>
|
64
|
+
<% packages << 'libsnmp30' %>
|
65
|
+
<% end %>
|
66
|
+
|
67
|
+
<% if distro !~ /ubuntu2004|ubuntu2204|debian11/ %>
|
68
|
+
<% packages << 'python-pip' %>
|
69
|
+
<% end %>
|
70
|
+
|
71
|
+
<% if distro =~ /ubuntu2204|debian11/ %>
|
72
|
+
<% packages << 'python3-venv' %>
|
73
|
+
<% end %>
|
74
|
+
|
75
|
+
<% if distro =~ /ubuntu2004|ubuntu2204/ %>
|
76
|
+
<% packages += %w(ruby bundler) %>
|
77
|
+
<% end %>
|
78
|
+
|
79
|
+
RUN apt-get update && apt-get install -y <%= packages.join(' ') %>
|
80
|
+
|
81
|
+
<% if ubuntu? %>
|
82
|
+
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
|
83
|
+
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
|
84
|
+
<% end %>
|
85
|
+
RUN apt-add-repository ppa:deadsnakes/ppa -y
|
86
|
+
RUN apt-get update && apt-get install -y cmake python3.10 python3.10-dev python3.10-venv
|
87
|
+
RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 1
|
88
|
+
<% else %>
|
89
|
+
|
90
|
+
# Enterprise server: net-snmp
|
91
|
+
# lsb_release: redhat-lsb-core
|
92
|
+
# our runner scripts: which
|
93
|
+
# Ruby dependency: libyaml
|
94
|
+
# compiling python packages: gcc python-devel
|
95
|
+
# Kerberos tests: krb5-workstation + cyrus-sasl-devel to build the
|
96
|
+
# mongo_kerberos gem + cyrus-sasl-gssapi for authentication to work
|
97
|
+
# Local Kerberos server: krb5-server
|
98
|
+
# JRuby: java-17-openjdk
|
99
|
+
#
|
100
|
+
# Note: lacking cyrus-sasl-gssapi produces a cryptic message
|
101
|
+
# "SASL(-4): no mechanism available: No worthy mechs found"
|
102
|
+
# https://github.com/farorm/python-ad/issues/10
|
103
|
+
|
104
|
+
RUN yum --enablerepo=powertools install -y redhat-lsb-core which git gcc gcc-c++ libyaml-devel krb5-server \
|
105
|
+
krb5-workstation cyrus-sasl-devel cyrus-sasl-gssapi java-17-openjdk \
|
106
|
+
net-snmp python38 python38-devel cmake nodejs npm xz
|
107
|
+
|
108
|
+
<% end %>
|
109
|
+
|
110
|
+
<% if preload? %>
|
111
|
+
|
112
|
+
<% if distro =~ /debian9|ubuntu1604|ubuntu1804/ %>
|
113
|
+
# Install python 3.7 for mlaunch.
|
114
|
+
RUN curl -fL --retry 3 https://github.com/p-mongodb/deps/raw/main/<%= distro %>-python37.tar.xz | \
|
115
|
+
tar xfJ - -C /opt
|
116
|
+
ENV PATH=/opt/python37/bin:$PATH
|
117
|
+
RUN python3 -V
|
118
|
+
<% end %>
|
119
|
+
|
120
|
+
<% if true || distro =~ /rhel|ubuntu1604/ %>
|
121
|
+
|
122
|
+
# Ubuntu 12.04 ships pip 1.0 which is ancient and does not work.
|
123
|
+
#
|
124
|
+
# Ubuntu 16.04 apparently also ships a pip that does not work:
|
125
|
+
# https://stackoverflow.com/questions/37495375/python-pip-install-throws-typeerror-unsupported-operand-types-for-retry
|
126
|
+
# Potentially this only affects environments with less than ideal
|
127
|
+
# connectivity (or, perhaps, when python package registry is experiencing
|
128
|
+
# availability issues) when pip must retry to install packages.
|
129
|
+
#
|
130
|
+
# rhel apparently does not package pip at all in core repoitories,
|
131
|
+
# therefore install it the manual way.
|
132
|
+
#
|
133
|
+
# https://pip.pypa.io/en/stable/installing/
|
134
|
+
RUN curl --retry 3 -fL https://bootstrap.pypa.io/pip/get-pip.py | python3
|
135
|
+
RUN python3 -m pip install --upgrade pip setuptools wheel
|
136
|
+
|
137
|
+
<% end %>
|
138
|
+
|
139
|
+
# Current virtualenv fails with
|
140
|
+
# https://github.com/pypa/virtualenv/issues/1630
|
141
|
+
<% mtools = 'legacy' %>
|
142
|
+
<% case mtools
|
143
|
+
when 'legacy' %>
|
144
|
+
# dateutil dependency is missing in mtools: https://github.com/rueckstiess/mtools/issues/864
|
145
|
+
RUN python3 -m pip install 'virtualenv<20' 'mtools-legacy[mlaunch]' 'pymongo<4' python-dateutil
|
146
|
+
<% when 'git' %>
|
147
|
+
# dateutil dependency is missing in mtools: https://github.com/rueckstiess/mtools/issues/864
|
148
|
+
RUN python3 -m pip install virtualenv 'pymongo>=4' python-dateutil psutil
|
149
|
+
|
150
|
+
# Install mtools from git because released versions do not work with pymongo 4.0
|
151
|
+
RUN git clone https://github.com/p-mongodb/mtools && \
|
152
|
+
cd mtools && \
|
153
|
+
python3 setup.py install
|
154
|
+
<% else %>
|
155
|
+
# mtools[mlaunch] does not work: https://github.com/rueckstiess/mtools/issues/856
|
156
|
+
# dateutil dependency is missing in mtools: https://github.com/rueckstiess/mtools/issues/864
|
157
|
+
RUN python3 -m pip install virtualenv 'pymongo>=4' python-dateutil psutil mtools
|
158
|
+
<% end %>
|
159
|
+
|
160
|
+
<% if @env.fetch('MONGODB_VERSION') >= '4.4' %>
|
161
|
+
# ubuntu1604 installs MarkupSafe 0.0.0 here instead of 2.0.0+
|
162
|
+
# as specified by dependencies, causing OCSP mock to not work.
|
163
|
+
RUN python3 -mpip install asn1crypto oscrypto flask --upgrade --ignore-installed
|
164
|
+
<% end %>
|
165
|
+
|
166
|
+
# FLE is tested against 4.0+ servers.
|
167
|
+
<% if @env.fetch('MONGODB_VERSION') >= '4.0' %>
|
168
|
+
# Requirements in drivers-evergreen-tools:
|
169
|
+
# boto3~=1.19 cryptography~=3.4.8 pykmip~=0.10.0
|
170
|
+
# cryptography does not install due to lacking setuptools_rust
|
171
|
+
# (either that version or anything that isn't part of system packages)
|
172
|
+
RUN python3 -mpip install boto3~=1.19 cryptography pykmip~=0.10.0 'sqlalchemy<2.0.0'
|
173
|
+
<% end %>
|
174
|
+
|
175
|
+
<% unless ruby_head? || system_ruby? %>
|
176
|
+
|
177
|
+
RUN curl --retry 3 -fL <%= ruby_toolchain_url(ruby) %> |tar -xC /opt -Jf -
|
178
|
+
ENV PATH=/opt/rubies/<%= ruby %>/bin:$PATH \
|
179
|
+
USE_OPT_TOOLCHAIN=1
|
180
|
+
|
181
|
+
<% end %>
|
182
|
+
|
183
|
+
<% end %>
|
184
|
+
|
185
|
+
<% if distro =~ /debian|ubuntu/ %>
|
186
|
+
# mkdir was moved from /usr/bin to /bin and MongoDB's distros
|
187
|
+
# apparently keep using the old location.
|
188
|
+
# This definitely affects debian10.
|
189
|
+
# https://stackoverflow.com/questions/64653051/make-usr-bin-mkdir-command-not-found-during-gem-install-nokogiri-in-ubuntu
|
190
|
+
RUN test -f /usr/bin/mkdir || ln -s /bin/mkdir /usr/bin/mkdir
|
191
|
+
<% end %>
|
192
|
+
|
193
|
+
WORKDIR /app
|
194
|
+
|
195
|
+
<% if preload? && !ruby_head? %>
|
196
|
+
|
197
|
+
COPY Gemfile .
|
198
|
+
COPY gemfiles gemfiles
|
199
|
+
COPY *.gemspec .
|
200
|
+
COPY lib/<%= project_lib_subdir %>/version.rb lib/<%= project_lib_subdir %>/version.rb
|
201
|
+
RUN bundle install
|
202
|
+
COPY .evergreen/patch-debuggers .evergreen/patch-debuggers
|
203
|
+
<% if system_ruby? %>
|
204
|
+
# Running under docker with root access
|
205
|
+
RUN .evergreen/patch-debuggers /var/lib/gems
|
206
|
+
<% else %>
|
207
|
+
RUN .evergreen/patch-debuggers /opt/rubies
|
208
|
+
<% end %>
|
209
|
+
|
210
|
+
<% end %>
|
211
|
+
|
212
|
+
<% if fle? %>
|
213
|
+
RUN curl --retry 3 -fL "https://s3.amazonaws.com/mciuploads/libmongocrypt/all/master/latest/libmongocrypt-all.tar.gz" |tar zxf -
|
214
|
+
|
215
|
+
<%= "ENV LIBMONGOCRYPT_PATH #{libmongocrypt_path}" %>
|
216
|
+
<% end %>
|
217
|
+
|
218
|
+
<% if preload? %>
|
219
|
+
ENV DOCKER_PRELOAD=1
|
220
|
+
<% end %>
|
221
|
+
|
222
|
+
RUN npm install --global yarn
|
223
|
+
|
224
|
+
ENV MONGO_ORCHESTRATION_HOME=/tmpfs \
|
225
|
+
PROJECT_DIRECTORY=/app \
|
226
|
+
<%= @env.map { |k, v| %Q`#{k}="#{v.gsub('$', "\\$").gsub('"', "\\\"")}"` }.join(" \\\n ") %>
|
227
|
+
|
228
|
+
<% if interactive? %>
|
229
|
+
ENV INTERACTIVE=1
|
230
|
+
<% end %>
|
231
|
+
|
232
|
+
COPY . .
|
233
|
+
|
234
|
+
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'
|
235
|
+
ENV USE_OPT_MONGODB=1 USE_SYSTEM_PYTHON_PACKAGES=1
|
236
|
+
|
237
|
+
<% if expose? %>
|
238
|
+
|
239
|
+
<% ports = [] %>
|
240
|
+
|
241
|
+
<% 0.upto(num_exposed_ports-1) do |i| %>
|
242
|
+
<% ports << 27017 + i %>
|
243
|
+
<% end %>
|
244
|
+
|
245
|
+
<% if @env['OCSP_ALGORITHM'] %>
|
246
|
+
<% ports << 8100 %>
|
247
|
+
<% end %>
|
248
|
+
|
249
|
+
EXPOSE <%= ports.map(&:to_s).join(' ') %>
|
250
|
+
|
251
|
+
<% end %>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# Modeled after
|
2
|
+
# https://github.com/mongodb-labs/drivers-evergreen-tools/blob/master/.evergreen/run-load-balancer.sh
|
3
|
+
|
4
|
+
defaults
|
5
|
+
mode tcp
|
6
|
+
timeout connect 7s
|
7
|
+
timeout client 55s
|
8
|
+
timeout server 55s
|
9
|
+
|
10
|
+
frontend mongos_frontend
|
11
|
+
bind *:27017
|
12
|
+
use_backend mongos_backend
|
13
|
+
|
14
|
+
backend mongos_backend
|
15
|
+
mode tcp
|
16
|
+
server mongos_one 127.0.0.1:27117 check
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# Modeled after
|
2
|
+
# https://github.com/mongodb-labs/drivers-evergreen-tools/blob/master/.evergreen/run-load-balancer.sh
|
3
|
+
|
4
|
+
defaults
|
5
|
+
mode tcp
|
6
|
+
timeout connect 7s
|
7
|
+
timeout client 55s
|
8
|
+
timeout server 55s
|
9
|
+
|
10
|
+
frontend mongos_frontend
|
11
|
+
bind *:27017
|
12
|
+
use_backend mongos_backend
|
13
|
+
|
14
|
+
backend mongos_backend
|
15
|
+
mode tcp
|
16
|
+
server mongos_one 127.0.0.1:27117 check
|
17
|
+
server mongos_two 127.0.0.1:27118 check
|
@@ -0,0 +1,27 @@
|
|
1
|
+
show_local_instructions_impl() {
|
2
|
+
local arch="$1"
|
3
|
+
shift
|
4
|
+
|
5
|
+
echo To test this configuration locally:
|
6
|
+
local params=
|
7
|
+
while test -n "$1"; do
|
8
|
+
key="$1"
|
9
|
+
shift
|
10
|
+
# ${!foo} syntax is bash specific:
|
11
|
+
# https://stackoverflow.com/questions/14049057/bash-expand-variable-in-a-variable
|
12
|
+
value="${!key}"
|
13
|
+
if test -n "$value"; then
|
14
|
+
params="$params $key=$value"
|
15
|
+
fi
|
16
|
+
done
|
17
|
+
|
18
|
+
# $0 has the current script being executed which is also the script that
|
19
|
+
# was initially invoked EXCEPT for the AWS configurations which use the
|
20
|
+
# wrapper script.
|
21
|
+
if echo "$AUTH" |grep -q ^aws; then
|
22
|
+
script=.evergreen/run-tests-aws-auth.sh
|
23
|
+
else
|
24
|
+
script="$0"
|
25
|
+
fi
|
26
|
+
echo ./.evergreen/test-on-docker -d $arch $params -s "$script"
|
27
|
+
}
|
@@ -0,0 +1,84 @@
|
|
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
|
+
release=`lsb_release -rs |tr -d .`
|
17
|
+
distro="ubuntu$release"-arm
|
18
|
+
elif lsb_release -is |grep -q Debian; then
|
19
|
+
release=`lsb_release -rs |tr -d .`
|
20
|
+
# In docker, release is something like 9.11.
|
21
|
+
# In evergreen, release is 9.2.
|
22
|
+
release=`echo $release |sed -e 's/^9.*/92/'`
|
23
|
+
distro="debian$release"
|
24
|
+
elif lsb_release -is |grep -q Ubuntu; then
|
25
|
+
if test "`uname -m`" = ppc64le; then
|
26
|
+
release=`lsb_release -rs |tr -d .`
|
27
|
+
distro="ubuntu$release-ppc"
|
28
|
+
else
|
29
|
+
release=`lsb_release -rs |tr -d .`
|
30
|
+
distro="ubuntu$release"
|
31
|
+
fi
|
32
|
+
else
|
33
|
+
echo 'Unknown Debian flavor' 1>&2
|
34
|
+
exit 1
|
35
|
+
fi
|
36
|
+
elif lsb_release -is |grep -qi suse; then
|
37
|
+
if test "`uname -m`" = s390x; then
|
38
|
+
release=`lsb_release -rs |sed -e 's/\..*//'`
|
39
|
+
distro="suse$release-s390x"
|
40
|
+
else
|
41
|
+
echo 'Unknown Suse arch' 1>&2
|
42
|
+
exit 1
|
43
|
+
fi
|
44
|
+
elif test -f /etc/redhat-release; then
|
45
|
+
# RHEL or CentOS
|
46
|
+
if test "`uname -m`" = s390x; then
|
47
|
+
distro=rhel72-s390x
|
48
|
+
elif test "`uname -m`" = ppc64le; then
|
49
|
+
distro=rhel71-ppc
|
50
|
+
elif lsb_release >/dev/null 2>&1; then
|
51
|
+
if lsb_release -is |grep -q RedHat; then
|
52
|
+
release=`lsb_release -rs |tr -d .`
|
53
|
+
distro="rhel$release"
|
54
|
+
elif lsb_release -is |grep -q CentOS; then
|
55
|
+
release=`lsb_release -rs |cut -c 1 |sed -e s/7/70/ -e s/6/62/ -e s/8/80/`
|
56
|
+
distro="rhel$release"
|
57
|
+
else
|
58
|
+
echo 'Unknown RHEL flavor' 1>&2
|
59
|
+
exit 1
|
60
|
+
fi
|
61
|
+
else
|
62
|
+
echo lsb_release missing, using /etc/redhat-release 1>&2
|
63
|
+
release=`grep -o 'release [0-9]' /etc/redhat-release |awk '{print $2}'`
|
64
|
+
release=`echo $release |sed -e s/7/70/ -e s/6/62/ -e s/8/80/`
|
65
|
+
distro=rhel$release
|
66
|
+
fi
|
67
|
+
elif test -f /etc/os-release; then
|
68
|
+
name=`grep -o '^NAME=.*' /etc/os-release | awk -F '"' '{ print $2 }'`
|
69
|
+
version=`grep -o '^VERSION=.*' /etc/os-release | awk -F '"' '{ print $2 }'`
|
70
|
+
if test "$name" = "Amazon Linux"; then
|
71
|
+
distro=amazon$version
|
72
|
+
else
|
73
|
+
cat /etc/os-release
|
74
|
+
echo 'Unknown distro' 1>&2
|
75
|
+
exit 1
|
76
|
+
fi
|
77
|
+
else
|
78
|
+
lsb_release -a
|
79
|
+
echo 'Unknown distro' 1>&2
|
80
|
+
exit 1
|
81
|
+
fi
|
82
|
+
echo "Detected distro: $distro" 1>&2
|
83
|
+
echo $distro
|
84
|
+
}
|