0
0
mirror of https://github.com/mongodb/mongo.git synced 2024-12-01 09:32:32 +01:00
mongodb/jstests/multiVersion/genericSetFCVUsage/add_invalid_shard.js

105 lines
3.6 KiB
JavaScript

/**
* Test that adding invalid or duplicate shards will fail.
*
*/
(function() {
"use strict";
const st = new ShardingTest({shards: 1});
const configDB = st.s.getDB('config');
const shardDoc = configDB.shards.findOne();
/**
* @summary Starts a new replica set with the specified binVersion and replicaName.
* Tests that we can't add that replicaSet as a shard to our existing cluster. Once the assertion
* completes successfully, it will stop the replica set.
* @param {string} binVersion The binVersion to configure the replica set with.
* @param {string} replicaName The name given to the replica set.
*/
const executeOldBinaryTest = (binVersion) => {
jsTest.log(`Executing binary test for binVersion ${binVersion}`);
const oldBinaryReplTest = new ReplSetTest({nodes: 2, nodeOptions: {binVersion, shardsvr: ""}});
oldBinaryReplTest.startSet();
oldBinaryReplTest.initiate();
const connectionString = oldBinaryReplTest.getURL();
assert.commandFailed(st.admin.runCommand({addshard: connectionString}));
oldBinaryReplTest.stopSet();
};
/**
*
* @callback TestCaseGenerator
* @param {String} connectionString - The host URL of the replica set.
* @returns {Array<{addshard: string, name: string, setup: any}>} - An array of test cases to
* execute.
*/
/**
* @summary Receives a function that it can call to generate addshard command objects.
* It will then go through each command and assert that it will fail. After going through each
* command, it will stop the replica set.
* @param {TestCaseGenerator} createStandardTestCases
*/
const executeStandardTests = (createStandardTestCases) => {
jsTest.log("Starting to execute the standard test cases");
const replTest = new ReplSetTest({nodes: 2, nodeOptions: {shardsvr: ""}});
replTest.startSet({oplogSize: 10});
replTest.initiate();
const addShardCommands = createStandardTestCases(replTest.getURL());
addShardCommands.forEach(({addshard, name, setup}) => {
jsTest.log(`About to run addshard command with value ${addshard} and name ${name}`);
if (setup) {
setup();
}
assert.commandFailed(st.admin.runCommand({addshard: addshard, name: name}));
});
replTest.stopSet();
};
// ---- TEST CASES ----
// Can't add a mongod with a lower binary version than our featureCompatibilityVersion.
executeOldBinaryTest("last-lts");
executeOldBinaryTest("last-continuous");
executeStandardTests((replicaSetConnectionURL) => {
const truncatedRSConnStr =
replicaSetConnectionURL.substring(0, replicaSetConnectionURL.indexOf(','));
return [
{
// Can't add replSet as shard if the name doesn't match the replSet config.
addshard: "prefix_" + replicaSetConnectionURL,
},
{
// Cannot add the same replSet shard host twice when using a unique shard name.
addshard: replicaSetConnectionURL,
name: 'dupRS',
setup: () => (assert.commandWorked(
st.admin.runCommand({addshard: replicaSetConnectionURL, name: 'dummyRS'})))
},
{
// Cannot add a replica set connection string containing a member that isn't actually
// part of the replica set.
addshard: truncatedRSConnStr + 'fakehost',
name: 'dummyRS'
},
{addshard: shardDoc.host, name: 'dupShard'},
{addshard: st._configDB}, // Can't add config servers as shard.
];
});
// Can't add mongos as shard.
assert.commandFailedWithCode(st.admin.runCommand({addshard: st.s.host}),
ErrorCodes.IllegalOperation);
st.stop();
})();