mongo/jstests/sharding/auth_sharding_cmd_metadata.js

52 lines
2.0 KiB
JavaScript

/**
* Tests that only the internal user will be able to advance the config server opTime.
*/
import {ShardingTest} from "jstests/libs/shardingtest.js";
// The index consistency checker doesn't take into account that
// authentication is needed for contacting shard0 of this cluster
TestData.skipCheckingIndexesConsistentAcrossCluster = true;
function getConfigOpTime() {
let srvStatus = assert.commandWorked(shardTestDB.serverStatus());
assert.hasFields(srvStatus, ["sharding"]);
return srvStatus.sharding.lastSeenConfigServerOpTime.ts;
}
let st = new ShardingTest({shards: 1, other: {keyFile: "jstests/libs/key1"}});
const mongosAdminDB = st.s.getDB("admin");
mongosAdminDB.createUser({user: "foo", pwd: "bar", roles: jsTest.adminUserRoles});
mongosAdminDB.auth("foo", "bar");
st.adminCommand({enableSharding: "test"});
st.adminCommand({shardCollection: "test.user", key: {x: 1}});
const shardAdminDB = st.rs0.getPrimary().getDB("admin");
const shardTestDB = st.rs0.getPrimary().getDB("test");
// ConfigOpTime can't be advanced from external clients
if (TestData.configShard) {
// We've already used up the localhost bypass in config shard mode, so we have to log in to
// create the user below.
shardAdminDB.auth("foo", "bar");
}
shardAdminDB.createUser({user: "user", pwd: "pwd", roles: jsTest.adminUserRoles});
if (TestData.configShard) {
shardAdminDB.logout();
}
shardAdminDB.auth("user", "pwd");
const newTimestamp = Timestamp(getConfigOpTime().getTime() + 1000, 0);
assert.commandWorked(shardTestDB.runCommand({ping: 1, $configTime: newTimestamp}));
assert(timestampCmp(getConfigOpTime(), newTimestamp) < 0, "Unexpected ConfigOpTime advancement");
shardAdminDB.createUser({user: "internal", pwd: "pwd", roles: ["__system"]});
shardAdminDB.auth("internal", "pwd");
assert.commandWorked(shardTestDB.runCommand({ping: 1, $configTime: newTimestamp}));
assert(timestampCmp(getConfigOpTime(), newTimestamp) < 0, "Unexpected ConfigOpTime advancement");
mongosAdminDB.logout();
shardAdminDB.logout();
st.stop();