-
Notifications
You must be signed in to change notification settings - Fork 246
Connectivity debug script
Maurizio Casimirri edited this page Oct 6, 2020
·
8 revisions
What follows is a script that can be uses to debug connectivity and isolate the root cause of issues directly inside Compass.
- Open
DevToolsin compass. - Copy/paste the script below in the console.
- Run one of the available test, ie.
connectivityTests.testNativeDriverUri('mongodb://localhost:27017'). - Wait for the test to print
"Done. Test succeeded.". If that message is not printed the connection was not established correctly.
Tests the connection simulating the process happening in Compass when connecting with a connection string.
connectivityTests.testConnectionModelUri('mongodb://localhost:27017')`;Tests the connection simulating the process happening in Compass when connecting with form parameters.
Basic standalone server:
connectivityTests.testConnectionModelAttributes({
"isSrvRecord": false,
"hostname": "localhost",
"port": 27017,
"hosts": [
{
"host": "localhost",
"port": 27017
}
],
"authStrategy": "NONE"
})`;Kerberos:
connectivityTests.testConnectionModelAttributes({
"isSrvRecord": false,
"hostname": "<server hostname>",
"port": <server port>,
"hosts": [
{
"host": "<server hostname>",
"port": <server port>
}
],
"authStrategy": "KERBEROS",
"kerberosServiceName": "<kerberos service name>",
"kerberosPrincipal": "<kerberos principal>",
"kerberosCanonicalizeHostname": false
});LDAP:
connectivityTests.testConnectionModelAttributes({
"isSrvRecord": false,
"hostname": "<server hostname>",
"port": <server port>,
"hosts": [
{
"host": "<server hostname>",
"port": <server port>
}
],
"authStrategy": "LDAP",
"ldapUsername": "<ldap username>",
"ldapPassword": "<ldap password>"
});Tests the connection using the same node.js driver and default options as the Compass does. Default driver options are:
{
connectWithNoPrimary: true,
readPreference: "primary",
useNewUrlParser: true,
useUnifiedTopology: true
}connectivityTests.testNativeDriverUri('mongodb://localhost:27017')`;Overriding driver options:
connectivityTests.testNativeDriverUri('mongodb://localhost:27017', { useUnifiedTopology: false })`;This a wrapper around testNativeDriverUri to simplify testing of kerberos connection.
connectivityTests.testNativeDriverKerberos(
{
principal: '[email protected]',
server: 'localhost',
gssapiServiceName: 'mongodb'
},
{ useUnifiedTopology: true }
);
connectivityTests = (() => {
console.log('using driver version:', require('mongodb/package.json').version);
console.log('using mongodb-connection-model version:', require('mongodb-connection-model/package.json').version);
console.log('using kerberos extension version:', require('kerberos/package.json').version);
const util = require('util');
const { MongoClient } = require('mongodb');
const Connection = require('mongodb-connection-model');
const connectionModelFromUri = util.promisify(Connection.from.bind(Connection));
const connectWithConnectionModel = util.promisify(Connection.connect.bind(Connection));
async function testAndCloseClient(client) {
console.log('connected')
console.log('testing commands ...');
try {
await client.db().command({ connectionStatus: 1 });
console.log('Done. Test succeeded.');
} catch (e) {
console.log('Error', e);
} finally {
if (!client) {
return;
}
await client.close();
}
}
async function testConnectionModelAttributes(attributes) {
const connectionModel = new Connection(attributes);
console.log('Connecting ...');
const client = await connectWithConnectionModel(connectionModel, () => { });
await testAndCloseClient(client);
}
async function testConnectionModelUri(uri) {
const connectionModel = await connectionModelFromUri(uri);
console.log('Connecting ...');
const client = await connectWithConnectionModel(connectionModel, () => { });
await testAndCloseClient(client);
}
async function testNativeDriverUri(uri, driverOptions = {}) {
driverOptions = {
connectWithNoPrimary: true,
readPreference: "primary",
useNewUrlParser: true,
useUnifiedTopology: true,
...driverOptions
};
console.log('Connecting ...');
const client = await MongoClient.connect(uri, driverOptions);
await testAndCloseClient(client);
}
function buildConnectionString(connectionString, options = {}) {
const {
username,
password,
searchParams
} = options;
const connectionStringUrl = new URL(connectionString);
if (username) {
connectionStringUrl.username = username;
}
if (password) {
connectionStringUrl.password = password;
}
if (searchParams) {
for (const [name, value] of Object.entries(searchParams)) {
connectionStringUrl.searchParams.append(name, value);
}
}
return connectionStringUrl.toString();
}
return {
testConnectionModelAttributes,
testConnectionModelUri,
testNativeDriverUri,
buildConnectionString
};
})();