bson 4.11.0 → 4.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +4 -7
  4. data/ext/bson/bson-native.h +2 -0
  5. data/ext/bson/init.c +24 -1
  6. data/ext/bson/read.c +29 -0
  7. data/lib/bson/active_support.rb +1 -0
  8. data/lib/bson/array.rb +2 -1
  9. data/lib/bson/binary.rb +8 -5
  10. data/lib/bson/boolean.rb +2 -1
  11. data/lib/bson/code.rb +2 -1
  12. data/lib/bson/code_with_scope.rb +2 -1
  13. data/lib/bson/config.rb +1 -0
  14. data/lib/bson/date.rb +1 -0
  15. data/lib/bson/date_time.rb +1 -0
  16. data/lib/bson/db_pointer.rb +2 -1
  17. data/lib/bson/dbref.rb +125 -0
  18. data/lib/bson/decimal128/builder.rb +18 -15
  19. data/lib/bson/decimal128.rb +10 -9
  20. data/lib/bson/document.rb +61 -18
  21. data/lib/bson/environment.rb +1 -0
  22. data/lib/bson/error.rb +7 -0
  23. data/lib/bson/ext_json.rb +24 -11
  24. data/lib/bson/false_class.rb +2 -1
  25. data/lib/bson/float.rb +20 -31
  26. data/lib/bson/hash.rb +15 -6
  27. data/lib/bson/int32.rb +3 -2
  28. data/lib/bson/int64.rb +3 -2
  29. data/lib/bson/integer.rb +3 -2
  30. data/lib/bson/json.rb +1 -0
  31. data/lib/bson/max_key.rb +3 -2
  32. data/lib/bson/min_key.rb +3 -2
  33. data/lib/bson/nil_class.rb +2 -1
  34. data/lib/bson/object.rb +1 -0
  35. data/lib/bson/object_id.rb +4 -3
  36. data/lib/bson/open_struct.rb +1 -0
  37. data/lib/bson/regexp.rb +17 -6
  38. data/lib/bson/registry.rb +1 -0
  39. data/lib/bson/specialized.rb +1 -0
  40. data/lib/bson/string.rb +3 -2
  41. data/lib/bson/symbol.rb +2 -1
  42. data/lib/bson/time.rb +4 -3
  43. data/lib/bson/time_with_zone.rb +1 -0
  44. data/lib/bson/timestamp.rb +3 -2
  45. data/lib/bson/true_class.rb +2 -1
  46. data/lib/bson/undefined.rb +2 -1
  47. data/lib/bson/version.rb +2 -1
  48. data/lib/bson.rb +6 -4
  49. data/spec/README.md +14 -0
  50. data/spec/bson/binary_spec.rb +1 -1
  51. data/spec/bson/binary_uuid_spec.rb +12 -0
  52. data/spec/bson/byte_buffer_spec.rb +80 -1
  53. data/spec/bson/dbref_spec.rb +461 -0
  54. data/spec/bson/document_as_spec.rb +46 -0
  55. data/spec/bson/document_spec.rb +43 -1
  56. data/spec/bson/ext_json_parse_spec.rb +37 -0
  57. data/spec/bson/hash_as_spec.rb +57 -0
  58. data/spec/bson/int64_spec.rb +4 -24
  59. data/spec/bson/raw_spec.rb +7 -1
  60. data/spec/bson/regexp_spec.rb +52 -0
  61. data/spec/runners/common_driver.rb +1 -1
  62. data/spec/shared/LICENSE +20 -0
  63. data/spec/shared/bin/get-mongodb-download-url +17 -0
  64. data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
  65. data/spec/shared/lib/mrss/cluster_config.rb +221 -0
  66. data/spec/shared/lib/mrss/constraints.rb +346 -0
  67. data/spec/shared/lib/mrss/docker_runner.rb +265 -0
  68. data/spec/shared/lib/mrss/lite_constraints.rb +191 -0
  69. data/spec/shared/lib/mrss/server_version_registry.rb +115 -0
  70. data/spec/shared/lib/mrss/spec_organizer.rb +152 -0
  71. data/spec/shared/lib/mrss/utils.rb +15 -0
  72. data/spec/shared/share/Dockerfile.erb +231 -0
  73. data/spec/shared/shlib/distro.sh +73 -0
  74. data/spec/shared/shlib/server.sh +290 -0
  75. data/spec/shared/shlib/set_env.sh +128 -0
  76. data/spec/spec_helper.rb +13 -0
  77. data/spec/spec_tests/data/corpus/binary.json +33 -0
  78. data/spec/spec_tests/data/corpus/dbref.json +21 -1
  79. data/spec/spec_tests/data/corpus/document.json +4 -0
  80. data/spec/spec_tests/data/corpus/regex.json +2 -2
  81. data/spec/spec_tests/data/corpus/top.json +20 -9
  82. data/spec/support/spec_config.rb +2 -1
  83. data.tar.gz.sig +0 -0
  84. metadata +137 -101
  85. metadata.gz.sig +0 -0
  86. data/lib/bson_native.bundle +0 -0
