summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorA. Jesse Jiryu Davis <jesse@mongodb.com>2020-08-10 11:01:48 -0400
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-08-11 14:26:02 +0000
commitcf8949deb58129f7d01084ef6f01c495a70da94c (patch)
tree0f2004714a53195022ba7a4501675dc7b89cc1df
parentd3a19d99832e817a7f241cf1a295f53d2065af25 (diff)
downloadmongo-cf8949deb58129f7d01084ef6f01c495a70da94c.tar.gz
SERVER-49887 Add requireApiVersion server parameter
-rw-r--r--jstests/core/require_api_version.js28
-rw-r--r--src/mongo/db/initialize_api_parameters.cpp4
-rw-r--r--src/mongo/db/initialize_api_parameters.idl10
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