diff options
author | A. Jesse Jiryu Davis <jesse@mongodb.com> | 2020-08-10 11:01:48 -0400 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-08-11 14:26:02 +0000 |
commit | cf8949deb58129f7d01084ef6f01c495a70da94c (patch) | |
tree | 0f2004714a53195022ba7a4501675dc7b89cc1df | |
parent | d3a19d99832e817a7f241cf1a295f53d2065af25 (diff) | |
download | mongo-cf8949deb58129f7d01084ef6f01c495a70da94c.tar.gz |
SERVER-49887 Add requireApiVersion server parameter
-rw-r--r-- | jstests/core/require_api_version.js | 28 | ||||
-rw-r--r-- | src/mongo/db/initialize_api_parameters.cpp | 4 | ||||
-rw-r--r-- | src/mongo/db/initialize_api_parameters.idl | 10 |
3 files changed, 41 insertions, 1 deletions
diff --git a/jstests/core/require_api_version.js b/jstests/core/require_api_version.js new file mode 100644 index 00000000000..19062a3b49a --- /dev/null +++ b/jstests/core/require_api_version.js @@ -0,0 +1,28 @@ +/** + * Tests the "requireApiVersion" mongod/mongos parameter. + * + * @tags: [ + * assumes_superuser_permissions, + * requires_fcv_47, + * # Cannot change primary or read from secondary after setting primary parameter. + * assumes_read_preference_unchanged, + * does_not_support_stepdowns, + * ] + */ + +// Background commands will fail while requireApiVersion is true. +TestData.skipCheckingUUIDsConsistentAcrossCluster = true; +TestData.skipCheckingIndexesConsistentAcrossCluster = true; +TestData.skipCheckDBHashes = true; +TestData.skipCheckOrphans = true; + +(function() { +"use strict"; + +assert.commandWorked(db.adminCommand({setParameter: 1, requireApiVersion: true})); +assert.commandFailedWithCode(db.adminCommand({ping: 1}), 498870, "command without apiVersion"); +assert.commandWorked(db.adminCommand({ping: 1, apiVersion: "1"})); +assert.commandFailed(db.adminCommand({ping: 1, apiVersion: "not a real API version"})); +assert.commandWorked(db.adminCommand({setParameter: 1, requireApiVersion: false, apiVersion: "1"})); +assert.commandWorked(db.adminCommand({ping: 1})); +}()); diff --git a/src/mongo/db/initialize_api_parameters.cpp b/src/mongo/db/initialize_api_parameters.cpp index ed7245d7d41..dec5e477fa1 100644 --- a/src/mongo/db/initialize_api_parameters.cpp +++ b/src/mongo/db/initialize_api_parameters.cpp @@ -37,6 +37,10 @@ const APIParametersFromClient initializeAPIParameters(const BSONObj& requestBody auto apiParamsFromClient = APIParametersFromClient::parse("APIParametersFromClient"_sd, requestBody); + if (gRequireApiVersion.load()) { + uassert(498870, "Missing apiVersion parameter", apiParamsFromClient.getApiVersion()); + } + if (apiParamsFromClient.getApiDeprecationErrors() || apiParamsFromClient.getApiStrict()) { uassert(4886600, "Provided apiStrict and/or apiDeprecationErrors without passing apiVersion", diff --git a/src/mongo/db/initialize_api_parameters.idl b/src/mongo/db/initialize_api_parameters.idl index d44c7402603..14ac4c5f439 100644 --- a/src/mongo/db/initialize_api_parameters.idl +++ b/src/mongo/db/initialize_api_parameters.idl @@ -54,4 +54,12 @@ structs: description: "With apiVersion: 'V' and apiDeprecationErrors: true, the server rejects requests to use behaviors deprecated in V in the current MongoDB release" type: bool - optional: true
\ No newline at end of file + optional: true + +server_parameters: + requireApiVersion: + description: "Require clients to pass the 'apiVersion' parameter with all commands" + set_at: ["startup", "runtime"] + cpp_vartype: 'AtomicWord<bool>' + cpp_varname: "gRequireApiVersion" + default: false |