Files
mongo/jstests/auth/copyauth.js
Kaloian Manassiev 3ed6635a5f SERVER-21050 Cleanup ReplSetTest
This is just a cleanup work to hide some of the private state of
ReplSetTest so it is easier to encapsulate and add new logic. Also enables
strict mode.
2015-12-08 13:05:00 -05:00

236 lines
8.9 KiB
JavaScript

// Test copyDatabase command with various combinations of authed/unauthed and single node/replica
// set source and dest.
TestData.authMechanism = "SCRAM-SHA-1"; // SERVER-11428
DB.prototype._defaultAuthenticationMechanism = "SCRAM-SHA-1"; // SERVER-11428
var baseName = "jstests_clone_copyauth";
/*
* Helper to spawn a replica set, sharded cluster, or a single mongod and hide it all behind the
* same interface.
*
* Arguments:
*
* clusterType - type of cluster to start. Options are "sharded", "repl", or "single".
* startWithAuth - whether to start the cluster with authentication.
*
* Member variables:
*
* conn - a connection to the node used to access this cluster, whether it's the mongod, a primary
* mongod in a replica set, or a mongos.
* connString - the full connection string used to connect to this cluster. For a replica set this
* is the full connection string including the replica set name.
*
* Member functions:
*
* stop() - stop and cleanup whatever nodes the helper spawned when it was created.
*/
function ClusterSpawnHelper(clusterType, startWithAuth) {
if (clusterType === "sharded") {
var shardingTestConfig = {
name : baseName + "_source",
mongos : 1,
shards : 1,
config : 1
}
if (startWithAuth) {
shardingTestConfig.auth = "";
shardingTestConfig.keyFile = "jstests/libs/key1";
}
var shardingTest = new ShardingTest(shardingTestConfig);
this.conn = shardingTest.s;
this.connString = this.conn.host;
}
else if (clusterType === "repl") {
var replSetTestConfig = { name: baseName + "_source", nodes: 3, nodeOptions: {} };
if (startWithAuth) {
replSetTestConfig.nodeOptions.auth = "";
replSetTestConfig.nodeOptions.keyFile = "jstests/libs/key1";
}
var replSetTest = new ReplSetTest(replSetTestConfig);
replSetTest.startSet();
replSetTest.initiate();
if (startWithAuth) {
authutil.asCluster(replSetTest.nodes,
replSetTestConfig.nodeOptions.keyFile,
function() { replSetTest.awaitReplication(); });
}
else {
replSetTest.awaitReplication();
}
this.conn = replSetTest.getPrimary();
this.connString = replSetTest.getURL();
}
else {
var singleNodeConfig = {};
if (startWithAuth) {
singleNodeConfig.auth = "";
}
this.conn = MongoRunner.runMongod(singleNodeConfig);
this.connString = this.conn.host;
}
this.stop = function () {
if (clusterType === "sharded") {
shardingTest.stop();
}
else if (clusterType === "repl") {
replSetTest.stopSet();
}
else {
MongoRunner.stopMongod(this.conn.port);
}
}
}
/*
* Helper to test the running the "copydb" command between various kinds of clusters and various
* combinations of authentication on the source and target.
*
* @param {Object} configObj
*
* {
* sourceClusterType {string}: Type of cluster to use as the source of the copy. Options are
* "single", "repl", "sharded".
* isSourceUsingAuth {bool}: Whether to use auth in the source cluster for the copy.
* targetClusterType {string}: Type of cluster to use as the target of the copy. Options are
* "single", "repl", "sharded".
* isTargetUsingAuth {bool}: Whether to use auth in the target cluster for the copy.
* }
*/
function copydbBetweenClustersTest(configObj) {
// First sanity check the arguments in our configObj
var requiredKeys = [
'sourceClusterType',
'isSourceUsingAuth',
'targetClusterType',
'isTargetUsingAuth'
]
var i;
for (i = 0; i < requiredKeys.length; i++) {
assert(configObj.hasOwnProperty(requiredKeys[i]),
"Missing required key: " + requiredKeys[i] + " in config object");
}
// 1. Get a connection to the source database, insert data and setup auth if applicable
source = new ClusterSpawnHelper(configObj.sourceClusterType, configObj.isSourceUsingAuth);
if (configObj.isSourceUsingAuth) {
// Create a super user so we can create a regular user and not be locked out afterwards
source.conn.getDB("admin").createUser({ user: "sourceSuperUser", pwd: "sourceSuperUser",
roles: [ "root" ] });
source.conn.getDB("admin").auth("sourceSuperUser", "sourceSuperUser");
source.conn.getDB(baseName)[baseName].save({i:1});
assert.eq(1, source.conn.getDB(baseName)[baseName].count());
assert.eq(1, source.conn.getDB(baseName)[baseName].findOne().i);
// Insert a document and create a regular user that we will use for the target
// authenticating with the source
source.conn.getDB(baseName).createUser({ user: "foo", pwd: "bar",
roles: [ "dbOwner" ] });
source.conn.getDB("admin").logout();
assert.throws(function() { source.conn.getDB(baseName)[baseName].findOne(); });
} else {
source.conn.getDB(baseName)[baseName].save({i:1});
assert.eq(1, source.conn.getDB(baseName)[baseName].count());
assert.eq(1, source.conn.getDB(baseName)[baseName].findOne().i);
}
// 2. Get a connection to the target database, and set up auth if necessary
target = new ClusterSpawnHelper(configObj.targetClusterType, configObj.isTargetUsingAuth);
if (configObj.isTargetUsingAuth) {
target.conn.getDB("admin").createUser({ user: "targetSuperUser", pwd: "targetSuperUser",
roles: [ "root" ] });
assert.throws(function() { target.conn.getDB(baseName)[baseName].findOne(); });
target.conn.getDB("admin").auth("targetSuperUser", "targetSuperUser");
}
// 3. Run the copydb command
target.conn.getDB(baseName).dropDatabase();
assert.eq(0, target.conn.getDB(baseName)[baseName].count());
if (configObj.isSourceUsingAuth) {
// We only need to pass username and password if the target has to send authentication
// information to the source cluster
assert.commandWorked(target.conn.getDB(baseName).copyDatabase(baseName, baseName,
source.connString,
"foo", "bar"));
}
else {
// We are copying from a cluster with no auth
assert.commandWorked(target.conn.getDB(baseName).copyDatabase(baseName, baseName,
source.connString));
}
assert.eq(1, target.conn.getDB(baseName)[baseName].count());
assert.eq(1, target.conn.getDB(baseName)[baseName].findOne().i);
// 4. Do any necessary cleanup
source.stop();
target.stop();
}
(function() {
"use strict"
var sourceClusterTypeValues = [ "single", "repl", "sharded" ]
var isSourceUsingAuthValues = [ true, false ]
var targetClusterTypeValues = [ "single", "repl", "sharded" ]
var isTargetUsingAuthValues = [ true, false ]
for (var i = 0; i < sourceClusterTypeValues.length; i++) {
for (var j = 0; j < isSourceUsingAuthValues.length; j++) {
for (var k = 0; k < targetClusterTypeValues.length; k++) {
for (var l = 0; l < isTargetUsingAuthValues.length; l++) {
if (sourceClusterTypeValues[i] === "sharded" &&
targetClusterTypeValues[k] === "sharded") {
// SERVER-13112
continue;
}
if (sourceClusterTypeValues[i] === "repl" &&
targetClusterTypeValues[k] === "repl") {
// SERVER-13077
continue;
}
if (isSourceUsingAuthValues[j] === true &&
targetClusterTypeValues[k] === "sharded") {
// SERVER-6427
continue;
}
if (sourceClusterTypeValues[i] === "repl" &&
isSourceUsingAuthValues[j] === false &&
targetClusterTypeValues[k] === "sharded" &&
isTargetUsingAuthValues[l] == true) {
// SERVER-18103
continue;
}
var testCase = {
'sourceClusterType' : sourceClusterTypeValues[i],
'isSourceUsingAuth' : isSourceUsingAuthValues[j],
'targetClusterType' : targetClusterTypeValues[k],
'isTargetUsingAuth' : isTargetUsingAuthValues[l]
}
print("Running copydb with auth test:");
printjson(testCase);
copydbBetweenClustersTest(testCase);
}
}
}
}
}());
print(baseName + " success!");