summaryrefslogtreecommitdiff
path: root/jstests/sharding/enable_sharding.js
blob: 91285a383eb657f0cce0630efa78b665eb5454aa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
//
// Basic tests for enableSharding command.
//

(function() {
'use strict';

load("jstests/libs/feature_flag_util.js");  // for FeatureFlagUtil.isEnabled

var st = new ShardingTest({shards: 2});

jsTest.log('enableSharding can run only against the admin database');
{
    assert.commandFailedWithCode(st.s0.getDB('test').runCommand({enableSharding: 'db'}),
                                 ErrorCodes.Unauthorized);
}

jsTest.log('Cannot shard system databases except for the config db');
{
    assert.commandWorked(st.s0.adminCommand({enableSharding: 'config'}));
    assert.commandFailed(st.s0.adminCommand({enableSharding: 'local'}));
    assert.commandFailed(st.s0.adminCommand({enableSharding: 'admin'}));
}

jsTest.log('Cannot shard db with the name that just differ on case');
{
    assert.commandWorked(st.s0.adminCommand({enableSharding: 'db'}));
    assert.eq(1, st.config.databases.countDocuments({_id: 'db'}));
    assert.commandFailedWithCode(st.s0.adminCommand({enableSharding: 'DB'}),
                                 ErrorCodes.DatabaseDifferCase);
}

jsTest.log('Cannot shard invalid db name');
{
    assert.commandFailed(st.s0.adminCommand({enableSharding: 'a.b'}));
    assert.commandFailed(st.s0.adminCommand({enableSharding: ''}));
}

jsTest.log('Attempting to shard already sharded database returns success');
{
    assert.commandWorked(st.s0.adminCommand({enableSharding: 'db'}));
    assert.eq(1, st.config.databases.countDocuments({_id: 'db'}));
}

jsTest.log('Implicit db creation when writing to an unsharded collection');
{
    assert.commandWorked(st.s0.getDB('unsharded').foo.insert({aKey: "aValue"}));
    assert.eq(1, st.config.databases.countDocuments({_id: 'unsharded'}));
}

jsTest.log('Sharding a collection before enableSharding works');
{ assert.commandWorked(st.s.adminCommand({shardCollection: 'testdb.testcoll', key: {_id: 1}})); }

jsTest.log('Cannot enable sharding on a database using a wrong shard name');
{
    assert.commandFailed(st.s0.adminCommand(
        {enableSharding: 'db2', primaryShard: st.shard1.shardName + '_unenxisting_name_postfix'}));
}

jsTest.log('Enabling sharding on a database with a valid shard name must work');
{
    assert.commandWorked(
        st.s0.adminCommand({enableSharding: 'db_on_shard0', primaryShard: st.shard0.shardName}));
    assert.commandWorked(
        st.s0.adminCommand({enableSharding: 'db_on_shard1', primaryShard: st.shard1.shardName}));
    assert.eq(st.s0.getDB('config').databases.findOne({_id: 'db_on_shard0'}).primary,
              st.shard0.shardName);
    assert.eq(st.s0.getDB('config').databases.findOne({_id: 'db_on_shard1'}).primary,
              st.shard1.shardName);
}

jsTest.log(
    'Enable sharding on a database already created with the correct primary shard name must work');
{
    assert.commandWorked(
        st.s0.adminCommand({enableSharding: 'db_on_shard0', primaryShard: st.shard0.shardName}));
    assert.commandWorked(
        st.s0.adminCommand({enableSharding: 'db_on_shard1', primaryShard: st.shard1.shardName}));
}

jsTest.log(
    'Cannot enable sharding of a database already created with a different primary shard name');
{
    assert.commandFailedWithCode(
        st.s0.adminCommand({enableSharding: 'db_on_shard0', primaryShard: st.shard1.shardName}),
        ErrorCodes.NamespaceExists);
    assert.commandFailedWithCode(
        st.s0.adminCommand({enableSharding: 'db_on_shard1', primaryShard: st.shard0.shardName}),
        ErrorCodes.NamespaceExists);
}

st.stop();
})();