@@ -0,0 +1,191 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ module Mrss
5
+ module LiteConstraints
6
+
7
+ # Constrain tests that use TimeoutInterrupt to MRI (and Unix).
8
+ def require_mri
9
+ before(:all) do
10
+ unless SpecConfig.instance.mri?
11
+ skip "MRI required, we have #{SpecConfig.instance.platform}"
12
+ end
13
+ end
14
+ end
15
+
16
+ def require_jruby
17
+ before(:all) do
18
+ unless BSON::Environment.jruby?
19
+ skip "JRuby required, we have #{SpecConfig.instance.platform}"
20
+ end
21
+ end
22
+ end
23
+
24
+ # This is for marking tests that fail on JRuby that should
25
+ # in principle work (as opposed to being fundamentally incompatible
26
+ # with JRuby).
27
+ # Often times these failures happen only in Evergreen.
28
+ def fails_on_jruby(version=nil)
29
+ before(:all) do
30
+ if BSON::Environment.jruby?
31
+ if version
32
+ min_parts = version.split('.').map(&:to_i)
33
+ actual_parts = JRUBY_VERSION.split('.').map(&:to_i)[0...min_parts.length]
34
+ actual = actual_parts.join('.')
35
+ if actual <= version
36
+ skip "Fails on jruby through #{version}"
37
+ end
38
+ else
39
+ skip "Fails on jruby"
40
+ end
41
+ end
42
+ end
43
+ end
44
+
45
+ # Indicates that the respective test uses the internet in some capacity,
46
+ # for example the test resolves SRV DNS records.
47
+ def require_external_connectivity
48
+ before(:all) do
49
+ if ENV['EXTERNAL_DISABLED']
50
+ skip "Test requires external connectivity"
51
+ end
52
+ end
53
+ end
54
+
55
+ def require_mongo_kerberos
56
+ before(:all) do
57
+ # TODO Use a more generic environment variable name if/when
58
+ # Mongoid tests get Kerberos configurations.
59
+ unless %w(1 yes true).include?(ENV['MONGO_RUBY_DRIVER_KERBEROS']&.downcase)
60
+ skip 'Set MONGO_RUBY_DRIVER_KERBEROS=1 in environment to run Kerberos unit tests'
61
+ end
62
+ require 'mongo_kerberos'
63
+ end
64
+ end
65
+
66
+ def require_linting
67
+ before(:all) do
68
+ unless Mongo::Lint.enabled?
69
+ skip "Linting is not enabled"
70
+ end
71
+ end
72
+ end
73
+
74
+ # Some tests will fail if linting is enabled:
75
+ # 1. Tests that pass invalid options to client, etc. which the linter
76
+ # rejects.
77
+ # 2. Tests that set expectations on topologies, server descriptions, etc.
78
+ # (since setting expectations requires mutating said objects, and when
79
+ # linting is on those objects are frozen).
80
+ def require_no_linting
81
+ before(:all) do
82
+ if Mongo::Lint.enabled?
83
+ skip "Linting is enabled"
84
+ end
85
+ end
86
+ end
87
+
88
+ def require_libmongocrypt
89
+ before(:all) do
90
+ unless ENV['LIBMONGOCRYPT_PATH']
91
+ skip 'Test requires path to libmongocrypt to be specified in LIBMONGOCRYPT_PATH env variable'
92
+ end
93
+ end
94
+ end
95
+
96
+ def require_no_libmongocrypt
97
+ before(:all) do
98
+ if ENV['LIBMONGOCRYPT_PATH']
99
+ skip 'Test requires libmongocrypt to not be configured'
100
+ end
101
+ end
102
+ end
103
+
104
+ def require_aws_auth
105
+ before(:all) do
106
+ unless (ENV['AUTH'] || '') =~ /^aws/
107
+ skip 'This test requires AUTH=aws* and an appropriately configured runtime environment'
108
+ end
109
+ end
110
+ end
111
+
112
+ def require_ec2_host
113
+ before(:all) do
114
+ if $have_aws.nil?
115
+ $have_aws = begin
116
+ require 'open-uri'
117
+ begin
118
+ Timeout.timeout(3.81) do
119
+ URI.parse('http://169.254.169.254/latest/meta-data/profile').open.read
120
+ end
121
+ true
122
+ # When trying to use the EC2 metadata endpoint on ECS:
123
+ # Errno::EINVAL: Failed to open TCP connection to 169.254.169.254:80 (Invalid argument - connect(2) for "169.254.169.254" port 80)
124
+ rescue Timeout::Error, Errno::ETIMEDOUT, Errno::EINVAL, OpenURI::HTTPError => $aws_error
125
+ false
126
+ end
127
+ end
128
+ end
129
+ unless $have_aws
130
+ skip "EC2 instance metadata is not available - assuming not running on an EC2 instance: #{$aws_error.class}: #{$aws_error}"
131
+ end
132
+ end
133
+ end
134
+
135
+ def require_stress
136
+ before(:all) do
137
+ if !SpecConfig.instance.stress?
138
+ skip 'Set STRESS=1 in environment to run stress tests'
139
+ end
140
+ end
141
+ end
142
+
143
+ def require_fork
144
+ before(:all) do
145
+ if !SpecConfig.instance.fork?
146
+ skip 'Set FORK=1 in environment to run fork tests'
147
+ end
148
+ end
149
+ end
150
+
151
+ def require_ocsp
152
+ before(:all) do
153
+ if !SpecConfig.instance.ocsp?
154
+ skip 'Set OCSP=1 in environment to run OCSP tests'
155
+ end
156
+ end
157
+ end
158
+
159
+ def require_ocsp_verifier
160
+ before(:all) do
161
+ if !SpecConfig.instance.ocsp_verifier?
162
+ skip 'Set OCSP_VERIFIER=1 in environment to run OCSP verifier tests'
163
+ end
164
+ end
165
+ end
166
+
167
+ def require_ocsp_connectivity
168
+ before(:all) do
169
+ if !SpecConfig.instance.ocsp_connectivity?
170
+ skip 'Set OCSP_CONNECTIVITY=pass or OCSP_CONNECTIVITY=fail in environment to run OCSP connectivity tests'
171
+ end
172
+ end
173
+ end
174
+
175
+ def require_active_support
176
+ before(:all) do
177
+ if !SpecConfig.instance.active_support?
178
+ skip 'This test requires ActiveSupport; set WITH_ACTIVE_SUPPORT=1 in environment'
179
+ end
180
+ end
181
+ end
182
+
183
+ def no_active_support
184
+ before(:all) do
185
+ if SpecConfig.instance.active_support?
186
+ skip 'This test requires no ActiveSupport; unset WITH_ACTIVE_SUPPORT in environment'
187
+ end
188
+ end
189
+ end
190
+ end
191
+ end
@@ -0,0 +1,115 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ autoload :JSON, 'json'
5
+ require 'open-uri'
6
+
7
+ module Mrss
8
+ class ServerVersionRegistry
9
+ class Error < StandardError
10
+ end
11
+
12
+ class UnknownVersion < Error
13
+ end
14
+
15
+ class MissingDownloadUrl < Error
16
+ end
17
+
18
+ class BrokenDownloadUrl < Error
19
+ end
20
+
21
+ def initialize(desired_version, arch)
22
+ @desired_version, @arch = desired_version, arch
23
+ end
24
+
25
+ attr_reader :desired_version, :arch
26
+
27
+ def download_url
28
+ @download_url ||= begin
29
+ version, version_ok = detect_version(current_catalog)
30
+ if version.nil?
31
+ version, full_version_ok = detect_version(full_catalog)
32
+ version_ok ||= full_version_ok
33
+ end
34
+ if version.nil?
35
+ if version_ok
36
+ raise MissingDownloadUrl, "No downloads for version #{desired_version}"
37
+ else
38
+ raise UnknownVersion, "No version #{desired_version}"
39
+ end
40
+ end
41
+ dl = version['downloads'].detect do |dl|
42
+ dl['archive']['url'].index("enterprise-#{arch}") &&
43
+ dl['arch'] == 'x86_64'
44
+ end
45
+ unless dl
46
+ raise MissingDownloadUrl, "No download for #{arch} for #{version['version']}"
47
+ end
48
+ url = dl['archive']['url']
49
+ end
50
+ rescue MissingDownloadUrl
51
+ if %w(4.7 4.7.0).include?(desired_version)
52
+ # 4.7.0 has no advertised downloads but it is downloadable and
53
+ # we do need it. Dirty hack below.
54
+ registry = self.class.new('4.4.3', arch)
55
+ registry.download_url.sub('4.4.3', '4.7.0').tap do |url|
56
+ # Sanity check - ensure the URL we hacked up is a valid one
57
+ io = uri_open(url)
58
+ begin
59
+ io.read(1)
60
+ ensure
61
+ io.close
62
+ end
63
+ end
64
+ else
65
+ raise
66
+ end
67
+ end
68
+
69
+ private
70
+
71
+ def uri_open(*args)
72
+ if RUBY_VERSION < '2.5'
73
+ open(*args)
74
+ else
75
+ URI.open(*args)
76
+ end
77
+ end
78
+
79
+ def detect_version(catalog)
80
+ candidate_versions = catalog['versions'].select do |version|
81
+ version['version'].start_with?(desired_version) &&
82
+ !version['version'].include?('-')
83
+ end
84
+ version_ok = !candidate_versions.empty?
85
+ # Sometimes the download situation is borked and there is a release
86
+ # with no downloads... skip those.
87
+ version = candidate_versions.detect do |version|
88
+ !version['downloads'].empty?
89
+ end
90
+ # Allow RC releases if there isn't a GA release.
91
+ if version.nil?
92
+ candidate_versions = catalog['versions'].select do |version|
93
+ version['version'].start_with?(desired_version)
94
+ end
95
+ version_ok ||= !candidate_versions.empty?
96
+ version = candidate_versions.detect do |version|
97
+ !version['downloads'].empty?
98
+ end
99
+ end
100
+ [version, version_ok]
101
+ end
102
+
103
+ def current_catalog
104
+ @current_catalog ||= begin
105
+ JSON.load(uri_open('http://downloads.mongodb.org/current.json').read)
106
+ end
107
+ end
108
+
109
+ def full_catalog
110
+ @full_catalog ||= begin
111
+ JSON.load(uri_open('http://downloads.mongodb.org/full.json').read)
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,152 @@
1
+ # frozen_string_literal: true
2
+ # encoding: utf-8
3
+
4
+ autoload :JSON, 'json'
5
+ autoload :FileUtils, 'fileutils'
6
+ autoload :Find, 'find'
7
+
8
+ module Mrss
9
+
10
+ autoload :ChildProcessHelper, 'mrss/child_process_helper'
11
+
12
+ # Organizes and runs all of the tests in the test suite in batches.
13
+ #
14
+ # Organizing the tests in batches serves two purposes:
15
+ #
16
+ # 1. This allows running unit tests before integration tests, therefore
17
+ # in theory revealing failures quicker on average.
18
+ # 2. This allows running some tests that have high intermittent failure rate
19
+ # in their own test process.
20
+ #
21
+ # This class aggregates RSpec results after the test runs.
22
+ class SpecOrganizer
23
+
24
+ class BucketsNotPrioritized < StandardError
25
+ end
26
+
27
+ def initialize(root: nil, classifiers:, priority_order:,
28
+ spec_root: nil, rspec_json_path: nil, rspec_all_json_path: nil
29
+ )
30
+ @spec_root = spec_root || File.join(root, 'spec')
31
+ @classifiers = classifiers
32
+ @priority_order = priority_order
33
+ @rspec_json_path = rspec_json_path || File.join(root, 'tmp/rspec.json')
34
+ @rspec_all_json_path = rspec_all_json_path || File.join(root, 'tmp/rspec-all.json')
35
+ end
36
+
37
+ attr_reader :spec_root, :classifiers, :priority_order
38
+ attr_reader :rspec_json_path, :rspec_all_json_path
39
+
40
+ def buckets
41
+ @buckets ||= {}.tap do |buckets|
42
+ Find.find(spec_root) do |path|
43
+ next unless File.file?(path)
44
+ next unless path =~ /_spec\.rb\z/
45
+ rel_path = path[(spec_root.length + 1)..path.length]
46
+
47
+ found = false
48
+ classifiers.each do |(regexp, category)|
49
+ if regexp =~ rel_path
50
+ buckets[category] ||= []
51
+ buckets[category] << File.join('spec', rel_path)
52
+ found = true
53
+ break
54
+ end
55
+ end
56
+
57
+ unless found
58
+ buckets[nil] ||= []
59
+ buckets[nil] << File.join('spec', rel_path)
60
+ end
61
+ end
62
+ end.freeze
63
+ end
64
+
65
+ def ordered_buckets
66
+ @ordered_buckets ||= {}.tap do |ordered_buckets|
67
+ buckets = self.buckets.dup
68
+ priority_order.each do |category|
69
+ files = buckets.delete(category)
70
+ ordered_buckets[category] = files
71
+ end
72
+
73
+ if files = buckets.delete(nil)
74
+ ordered_buckets[nil] = files
75
+ end
76
+
77
+ unless buckets.empty?
78
+ raise BucketsNotPrioritized, "Some buckets were not prioritized: #{buckets.keys.map(&:to_s).join(', ')}"
79
+ end
80
+ end.freeze
81
+ end
82
+
83
+ def run
84
+ FileUtils.rm_f(rspec_all_json_path)
85
+
86
+ failed = []
87
+ buckets = self.buckets.dup
88
+
89
+ priority_order.each do |category|
90
+ if files = buckets.delete(category)
91
+ unless run_files(category, files)
92
+ failed << category
93
+ end
94
+ end
95
+ end
96
+ if files = buckets.delete(nil)
97
+ unless run_files('remaining', files)
98
+ failed << 'remaining'
99
+ end
100
+ end
101
+
102
+ unless buckets.empty?
103
+ raise "Some buckets were not executed: #{buckets.keys.map(&:to_s).join(', ')}"
104
+ end
105
+
106
+ if failed.any?
107
+ raise "The following buckets failed: #{failed.map(&:to_s).join(', ')}"
108
+ end
109
+ end
110
+
111
+ def run_files(category, paths)
112
+ puts "Running #{category.to_s.gsub('_', ' ')} tests"
113
+ FileUtils.rm_f(rspec_json_path)
114
+ cmd = %w(rspec) + paths
115
+
116
+ begin
117
+ ChildProcessHelper.check_call(cmd)
118
+ ensure
119
+ if File.exist?(rspec_json_path)
120
+ if File.exist?(rspec_all_json_path)
121
+ merge_rspec_results
122
+ else
123
+ FileUtils.cp(rspec_json_path, rspec_all_json_path)
124
+ end
125
+ end
126
+ end
127
+
128
+ true
129
+ rescue ChildProcessHelper::SpawnError
130
+ false
131
+ end
132
+
133
+ def merge_rspec_results
134
+ all = JSON.parse(File.read(rspec_all_json_path))
135
+ new = JSON.parse(File.read(rspec_json_path))
136
+ all['examples'] += new.delete('examples')
137
+ new.delete('summary').each do |k, v|
138
+ all['summary'][k] += v
139
+ end
140
+ new.delete('version')
141
+ new.delete('summary_line')
142
+ unless new.empty?
143
+ raise "Unhandled rspec results keys: #{new.keys.join(', ')}"
144
+ end
145
+ # We do not merge summary lines, delete them from aggregated results
146
+ all.delete('summary_line')
147
+ File.open(rspec_all_json_path, 'w') do |f|
148
+ f << JSON.dump(all)
149
+ end
150
+ end
151
+ end
152
+ end
@@ -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 %>