From 166d44bfd787701feba87bb1ea64da3ab1329241 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Tue, 10 May 2022 18:13:52 +0200 Subject: [PATCH 1/2] feat(data-service): ensure that FLE2 collections are dropped properly COMPASS-5627 --- packages/data-service/package.json | 2 +- .../data-service/src/data-service.spec.ts | 72 ++++++++++++++++++- packages/data-service/src/data-service.ts | 31 ++++++-- 3 files changed, 94 insertions(+), 11 deletions(-) diff --git a/packages/data-service/package.json b/packages/data-service/package.json index 373d5f23a9c..8fc32284c3c 100644 --- a/packages/data-service/package.json +++ b/packages/data-service/package.json @@ -51,7 +51,7 @@ "test-connectivity": "mocha ./src/connect.spec.ts", "posttest": "mongodb-runner stop --port=27018", "pretest-csfle": "mongodb-runner start --enterprise --mongodb-version \">=6.0.0-rc1\" --topology=replicaset --secondaries=0 --port=27018", - "test-csfle": "mocha ./src/csfle-collection-tracker.spec.ts", + "test-csfle": "mocha ./src/csfle-collection-tracker.spec.ts ./src/data-service.spec.ts", "posttest-csfle": "mongodb-runner stop --enterprise --mongodb-version \">=6.0.0-rc1\" --topology=replicaset --secondaries=0 --port=27018", "test-cov": "nyc -x \"**/*.spec.*\" --reporter=lcov --reporter=text --reporter=html npm run test", "test-watch": "npm run test -- --watch", diff --git a/packages/data-service/src/data-service.spec.ts b/packages/data-service/src/data-service.spec.ts index 124878d64ec..005aaf82d57 100644 --- a/packages/data-service/src/data-service.spec.ts +++ b/packages/data-service/src/data-service.spec.ts @@ -1,8 +1,9 @@ import assert from 'assert'; +import type { Document } from 'bson'; import { ObjectId } from 'bson'; import { expect } from 'chai'; import type { Sort } from 'mongodb'; -import { MongoClient } from 'mongodb'; +import { MongoClient } from 'mongodb-fle'; import sinon from 'sinon'; import { v4 as uuid } from 'uuid'; @@ -213,6 +214,14 @@ describe('DataService', function () { await mongoClient.db(testDatabaseName).createCollection('bar'); }); + afterEach(async function () { + try { + await mongoClient.db(testDatabaseName).collection('bar').drop(); + } catch { + /* ignore ns not found */ + } + }); + it('drops a collection', function (done) { dataService.dropCollection(`${testDatabaseName}.bar`, function (error) { assert.equal(null, error); @@ -225,6 +234,62 @@ describe('DataService', function () { .catch(done); }); }); + + it('drops a collection with fle2 options', async function () { + const buildInfo = await new Promise((resolve, reject) => { + dataService.command('admin', { buildInfo: 1 }, (error, result) => { + error ? reject(error) : resolve(result); + }); + }); + console.log(dataService.currentTopologyType()); + if ( + (buildInfo.versionArray?.[0] ?? 0) <= 5 || + dataService.currentTopologyType() === 'Single' || + process.env.COMPASS_CSFLE_SUPPORT !== 'true' + ) { + return this.skip(); // FLE2 requires 6.0+ replset + } + + await mongoClient.db(testDatabaseName).createCollection('fle2', { + encryptedFields: { + escCollection: 'enxcol_.fle2.esc', + eccCollection: 'enxcol_.fle2.ecc', + ecocCollection: 'enxcol_.fle2.ecoc', + fields: [], + }, + }); + + let items = ( + await mongoClient + .db(testDatabaseName) + .listCollections({}, { nameOnly: true }) + .toArray() + ).map(({ name }) => name); + expect(items).to.include('fle2'); + expect(items).to.include('enxcol_.fle2.esc'); + expect(items).to.include('enxcol_.fle2.ecc'); + expect(items).to.include('enxcol_.fle2.ecoc'); + + await new Promise((resolve, reject) => { + dataService.dropCollection( + `${testDatabaseName}.fle2`, + function (error) { + error ? reject(error) : resolve(); + } + ); + }); + + items = ( + await mongoClient + .db(testDatabaseName) + .listCollections({}, { nameOnly: true }) + .toArray() + ).map(({ name }) => name); + expect(items).to.not.include('fle2'); + expect(items).to.not.include('enxcol_.fle2.esc'); + expect(items).to.not.include('enxcol_.fle2.ecc'); + expect(items).to.not.include('enxcol_.fle2.ecoc'); + }); }); describe('#dropDatabase', function () { @@ -1005,7 +1070,9 @@ describe('DataService', function () { const topology = dataService.getLastSeenTopology(); expect(topology).to.not.be.null; - expect(topology!.servers.has('127.0.0.1:27018')).to.equal(true); + expect(topology!.servers.values().next().value.address).to.be.a( + 'string' + ); expect(topology).to.deep.include({ compatible: true, @@ -1013,7 +1080,6 @@ describe('DataService', function () { localThresholdMS: 15, logicalSessionTimeoutMinutes: 30, stale: false, - type: 'Single', }); }); diff --git a/packages/data-service/src/data-service.ts b/packages/data-service/src/data-service.ts index 0cdc259380b..028d43ab33b 100644 --- a/packages/data-service/src/data-service.ts +++ b/packages/data-service/src/data-service.ts @@ -19,6 +19,7 @@ import type { DeleteOptions, DeleteResult, Document, + DropCollectionOptions, EstimatedDocumentCountOptions, Filter, FindCursor, @@ -1382,14 +1383,30 @@ export class DataServiceImpl extends EventEmitter implements DataService { 'Running dropCollection', { ns } ); - this._collection(ns, 'CRUD').drop((error, result) => { - logop(error, result); - if (error) { - // @ts-expect-error Callback without result... - return callback(this._translateMessage(error)); + + const client = this._initializedClient('CRUD'); + const db = client.db(this._databaseName(ns)); + const collName = this._collectionName(ns); + const coll = db.collection(collName); + + db.listCollections({ name: collName }, { nameOnly: false }).toArray( + (_errIgnore, result) => { + const options: DropCollectionOptions = {}; + const encryptedFieldsInfo = result?.[0]?.options?.encryptedFields; + if (encryptedFieldsInfo) { + // @ts-expect-error next driver release has types + options.encryptedFields = encryptedFieldsInfo; + } + coll.drop(options, (error, result) => { + logop(error, result); + if (error) { + // @ts-expect-error Callback without result... + return callback(this._translateMessage(error)); + } + callback(null, result!); + }); } - callback(null, result!); - }); + ); } dropDatabase(name: string, callback: Callback): void { From d8843598d8ea3e7c116be142f8762840dc867cdc Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Tue, 10 May 2022 19:32:04 +0200 Subject: [PATCH 2/2] Update packages/data-service/src/data-service.spec.ts Co-authored-by: Rhys --- packages/data-service/src/data-service.spec.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/data-service/src/data-service.spec.ts b/packages/data-service/src/data-service.spec.ts index 005aaf82d57..9f4d273dbcb 100644 --- a/packages/data-service/src/data-service.spec.ts +++ b/packages/data-service/src/data-service.spec.ts @@ -241,7 +241,6 @@ describe('DataService', function () { error ? reject(error) : resolve(result); }); }); - console.log(dataService.currentTopologyType()); if ( (buildInfo.versionArray?.[0] ?? 0) <= 5 || dataService.currentTopologyType() === 'Single' ||