diff --git a/configs/testing-library-compass/package.json b/configs/testing-library-compass/package.json index 9d1793c8e91..665829e1851 100644 --- a/configs/testing-library-compass/package.json +++ b/configs/testing-library-compass/package.json @@ -62,6 +62,7 @@ "@testing-library/react": "^12.1.5", "@testing-library/react-hooks": "^7.0.2", "@testing-library/user-event": "^13.5.0", + "mongodb-build-info": "^1.8.1", "mongodb-connection-string-url": "^3.0.1", "react": "^17.0.2", "react-redux": "^8.1.3", diff --git a/configs/testing-library-compass/src/index.tsx b/configs/testing-library-compass/src/index.tsx index ea4910c149e..b2519d077e9 100644 --- a/configs/testing-library-compass/src/index.tsx +++ b/configs/testing-library-compass/src/index.tsx @@ -34,6 +34,7 @@ import type { DataService, InstanceDetails, } from 'mongodb-data-service'; +import { identifyServerName } from 'mongodb-build-info'; import Sinon from 'sinon'; import React from 'react'; import type { @@ -175,8 +176,22 @@ export class MockDataService disconnect(): Promise { return Promise.resolve(); } - instance(): Promise { - return Promise.resolve({ + async instance(): Promise { + const { connectionString } = this.connectionOptions; + const serverName = await identifyServerName({ + connectionString, + adminCommand: () => + Promise.reject( + new Error( + 'MockDataService adminCommand: this is a mocked environment; no server commands available.' + ) + ), + }); + const genuineMongoDB = { + serverName, + isGenuine: serverName === 'mongodb' || serverName === 'unknown', + }; + return { auth: { user: null, roles: [], @@ -188,10 +203,7 @@ export class MockDataService version: '100.0.0', }, host: {}, - genuineMongoDB: { - isGenuine: true, - dbType: 'mongodb', - }, + genuineMongoDB, dataLake: { isDataLake: false, version: null, @@ -200,7 +212,7 @@ export class MockDataService isAtlas: false, isLocalAtlas: false, csfleMode: 'unavailable', - }); + }; } } diff --git a/package-lock.json b/package-lock.json index d3d09c04455..e5e15e8ec09 100644 --- a/package-lock.json +++ b/package-lock.json @@ -336,6 +336,7 @@ "@testing-library/react": "^12.1.5", "@testing-library/react-hooks": "^7.0.2", "@testing-library/user-event": "^13.5.0", + "mongodb-build-info": "^1.8.1", "mongodb-connection-string-url": "^3.0.1", "react": "^17.0.2", "react-redux": "^8.1.3", @@ -34926,14 +34927,32 @@ } }, "node_modules/mongodb-build-info": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/mongodb-build-info/-/mongodb-build-info-1.7.2.tgz", - "integrity": "sha512-eoLFZvCIjcwijYJdxvYupj1c+55VAVm0o4gBJjrcDxxmmpm+bC4Ix9ayZbyhQdVXDZAGDi03NA0GghXjBVXnxg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/mongodb-build-info/-/mongodb-build-info-1.8.1.tgz", + "integrity": "sha512-O6bWoFnDRyDS/ki9cTkYqh2EWITYAqnVrkaGWhbEVuzDhqoNYLtMgukEyusmsJV+5wpO3lAUiyBbKNq1g4vl3g==", "license": "Apache-2.0", "dependencies": { + "debug": "^4.4.0", "mongodb-connection-string-url": "^3.0.0" } }, + "node_modules/mongodb-build-info/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/mongodb-client-encryption": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/mongodb-client-encryption/-/mongodb-client-encryption-6.5.0.tgz", @@ -48028,7 +48047,7 @@ "make-fetch-happen": "^10.2.1", "minimatch": "^10.0.1", "mongodb": "^6.19.0", - "mongodb-build-info": "^1.7.2", + "mongodb-build-info": "^1.8.1", "mongodb-cloud-info": "^2.1.7", "mongodb-connection-string-url": "^3.0.1", "mongodb-data-service": "^22.34.6", @@ -49497,7 +49516,7 @@ "compass-preferences-model": "^2.64.0", "lodash": "^4.17.21", "mongodb": "^6.19.0", - "mongodb-build-info": "^1.7.2", + "mongodb-build-info": "^1.8.1", "mongodb-connection-string-url": "^3.0.1", "mongodb-data-service": "^22.34.6", "react": "^17.0.2", @@ -49541,7 +49560,7 @@ "@mongodb-js/connection-form": "^1.72.1", "@mongodb-js/connection-info": "^0.22.0", "compass-preferences-model": "^2.64.0", - "mongodb-build-info": "^1.7.2", + "mongodb-build-info": "^1.8.1", "react": "^17.0.2", "react-virtualized-auto-sizer": "^1.0.6", "react-window": "^1.8.6" @@ -50061,7 +50080,7 @@ "lodash": "^4.17.21", "mocha": "^10.2.0", "mongodb": "^6.19.0", - "mongodb-build-info": "^1.7.2", + "mongodb-build-info": "^1.8.1", "mongodb-connection-string-url": "^3.0.1", "mongodb-log-writer": "^2.3.4", "mongodb-ns": "^3.0.1", @@ -53140,7 +53159,6 @@ "is-ip": "^5.0.1", "mocha": "^10.2.0", "mongodb": "^6.19.0", - "mongodb-build-info": "^1.7.2", "mongodb-data-service": "^22.34.6", "mongodb-log-writer": "^2.3.4", "mongodb-ns": "^3.0.1", @@ -53784,7 +53802,7 @@ "@mongodb-js/shell-bson-parser": "^1.2.0", "lodash": "^4.17.21", "mongodb": "^6.19.0", - "mongodb-build-info": "^1.7.2", + "mongodb-build-info": "^1.8.1", "mongodb-connection-string-url": "^3.0.1", "mongodb-data-service": "^22.34.6", "mongodb-query-parser": "^4.3.0", @@ -53823,6 +53841,23 @@ "bson": "^4.6.3 || ^5 || ^6" } }, + "packages/connection-form/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "packages/connection-form/node_modules/mongodb-query-parser": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/mongodb-query-parser/-/mongodb-query-parser-4.3.0.tgz", @@ -54064,7 +54099,7 @@ "bson": "^6.10.4", "lodash": "^4.17.21", "mongodb": "^6.19.0", - "mongodb-build-info": "^1.7.2", + "mongodb-build-info": "^1.8.1", "mongodb-connection-string-url": "^3.0.1", "mongodb-ns": "^3.0.1" }, @@ -64045,7 +64080,7 @@ "lodash": "^4.17.21", "mocha": "^10.2.0", "mongodb": "^6.19.0", - "mongodb-build-info": "^1.7.2", + "mongodb-build-info": "^1.8.1", "mongodb-connection-string-url": "^3.0.1", "mongodb-data-service": "^22.34.6", "nyc": "^15.1.0", @@ -64109,7 +64144,7 @@ "compass-preferences-model": "^2.64.0", "depcheck": "^1.4.1", "mocha": "^10.2.0", - "mongodb-build-info": "^1.7.2", + "mongodb-build-info": "^1.8.1", "nyc": "^15.1.0", "react": "^17.0.2", "react-dom": "^17.0.2", @@ -66790,7 +66825,6 @@ "is-ip": "^5.0.1", "mocha": "^10.2.0", "mongodb": "^6.19.0", - "mongodb-build-info": "^1.7.2", "mongodb-data-service": "^22.34.6", "mongodb-log-writer": "^2.3.4", "mongodb-ns": "^3.0.1", @@ -67180,7 +67214,7 @@ "lodash": "^4.17.21", "mocha": "^10.2.0", "mongodb": "^6.19.0", - "mongodb-build-info": "^1.7.2", + "mongodb-build-info": "^1.8.1", "mongodb-connection-string-url": "^3.0.1", "mongodb-data-service": "^22.34.6", "mongodb-query-parser": "^4.3.0", @@ -67198,6 +67232,14 @@ "acorn": "^8.1.0" } }, + "debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "requires": { + "ms": "^2.1.3" + } + }, "mongodb-query-parser": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/mongodb-query-parser/-/mongodb-query-parser-4.3.0.tgz", @@ -68633,6 +68675,7 @@ "chai": "^4.3.6", "depcheck": "^1.4.1", "mocha": "^10.2.0", + "mongodb-build-info": "^1.8.1", "mongodb-connection-string-url": "^3.0.1", "nyc": "^15.1.0", "react": "^17.0.2", @@ -76869,7 +76912,7 @@ "lodash": "^4.17.21", "mocha": "^10.2.0", "mongodb": "^6.19.0", - "mongodb-build-info": "^1.7.2", + "mongodb-build-info": "^1.8.1", "mongodb-connection-string-url": "^3.0.1", "mongodb-log-writer": "^2.3.4", "mongodb-ns": "^3.0.1", @@ -87967,11 +88010,22 @@ } }, "mongodb-build-info": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/mongodb-build-info/-/mongodb-build-info-1.7.2.tgz", - "integrity": "sha512-eoLFZvCIjcwijYJdxvYupj1c+55VAVm0o4gBJjrcDxxmmpm+bC4Ix9ayZbyhQdVXDZAGDi03NA0GghXjBVXnxg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/mongodb-build-info/-/mongodb-build-info-1.8.1.tgz", + "integrity": "sha512-O6bWoFnDRyDS/ki9cTkYqh2EWITYAqnVrkaGWhbEVuzDhqoNYLtMgukEyusmsJV+5wpO3lAUiyBbKNq1g4vl3g==", "requires": { + "debug": "^4.4.0", "mongodb-connection-string-url": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "requires": { + "ms": "^2.1.3" + } + } } }, "mongodb-client-encryption": { @@ -88097,7 +88151,7 @@ "make-fetch-happen": "^10.2.1", "minimatch": "^10.0.1", "mongodb": "^6.19.0", - "mongodb-build-info": "^1.7.2", + "mongodb-build-info": "^1.8.1", "mongodb-client-encryption": "^6.5.0", "mongodb-cloud-info": "^2.1.7", "mongodb-connection-string-url": "^3.0.1", @@ -88318,7 +88372,7 @@ "lodash": "^4.17.21", "mocha": "^10.2.0", "mongodb": "^6.19.0", - "mongodb-build-info": "^1.7.2", + "mongodb-build-info": "^1.8.1", "mongodb-client-encryption": "^6.5.0", "mongodb-connection-string-url": "^3.0.1", "mongodb-log-writer": "^2.3.4", diff --git a/packages/compass-app-stores/src/provider.tsx b/packages/compass-app-stores/src/provider.tsx index 9bbfc34616c..40e68964cde 100644 --- a/packages/compass-app-stores/src/provider.tsx +++ b/packages/compass-app-stores/src/provider.tsx @@ -10,6 +10,7 @@ import type { MongoDBInstanceProps } from 'mongodb-instance-model'; import { MongoDBInstance } from 'mongodb-instance-model'; import React, { createContext, + useCallback, useContext, useEffect, useMemo, @@ -93,6 +94,46 @@ export const mongoDBInstanceLocator = createServiceLocator( 'mongoDBInstanceLocator' ); +/** + * Hook to check if there are any connected non-genuine MongoDB connections. + * @return true if any connected connection is to a non-genuine MongoDB server. + */ +export function useHasNonGenuineConnections(): boolean { + const instancesManager = useContext(MongoDBInstancesManagerContext); + + const hasNonGenuineConnections = useCallback( + function () { + if (!instancesManager) { + return false; + } + return Array.from(instancesManager.listMongoDBInstances().values()).some( + (instance) => { + return !instance.genuineMongoDB.isGenuine; + } + ); + }, + [instancesManager] + ); + + const [result, setResult] = useState(hasNonGenuineConnections); + + useEffect(() => { + if (instancesManager) { + const updateResult = () => { + setResult(hasNonGenuineConnections); + }; + instancesManager.on('instance-started', updateResult); + instancesManager.on('instance-removed', updateResult); + return () => { + instancesManager.off('instance-started', updateResult); + instancesManager.off('instance-removed', updateResult); + }; + } + }, [instancesManager, setResult, hasNonGenuineConnections]); + + return result; +} + const NamespaceModelContext = React.createContext( null ); diff --git a/packages/compass-connections-navigation/package.json b/packages/compass-connections-navigation/package.json index c3eee835929..479e89b0394 100644 --- a/packages/compass-connections-navigation/package.json +++ b/packages/compass-connections-navigation/package.json @@ -55,7 +55,7 @@ "@mongodb-js/connection-form": "^1.72.1", "@mongodb-js/connection-info": "^0.22.0", "compass-preferences-model": "^2.64.0", - "mongodb-build-info": "^1.7.2", + "mongodb-build-info": "^1.8.1", "react": "^17.0.2", "react-virtualized-auto-sizer": "^1.0.6", "react-window": "^1.8.6" diff --git a/packages/compass-connections/package.json b/packages/compass-connections/package.json index a36a3c49511..081e89cee85 100644 --- a/packages/compass-connections/package.json +++ b/packages/compass-connections/package.json @@ -63,7 +63,7 @@ "compass-preferences-model": "^2.64.0", "lodash": "^4.17.21", "mongodb": "^6.19.0", - "mongodb-build-info": "^1.7.2", + "mongodb-build-info": "^1.8.1", "mongodb-connection-string-url": "^3.0.1", "mongodb-data-service": "^22.34.6", "react": "^17.0.2", diff --git a/packages/compass-connections/src/stores/connections-store-redux.ts b/packages/compass-connections/src/stores/connections-store-redux.ts index 92da56e5653..879d085d14f 100644 --- a/packages/compass-connections/src/stores/connections-store-redux.ts +++ b/packages/compass-connections/src/stores/connections-store-redux.ts @@ -28,7 +28,7 @@ import { import { getNotificationTriggers } from '../components/connection-status-notifications'; import { openToast, showConfirmation } from '@mongodb-js/compass-components'; import { adjustConnectionOptionsBeforeConnect } from '@mongodb-js/connection-form'; -import mongodbBuildInfo, { getGenuineMongoDB } from 'mongodb-build-info'; +import { isAtlasStream } from 'mongodb-build-info'; import EventEmitter from 'events'; import { showNonGenuineMongoDBWarningModal as _showNonGenuineMongoDBWarningModal } from '../components/non-genuine-connection-modal'; import { showEndOfLifeMongoDBWarningModal as _showEndOfLifeMongoDBWarningModal } from '../components/end-of-life-connection-modal'; @@ -1416,13 +1416,13 @@ function isAtlasStreamsInstance( adjustedConnectionInfoForConnection: ConnectionInfo ) { try { - return mongodbBuildInfo.isAtlasStream( + return isAtlasStream( adjustedConnectionInfoForConnection.connectionOptions.connectionString ); } catch { // This catch-all is not ideal, but it safe-guards regular connections // instead of making assumptions on the fact that the implementation - // of `mongodbBuildInfo.isAtlasStream` would never throw. + // of `isAtlasStream` would never throw. return false; } } @@ -1844,7 +1844,7 @@ const connectWithOptions = ( is_dataLake: dataLake.isDataLake, is_enterprise: build.isEnterprise, is_genuine: genuineMongoDB.isGenuine, - non_genuine_server_name: genuineMongoDB.dbType, + non_genuine_server_name: genuineMongoDB.serverName, server_version: build.version, server_arch: host.arch, server_os_family: host.os_family, @@ -1888,10 +1888,7 @@ const connectWithOptions = ( connectionId: connectionInfo.id, }); - if ( - getGenuineMongoDB(connectionInfo.connectionOptions.connectionString) - .isGenuine === false - ) { + if (!instanceInfo.genuineMongoDB.isGenuine) { dispatch(showNonGenuineMongoDBWarningModal(connectionInfo.id)); } else if ( await shouldShowEndOfLifeWarning( diff --git a/packages/compass-e2e-tests/package.json b/packages/compass-e2e-tests/package.json index 13aa815af3e..95c2b237afc 100644 --- a/packages/compass-e2e-tests/package.json +++ b/packages/compass-e2e-tests/package.json @@ -59,7 +59,7 @@ "lodash": "^4.17.21", "mocha": "^10.2.0", "mongodb": "^6.19.0", - "mongodb-build-info": "^1.7.2", + "mongodb-build-info": "^1.8.1", "mongodb-connection-string-url": "^3.0.1", "mongodb-log-writer": "^2.3.4", "mongodb-ns": "^3.0.1", diff --git a/packages/compass-e2e-tests/tests/logging.test.ts b/packages/compass-e2e-tests/tests/logging.test.ts index 853fc210f1d..9b982af75b1 100644 --- a/packages/compass-e2e-tests/tests/logging.test.ts +++ b/packages/compass-e2e-tests/tests/logging.test.ts @@ -302,7 +302,7 @@ describe('Logging and Telemetry integration', function () { const { dataLake, genuineMongoDB } = actual; expect({ dataLake, genuineMongoDB }).to.deep.equal({ dataLake: { isDataLake: false, version: null }, - genuineMongoDB: { dbType: 'mongodb', isGenuine: true }, + genuineMongoDB: { serverName: 'mongodb', isGenuine: true }, }); expect(actual.featureCompatibilityVersion).to.be.a('string'); diff --git a/packages/compass-sidebar/src/components/multiple-connections/sidebar.spec.tsx b/packages/compass-sidebar/src/components/multiple-connections/sidebar.spec.tsx index 823f568ff07..65039338fc8 100644 --- a/packages/compass-sidebar/src/components/multiple-connections/sidebar.spec.tsx +++ b/packages/compass-sidebar/src/components/multiple-connections/sidebar.spec.tsx @@ -54,7 +54,7 @@ describe('Multiple Connections Sidebar Component', function () { _id: '1', status: 'ready', genuineMongoDB: { - dbType: 'local', + serverName: 'mongodb', isGenuine: true, }, build: { diff --git a/packages/compass-sidebar/src/modules/instance.ts b/packages/compass-sidebar/src/modules/instance.ts index d714c50ae57..acf476c83f9 100644 --- a/packages/compass-sidebar/src/modules/instance.ts +++ b/packages/compass-sidebar/src/modules/instance.ts @@ -107,7 +107,7 @@ export const setupInstance = version: instance.dataLake.version, }, genuineMongoDB: { - dbType: instance.genuineMongoDB.dbType, + serverName: instance.genuineMongoDB.serverName, isGenuine: instance.genuineMongoDB.isGenuine, }, topologyDescription: { diff --git a/packages/compass-web/package.json b/packages/compass-web/package.json index e47f91f7513..7332ea7f36a 100644 --- a/packages/compass-web/package.json +++ b/packages/compass-web/package.json @@ -129,7 +129,6 @@ "is-ip": "^5.0.1", "mocha": "^10.2.0", "mongodb": "^6.19.0", - "mongodb-build-info": "^1.7.2", "mongodb-data-service": "^22.34.6", "mongodb-log-writer": "^2.3.4", "mongodb-ns": "^3.0.1", diff --git a/packages/compass-web/src/compass-assistant-drawer.tsx b/packages/compass-web/src/compass-assistant-drawer.tsx index bae915fbe71..4ebf56e579c 100644 --- a/packages/compass-web/src/compass-assistant-drawer.tsx +++ b/packages/compass-web/src/compass-assistant-drawer.tsx @@ -1,5 +1,4 @@ -import { useConnectionIds } from '@mongodb-js/compass-connections/provider'; -import { getGenuineMongoDB } from 'mongodb-build-info'; +import { useHasNonGenuineConnections } from '@mongodb-js/compass-app-stores/provider'; import React from 'react'; import { CompassAssistantDrawer } from '@mongodb-js/compass-assistant'; @@ -11,16 +10,12 @@ export function CompassAssistantDrawerWithConnections({ }: { appName: string; }) { - // Check for non-genuine connections - const activeConnectionIds = useConnectionIds( - (conn) => - getGenuineMongoDB(conn.info.connectionOptions.connectionString) - .isGenuine === false && conn.status === 'connected' - ); + const hasNonGenuineConnections = useHasNonGenuineConnections(); + return ( 0} + hasNonGenuineConnections={hasNonGenuineConnections} /> ); } diff --git a/packages/compass/package.json b/packages/compass/package.json index 91d3552e6b9..4b1c632e6b3 100644 --- a/packages/compass/package.json +++ b/packages/compass/package.json @@ -264,7 +264,7 @@ "make-fetch-happen": "^10.2.1", "minimatch": "^10.0.1", "mongodb": "^6.19.0", - "mongodb-build-info": "^1.7.2", + "mongodb-build-info": "^1.8.1", "mongodb-cloud-info": "^2.1.7", "mongodb-connection-string-url": "^3.0.1", "mongodb-data-service": "^22.34.6", diff --git a/packages/compass/src/app/components/compass-assistant-drawer.tsx b/packages/compass/src/app/components/compass-assistant-drawer.tsx index bae915fbe71..4ebf56e579c 100644 --- a/packages/compass/src/app/components/compass-assistant-drawer.tsx +++ b/packages/compass/src/app/components/compass-assistant-drawer.tsx @@ -1,5 +1,4 @@ -import { useConnectionIds } from '@mongodb-js/compass-connections/provider'; -import { getGenuineMongoDB } from 'mongodb-build-info'; +import { useHasNonGenuineConnections } from '@mongodb-js/compass-app-stores/provider'; import React from 'react'; import { CompassAssistantDrawer } from '@mongodb-js/compass-assistant'; @@ -11,16 +10,12 @@ export function CompassAssistantDrawerWithConnections({ }: { appName: string; }) { - // Check for non-genuine connections - const activeConnectionIds = useConnectionIds( - (conn) => - getGenuineMongoDB(conn.info.connectionOptions.connectionString) - .isGenuine === false && conn.status === 'connected' - ); + const hasNonGenuineConnections = useHasNonGenuineConnections(); + return ( 0} + hasNonGenuineConnections={hasNonGenuineConnections} /> ); } diff --git a/packages/connection-form/package.json b/packages/connection-form/package.json index 67c24e91cef..a29e7e17954 100644 --- a/packages/connection-form/package.json +++ b/packages/connection-form/package.json @@ -54,7 +54,7 @@ "@mongodb-js/shell-bson-parser": "^1.2.0", "lodash": "^4.17.21", "mongodb": "^6.19.0", - "mongodb-build-info": "^1.7.2", + "mongodb-build-info": "^1.8.1", "mongodb-connection-string-url": "^3.0.1", "mongodb-data-service": "^22.34.6", "mongodb-query-parser": "^4.3.0", diff --git a/packages/data-service/package.json b/packages/data-service/package.json index 81b253a02c9..a57c358ce1b 100644 --- a/packages/data-service/package.json +++ b/packages/data-service/package.json @@ -59,7 +59,7 @@ "bson": "^6.10.4", "lodash": "^4.17.21", "mongodb": "^6.19.0", - "mongodb-build-info": "^1.7.2", + "mongodb-build-info": "^1.8.1", "mongodb-connection-string-url": "^3.0.1", "mongodb-ns": "^3.0.1" }, diff --git a/packages/data-service/src/data-service.spec.ts b/packages/data-service/src/data-service.spec.ts index fc9337fecd2..2d63fb4cfd7 100644 --- a/packages/data-service/src/data-service.spec.ts +++ b/packages/data-service/src/data-service.spec.ts @@ -1085,7 +1085,7 @@ describe('DataService', function () { const instance = await dataService.instance(); expect(instance.genuineMongoDB).to.deep.equal({ isGenuine: true, - dbType: 'mongodb', + serverName: 'mongodb', }); expect(instance.dataLake).to.deep.equal({ isDataLake: false, diff --git a/packages/data-service/src/instance-detail-helper.spec.ts b/packages/data-service/src/instance-detail-helper.spec.ts index 54a7acc020d..8495a25e92b 100644 --- a/packages/data-service/src/instance-detail-helper.spec.ts +++ b/packages/data-service/src/instance-detail-helper.spec.ts @@ -86,7 +86,7 @@ describe('instance-detail-helper', function () { true ); expect(instanceDetails).to.have.nested.property( - 'genuineMongoDB.dbType', + 'genuineMongoDB.serverName', 'mongodb' ); }); @@ -241,7 +241,7 @@ describe('instance-detail-helper', function () { ); expect(instanceDetails).to.have.nested.property( - 'genuineMongoDB.dbType', + 'genuineMongoDB.serverName', 'cosmosdb' ); }); @@ -271,7 +271,7 @@ describe('instance-detail-helper', function () { ); expect(instanceDetails).to.have.nested.property( - 'genuineMongoDB.dbType', + 'genuineMongoDB.serverName', 'documentdb' ); }); diff --git a/packages/data-service/src/instance-detail-helper.ts b/packages/data-service/src/instance-detail-helper.ts index e93188d6592..b4c0f1c9710 100644 --- a/packages/data-service/src/instance-detail-helper.ts +++ b/packages/data-service/src/instance-detail-helper.ts @@ -7,7 +7,7 @@ import type { } from 'mongodb'; import { isEnterprise, - getGenuineMongoDB, + identifyServerName, getDataLake, isAtlas as checkIsAtlas, isLocalAtlas as checkIsLocalAtlas, @@ -46,7 +46,7 @@ type HostInfoDetails = { type GenuineMongoDBDetails = { isGenuine: boolean; - dbType: string; + serverName: string; }; type DataLakeDetails = { @@ -122,6 +122,7 @@ export async function getInstance( getParameterResult, atlasVersionResult, isLocalAtlas, + genuineMongoDB, ] = await Promise.all([ runCommand( adminDb, @@ -158,6 +159,7 @@ export async function getInstance( return await client.db(db).collection(collection).countDocuments(query); } ), + buildGenuineMongoDBInfo(uri, client), ]); const isAtlas = !!atlasVersionResult.atlasVersion || checkIsAtlas(uri); @@ -166,8 +168,8 @@ export async function getInstance( auth: adaptAuthInfo(connectionStatus), build: adaptBuildInfo(buildInfoResult), host: adaptHostInfo(hostInfoResult), - genuineMongoDB: buildGenuineMongoDBInfo(uri), dataLake: buildDataLakeInfo(buildInfoResult), + genuineMongoDB, featureCompatibilityVersion: getParameterResult?.featureCompatibilityVersion.version ?? null, isAtlas, @@ -196,12 +198,30 @@ export function configuredKMSProviders( .map(([kmsProviderName]) => kmsProviderName as any); } -function buildGenuineMongoDBInfo(uri: string): GenuineMongoDBDetails { - const { isGenuine, serverName } = getGenuineMongoDB(uri); +async function buildGenuineMongoDBInfo( + uri: string, + client: MongoClient +): Promise { + const adminDb = client.db('admin'); + const serverName = await identifyServerName({ + connectionString: uri, + async adminCommand(doc) { + try { + const result = await adminDb.command(doc); + debug('adminCommand(%O) = %O', doc, result); + return result; + } catch (err) { + debug('adminCommand(%O) failed %O', doc, err); + throw err; + } + }, + }); return { - isGenuine, - dbType: serverName, + // Actually, we can't say for sure that 'unknown' is genuine, + // but we cannot say that it's non-genuine either. + isGenuine: serverName === 'mongodb' || serverName === 'unknown', + serverName, }; } diff --git a/packages/instance-model/index.d.ts b/packages/instance-model/index.d.ts index 3cc3b206e02..71add6552e9 100644 --- a/packages/instance-model/index.d.ts +++ b/packages/instance-model/index.d.ts @@ -59,7 +59,7 @@ interface BuildInfo { interface GenuineMongoDB { isGenuine: boolean; - dbType: string; + serverName: string; } interface DataLake { diff --git a/packages/instance-model/lib/model.js b/packages/instance-model/lib/model.js index 7cfb2cd638c..0d2238ebcf6 100644 --- a/packages/instance-model/lib/model.js +++ b/packages/instance-model/lib/model.js @@ -88,7 +88,7 @@ const BuildInfo = AmpersandModel.extend({ const GenuineMongoDB = AmpersandModel.extend({ props: { isGenuine: { type: 'boolean', default: true }, - dbType: 'string', + serverName: 'string', }, });