/**
 * Test for making sure that the replica seed list in the config server does not
 * become invalid when a replica set reconfig happens.
 */
(function() {
    "use strict";

    var NODE_COUNT = 3;
    var st = new ShardingTest({shards: {rs0: {nodes: NODE_COUNT, oplogSize: 10}}});
    var replTest = st.rs0;
    var mongos = st.s;

    var shardDoc = mongos.getDB('config').shards.findOne();
    assert.eq(NODE_COUNT, shardDoc.host.split(',').length);  // seed list should contain all nodes

    /* Make sure that the first node is not the primary (by making the second one primary).
     * We need to do this since the ReplicaSetMonitor iterates over the nodes one
     * by one and you can't remove a node that is currently the primary.
     */
    var connPoolStats = mongos.getDB('admin').runCommand({connPoolStats: 1});
    var targetHostName = connPoolStats['replicaSets'][replTest.name].hosts[1].addr;

    var priConn = replTest.getPrimary();
    var confDoc = priConn.getDB("local").system.replset.findOne();

    for (var idx = 0; idx < confDoc.members.length; idx++) {
        if (confDoc.members[idx].host == targetHostName) {
            confDoc.members[idx].priority = 100;
        } else {
            confDoc.members[idx].priority = 1;
        }
    }

    confDoc.version++;

    jsTest.log('Changing conf to ' + tojson(confDoc));

    try {
        priConn.getDB('admin').adminCommand({replSetReconfig: confDoc});
    } catch (x) {
        print('Expected exception because of reconfig' + x);
    }

    ReplSetTest.awaitRSClientHosts(mongos, {host: targetHostName}, {ok: true, ismaster: true});

    // Remove first node from set
    confDoc.members.shift();
    confDoc.version++;

    try {
        replTest.getPrimary().getDB('admin').adminCommand({replSetReconfig: confDoc});
    } catch (x) {
        print('Expected exception because of reconfig: ' + x);
    }

    assert.soon(function() {
        var connPoolStats = mongos.getDB('admin').runCommand('connPoolStats');
        var replView = connPoolStats.replicaSets[replTest.name].hosts;
        jsTest.log('current replView: ' + tojson(replView));

        return replView.length == NODE_COUNT - 1;
    });

    assert.soon(function() {
        shardDoc = mongos.getDB('config').shards.findOne();
        jsTest.log('shardDoc: ' + tojson(shardDoc));
        // seed list should contain one less node
        return shardDoc.host.split(',').length == NODE_COUNT - 1;
    });

    st.stop();

}());