From d6a33942fbece09a5916532ce2feb68135315310 Mon Sep 17 00:00:00 2001 From: gagik Date: Fri, 4 Apr 2025 12:33:34 +0200 Subject: [PATCH 1/7] chore(deps): add test for $lookup with field level encryption COMPASS-8816 --- .../service-provider-node-driver/package.json | 2 +- .../src/field-level-encryption.spec.ts | 93 ++++++++++++++++++- 2 files changed, 93 insertions(+), 2 deletions(-) diff --git a/packages/service-provider-node-driver/package.json b/packages/service-provider-node-driver/package.json index d40b92094f..e6be27669c 100644 --- a/packages/service-provider-node-driver/package.json +++ b/packages/service-provider-node-driver/package.json @@ -59,7 +59,7 @@ }, "optionalDependencies": { "kerberos": "2.1.0", - "mongodb-client-encryption": "^6.1.1" + "mongodb-client-encryption": "^6.3.0" }, "devDependencies": { "@mongodb-js/eslint-config-mongosh": "^1.0.0", diff --git a/packages/shell-api/src/field-level-encryption.spec.ts b/packages/shell-api/src/field-level-encryption.spec.ts index 9fab4b6246..0cf6b21cbc 100644 --- a/packages/shell-api/src/field-level-encryption.spec.ts +++ b/packages/shell-api/src/field-level-encryption.spec.ts @@ -960,7 +960,7 @@ srDVjIT3LsvTqw==`, return; } expect.fail('missed exception'); - break; + // eslint-disable-next-line no-fallthrough default: throw new Error(`unreachable ${kmsName}`); } @@ -1058,6 +1058,97 @@ srDVjIT3LsvTqw==`, expect(printedOutput).to.deep.equal([]); }); + it('allows $lookup with a collection with automatic encryption', async function () { + const keyMongo = new Mongo( + instanceState, + uri, + { + keyVaultNamespace: `${dbname}.__keyVault`, + kmsProviders: { local: { key: 'A'.repeat(128) } }, + }, + {}, + serviceProvider + ); + + await keyMongo.connect(); + instanceState.mongos.push(keyMongo); + + const keyVault = await keyMongo.getKeyVault(); + + const dataKey1 = await keyVault.createKey('local'); + const dataKey2 = await keyVault.createKey('local'); + + const schemaMap = { + [`${dbname}.coll1`]: { + bsonType: 'object', + properties: { + phoneNumber: { + encrypt: { + bsonType: 'string', + keyId: [dataKey1], + algorithm: 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic', + }, + }, + key: { + bsonType: 'string', + }, + }, + }, + [`${dbname}.coll2`]: { + bsonType: 'object', + properties: { + phoneNumber: { + encrypt: { + bsonType: 'string', + keyId: [dataKey2], + algorithm: 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic', + }, + }, + key: { + bsonType: 'string', + }, + }, + }, + }; + + const autoMongo = new Mongo(instanceState, uri, { + keyVaultNamespace: `${dbname}.__keyVault`, + kmsProviders: { local: { key: 'A'.repeat(128) } }, + schemaMap, + }); + + const coll1 = autoMongo.getDB(dbname).getCollection('coll1'); + await coll1.insertMany([ + { phoneNumber: '123-456-7890', key: 'foo' }, + { phoneNumber: '123-456-7891', key: 'bar' }, + ]); + + const coll2 = autoMongo.getDB(dbname).getCollection('coll2'); + await coll2.insertMany([ + { phoneNumber: '123-456-7892', key: 'baz' }, + { phoneNumber: '123-456-7893', key: 'foo' }, + ]); + const result = await ( + await coll1.aggregate([ + { + $lookup: { + from: 'coll2', + localField: 'key', + foreignField: 'key', + as: 'lookupMatch', + }, + }, + ]) + ) + .map(({ key, lookupMatch }) => ({ key, size: lookupMatch.length })) + .toArray(); + + expect(result).deep.equals([ + { key: 'foo', size: 1 }, + { key: 'bar', size: 0 }, + ]); + }); + it('prints a warning when creating the keyAltNames index fails', async function () { const mongo = new Mongo( instanceState, From be6bbb33341f725440e65742b106faa73ac7fc6e Mon Sep 17 00:00:00 2001 From: gagik Date: Fri, 12 Sep 2025 14:53:46 +0200 Subject: [PATCH 2/7] chore(e2e-tests): add queryable encryption suffix/prefix/substring tests MONGOSH-1351 --- packages/e2e-tests/test/e2e-fle.spec.ts | 167 ++++++++++++++++++++++++ 1 file changed, 167 insertions(+) diff --git a/packages/e2e-tests/test/e2e-fle.spec.ts b/packages/e2e-tests/test/e2e-fle.spec.ts index e022a587d2..beefceae08 100644 --- a/packages/e2e-tests/test/e2e-fle.spec.ts +++ b/packages/e2e-tests/test/e2e-fle.spec.ts @@ -914,6 +914,173 @@ describe('FLE tests', function () { }); }); + context('8.2+', function () { + skipIfServerVersion(testServer, '< 8.2'); + + context( + 'Queryable Encryption Prefix/Suffix/Substring Support', + function () { + // Substring prefix support is enterprise-only 8.2+ + skipIfCommunityServer(testServer); + + let shell: TestShell; + let uri: string; + + const testCollection = 'qeSubstringTest'; + + before(async function () { + shell = this.startTestShell({ + args: ['--nodb', `--cryptSharedLibPath=${cryptLibrary}`], + }); + uri = JSON.stringify(await testServer.connectionString()); + await shell.waitForPrompt(); + + // Shared setup for all substring search tests - create collection once + await shell.executeLine(`{ + opts = { + keyVaultNamespace: '${dbname}.__keyVault', + kmsProviders: { local: { key: 'A'.repeat(128) } }, + bypassQueryAnalysis: false + }; + + autoMongo = Mongo(${uri}, { ...opts }); + autoMongo.getDB('${dbname}').test.drop(); + + keyId = autoMongo.getKeyVault().createKey('local'); + + substringOptions = { + strMinQueryLength: 2, + strMaxQueryLength: 10, + strMaxLength: 60, + }; + + autoMongo.getClientEncryption().createEncryptedCollection('${dbname}', '${testCollection}', { + provider: 'local', + createCollectionOptions: { + encryptedFields: { + fields: [{ + keyId, + path: 'data', + bsonType: 'string', + queries: [{ + queryType: 'substringPreview', + ...substringOptions, + caseSensitive: false, + diacriticSensitive: false, + contention: 4 + }] + }] + } + } + }); + + coll = autoMongo.getDB('${dbname}').${testCollection}; + + // Setup explicit encryption client + explicitMongo = Mongo(${uri}, { ...opts, bypassQueryAnalysis: true }); + ce = explicitMongo.getClientEncryption(); + ecoll = explicitMongo.getDB('${dbname}').${testCollection}; + + explicitOpts = { + algorithm: 'TextPreview', + contentionFactor: 4, + textOptions: { caseSensitive: false, diacriticSensitive: false, substring: substringOptions } + }; + }`); + }); + + after(async function () { + await shell.executeLine(`${testCollection}.drop()`); + }); + + afterEach(async function () { + await shell.executeLine(`${testCollection}.deleteMany({})`); + }); + + it('allows queryable encryption with prefix searches', async function () { + // Insert test data for prefix searches + await shell.executeLine(`{ + coll.insertOne({ data: 'admin_user_123.txt' }); + coll.insertOne({ data: 'admin_super_456.pdf' }); + coll.insertOne({ data: 'user_regular_789.pdf' }); + coll.insertOne({ data: 'guest_access_000.txt' }); + + // Add explicit encryption data + ecoll.insertOne({ data: ce.encrypt(keyId, 'admin_explicit_test.pdf', explicitOpts) }); + }`); + const prefixResults = await shell.executeLine( + 'coll.find({$expr: { $and: [{$encStrContains: {substring: "admin_", input: "$data"}}] }}, { __safeContent__: 0 }).toArray()' + ); + expect(prefixResults).to.have.length(2); + expect(prefixResults).to.include('admin_user_123.txt'); + expect(prefixResults).to.include('admin_super_456.pdf'); + expect(prefixResults).to.include('admin_explicit_test.pdf'); + }); + + it('allows queryable encryption with suffix searches', async function () { + // Insert test data for suffix searches + await shell.executeLine(`{ + coll.insertOne({ data: 'admin_user_123.txt' }); + coll.insertOne({ data: 'admin_super_456.pdf' }); + coll.insertOne({ data: 'user_regular_789.pdf' }); + coll.insertOne({ data: 'guest_access_000.txt' }); + + // Add explicit encryption data + ecoll.insertOne({ data: ce.encrypt(keyId, 'admin_explicit_test.pdf', explicitOpts) }); + }`); + + const suffixResults = await shell.executeLine( + 'coll.find({$expr: { $and: [{$encStrContains: {substring: ".pdf", input: "$data"}}] }}, { __safeContent__: 0 }).toArray()' + ); + expect(suffixResults).to.have.length(3); + expect(suffixResults).to.include('admin_super_456.pdf'); + expect(suffixResults).to.include('user_regular_789.pdf'); + expect(suffixResults).to.include('admin_explicit_test.pdf'); + }); + + it('allows queryable encryption with substring searches', async function () { + // Insert test data for substring searches + // Insert test data for prefix searches + await shell.executeLine(`{ + coll.insertOne({ data: 'admin_user_123.txt' }); + coll.insertOne({ data: 'admin_super_456.pdf' }); + coll.insertOne({ data: 'user_regular_789.pdf' }); + coll.insertOne({ data: 'guest_access_000.txt' }); + + // Add explicit encryption data + ecoll.insertOne({ data: ce.encrypt(keyId, 'explicit_user', explicitOpts) }); + }`); + // Test substring search returning multiple documents + const substringResults = await shell.executeLine( + 'coll.find({$expr: { $and: [{$encStrContains: {substring: "user", input: "$data"}}] }}, { __safeContent__: 0 }).toArray()' + ); + expect(substringResults).to.have.length(2); + expect(substringResults).to.include('user_regular_789.pdf'); + expect(substringResults).to.include('admin_user_123.txt'); + + const testingSubstringResult = await shell.executeLine( + 'coll.find({$expr: { $and: [{$encStrContains: {substring: "user", input: "$data"}}] }}, { __safeContent__: 0 }).toArray()' + ); + expect(testingSubstringResult).to.have.length(3); + expect(testingSubstringResult).to.include('user_regular_789.pdf'); + expect(testingSubstringResult).to.include('admin_user_123.txt'); + expect(testingSubstringResult).to.include('explicit_user'); + + // Test explicit encryption substring search + const explicitSubstringResult = await shell.executeLine(` + ecoll.findOne({$expr: { $and: [{$encStrContains: {substring: + ce.encrypt(keyId, 'user', { ...explicitOpts, queryType: 'substringPreview' }), input: '$data'}}] }}, + { __safeContent__: 0 }) + `); + expect(explicitSubstringResult).to.have.length(3); + expect(explicitSubstringResult).to.include('user_regular_789.pdf'); + expect(explicitSubstringResult).to.include('admin_user_123.txt'); + expect(explicitSubstringResult).to.include('explicit_user'); + }); + } + ); + }); + context('pre-6.0', function () { skipIfServerVersion(testServer, '>= 6.0'); // FLE2 available on 6.0+ From 6a40bdc9dbcc84292eaf3d9742c60d4b1a34a43f Mon Sep 17 00:00:00 2001 From: gagik Date: Fri, 12 Sep 2025 15:05:14 +0200 Subject: [PATCH 3/7] chore: fixups --- packages/e2e-tests/test/e2e-fle.spec.ts | 39 ++++++++++++++++--------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/packages/e2e-tests/test/e2e-fle.spec.ts b/packages/e2e-tests/test/e2e-fle.spec.ts index beefceae08..79d475365e 100644 --- a/packages/e2e-tests/test/e2e-fle.spec.ts +++ b/packages/e2e-tests/test/e2e-fle.spec.ts @@ -990,11 +990,11 @@ describe('FLE tests', function () { }); after(async function () { - await shell.executeLine(`${testCollection}.drop()`); + await shell.executeLine(`ecoll.${testCollection}.drop()`); }); afterEach(async function () { - await shell.executeLine(`${testCollection}.deleteMany({})`); + await shell.executeLine(`ecoll.${testCollection}.deleteMany({})`); }); it('allows queryable encryption with prefix searches', async function () { @@ -1009,12 +1009,22 @@ describe('FLE tests', function () { ecoll.insertOne({ data: ce.encrypt(keyId, 'admin_explicit_test.pdf', explicitOpts) }); }`); const prefixResults = await shell.executeLine( - 'coll.find({$expr: { $and: [{$encStrContains: {substring: "admin_", input: "$data"}}] }}, { __safeContent__: 0 }).toArray()' + 'coll.find({$expr: { $and: [{$encStrStartsWith: {prefix: "admin_", input: "$data"}}] }}, { __safeContent__: 0 }).toArray()' ); - expect(prefixResults).to.have.length(2); + expect(prefixResults).to.have.length(3); expect(prefixResults).to.include('admin_user_123.txt'); expect(prefixResults).to.include('admin_super_456.pdf'); expect(prefixResults).to.include('admin_explicit_test.pdf'); + + const explicitPrefixResult = await shell.executeLine(` + ecoll.findOne({$expr: { $and: [{$encStrStartsWith: {prefix: + ce.encrypt(keyId, 'admin_', { ...explicitOpts, queryType: 'prefixPreview' }), input: '$data'}}] }}, + { __safeContent__: 0 }) + `); + expect(explicitPrefixResult).to.have.length(3); + expect(explicitPrefixResult).to.include('admin_user_123.txt'); + expect(explicitPrefixResult).to.include('admin_super_456.pdf'); + expect(explicitPrefixResult).to.include('admin_explicit_test.pdf'); }); it('allows queryable encryption with suffix searches', async function () { @@ -1030,12 +1040,22 @@ describe('FLE tests', function () { }`); const suffixResults = await shell.executeLine( - 'coll.find({$expr: { $and: [{$encStrContains: {substring: ".pdf", input: "$data"}}] }}, { __safeContent__: 0 }).toArray()' + 'coll.find({$expr: { $and: [{$encStrEndsWith: { suffix: ".pdf", input: "$data"}}] }}, { __safeContent__: 0 }).toArray()' ); expect(suffixResults).to.have.length(3); expect(suffixResults).to.include('admin_super_456.pdf'); expect(suffixResults).to.include('user_regular_789.pdf'); expect(suffixResults).to.include('admin_explicit_test.pdf'); + + const explicitSuffixResult = await shell.executeLine(` + ecoll.find({$expr: { $and: [{$encStrEndsWith: {suffix: + ce.encrypt(keyId, '.pdf', { ...explicitOpts, queryType: 'suffixPreview' }), input: '$data'}}] }}, + { __safeContent__: 0 }) + `); + expect(explicitSuffixResult).to.have.length(3); + expect(explicitSuffixResult).to.include('admin_super_456.pdf'); + expect(explicitSuffixResult).to.include('user_regular_789.pdf'); + expect(explicitSuffixResult).to.include('admin_explicit_test.pdf'); }); it('allows queryable encryption with substring searches', async function () { @@ -1050,13 +1070,6 @@ describe('FLE tests', function () { // Add explicit encryption data ecoll.insertOne({ data: ce.encrypt(keyId, 'explicit_user', explicitOpts) }); }`); - // Test substring search returning multiple documents - const substringResults = await shell.executeLine( - 'coll.find({$expr: { $and: [{$encStrContains: {substring: "user", input: "$data"}}] }}, { __safeContent__: 0 }).toArray()' - ); - expect(substringResults).to.have.length(2); - expect(substringResults).to.include('user_regular_789.pdf'); - expect(substringResults).to.include('admin_user_123.txt'); const testingSubstringResult = await shell.executeLine( 'coll.find({$expr: { $and: [{$encStrContains: {substring: "user", input: "$data"}}] }}, { __safeContent__: 0 }).toArray()' @@ -1068,7 +1081,7 @@ describe('FLE tests', function () { // Test explicit encryption substring search const explicitSubstringResult = await shell.executeLine(` - ecoll.findOne({$expr: { $and: [{$encStrContains: {substring: + ecoll.find({$expr: { $and: [{$encStrContains: {substring: ce.encrypt(keyId, 'user', { ...explicitOpts, queryType: 'substringPreview' }), input: '$data'}}] }}, { __safeContent__: 0 }) `); From 58e5e7781e6db6fe1b2fc3dd54f00789da2e6ebe Mon Sep 17 00:00:00 2001 From: gagik Date: Mon, 15 Sep 2025 13:08:59 +0200 Subject: [PATCH 4/7] chore: simplify test, use correct crypt_shared --- .../src/packaging/download-crypt-library.ts | 9 +++-- packages/e2e-tests/test/e2e-fle.spec.ts | 36 ++++--------------- 2 files changed, 12 insertions(+), 33 deletions(-) diff --git a/packages/build/src/packaging/download-crypt-library.ts b/packages/build/src/packaging/download-crypt-library.ts index 64a2451f8a..4b0242954c 100644 --- a/packages/build/src/packaging/download-crypt-library.ts +++ b/packages/build/src/packaging/download-crypt-library.ts @@ -35,10 +35,13 @@ export async function downloadCryptLibrary( // Download mongodb for latest server version, including rapid releases // (for the platforms that they exist for, i.e. for ppc64le/s390x only pick stable releases). let versionSpec = '8.0.12'; // TODO(MONGOSH-2192): Switch back to 'continuous' and deal with affected platform support. - if (/ppc64|s390x/.test(opts.arch || process.arch)) { + + // For 8.2.0-rc4, we use the equivalent crypt shared library version for testing. + if (process.env.MONGOSH_SERVER_TEST_VERSION === '8.2.0-rc4-enterprise') { + versionSpec = '8.2.0-rc4'; + } else if (/ppc64|s390x/.test(opts.arch || process.arch)) { versionSpec = '8.0.12'; - } - if ((opts.platform || process.platform) === 'darwin') { + } else if ((opts.platform || process.platform) === 'darwin') { versionSpec = '8.0.5'; // TBD(MONGOSH-2192,SERVER-101020): Figure out at what point we use a later version. } const { downloadedBinDir: libdir, version } = diff --git a/packages/e2e-tests/test/e2e-fle.spec.ts b/packages/e2e-tests/test/e2e-fle.spec.ts index 79d475365e..a497f3d327 100644 --- a/packages/e2e-tests/test/e2e-fle.spec.ts +++ b/packages/e2e-tests/test/e2e-fle.spec.ts @@ -997,7 +997,7 @@ describe('FLE tests', function () { await shell.executeLine(`ecoll.${testCollection}.deleteMany({})`); }); - it('allows queryable encryption with prefix searches', async function () { + it.skip('allows queryable encryption with prefix searches', async function () { // Insert test data for prefix searches await shell.executeLine(`{ coll.insertOne({ data: 'admin_user_123.txt' }); @@ -1017,17 +1017,15 @@ describe('FLE tests', function () { expect(prefixResults).to.include('admin_explicit_test.pdf'); const explicitPrefixResult = await shell.executeLine(` - ecoll.findOne({$expr: { $and: [{$encStrStartsWith: {prefix: - ce.encrypt(keyId, 'admin_', { ...explicitOpts, queryType: 'prefixPreview' }), input: '$data'}}] }}, + ecoll.find({$expr: { $and: [{$encStrStartsWith: {prefix: "admin_", input: "$data"}}] }}, { __safeContent__: 0 }) `); - expect(explicitPrefixResult).to.have.length(3); expect(explicitPrefixResult).to.include('admin_user_123.txt'); expect(explicitPrefixResult).to.include('admin_super_456.pdf'); expect(explicitPrefixResult).to.include('admin_explicit_test.pdf'); }); - it('allows queryable encryption with suffix searches', async function () { + it.skip('allows queryable encryption with suffix searches', async function () { // Insert test data for suffix searches await shell.executeLine(`{ coll.insertOne({ data: 'admin_user_123.txt' }); @@ -1039,20 +1037,9 @@ describe('FLE tests', function () { ecoll.insertOne({ data: ce.encrypt(keyId, 'admin_explicit_test.pdf', explicitOpts) }); }`); - const suffixResults = await shell.executeLine( - 'coll.find({$expr: { $and: [{$encStrEndsWith: { suffix: ".pdf", input: "$data"}}] }}, { __safeContent__: 0 }).toArray()' - ); - expect(suffixResults).to.have.length(3); - expect(suffixResults).to.include('admin_super_456.pdf'); - expect(suffixResults).to.include('user_regular_789.pdf'); - expect(suffixResults).to.include('admin_explicit_test.pdf'); - const explicitSuffixResult = await shell.executeLine(` - ecoll.find({$expr: { $and: [{$encStrEndsWith: {suffix: - ce.encrypt(keyId, '.pdf', { ...explicitOpts, queryType: 'suffixPreview' }), input: '$data'}}] }}, - { __safeContent__: 0 }) + ecoll.find({$expr: { $and: [{$encStrEndsWith: {suffix: ".pdf", input: "$data"}}] }}, { __safeContent__: 0 }).toArray() `); - expect(explicitSuffixResult).to.have.length(3); expect(explicitSuffixResult).to.include('admin_super_456.pdf'); expect(explicitSuffixResult).to.include('user_regular_789.pdf'); expect(explicitSuffixResult).to.include('admin_explicit_test.pdf'); @@ -1072,23 +1059,12 @@ describe('FLE tests', function () { }`); const testingSubstringResult = await shell.executeLine( - 'coll.find({$expr: { $and: [{$encStrContains: {substring: "user", input: "$data"}}] }}, { __safeContent__: 0 }).toArray()' + 'ecoll.find({$expr: { $and: [{$encStrContains: {substring: "user", input: "$data"}}] }}, { __safeContent__: 0 }).toArray()' ); - expect(testingSubstringResult).to.have.length(3); + expect(testingSubstringResult).to.include('user_regular_789.pdf'); expect(testingSubstringResult).to.include('admin_user_123.txt'); expect(testingSubstringResult).to.include('explicit_user'); - - // Test explicit encryption substring search - const explicitSubstringResult = await shell.executeLine(` - ecoll.find({$expr: { $and: [{$encStrContains: {substring: - ce.encrypt(keyId, 'user', { ...explicitOpts, queryType: 'substringPreview' }), input: '$data'}}] }}, - { __safeContent__: 0 }) - `); - expect(explicitSubstringResult).to.have.length(3); - expect(explicitSubstringResult).to.include('user_regular_789.pdf'); - expect(explicitSubstringResult).to.include('admin_user_123.txt'); - expect(explicitSubstringResult).to.include('explicit_user'); }); } ); From 8559064d230dcc237d22da760659f7830e2b6438 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Tue, 23 Sep 2025 19:22:25 +0200 Subject: [PATCH 5/7] fixups: get everything to work! :) --- .evergreen.yml | 12 +- .evergreen/constants.js | 4 +- .../src/packaging/download-crypt-library.ts | 28 +- packages/e2e-tests/test/e2e-fle.spec.ts | 394 ++++++++++++------ .../src/field-level-encryption.spec.ts | 91 ---- testing/integration-testing-hooks.ts | 17 +- 6 files changed, 309 insertions(+), 237 deletions(-) diff --git a/.evergreen.yml b/.evergreen.yml index b4116a8eac..14f80cddbb 100644 --- a/.evergreen.yml +++ b/.evergreen.yml @@ -10604,7 +10604,7 @@ buildvariants: tags: [] expansions: executable_os_id: darwin-arm64 - mongosh_server_test_version: "8.2.0-rc4" + mongosh_server_test_version: "8.2.0" node_js_version: "20.19.5" mongosh_skip_node_version_check: "" tasks: @@ -10637,7 +10637,7 @@ buildvariants: tags: [] expansions: executable_os_id: darwin-arm64 - mongosh_server_test_version: "8.2.0-rc4-enterprise" + mongosh_server_test_version: "8.2.0-enterprise" node_js_version: "20.19.5" mongosh_skip_node_version_check: "" tasks: @@ -11099,7 +11099,7 @@ buildvariants: tags: ["nightly-driver"] expansions: executable_os_id: darwin-arm64 - mongosh_server_test_version: "8.2.0-rc4" + mongosh_server_test_version: "8.2.0" node_js_version: "20.19.5" mongosh_skip_node_version_check: "" tasks: @@ -11132,7 +11132,7 @@ buildvariants: tags: ["nightly-driver"] expansions: executable_os_id: darwin-arm64 - mongosh_server_test_version: "8.2.0-rc4-enterprise" + mongosh_server_test_version: "8.2.0-enterprise" node_js_version: "20.19.5" mongosh_skip_node_version_check: "" tasks: @@ -11614,7 +11614,7 @@ buildvariants: tags: [] expansions: executable_os_id: win32 - mongosh_server_test_version: "8.2.0-rc4" + mongosh_server_test_version: "8.2.0" node_js_version: "20.19.5" mongosh_skip_node_version_check: "" tasks: @@ -11646,7 +11646,7 @@ buildvariants: tags: [] expansions: executable_os_id: win32 - mongosh_server_test_version: "8.2.0-rc4-enterprise" + mongosh_server_test_version: "8.2.0-enterprise" node_js_version: "20.19.5" mongosh_skip_node_version_check: "" tasks: diff --git a/.evergreen/constants.js b/.evergreen/constants.js index 407bbf1142..4ac09db8dc 100644 --- a/.evergreen/constants.js +++ b/.evergreen/constants.js @@ -37,8 +37,8 @@ exports.MONGODB_VERSIONS = [ { shortName: '70xe', versionSpec: '7.0.x-enterprise' }, { shortName: '80xc', versionSpec: '8.0.x' }, { shortName: '80xe', versionSpec: '8.0.x-enterprise' }, - { shortName: '82rc', versionSpec: '8.2.0-rc4' }, - { shortName: '82rce', versionSpec: '8.2.0-rc4-enterprise' }, + { shortName: '82rc', versionSpec: '8.2.0' }, + { shortName: '82rce', versionSpec: '8.2.0-enterprise' }, { shortName: 'latest', versionSpec: 'latest-alpha-enterprise' }, ]; diff --git a/packages/build/src/packaging/download-crypt-library.ts b/packages/build/src/packaging/download-crypt-library.ts index 4b0242954c..b081711310 100644 --- a/packages/build/src/packaging/download-crypt-library.ts +++ b/packages/build/src/packaging/download-crypt-library.ts @@ -7,7 +7,8 @@ import type { PackageVariant } from '../config'; import { getDistro, getArch } from '../config'; export async function downloadCryptLibrary( - variant: PackageVariant | 'host' + variant: PackageVariant | 'host', + versionSpec = '' ): Promise<{ cryptLibrary: string; version: string }> { let opts: DownloadOptions = {}; opts.arch = variant === 'host' ? undefined : getArch(variant); @@ -32,18 +33,19 @@ export async function downloadCryptLibrary( 'crypt-store', variant ); - // Download mongodb for latest server version, including rapid releases - // (for the platforms that they exist for, i.e. for ppc64le/s390x only pick stable releases). - let versionSpec = '8.0.12'; // TODO(MONGOSH-2192): Switch back to 'continuous' and deal with affected platform support. - // For 8.2.0-rc4, we use the equivalent crypt shared library version for testing. - if (process.env.MONGOSH_SERVER_TEST_VERSION === '8.2.0-rc4-enterprise') { - versionSpec = '8.2.0-rc4'; - } else if (/ppc64|s390x/.test(opts.arch || process.arch)) { - versionSpec = '8.0.12'; - } else if ((opts.platform || process.platform) === 'darwin') { - versionSpec = '8.0.5'; // TBD(MONGOSH-2192,SERVER-101020): Figure out at what point we use a later version. + if (!versionSpec) { + // Download mongodb for latest server version, including rapid releases + // (for the platforms that they exist for, i.e. for ppc64le/s390x only pick stable releases). + versionSpec = '8.0.12'; // TODO(MONGOSH-2192): Switch back to 'continuous' and deal with affected platform support. + + if (/ppc64|s390x/.test(opts.arch || process.arch)) { + versionSpec = '8.0.12'; + } else if ((opts.platform || process.platform) === 'darwin') { + versionSpec = '8.0.5'; // TBD(MONGOSH-2192,SERVER-101020): Figure out at what point we use a later version. + } } + const { downloadedBinDir: libdir, version } = await downloadMongoDbWithVersionInfo(cryptTmpTargetDir, versionSpec, opts); const cryptLibrary = path.join( @@ -54,7 +56,9 @@ export async function downloadCryptLibrary( ); // Make sure that the binary exists and is readable. await fs.access(cryptLibrary, fsConstants.R_OK); - console.info('mongosh: downloaded', cryptLibrary, 'version', version); + console.info( + `mongosh: downloaded ${cryptLibrary} version ${version} (requested: ${versionSpec})` + ); return { cryptLibrary, version }; } diff --git a/packages/e2e-tests/test/e2e-fle.spec.ts b/packages/e2e-tests/test/e2e-fle.spec.ts index a497f3d327..7f4d0b2988 100644 --- a/packages/e2e-tests/test/e2e-fle.spec.ts +++ b/packages/e2e-tests/test/e2e-fle.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; import { MongoClient } from 'mongodb'; -import type { TestShell } from './test-shell'; +import { TestShell } from './test-shell'; import { eventually } from '../../../testing/eventually'; import { startTestServer, @@ -8,6 +8,7 @@ import { skipIfServerVersion, skipIfCommunityServer, downloadCurrentCryptSharedLibrary, + sortObjectArray, } from '../../../testing/integration-testing-hooks'; import { makeFakeHTTPServer, fakeAWSHandlers } from '../../../testing/fake-kms'; import { once } from 'events'; @@ -25,6 +26,7 @@ describe('FLE tests', function () { let kmsServer: ReturnType; let dbname: string; let cryptLibrary: string; + let cryptLibrary82: string; before(async function () { if (process.platform === 'linux') { @@ -39,7 +41,11 @@ describe('FLE tests', function () { kmsServer = makeFakeHTTPServer(fakeAWSHandlers); kmsServer.listen(0); await once(kmsServer, 'listening'); - cryptLibrary = await downloadCurrentCryptSharedLibrary(); + // TODO(MONGOSH-2192): Go back to always testing with latest continuous version. + [cryptLibrary, cryptLibrary82] = await Promise.all([ + downloadCurrentCryptSharedLibrary(), + downloadCurrentCryptSharedLibrary('8.2.0'), + ]); }); after(function () { kmsServer?.close(); @@ -855,13 +861,6 @@ describe('FLE tests', function () { }); it('allows automatic range encryption', async function () { - // TODO(MONGOSH-1550): On s390x, we are using the 6.0.x RHEL7 shared library, - // which does not support QE rangePreview/range. That's just fine for preview, but - // we should switch to the 7.0.x RHEL8 shared library for Range GA. - if (process.arch === 's390x') { - return this.skip(); - } - const shell = this.startTestShell({ args: ['--nodb', `--cryptSharedLibPath=${cryptLibrary}`], }); @@ -917,157 +916,306 @@ describe('FLE tests', function () { context('8.2+', function () { skipIfServerVersion(testServer, '< 8.2'); - context( - 'Queryable Encryption Prefix/Suffix/Substring Support', - function () { - // Substring prefix support is enterprise-only 8.2+ - skipIfCommunityServer(testServer); + context('$lookup support', function () { + skipIfCommunityServer(testServer); - let shell: TestShell; - let uri: string; + it('allows $lookup with a collection with automatic encryption', async function () { + const shell = this.startTestShell({ + args: [ + `--cryptSharedLibPath=${cryptLibrary82}`, + await testServer.connectionString(), + ], + }); + await shell.executeLine(`{ + const keyMongo = Mongo( + db.getMongo(), + { + keyVaultNamespace: '${dbname}.__keyVault', + kmsProviders: { local: { key: 'A'.repeat(128) } }, + } + ); - const testCollection = 'qeSubstringTest'; + const keyVault = keyMongo.getKeyVault(); - before(async function () { - shell = this.startTestShell({ - args: ['--nodb', `--cryptSharedLibPath=${cryptLibrary}`], - }); - uri = JSON.stringify(await testServer.connectionString()); - await shell.waitForPrompt(); + const dataKey1 = keyVault.createKey('local'); + const dataKey2 = keyVault.createKey('local'); + + const schemaMap = { + ['${dbname}.coll1']: { + bsonType: 'object', + properties: { + phoneNumber: { + encrypt: { + bsonType: 'string', + keyId: [dataKey1], + algorithm: 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic', + }, + }, + key: { + bsonType: 'string', + }, + }, + }, + ['${dbname}.coll2']: { + bsonType: 'object', + properties: { + phoneNumber: { + encrypt: { + bsonType: 'string', + keyId: [dataKey2], + algorithm: 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic', + }, + }, + key: { + bsonType: 'string', + }, + }, + }, + }; + + autoMongo = new Mongo(db.getMongo(), { + keyVaultNamespace: '${dbname}.__keyVault', + kmsProviders: { local: { key: 'A'.repeat(128) } }, + schemaMap, + }); + + coll1 = autoMongo.getDB('${dbname}').getCollection('coll1'); + coll1.insertMany([ + { phoneNumber: '123-456-7890', key: 'foo' }, + { phoneNumber: '123-456-7891', key: 'bar' }, + ]); + + coll2 = autoMongo.getDB('${dbname}').getCollection('coll2'); + coll2.insertMany([ + { phoneNumber: '123-456-7892', key: 'baz' }, + { phoneNumber: '123-456-7893', key: 'foo' }, + ]); + }`); + const result = await shell.executeLineWithJSONResult(`( + coll1.aggregate([ + { + $lookup: { + from: 'coll2', + localField: 'key', + foreignField: 'key', + as: 'lookupMatch', + }, + }, + ]) + .map(({ key, lookupMatch }) => ({ key, size: lookupMatch.length })) + .toArray())`); + expect(result).to.deep.equal([ + { key: 'foo', size: 1 }, + { key: 'bar', size: 0 }, + ]); + }); + }); + + for (const mode of ['automatic', 'explicit'] as const) + context( + `Queryable Encryption Prefix/Suffix/Substring Support ${mode}`, + function () { + // Substring prefix support is enterprise-only 8.2+ + skipIfCommunityServer(testServer); + + let shell: TestShell; + + const testCollection = 'qeSubstringTest'; + + beforeEach(async function () { + shell = this.startTestShell({ + args: [ + `--cryptSharedLibPath=${cryptLibrary82}`, + await testServer.connectionString(), + ], + }); + await shell.waitForPrompt(); - // Shared setup for all substring search tests - create collection once - await shell.executeLine(`{ + // Shared setup for all substring search tests - create collection once + await shell.executeLine(`{ + mode = ${JSON.stringify(mode)}; opts = { keyVaultNamespace: '${dbname}.__keyVault', kmsProviders: { local: { key: 'A'.repeat(128) } }, - bypassQueryAnalysis: false }; - autoMongo = Mongo(${uri}, { ...opts }); - autoMongo.getDB('${dbname}').test.drop(); + // Setup explicit encryption client + explicitMongo = Mongo(db.getMongo(), { ...opts, bypassQueryAnalysis: true }); + if (mode === 'automatic') { + autoMongo = Mongo(db.getMongo(), { ...opts }); + coll = autoMongo.getDB('${dbname}').${testCollection}; + } - keyId = autoMongo.getKeyVault().createKey('local'); + keyId1 = explicitMongo.getKeyVault().createKey('local'); + keyId2 = explicitMongo.getKeyVault().createKey('local'); substringOptions = { strMinQueryLength: 2, strMaxQueryLength: 10, - strMaxLength: 60, }; - - autoMongo.getClientEncryption().createEncryptedCollection('${dbname}', '${testCollection}', { + encryptedFieldOptions = { + ...substringOptions, + caseSensitive: false, + diacriticSensitive: false, + contention: 4 + }; + + explicitMongo.getClientEncryption().createEncryptedCollection('${dbname}', '${testCollection}', { provider: 'local', createCollectionOptions: { encryptedFields: { fields: [{ - keyId, - path: 'data', + keyId: keyId1, + path: 'substringData', bsonType: 'string', queries: [{ queryType: 'substringPreview', - ...substringOptions, - caseSensitive: false, - diacriticSensitive: false, - contention: 4 + strMaxLength: 60, + ...encryptedFieldOptions + }] + }, { + keyId: keyId2, + path: 'prefixSuffixData', + bsonType: 'string', + queries: [{ + queryType: 'prefixPreview', + ...encryptedFieldOptions + }, { + queryType: 'suffixPreview', + ...encryptedFieldOptions }] }] } } }); - coll = autoMongo.getDB('${dbname}').${testCollection}; - - // Setup explicit encryption client - explicitMongo = Mongo(${uri}, { ...opts, bypassQueryAnalysis: true }); ce = explicitMongo.getClientEncryption(); ecoll = explicitMongo.getDB('${dbname}').${testCollection}; - - explicitOpts = { + + explicitOpts = (details) => ({ algorithm: 'TextPreview', contentionFactor: 4, - textOptions: { caseSensitive: false, diacriticSensitive: false, substring: substringOptions } + textOptions: { caseSensitive: false, diacriticSensitive: false, ...details } + }); + substringOpts = explicitOpts({ substring: { ...substringOptions, strMaxLength: 60 } }); + prefixSuffixOpts = explicitOpts({ prefix: substringOptions, suffix: substringOptions }); + methods = { + substring: { queryType: 'substringPreview', keyId: keyId1, options: substringOpts }, + prefix: { queryType: 'prefixPreview', keyId: keyId2, options: prefixSuffixOpts }, + suffix: { queryType: 'suffixPreview', keyId: keyId2, options: prefixSuffixOpts } + } + explicitEncrypt = (method, data) => { + return ce.encrypt(methods[method].keyId, data, { + ...methods[method].options, + queryType: methods[method].queryType + }); }; }`); - }); - - after(async function () { - await shell.executeLine(`ecoll.${testCollection}.drop()`); - }); + }); - afterEach(async function () { - await shell.executeLine(`ecoll.${testCollection}.deleteMany({})`); - }); + afterEach(function () { + shell.kill(); + }); - it.skip('allows queryable encryption with prefix searches', async function () { - // Insert test data for prefix searches - await shell.executeLine(`{ - coll.insertOne({ data: 'admin_user_123.txt' }); - coll.insertOne({ data: 'admin_super_456.pdf' }); - coll.insertOne({ data: 'user_regular_789.pdf' }); - coll.insertOne({ data: 'guest_access_000.txt' }); - - // Add explicit encryption data - ecoll.insertOne({ data: ce.encrypt(keyId, 'admin_explicit_test.pdf', explicitOpts) }); + it('allows queryable encryption with prefix searches', async function () { + // Insert test data for prefix searches + await shell.executeLine(`{ + for (const data of [ + 'admin_user_123.txt', + 'admin_super_456.pdf', + 'user_regular_789.pdf', + 'guest_access_000.txt', + 'just_user.txt', + 'admin_explicit_test.pdf' + ]) { + if (mode === 'automatic') { + coll.insertOne({ + substringData: data, + prefixSuffixData: data + }); + } else { + ecoll.insertOne({ + substringData: ce.encrypt(keyId1, data, substringOpts), + prefixSuffixData: ce.encrypt(keyId2, data, prefixSuffixOpts) + }); + } + } }`); - const prefixResults = await shell.executeLine( - 'coll.find({$expr: { $and: [{$encStrStartsWith: {prefix: "admin_", input: "$data"}}] }}, { __safeContent__: 0 }).toArray()' - ); - expect(prefixResults).to.have.length(3); - expect(prefixResults).to.include('admin_user_123.txt'); - expect(prefixResults).to.include('admin_super_456.pdf'); - expect(prefixResults).to.include('admin_explicit_test.pdf'); - - const explicitPrefixResult = await shell.executeLine(` - ecoll.find({$expr: { $and: [{$encStrStartsWith: {prefix: "admin_", input: "$data"}}] }}, - { __safeContent__: 0 }) - `); - expect(explicitPrefixResult).to.include('admin_user_123.txt'); - expect(explicitPrefixResult).to.include('admin_super_456.pdf'); - expect(explicitPrefixResult).to.include('admin_explicit_test.pdf'); - }); - - it.skip('allows queryable encryption with suffix searches', async function () { - // Insert test data for suffix searches - await shell.executeLine(`{ - coll.insertOne({ data: 'admin_user_123.txt' }); - coll.insertOne({ data: 'admin_super_456.pdf' }); - coll.insertOne({ data: 'user_regular_789.pdf' }); - coll.insertOne({ data: 'guest_access_000.txt' }); - - // Add explicit encryption data - ecoll.insertOne({ data: ce.encrypt(keyId, 'admin_explicit_test.pdf', explicitOpts) }); - }`); - - const explicitSuffixResult = await shell.executeLine(` - ecoll.find({$expr: { $and: [{$encStrEndsWith: {suffix: ".pdf", input: "$data"}}] }}, { __safeContent__: 0 }).toArray() - `); - expect(explicitSuffixResult).to.include('admin_super_456.pdf'); - expect(explicitSuffixResult).to.include('user_regular_789.pdf'); - expect(explicitSuffixResult).to.include('admin_explicit_test.pdf'); - }); - - it('allows queryable encryption with substring searches', async function () { - // Insert test data for substring searches - // Insert test data for prefix searches - await shell.executeLine(`{ - coll.insertOne({ data: 'admin_user_123.txt' }); - coll.insertOne({ data: 'admin_super_456.pdf' }); - coll.insertOne({ data: 'user_regular_789.pdf' }); - coll.insertOne({ data: 'guest_access_000.txt' }); - - // Add explicit encryption data - ecoll.insertOne({ data: ce.encrypt(keyId, 'explicit_user', explicitOpts) }); - }`); - - const testingSubstringResult = await shell.executeLine( - 'ecoll.find({$expr: { $and: [{$encStrContains: {substring: "user", input: "$data"}}] }}, { __safeContent__: 0 }).toArray()' - ); - - expect(testingSubstringResult).to.include('user_regular_789.pdf'); - expect(testingSubstringResult).to.include('admin_user_123.txt'); - expect(testingSubstringResult).to.include('explicit_user'); - }); - } - ); + const automaticEncrypt = (_method: string, data: string) => + JSON.stringify(data); + const explicitEncrypt = (method: string, data: string) => + `explicitEncrypt('${method}', ${JSON.stringify(data)})`; + const s = sortObjectArray; + + for (const [coll, maybeEncrypt] of mode === 'explicit' + ? ([['ecoll', explicitEncrypt]] as const) + : ([ + ['coll', automaticEncrypt], + ['ecoll', explicitEncrypt], + ] as const)) { + const prefixResults = await shell.executeLineWithJSONResult( + `${coll}.find({$expr: { $and: [{$encStrStartsWith: {prefix: ${maybeEncrypt( + 'prefix', + 'admin_' + )}, input: "$prefixSuffixData"}}] }}, { data: '$prefixSuffixData', _id: 0 }).toArray()` + ); + expect(s(prefixResults)).to.deep.equal( + s([ + { + data: 'admin_user_123.txt', + }, + { + data: 'admin_super_456.pdf', + }, + { + data: 'admin_explicit_test.pdf', + }, + ]) + ); + + const suffixResults = await shell.executeLineWithJSONResult(` + ${coll}.find({$expr: { $and: [{$encStrEndsWith: {suffix: ${maybeEncrypt( + 'suffix', + '.pdf' + )}, input: "$prefixSuffixData"}}] }}, { data: '$prefixSuffixData', _id: 0 }).toArray() + `); + expect(s(suffixResults)).to.deep.equal( + s([ + { + data: 'admin_super_456.pdf', + }, + { + data: 'user_regular_789.pdf', + }, + { + data: 'admin_explicit_test.pdf', + }, + ]) + ); + + const substringResults = await shell.executeLineWithJSONResult(` + ${coll}.find({$expr: { $and: [{$encStrContains: {substring: ${maybeEncrypt( + 'substring', + 'user' + )}, input: "$substringData"}}] }}, { data: '$substringData', _id: 0 }).toArray() + `); + expect(s(substringResults)).to.deep.equal( + s([ + { + data: 'user_regular_789.pdf', + }, + { + data: 'admin_user_123.txt', + }, + { + data: 'just_user.txt', + }, + ]) + ); + } + }); + } + ); }); context('pre-6.0', function () { diff --git a/packages/shell-api/src/field-level-encryption.spec.ts b/packages/shell-api/src/field-level-encryption.spec.ts index eced3b59d1..06564248ba 100644 --- a/packages/shell-api/src/field-level-encryption.spec.ts +++ b/packages/shell-api/src/field-level-encryption.spec.ts @@ -1060,97 +1060,6 @@ srDVjIT3LsvTqw==`, expect(printedOutput).to.deep.equal([]); }); - it('allows $lookup with a collection with automatic encryption', async function () { - const keyMongo = new Mongo( - instanceState, - uri, - { - keyVaultNamespace: `${dbname}.__keyVault`, - kmsProviders: { local: { key: 'A'.repeat(128) } }, - }, - {}, - serviceProvider - ); - - await keyMongo.connect(); - instanceState.mongos.push(keyMongo); - - const keyVault = await keyMongo.getKeyVault(); - - const dataKey1 = await keyVault.createKey('local'); - const dataKey2 = await keyVault.createKey('local'); - - const schemaMap = { - [`${dbname}.coll1`]: { - bsonType: 'object', - properties: { - phoneNumber: { - encrypt: { - bsonType: 'string', - keyId: [dataKey1], - algorithm: 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic', - }, - }, - key: { - bsonType: 'string', - }, - }, - }, - [`${dbname}.coll2`]: { - bsonType: 'object', - properties: { - phoneNumber: { - encrypt: { - bsonType: 'string', - keyId: [dataKey2], - algorithm: 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic', - }, - }, - key: { - bsonType: 'string', - }, - }, - }, - }; - - const autoMongo = new Mongo(instanceState, uri, { - keyVaultNamespace: `${dbname}.__keyVault`, - kmsProviders: { local: { key: 'A'.repeat(128) } }, - schemaMap, - }); - - const coll1 = autoMongo.getDB(dbname).getCollection('coll1'); - await coll1.insertMany([ - { phoneNumber: '123-456-7890', key: 'foo' }, - { phoneNumber: '123-456-7891', key: 'bar' }, - ]); - - const coll2 = autoMongo.getDB(dbname).getCollection('coll2'); - await coll2.insertMany([ - { phoneNumber: '123-456-7892', key: 'baz' }, - { phoneNumber: '123-456-7893', key: 'foo' }, - ]); - const result = await ( - await coll1.aggregate([ - { - $lookup: { - from: 'coll2', - localField: 'key', - foreignField: 'key', - as: 'lookupMatch', - }, - }, - ]) - ) - .map(({ key, lookupMatch }) => ({ key, size: lookupMatch.length })) - .toArray(); - - expect(result).deep.equals([ - { key: 'foo', size: 1 }, - { key: 'bar', size: 0 }, - ]); - }); - it('prints a warning when creating the keyAltNames index fails', async function () { const mongo = new Mongo( instanceState, diff --git a/testing/integration-testing-hooks.ts b/testing/integration-testing-hooks.ts index c2101fd25a..578f70a871 100644 --- a/testing/integration-testing-hooks.ts +++ b/testing/integration-testing-hooks.ts @@ -174,11 +174,11 @@ async function getInstalledMongodVersion(): Promise { return version; } -export async function downloadCurrentCryptSharedLibrary(): Promise { +export async function downloadCurrentCryptSharedLibrary(versionSpec?: string): Promise { if (process.platform === 'linux') { - return (await downloadCryptLibrary(`linux-${process.arch.replace('ppc64', 'ppc64le')}` as any)).cryptLibrary; + return (await downloadCryptLibrary(`linux-${process.arch.replace('ppc64', 'ppc64le')}` as any, versionSpec)).cryptLibrary; } - return (await downloadCryptLibrary('host')).cryptLibrary; + return (await downloadCryptLibrary('host', versionSpec)).cryptLibrary; } /** @@ -259,6 +259,7 @@ export function startTestCluster(id: string, ...argLists: Partial(arr: T): T { + return arr.sort((a, b) => { + const aStr = JSON.stringify(a); + const bStr = JSON.stringify(b); + if (aStr < bStr) return -1; + if (aStr > bStr) return 1; + return 0; + }); +} From 4827ce03b601eee49237a3cf9195318a7f5ea673 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Wed, 24 Sep 2025 11:43:57 +0200 Subject: [PATCH 6/7] fixup: review comments --- .evergreen.yml | 280 +++++++++--------- .evergreen/constants.js | 4 +- .../src/field-level-encryption.spec.ts | 2 +- testing/integration-testing-hooks.ts | 1 - 4 files changed, 143 insertions(+), 144 deletions(-) diff --git a/.evergreen.yml b/.evergreen.yml index 14f80cddbb..4cd885d65d 100644 --- a/.evergreen.yml +++ b/.evergreen.yml @@ -983,8 +983,8 @@ functions: params: aws_key: ${aws_key} aws_secret: ${aws_secret} - local_file: src/nyc-output-tests_darwin-m82rc_n20-cli_repl.tgz - remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_darwin-m82rc_n20-cli_repl.tgz + local_file: src/nyc-output-tests_darwin-m82xc_n20-cli_repl.tgz + remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_darwin-m82xc_n20-cli_repl.tgz bucket: mciuploads - command: shell.exec params: @@ -992,13 +992,13 @@ functions: shell: bash script: | set -e - tar xvzf nyc-output-tests_darwin-m82rc_n20-cli_repl.tgz + tar xvzf nyc-output-tests_darwin-m82xc_n20-cli_repl.tgz - command: s3.get params: aws_key: ${aws_key} aws_secret: ${aws_secret} - local_file: src/nyc-output-tests_darwin-m82rc_n20-e2e_tests.tgz - remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_darwin-m82rc_n20-e2e_tests.tgz + local_file: src/nyc-output-tests_darwin-m82xc_n20-e2e_tests.tgz + remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_darwin-m82xc_n20-e2e_tests.tgz bucket: mciuploads - command: shell.exec params: @@ -1006,13 +1006,13 @@ functions: shell: bash script: | set -e - tar xvzf nyc-output-tests_darwin-m82rc_n20-e2e_tests.tgz + tar xvzf nyc-output-tests_darwin-m82xc_n20-e2e_tests.tgz - command: s3.get params: aws_key: ${aws_key} aws_secret: ${aws_secret} - local_file: src/nyc-output-tests_darwin-m82rc_n20-node_runtime_worker_thread.tgz - remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_darwin-m82rc_n20-node_runtime_worker_thread.tgz + local_file: src/nyc-output-tests_darwin-m82xc_n20-node_runtime_worker_thread.tgz + remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_darwin-m82xc_n20-node_runtime_worker_thread.tgz bucket: mciuploads - command: shell.exec params: @@ -1020,13 +1020,13 @@ functions: shell: bash script: | set -e - tar xvzf nyc-output-tests_darwin-m82rc_n20-node_runtime_worker_thread.tgz + tar xvzf nyc-output-tests_darwin-m82xc_n20-node_runtime_worker_thread.tgz - command: s3.get params: aws_key: ${aws_key} aws_secret: ${aws_secret} - local_file: src/nyc-output-tests_darwin-m82rc_n20-service_provider_node_driver.tgz - remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_darwin-m82rc_n20-service_provider_node_driver.tgz + local_file: src/nyc-output-tests_darwin-m82xc_n20-service_provider_node_driver.tgz + remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_darwin-m82xc_n20-service_provider_node_driver.tgz bucket: mciuploads - command: shell.exec params: @@ -1034,13 +1034,13 @@ functions: shell: bash script: | set -e - tar xvzf nyc-output-tests_darwin-m82rc_n20-service_provider_node_driver.tgz + tar xvzf nyc-output-tests_darwin-m82xc_n20-service_provider_node_driver.tgz - command: s3.get params: aws_key: ${aws_key} aws_secret: ${aws_secret} - local_file: src/nyc-output-tests_darwin-m82rc_n20-shell_api.tgz - remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_darwin-m82rc_n20-shell_api.tgz + local_file: src/nyc-output-tests_darwin-m82xc_n20-shell_api.tgz + remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_darwin-m82xc_n20-shell_api.tgz bucket: mciuploads - command: shell.exec params: @@ -1048,13 +1048,13 @@ functions: shell: bash script: | set -e - tar xvzf nyc-output-tests_darwin-m82rc_n20-shell_api.tgz + tar xvzf nyc-output-tests_darwin-m82xc_n20-shell_api.tgz - command: s3.get params: aws_key: ${aws_key} aws_secret: ${aws_secret} - local_file: src/nyc-output-tests_darwin-m82rce_n20-cli_repl.tgz - remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_darwin-m82rce_n20-cli_repl.tgz + local_file: src/nyc-output-tests_darwin-m82xe_n20-cli_repl.tgz + remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_darwin-m82xe_n20-cli_repl.tgz bucket: mciuploads - command: shell.exec params: @@ -1062,13 +1062,13 @@ functions: shell: bash script: | set -e - tar xvzf nyc-output-tests_darwin-m82rce_n20-cli_repl.tgz + tar xvzf nyc-output-tests_darwin-m82xe_n20-cli_repl.tgz - command: s3.get params: aws_key: ${aws_key} aws_secret: ${aws_secret} - local_file: src/nyc-output-tests_darwin-m82rce_n20-e2e_tests.tgz - remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_darwin-m82rce_n20-e2e_tests.tgz + local_file: src/nyc-output-tests_darwin-m82xe_n20-e2e_tests.tgz + remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_darwin-m82xe_n20-e2e_tests.tgz bucket: mciuploads - command: shell.exec params: @@ -1076,13 +1076,13 @@ functions: shell: bash script: | set -e - tar xvzf nyc-output-tests_darwin-m82rce_n20-e2e_tests.tgz + tar xvzf nyc-output-tests_darwin-m82xe_n20-e2e_tests.tgz - command: s3.get params: aws_key: ${aws_key} aws_secret: ${aws_secret} - local_file: src/nyc-output-tests_darwin-m82rce_n20-node_runtime_worker_thread.tgz - remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_darwin-m82rce_n20-node_runtime_worker_thread.tgz + local_file: src/nyc-output-tests_darwin-m82xe_n20-node_runtime_worker_thread.tgz + remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_darwin-m82xe_n20-node_runtime_worker_thread.tgz bucket: mciuploads - command: shell.exec params: @@ -1090,13 +1090,13 @@ functions: shell: bash script: | set -e - tar xvzf nyc-output-tests_darwin-m82rce_n20-node_runtime_worker_thread.tgz + tar xvzf nyc-output-tests_darwin-m82xe_n20-node_runtime_worker_thread.tgz - command: s3.get params: aws_key: ${aws_key} aws_secret: ${aws_secret} - local_file: src/nyc-output-tests_darwin-m82rce_n20-service_provider_node_driver.tgz - remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_darwin-m82rce_n20-service_provider_node_driver.tgz + local_file: src/nyc-output-tests_darwin-m82xe_n20-service_provider_node_driver.tgz + remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_darwin-m82xe_n20-service_provider_node_driver.tgz bucket: mciuploads - command: shell.exec params: @@ -1104,13 +1104,13 @@ functions: shell: bash script: | set -e - tar xvzf nyc-output-tests_darwin-m82rce_n20-service_provider_node_driver.tgz + tar xvzf nyc-output-tests_darwin-m82xe_n20-service_provider_node_driver.tgz - command: s3.get params: aws_key: ${aws_key} aws_secret: ${aws_secret} - local_file: src/nyc-output-tests_darwin-m82rce_n20-shell_api.tgz - remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_darwin-m82rce_n20-shell_api.tgz + local_file: src/nyc-output-tests_darwin-m82xe_n20-shell_api.tgz + remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_darwin-m82xe_n20-shell_api.tgz bucket: mciuploads - command: shell.exec params: @@ -1118,7 +1118,7 @@ functions: shell: bash script: | set -e - tar xvzf nyc-output-tests_darwin-m82rce_n20-shell_api.tgz + tar xvzf nyc-output-tests_darwin-m82xe_n20-shell_api.tgz - command: s3.get params: aws_key: ${aws_key} @@ -2439,8 +2439,8 @@ functions: params: aws_key: ${aws_key} aws_secret: ${aws_secret} - local_file: src/nyc-output-tests_linux-m82rc_n20-cli_repl.tgz - remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_linux-m82rc_n20-cli_repl.tgz + local_file: src/nyc-output-tests_linux-m82xc_n20-cli_repl.tgz + remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_linux-m82xc_n20-cli_repl.tgz bucket: mciuploads - command: shell.exec params: @@ -2448,13 +2448,13 @@ functions: shell: bash script: | set -e - tar xvzf nyc-output-tests_linux-m82rc_n20-cli_repl.tgz + tar xvzf nyc-output-tests_linux-m82xc_n20-cli_repl.tgz - command: s3.get params: aws_key: ${aws_key} aws_secret: ${aws_secret} - local_file: src/nyc-output-tests_linux-m82rc_n20-e2e_tests.tgz - remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_linux-m82rc_n20-e2e_tests.tgz + local_file: src/nyc-output-tests_linux-m82xc_n20-e2e_tests.tgz + remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_linux-m82xc_n20-e2e_tests.tgz bucket: mciuploads - command: shell.exec params: @@ -2462,13 +2462,13 @@ functions: shell: bash script: | set -e - tar xvzf nyc-output-tests_linux-m82rc_n20-e2e_tests.tgz + tar xvzf nyc-output-tests_linux-m82xc_n20-e2e_tests.tgz - command: s3.get params: aws_key: ${aws_key} aws_secret: ${aws_secret} - local_file: src/nyc-output-tests_linux-m82rc_n20-java_shell.tgz - remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_linux-m82rc_n20-java_shell.tgz + local_file: src/nyc-output-tests_linux-m82xc_n20-java_shell.tgz + remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_linux-m82xc_n20-java_shell.tgz bucket: mciuploads - command: shell.exec params: @@ -2476,13 +2476,13 @@ functions: shell: bash script: | set -e - tar xvzf nyc-output-tests_linux-m82rc_n20-java_shell.tgz + tar xvzf nyc-output-tests_linux-m82xc_n20-java_shell.tgz - command: s3.get params: aws_key: ${aws_key} aws_secret: ${aws_secret} - local_file: src/nyc-output-tests_linux-m82rc_n20-node_runtime_worker_thread.tgz - remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_linux-m82rc_n20-node_runtime_worker_thread.tgz + local_file: src/nyc-output-tests_linux-m82xc_n20-node_runtime_worker_thread.tgz + remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_linux-m82xc_n20-node_runtime_worker_thread.tgz bucket: mciuploads - command: shell.exec params: @@ -2490,13 +2490,13 @@ functions: shell: bash script: | set -e - tar xvzf nyc-output-tests_linux-m82rc_n20-node_runtime_worker_thread.tgz + tar xvzf nyc-output-tests_linux-m82xc_n20-node_runtime_worker_thread.tgz - command: s3.get params: aws_key: ${aws_key} aws_secret: ${aws_secret} - local_file: src/nyc-output-tests_linux-m82rc_n20-service_provider_node_driver.tgz - remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_linux-m82rc_n20-service_provider_node_driver.tgz + local_file: src/nyc-output-tests_linux-m82xc_n20-service_provider_node_driver.tgz + remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_linux-m82xc_n20-service_provider_node_driver.tgz bucket: mciuploads - command: shell.exec params: @@ -2504,13 +2504,13 @@ functions: shell: bash script: | set -e - tar xvzf nyc-output-tests_linux-m82rc_n20-service_provider_node_driver.tgz + tar xvzf nyc-output-tests_linux-m82xc_n20-service_provider_node_driver.tgz - command: s3.get params: aws_key: ${aws_key} aws_secret: ${aws_secret} - local_file: src/nyc-output-tests_linux-m82rc_n20-shell_api.tgz - remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_linux-m82rc_n20-shell_api.tgz + local_file: src/nyc-output-tests_linux-m82xc_n20-shell_api.tgz + remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_linux-m82xc_n20-shell_api.tgz bucket: mciuploads - command: shell.exec params: @@ -2518,13 +2518,13 @@ functions: shell: bash script: | set -e - tar xvzf nyc-output-tests_linux-m82rc_n20-shell_api.tgz + tar xvzf nyc-output-tests_linux-m82xc_n20-shell_api.tgz - command: s3.get params: aws_key: ${aws_key} aws_secret: ${aws_secret} - local_file: src/nyc-output-tests_linux-m82rce_n20-cli_repl.tgz - remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_linux-m82rce_n20-cli_repl.tgz + local_file: src/nyc-output-tests_linux-m82xe_n20-cli_repl.tgz + remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_linux-m82xe_n20-cli_repl.tgz bucket: mciuploads - command: shell.exec params: @@ -2532,13 +2532,13 @@ functions: shell: bash script: | set -e - tar xvzf nyc-output-tests_linux-m82rce_n20-cli_repl.tgz + tar xvzf nyc-output-tests_linux-m82xe_n20-cli_repl.tgz - command: s3.get params: aws_key: ${aws_key} aws_secret: ${aws_secret} - local_file: src/nyc-output-tests_linux-m82rce_n20-e2e_tests.tgz - remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_linux-m82rce_n20-e2e_tests.tgz + local_file: src/nyc-output-tests_linux-m82xe_n20-e2e_tests.tgz + remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_linux-m82xe_n20-e2e_tests.tgz bucket: mciuploads - command: shell.exec params: @@ -2546,13 +2546,13 @@ functions: shell: bash script: | set -e - tar xvzf nyc-output-tests_linux-m82rce_n20-e2e_tests.tgz + tar xvzf nyc-output-tests_linux-m82xe_n20-e2e_tests.tgz - command: s3.get params: aws_key: ${aws_key} aws_secret: ${aws_secret} - local_file: src/nyc-output-tests_linux-m82rce_n20-java_shell.tgz - remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_linux-m82rce_n20-java_shell.tgz + local_file: src/nyc-output-tests_linux-m82xe_n20-java_shell.tgz + remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_linux-m82xe_n20-java_shell.tgz bucket: mciuploads - command: shell.exec params: @@ -2560,13 +2560,13 @@ functions: shell: bash script: | set -e - tar xvzf nyc-output-tests_linux-m82rce_n20-java_shell.tgz + tar xvzf nyc-output-tests_linux-m82xe_n20-java_shell.tgz - command: s3.get params: aws_key: ${aws_key} aws_secret: ${aws_secret} - local_file: src/nyc-output-tests_linux-m82rce_n20-node_runtime_worker_thread.tgz - remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_linux-m82rce_n20-node_runtime_worker_thread.tgz + local_file: src/nyc-output-tests_linux-m82xe_n20-node_runtime_worker_thread.tgz + remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_linux-m82xe_n20-node_runtime_worker_thread.tgz bucket: mciuploads - command: shell.exec params: @@ -2574,13 +2574,13 @@ functions: shell: bash script: | set -e - tar xvzf nyc-output-tests_linux-m82rce_n20-node_runtime_worker_thread.tgz + tar xvzf nyc-output-tests_linux-m82xe_n20-node_runtime_worker_thread.tgz - command: s3.get params: aws_key: ${aws_key} aws_secret: ${aws_secret} - local_file: src/nyc-output-tests_linux-m82rce_n20-service_provider_node_driver.tgz - remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_linux-m82rce_n20-service_provider_node_driver.tgz + local_file: src/nyc-output-tests_linux-m82xe_n20-service_provider_node_driver.tgz + remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_linux-m82xe_n20-service_provider_node_driver.tgz bucket: mciuploads - command: shell.exec params: @@ -2588,13 +2588,13 @@ functions: shell: bash script: | set -e - tar xvzf nyc-output-tests_linux-m82rce_n20-service_provider_node_driver.tgz + tar xvzf nyc-output-tests_linux-m82xe_n20-service_provider_node_driver.tgz - command: s3.get params: aws_key: ${aws_key} aws_secret: ${aws_secret} - local_file: src/nyc-output-tests_linux-m82rce_n20-shell_api.tgz - remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_linux-m82rce_n20-shell_api.tgz + local_file: src/nyc-output-tests_linux-m82xe_n20-shell_api.tgz + remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_linux-m82xe_n20-shell_api.tgz bucket: mciuploads - command: shell.exec params: @@ -2602,7 +2602,7 @@ functions: shell: bash script: | set -e - tar xvzf nyc-output-tests_linux-m82rce_n20-shell_api.tgz + tar xvzf nyc-output-tests_linux-m82xe_n20-shell_api.tgz - command: s3.get params: aws_key: ${aws_key} @@ -3839,8 +3839,8 @@ functions: params: aws_key: ${aws_key} aws_secret: ${aws_secret} - local_file: src/nyc-output-tests_win32-m82rc_n20-cli_repl.tgz - remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_win32-m82rc_n20-cli_repl.tgz + local_file: src/nyc-output-tests_win32-m82xc_n20-cli_repl.tgz + remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_win32-m82xc_n20-cli_repl.tgz bucket: mciuploads - command: shell.exec params: @@ -3848,13 +3848,13 @@ functions: shell: bash script: | set -e - tar xvzf nyc-output-tests_win32-m82rc_n20-cli_repl.tgz + tar xvzf nyc-output-tests_win32-m82xc_n20-cli_repl.tgz - command: s3.get params: aws_key: ${aws_key} aws_secret: ${aws_secret} - local_file: src/nyc-output-tests_win32-m82rc_n20-e2e_tests.tgz - remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_win32-m82rc_n20-e2e_tests.tgz + local_file: src/nyc-output-tests_win32-m82xc_n20-e2e_tests.tgz + remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_win32-m82xc_n20-e2e_tests.tgz bucket: mciuploads - command: shell.exec params: @@ -3862,13 +3862,13 @@ functions: shell: bash script: | set -e - tar xvzf nyc-output-tests_win32-m82rc_n20-e2e_tests.tgz + tar xvzf nyc-output-tests_win32-m82xc_n20-e2e_tests.tgz - command: s3.get params: aws_key: ${aws_key} aws_secret: ${aws_secret} - local_file: src/nyc-output-tests_win32-m82rc_n20-node_runtime_worker_thread.tgz - remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_win32-m82rc_n20-node_runtime_worker_thread.tgz + local_file: src/nyc-output-tests_win32-m82xc_n20-node_runtime_worker_thread.tgz + remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_win32-m82xc_n20-node_runtime_worker_thread.tgz bucket: mciuploads - command: shell.exec params: @@ -3876,13 +3876,13 @@ functions: shell: bash script: | set -e - tar xvzf nyc-output-tests_win32-m82rc_n20-node_runtime_worker_thread.tgz + tar xvzf nyc-output-tests_win32-m82xc_n20-node_runtime_worker_thread.tgz - command: s3.get params: aws_key: ${aws_key} aws_secret: ${aws_secret} - local_file: src/nyc-output-tests_win32-m82rc_n20-service_provider_node_driver.tgz - remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_win32-m82rc_n20-service_provider_node_driver.tgz + local_file: src/nyc-output-tests_win32-m82xc_n20-service_provider_node_driver.tgz + remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_win32-m82xc_n20-service_provider_node_driver.tgz bucket: mciuploads - command: shell.exec params: @@ -3890,13 +3890,13 @@ functions: shell: bash script: | set -e - tar xvzf nyc-output-tests_win32-m82rc_n20-service_provider_node_driver.tgz + tar xvzf nyc-output-tests_win32-m82xc_n20-service_provider_node_driver.tgz - command: s3.get params: aws_key: ${aws_key} aws_secret: ${aws_secret} - local_file: src/nyc-output-tests_win32-m82rc_n20-shell_api.tgz - remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_win32-m82rc_n20-shell_api.tgz + local_file: src/nyc-output-tests_win32-m82xc_n20-shell_api.tgz + remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_win32-m82xc_n20-shell_api.tgz bucket: mciuploads - command: shell.exec params: @@ -3904,13 +3904,13 @@ functions: shell: bash script: | set -e - tar xvzf nyc-output-tests_win32-m82rc_n20-shell_api.tgz + tar xvzf nyc-output-tests_win32-m82xc_n20-shell_api.tgz - command: s3.get params: aws_key: ${aws_key} aws_secret: ${aws_secret} - local_file: src/nyc-output-tests_win32-m82rce_n20-cli_repl.tgz - remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_win32-m82rce_n20-cli_repl.tgz + local_file: src/nyc-output-tests_win32-m82xe_n20-cli_repl.tgz + remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_win32-m82xe_n20-cli_repl.tgz bucket: mciuploads - command: shell.exec params: @@ -3918,13 +3918,13 @@ functions: shell: bash script: | set -e - tar xvzf nyc-output-tests_win32-m82rce_n20-cli_repl.tgz + tar xvzf nyc-output-tests_win32-m82xe_n20-cli_repl.tgz - command: s3.get params: aws_key: ${aws_key} aws_secret: ${aws_secret} - local_file: src/nyc-output-tests_win32-m82rce_n20-e2e_tests.tgz - remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_win32-m82rce_n20-e2e_tests.tgz + local_file: src/nyc-output-tests_win32-m82xe_n20-e2e_tests.tgz + remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_win32-m82xe_n20-e2e_tests.tgz bucket: mciuploads - command: shell.exec params: @@ -3932,13 +3932,13 @@ functions: shell: bash script: | set -e - tar xvzf nyc-output-tests_win32-m82rce_n20-e2e_tests.tgz + tar xvzf nyc-output-tests_win32-m82xe_n20-e2e_tests.tgz - command: s3.get params: aws_key: ${aws_key} aws_secret: ${aws_secret} - local_file: src/nyc-output-tests_win32-m82rce_n20-node_runtime_worker_thread.tgz - remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_win32-m82rce_n20-node_runtime_worker_thread.tgz + local_file: src/nyc-output-tests_win32-m82xe_n20-node_runtime_worker_thread.tgz + remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_win32-m82xe_n20-node_runtime_worker_thread.tgz bucket: mciuploads - command: shell.exec params: @@ -3946,13 +3946,13 @@ functions: shell: bash script: | set -e - tar xvzf nyc-output-tests_win32-m82rce_n20-node_runtime_worker_thread.tgz + tar xvzf nyc-output-tests_win32-m82xe_n20-node_runtime_worker_thread.tgz - command: s3.get params: aws_key: ${aws_key} aws_secret: ${aws_secret} - local_file: src/nyc-output-tests_win32-m82rce_n20-service_provider_node_driver.tgz - remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_win32-m82rce_n20-service_provider_node_driver.tgz + local_file: src/nyc-output-tests_win32-m82xe_n20-service_provider_node_driver.tgz + remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_win32-m82xe_n20-service_provider_node_driver.tgz bucket: mciuploads - command: shell.exec params: @@ -3960,13 +3960,13 @@ functions: shell: bash script: | set -e - tar xvzf nyc-output-tests_win32-m82rce_n20-service_provider_node_driver.tgz + tar xvzf nyc-output-tests_win32-m82xe_n20-service_provider_node_driver.tgz - command: s3.get params: aws_key: ${aws_key} aws_secret: ${aws_secret} - local_file: src/nyc-output-tests_win32-m82rce_n20-shell_api.tgz - remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_win32-m82rce_n20-shell_api.tgz + local_file: src/nyc-output-tests_win32-m82xe_n20-shell_api.tgz + remote_file: mongosh/binaries/${revision}/${revision_order_id}/nyc-output-tests_win32-m82xe_n20-shell_api.tgz bucket: mciuploads - command: shell.exec params: @@ -3974,7 +3974,7 @@ functions: shell: bash script: | set -e - tar xvzf nyc-output-tests_win32-m82rce_n20-shell_api.tgz + tar xvzf nyc-output-tests_win32-m82xe_n20-shell_api.tgz - command: s3.get params: aws_key: ${aws_key} @@ -5087,25 +5087,25 @@ tasks: - name: test_shell_api variant: tests_darwin-m80xe_n20 - name: test_cli_repl - variant: tests_darwin-m82rc_n20 + variant: tests_darwin-m82xc_n20 - name: test_e2e_tests - variant: tests_darwin-m82rc_n20 + variant: tests_darwin-m82xc_n20 - name: test_node_runtime_worker_thread - variant: tests_darwin-m82rc_n20 + variant: tests_darwin-m82xc_n20 - name: test_service_provider_node_driver - variant: tests_darwin-m82rc_n20 + variant: tests_darwin-m82xc_n20 - name: test_shell_api - variant: tests_darwin-m82rc_n20 + variant: tests_darwin-m82xc_n20 - name: test_cli_repl - variant: tests_darwin-m82rce_n20 + variant: tests_darwin-m82xe_n20 - name: test_e2e_tests - variant: tests_darwin-m82rce_n20 + variant: tests_darwin-m82xe_n20 - name: test_node_runtime_worker_thread - variant: tests_darwin-m82rce_n20 + variant: tests_darwin-m82xe_n20 - name: test_service_provider_node_driver - variant: tests_darwin-m82rce_n20 + variant: tests_darwin-m82xe_n20 - name: test_shell_api - variant: tests_darwin-m82rce_n20 + variant: tests_darwin-m82xe_n20 - name: test_cli_repl variant: tests_darwin-mlatest_n20 - name: test_e2e_tests @@ -5295,29 +5295,29 @@ tasks: - name: test_shell_api variant: tests_linux-m80xe_n20 - name: test_cli_repl - variant: tests_linux-m82rc_n20 + variant: tests_linux-m82xc_n20 - name: test_e2e_tests - variant: tests_linux-m82rc_n20 + variant: tests_linux-m82xc_n20 - name: test_java_shell - variant: tests_linux-m82rc_n20 + variant: tests_linux-m82xc_n20 - name: test_node_runtime_worker_thread - variant: tests_linux-m82rc_n20 + variant: tests_linux-m82xc_n20 - name: test_service_provider_node_driver - variant: tests_linux-m82rc_n20 + variant: tests_linux-m82xc_n20 - name: test_shell_api - variant: tests_linux-m82rc_n20 + variant: tests_linux-m82xc_n20 - name: test_cli_repl - variant: tests_linux-m82rce_n20 + variant: tests_linux-m82xe_n20 - name: test_e2e_tests - variant: tests_linux-m82rce_n20 + variant: tests_linux-m82xe_n20 - name: test_java_shell - variant: tests_linux-m82rce_n20 + variant: tests_linux-m82xe_n20 - name: test_node_runtime_worker_thread - variant: tests_linux-m82rce_n20 + variant: tests_linux-m82xe_n20 - name: test_service_provider_node_driver - variant: tests_linux-m82rce_n20 + variant: tests_linux-m82xe_n20 - name: test_shell_api - variant: tests_linux-m82rce_n20 + variant: tests_linux-m82xe_n20 - name: test_cli_repl variant: tests_linux-mlatest_n20 - name: test_e2e_tests @@ -5495,25 +5495,25 @@ tasks: - name: test_shell_api variant: tests_win32-m80xe_n20 - name: test_cli_repl - variant: tests_win32-m82rc_n20 + variant: tests_win32-m82xc_n20 - name: test_e2e_tests - variant: tests_win32-m82rc_n20 + variant: tests_win32-m82xc_n20 - name: test_node_runtime_worker_thread - variant: tests_win32-m82rc_n20 + variant: tests_win32-m82xc_n20 - name: test_service_provider_node_driver - variant: tests_win32-m82rc_n20 + variant: tests_win32-m82xc_n20 - name: test_shell_api - variant: tests_win32-m82rc_n20 + variant: tests_win32-m82xc_n20 - name: test_cli_repl - variant: tests_win32-m82rce_n20 + variant: tests_win32-m82xe_n20 - name: test_e2e_tests - variant: tests_win32-m82rce_n20 + variant: tests_win32-m82xe_n20 - name: test_node_runtime_worker_thread - variant: tests_win32-m82rce_n20 + variant: tests_win32-m82xe_n20 - name: test_service_provider_node_driver - variant: tests_win32-m82rce_n20 + variant: tests_win32-m82xe_n20 - name: test_shell_api - variant: tests_win32-m82rce_n20 + variant: tests_win32-m82xe_n20 - name: test_cli_repl variant: tests_win32-mlatest_n20 - name: test_e2e_tests @@ -10598,8 +10598,8 @@ buildvariants: - name: test_shell_evaluator - name: test_snippet_manager - name: test_types - - name: tests_darwin-m82rc_n20 - display_name: "MacOS 14 arm64 m82rc n20 (Unit tests)" + - name: tests_darwin-m82xc_n20 + display_name: "MacOS 14 arm64 m82xc n20 (Unit tests)" run_on: macos-14-arm64 tags: [] expansions: @@ -10631,8 +10631,8 @@ buildvariants: - name: test_shell_evaluator - name: test_snippet_manager - name: test_types - - name: tests_darwin-m82rce_n20 - display_name: "MacOS 14 arm64 m82rce n20 (Unit tests)" + - name: tests_darwin-m82xe_n20 + display_name: "MacOS 14 arm64 m82xe n20 (Unit tests)" run_on: macos-14-arm64 tags: [] expansions: @@ -11093,8 +11093,8 @@ buildvariants: - name: test_shell_evaluator - name: test_snippet_manager - name: test_types - - name: tests_linux-m82rc_n20 - display_name: "Ubuntu 20.04 x64 m82rc n20 (Unit tests)" + - name: tests_linux-m82xc_n20 + display_name: "Ubuntu 20.04 x64 m82xc n20 (Unit tests)" run_on: ubuntu2004-small tags: ["nightly-driver"] expansions: @@ -11126,8 +11126,8 @@ buildvariants: - name: test_shell_evaluator - name: test_snippet_manager - name: test_types - - name: tests_linux-m82rce_n20 - display_name: "Ubuntu 20.04 x64 m82rce n20 (Unit tests)" + - name: tests_linux-m82xe_n20 + display_name: "Ubuntu 20.04 x64 m82xe n20 (Unit tests)" run_on: ubuntu2004-small tags: ["nightly-driver"] expansions: @@ -11608,8 +11608,8 @@ buildvariants: - name: test_shell_evaluator - name: test_snippet_manager - name: test_types - - name: tests_win32-m82rc_n20 - display_name: "Windows m82rc n20 (Unit tests)" + - name: tests_win32-m82xc_n20 + display_name: "Windows m82xc n20 (Unit tests)" run_on: windows-vsCurrent-small tags: [] expansions: @@ -11640,8 +11640,8 @@ buildvariants: - name: test_shell_evaluator - name: test_snippet_manager - name: test_types - - name: tests_win32-m82rce_n20 - display_name: "Windows m82rce n20 (Unit tests)" + - name: tests_win32-m82xe_n20 + display_name: "Windows m82xe n20 (Unit tests)" run_on: windows-vsCurrent-small tags: [] expansions: diff --git a/.evergreen/constants.js b/.evergreen/constants.js index 4ac09db8dc..c51a081856 100644 --- a/.evergreen/constants.js +++ b/.evergreen/constants.js @@ -37,8 +37,8 @@ exports.MONGODB_VERSIONS = [ { shortName: '70xe', versionSpec: '7.0.x-enterprise' }, { shortName: '80xc', versionSpec: '8.0.x' }, { shortName: '80xe', versionSpec: '8.0.x-enterprise' }, - { shortName: '82rc', versionSpec: '8.2.0' }, - { shortName: '82rce', versionSpec: '8.2.0-enterprise' }, + { shortName: '82xc', versionSpec: '8.2.0' }, + { shortName: '82xe', versionSpec: '8.2.0-enterprise' }, { shortName: 'latest', versionSpec: 'latest-alpha-enterprise' }, ]; diff --git a/packages/shell-api/src/field-level-encryption.spec.ts b/packages/shell-api/src/field-level-encryption.spec.ts index 06564248ba..f892dee6fd 100644 --- a/packages/shell-api/src/field-level-encryption.spec.ts +++ b/packages/shell-api/src/field-level-encryption.spec.ts @@ -962,7 +962,7 @@ srDVjIT3LsvTqw==`, return; } expect.fail('missed exception'); - // eslint-disable-next-line no-fallthrough + break; default: throw new Error(`unreachable ${kmsName}`); } diff --git a/testing/integration-testing-hooks.ts b/testing/integration-testing-hooks.ts index 578f70a871..8d3ee3fd21 100644 --- a/testing/integration-testing-hooks.ts +++ b/testing/integration-testing-hooks.ts @@ -259,7 +259,6 @@ export function startTestCluster(id: string, ...argLists: Partial Date: Thu, 25 Sep 2025 13:52:51 +0200 Subject: [PATCH 7/7] fixup: address check warning --- packages/e2e-tests/test/e2e-fle.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/e2e-tests/test/e2e-fle.spec.ts b/packages/e2e-tests/test/e2e-fle.spec.ts index 7f4d0b2988..ae86e55d3f 100644 --- a/packages/e2e-tests/test/e2e-fle.spec.ts +++ b/packages/e2e-tests/test/e2e-fle.spec.ts @@ -1,6 +1,6 @@ import { expect } from 'chai'; import { MongoClient } from 'mongodb'; -import { TestShell } from './test-shell'; +import type { TestShell } from './test-shell'; import { eventually } from '../../../testing/eventually'; import { startTestServer,