1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
# frozen_string_literal: true
# rubocop:todo all
module Mongo
module CRUD
class Requirement
YAML_KEYS = %w(auth minServerVersion maxServerVersion topology topologies serverParameters serverless csfle).freeze
def initialize(spec)
spec = spec.dup
# Legacy tests have the requirements mixed with other test fields
spec.delete('data')
spec.delete('tests')
unless (unhandled_keys = spec.keys - YAML_KEYS).empty?
raise "Unhandled requirement specification keys: #{unhandled_keys}"
end
@min_server_version = spec['minServerVersion']
@max_server_version = spec['maxServerVersion']
# topologies is for unified test format.
# topology is for legacy tests.
@topologies = if topologies = spec['topology'] || spec['topologies']
topologies.map do |topology|
{
'replicaset' => :replica_set,
'single' => :single,
'sharded' => :sharded,
'sharded-replicaset' => :sharded,
'load-balanced' => :load_balanced,
}[topology].tap do |v|
unless v
raise "Unknown topology #{topology}"
end
end
end
else
nil
end
@server_parameters = spec['serverParameters']
@serverless = if serverless = spec['serverless']
case spec['serverless']
when 'require' then :require
when 'forbid' then :forbid
when 'allow' then :allow
else raise "Unknown serverless requirement: #{serverless}"
end
else
nil
end
@auth = spec['auth']
@csfle = !!spec['csfle'] if spec['csfle']
end
attr_reader :min_server_version
attr_reader :max_server_version
attr_reader :topologies
attr_reader :serverless
def short_min_server_version
if min_server_version
min_server_version.split('.')[0..1].join('.')
else
nil
end
end
def short_max_server_version
if max_server_version
max_server_version.split('.')[0..1].join('.')
else
nil
end
end
def satisfied?
cc = ClusterConfig.instance
ok = true
if min_server_version
ok &&= Gem::Version.new(cc.fcv_ish) >= Gem::Version.new(min_server_version)
end
if max_server_version
ok &&= Gem::Version.new(cc.server_version) <= Gem::Version.new(max_server_version)
end
if topologies
ok &&= topologies.include?(cc.topology)
end
if @server_parameters
@server_parameters.each do |k, required_v|
actual_v = cc.server_parameters[k]
if actual_v.nil? && !required_v.nil?
ok = false
elsif actual_v != required_v
if Numeric === actual_v && Numeric === required_v
if actual_v.to_f != required_v.to_f
ok = false
end
else
ok = false
end
end
end
end
if @serverless
if SpecConfig.instance.serverless?
ok = ok && [:allow, :require].include?(serverless)
else
ok = ok && [:allow, :forbid].include?(serverless)
end
end
if @auth == true
ok &&= SpecConfig.instance.auth?
elsif @auth == false
ok &&= !SpecConfig.instance.auth?
end
if @csfle
ok &&= !!(ENV['LIBMONGOCRYPT_PATH'] || ENV['FLE'])
ok &&= Gem::Version.new(cc.fcv_ish) >= Gem::Version.new('4.2.0')
end
ok
end
def description
versions = [min_server_version, max_server_version].compact
if versions.any?
versions = versions.join('-')
else
versions = nil
end
topologies = if self.topologies
self.topologies.map(&:to_s).join(',')
else
nil
end
[versions, topologies].compact.join('/')
end
end
end
end
|