MULTI_NODE_MULTI_WRITER for block access by default
Signed-off-by: Travis Glenn Hansen <travisghansen@yahoo.com>
This commit is contained in:
parent
b205073280
commit
53b6cc183d
|
|
@ -1,3 +1,12 @@
|
||||||
|
# v1.8.2
|
||||||
|
|
||||||
|
Released 2023-04-01
|
||||||
|
|
||||||
|
- more comprehensive support to manually set `access_modes`
|
||||||
|
- more intelligent handling of `access_modes` when `access_type=block`
|
||||||
|
- https://github.com/ceph/ceph-csi/blob/devel/examples/README.md#how-to-test-rbd-multi_node_multi_writer-block-feature
|
||||||
|
- others? allow this by default
|
||||||
|
|
||||||
# v1.8.1
|
# v1.8.1
|
||||||
|
|
||||||
Released 2023-02-25
|
Released 2023-02-25
|
||||||
|
|
|
||||||
|
|
@ -104,6 +104,33 @@ class ControllerClientCommonDriver extends CsiBaseDriver {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getAccessModes(capability) {
|
||||||
|
let access_modes = _.get(this.options, "csi.access_modes", null);
|
||||||
|
if (access_modes !== null) {
|
||||||
|
return access_modes;
|
||||||
|
}
|
||||||
|
|
||||||
|
access_modes = [
|
||||||
|
"UNKNOWN",
|
||||||
|
"SINGLE_NODE_WRITER",
|
||||||
|
"SINGLE_NODE_SINGLE_WRITER", // added in v1.5.0
|
||||||
|
"SINGLE_NODE_MULTI_WRITER", // added in v1.5.0
|
||||||
|
"SINGLE_NODE_READER_ONLY",
|
||||||
|
"MULTI_NODE_READER_ONLY",
|
||||||
|
"MULTI_NODE_SINGLE_WRITER",
|
||||||
|
"MULTI_NODE_MULTI_WRITER",
|
||||||
|
];
|
||||||
|
|
||||||
|
if (
|
||||||
|
capability.access_type == "block" &&
|
||||||
|
!access_modes.includes("MULTI_NODE_MULTI_WRITER")
|
||||||
|
) {
|
||||||
|
access_modes.push("MULTI_NODE_MULTI_WRITER");
|
||||||
|
}
|
||||||
|
|
||||||
|
return access_modes;
|
||||||
|
}
|
||||||
|
|
||||||
assertCapabilities(capabilities) {
|
assertCapabilities(capabilities) {
|
||||||
const driver = this;
|
const driver = this;
|
||||||
this.ctx.logger.verbose("validating capabilities: %j", capabilities);
|
this.ctx.logger.verbose("validating capabilities: %j", capabilities);
|
||||||
|
|
@ -126,16 +153,7 @@ class ControllerClientCommonDriver extends CsiBaseDriver {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
![
|
!this.getAccessModes(capability).includes(capability.access_mode.mode)
|
||||||
"UNKNOWN",
|
|
||||||
"SINGLE_NODE_WRITER",
|
|
||||||
"SINGLE_NODE_SINGLE_WRITER", // added in v1.5.0
|
|
||||||
"SINGLE_NODE_MULTI_WRITER", // added in v1.5.0
|
|
||||||
"SINGLE_NODE_READER_ONLY",
|
|
||||||
"MULTI_NODE_READER_ONLY",
|
|
||||||
"MULTI_NODE_SINGLE_WRITER",
|
|
||||||
"MULTI_NODE_MULTI_WRITER",
|
|
||||||
].includes(capability.access_mode.mode)
|
|
||||||
) {
|
) {
|
||||||
message = `invalid access_mode, ${capability.access_mode.mode}`;
|
message = `invalid access_mode, ${capability.access_mode.mode}`;
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
|
|
@ -208,6 +208,47 @@ class ControllerSynologyDriver extends CsiBaseDriver {
|
||||||
return location;
|
return location;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getAccessModes(capability) {
|
||||||
|
let access_modes = _.get(this.options, "csi.access_modes", null);
|
||||||
|
if (access_modes !== null) {
|
||||||
|
return access_modes;
|
||||||
|
}
|
||||||
|
|
||||||
|
const driverResourceType = this.getDriverResourceType();
|
||||||
|
switch (driverResourceType) {
|
||||||
|
case "filesystem":
|
||||||
|
access_modes = [
|
||||||
|
"UNKNOWN",
|
||||||
|
"SINGLE_NODE_WRITER",
|
||||||
|
"SINGLE_NODE_SINGLE_WRITER", // added in v1.5.0
|
||||||
|
"SINGLE_NODE_MULTI_WRITER", // added in v1.5.0
|
||||||
|
"SINGLE_NODE_READER_ONLY",
|
||||||
|
"MULTI_NODE_READER_ONLY",
|
||||||
|
"MULTI_NODE_SINGLE_WRITER",
|
||||||
|
"MULTI_NODE_MULTI_WRITER",
|
||||||
|
];
|
||||||
|
case "volume":
|
||||||
|
access_modes = [
|
||||||
|
"UNKNOWN",
|
||||||
|
"SINGLE_NODE_WRITER",
|
||||||
|
"SINGLE_NODE_SINGLE_WRITER", // added in v1.5.0
|
||||||
|
"SINGLE_NODE_MULTI_WRITER", // added in v1.5.0
|
||||||
|
"SINGLE_NODE_READER_ONLY",
|
||||||
|
"MULTI_NODE_READER_ONLY",
|
||||||
|
"MULTI_NODE_SINGLE_WRITER",
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
capability.access_type == "block" &&
|
||||||
|
!access_modes.includes("MULTI_NODE_MULTI_WRITER")
|
||||||
|
) {
|
||||||
|
access_modes.push("MULTI_NODE_MULTI_WRITER");
|
||||||
|
}
|
||||||
|
|
||||||
|
return access_modes;
|
||||||
|
}
|
||||||
|
|
||||||
assertCapabilities(capabilities) {
|
assertCapabilities(capabilities) {
|
||||||
const driverResourceType = this.getDriverResourceType();
|
const driverResourceType = this.getDriverResourceType();
|
||||||
this.ctx.logger.verbose("validating capabilities: %j", capabilities);
|
this.ctx.logger.verbose("validating capabilities: %j", capabilities);
|
||||||
|
|
@ -233,16 +274,9 @@ class ControllerSynologyDriver extends CsiBaseDriver {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
![
|
!this.getAccessModes(capability).includes(
|
||||||
"UNKNOWN",
|
capability.access_mode.mode
|
||||||
"SINGLE_NODE_WRITER",
|
)
|
||||||
"SINGLE_NODE_SINGLE_WRITER", // added in v1.5.0
|
|
||||||
"SINGLE_NODE_MULTI_WRITER", // added in v1.5.0
|
|
||||||
"SINGLE_NODE_READER_ONLY",
|
|
||||||
"MULTI_NODE_READER_ONLY",
|
|
||||||
"MULTI_NODE_SINGLE_WRITER",
|
|
||||||
"MULTI_NODE_MULTI_WRITER",
|
|
||||||
].includes(capability.access_mode.mode)
|
|
||||||
) {
|
) {
|
||||||
message = `invalid access_mode, ${capability.access_mode.mode}`;
|
message = `invalid access_mode, ${capability.access_mode.mode}`;
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -263,15 +297,9 @@ class ControllerSynologyDriver extends CsiBaseDriver {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
![
|
!this.getAccessModes(capability).includes(
|
||||||
"UNKNOWN",
|
capability.access_mode.mode
|
||||||
"SINGLE_NODE_WRITER",
|
)
|
||||||
"SINGLE_NODE_SINGLE_WRITER", // added in v1.5.0
|
|
||||||
"SINGLE_NODE_MULTI_WRITER", // added in v1.5.0
|
|
||||||
"SINGLE_NODE_READER_ONLY",
|
|
||||||
"MULTI_NODE_READER_ONLY",
|
|
||||||
"MULTI_NODE_SINGLE_WRITER",
|
|
||||||
].includes(capability.access_mode.mode)
|
|
||||||
) {
|
) {
|
||||||
message = `invalid access_mode, ${capability.access_mode.mode}`;
|
message = `invalid access_mode, ${capability.access_mode.mode}`;
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
|
|
@ -110,7 +110,7 @@ class ControllerZfsLocalDriver extends ControllerZfsBaseDriver {
|
||||||
*
|
*
|
||||||
* @returns Array
|
* @returns Array
|
||||||
*/
|
*/
|
||||||
getAccessModes() {
|
getAccessModes(capability) {
|
||||||
let access_modes = _.get(this.options, "csi.access_modes", null);
|
let access_modes = _.get(this.options, "csi.access_modes", null);
|
||||||
if (access_modes !== null) {
|
if (access_modes !== null) {
|
||||||
return access_modes;
|
return access_modes;
|
||||||
|
|
@ -119,7 +119,7 @@ class ControllerZfsLocalDriver extends ControllerZfsBaseDriver {
|
||||||
const driverZfsResourceType = this.getDriverZfsResourceType();
|
const driverZfsResourceType = this.getDriverZfsResourceType();
|
||||||
switch (driverZfsResourceType) {
|
switch (driverZfsResourceType) {
|
||||||
case "filesystem":
|
case "filesystem":
|
||||||
return [
|
access_modes = [
|
||||||
"UNKNOWN",
|
"UNKNOWN",
|
||||||
"SINGLE_NODE_WRITER",
|
"SINGLE_NODE_WRITER",
|
||||||
"SINGLE_NODE_SINGLE_WRITER", // added in v1.5.0
|
"SINGLE_NODE_SINGLE_WRITER", // added in v1.5.0
|
||||||
|
|
@ -130,7 +130,7 @@ class ControllerZfsLocalDriver extends ControllerZfsBaseDriver {
|
||||||
"MULTI_NODE_MULTI_WRITER",
|
"MULTI_NODE_MULTI_WRITER",
|
||||||
];
|
];
|
||||||
case "volume":
|
case "volume":
|
||||||
return [
|
access_modes = [
|
||||||
"UNKNOWN",
|
"UNKNOWN",
|
||||||
"SINGLE_NODE_WRITER",
|
"SINGLE_NODE_WRITER",
|
||||||
"SINGLE_NODE_SINGLE_WRITER", // added in v1.5.0
|
"SINGLE_NODE_SINGLE_WRITER", // added in v1.5.0
|
||||||
|
|
@ -141,6 +141,15 @@ class ControllerZfsLocalDriver extends ControllerZfsBaseDriver {
|
||||||
"MULTI_NODE_MULTI_WRITER",
|
"MULTI_NODE_MULTI_WRITER",
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
capability.access_type == "block" &&
|
||||||
|
!access_modes.includes("MULTI_NODE_MULTI_WRITER")
|
||||||
|
) {
|
||||||
|
access_modes.push("MULTI_NODE_MULTI_WRITER");
|
||||||
|
}
|
||||||
|
|
||||||
|
return access_modes;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@ const MAX_ZVOL_NAME_LENGTH_CACHE_KEY = "controller-zfs:max_zvol_name_length";
|
||||||
* - async setZetabyteCustomOptions(options) // optional
|
* - async setZetabyteCustomOptions(options) // optional
|
||||||
* - getDriverZfsResourceType() // return "filesystem" or "volume"
|
* - getDriverZfsResourceType() // return "filesystem" or "volume"
|
||||||
* - getFSTypes() // optional
|
* - getFSTypes() // optional
|
||||||
* - getAccessModes() // optional
|
* - getAccessModes(capability) // optional
|
||||||
* - async getAccessibleTopology() // optional
|
* - async getAccessibleTopology() // optional
|
||||||
* - async createShare(call, datasetName) // return appropriate volume_context for Node operations
|
* - async createShare(call, datasetName) // return appropriate volume_context for Node operations
|
||||||
* - async deleteShare(call, datasetName) // no return expected
|
* - async deleteShare(call, datasetName) // no return expected
|
||||||
|
|
@ -207,7 +207,7 @@ class ControllerZfsBaseDriver extends CsiBaseDriver {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
getAccessModes() {
|
getAccessModes(capability) {
|
||||||
let access_modes = _.get(this.options, "csi.access_modes", null);
|
let access_modes = _.get(this.options, "csi.access_modes", null);
|
||||||
if (access_modes !== null) {
|
if (access_modes !== null) {
|
||||||
return access_modes;
|
return access_modes;
|
||||||
|
|
@ -216,7 +216,7 @@ class ControllerZfsBaseDriver extends CsiBaseDriver {
|
||||||
const driverZfsResourceType = this.getDriverZfsResourceType();
|
const driverZfsResourceType = this.getDriverZfsResourceType();
|
||||||
switch (driverZfsResourceType) {
|
switch (driverZfsResourceType) {
|
||||||
case "filesystem":
|
case "filesystem":
|
||||||
return [
|
access_modes = [
|
||||||
"UNKNOWN",
|
"UNKNOWN",
|
||||||
"SINGLE_NODE_WRITER",
|
"SINGLE_NODE_WRITER",
|
||||||
"SINGLE_NODE_SINGLE_WRITER", // added in v1.5.0
|
"SINGLE_NODE_SINGLE_WRITER", // added in v1.5.0
|
||||||
|
|
@ -227,7 +227,7 @@ class ControllerZfsBaseDriver extends CsiBaseDriver {
|
||||||
"MULTI_NODE_MULTI_WRITER",
|
"MULTI_NODE_MULTI_WRITER",
|
||||||
];
|
];
|
||||||
case "volume":
|
case "volume":
|
||||||
return [
|
access_modes = [
|
||||||
"UNKNOWN",
|
"UNKNOWN",
|
||||||
"SINGLE_NODE_WRITER",
|
"SINGLE_NODE_WRITER",
|
||||||
"SINGLE_NODE_SINGLE_WRITER", // added in v1.5.0
|
"SINGLE_NODE_SINGLE_WRITER", // added in v1.5.0
|
||||||
|
|
@ -237,6 +237,15 @@ class ControllerZfsBaseDriver extends CsiBaseDriver {
|
||||||
"MULTI_NODE_SINGLE_WRITER",
|
"MULTI_NODE_SINGLE_WRITER",
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
capability.access_type == "block" &&
|
||||||
|
!access_modes.includes("MULTI_NODE_MULTI_WRITER")
|
||||||
|
) {
|
||||||
|
access_modes.push("MULTI_NODE_MULTI_WRITER");
|
||||||
|
}
|
||||||
|
|
||||||
|
return access_modes;
|
||||||
}
|
}
|
||||||
|
|
||||||
assertCapabilities(capabilities) {
|
assertCapabilities(capabilities) {
|
||||||
|
|
@ -261,7 +270,11 @@ class ControllerZfsBaseDriver extends CsiBaseDriver {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this.getAccessModes().includes(capability.access_mode.mode)) {
|
if (
|
||||||
|
!this.getAccessModes(capability).includes(
|
||||||
|
capability.access_mode.mode
|
||||||
|
)
|
||||||
|
) {
|
||||||
message = `invalid access_mode, ${capability.access_mode.mode}`;
|
message = `invalid access_mode, ${capability.access_mode.mode}`;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
@ -278,7 +291,11 @@ class ControllerZfsBaseDriver extends CsiBaseDriver {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this.getAccessModes().includes(capability.access_mode.mode)) {
|
if (
|
||||||
|
!this.getAccessModes(capability).includes(
|
||||||
|
capability.access_mode.mode
|
||||||
|
)
|
||||||
|
) {
|
||||||
message = `invalid access_mode, ${capability.access_mode.mode}`;
|
message = `invalid access_mode, ${capability.access_mode.mode}`;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2017,6 +2017,47 @@ class FreeNASApiDriver extends CsiBaseDriver {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getAccessModes(capability) {
|
||||||
|
let access_modes = _.get(this.options, "csi.access_modes", null);
|
||||||
|
if (access_modes !== null) {
|
||||||
|
return access_modes;
|
||||||
|
}
|
||||||
|
|
||||||
|
const driverZfsResourceType = this.getDriverZfsResourceType();
|
||||||
|
switch (driverZfsResourceType) {
|
||||||
|
case "filesystem":
|
||||||
|
access_modes = [
|
||||||
|
"UNKNOWN",
|
||||||
|
"SINGLE_NODE_WRITER",
|
||||||
|
"SINGLE_NODE_SINGLE_WRITER", // added in v1.5.0
|
||||||
|
"SINGLE_NODE_MULTI_WRITER", // added in v1.5.0
|
||||||
|
"SINGLE_NODE_READER_ONLY",
|
||||||
|
"MULTI_NODE_READER_ONLY",
|
||||||
|
"MULTI_NODE_SINGLE_WRITER",
|
||||||
|
"MULTI_NODE_MULTI_WRITER",
|
||||||
|
];
|
||||||
|
case "volume":
|
||||||
|
access_modes = [
|
||||||
|
"UNKNOWN",
|
||||||
|
"SINGLE_NODE_WRITER",
|
||||||
|
"SINGLE_NODE_SINGLE_WRITER", // added in v1.5.0
|
||||||
|
"SINGLE_NODE_MULTI_WRITER", // added in v1.5.0
|
||||||
|
"SINGLE_NODE_READER_ONLY",
|
||||||
|
"MULTI_NODE_READER_ONLY",
|
||||||
|
"MULTI_NODE_SINGLE_WRITER",
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
capability.access_type == "block" &&
|
||||||
|
!access_modes.includes("MULTI_NODE_MULTI_WRITER")
|
||||||
|
) {
|
||||||
|
access_modes.push("MULTI_NODE_MULTI_WRITER");
|
||||||
|
}
|
||||||
|
|
||||||
|
return access_modes;
|
||||||
|
}
|
||||||
|
|
||||||
assertCapabilities(capabilities) {
|
assertCapabilities(capabilities) {
|
||||||
const driverZfsResourceType = this.getDriverZfsResourceType();
|
const driverZfsResourceType = this.getDriverZfsResourceType();
|
||||||
this.ctx.logger.verbose("validating capabilities: %j", capabilities);
|
this.ctx.logger.verbose("validating capabilities: %j", capabilities);
|
||||||
|
|
@ -2040,16 +2081,9 @@ class FreeNASApiDriver extends CsiBaseDriver {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
![
|
!this.getAccessModes(capability).includes(
|
||||||
"UNKNOWN",
|
capability.access_mode.mode
|
||||||
"SINGLE_NODE_WRITER",
|
)
|
||||||
"SINGLE_NODE_SINGLE_WRITER", // added in v1.5.0
|
|
||||||
"SINGLE_NODE_MULTI_WRITER", // added in v1.5.0
|
|
||||||
"SINGLE_NODE_READER_ONLY",
|
|
||||||
"MULTI_NODE_READER_ONLY",
|
|
||||||
"MULTI_NODE_SINGLE_WRITER",
|
|
||||||
"MULTI_NODE_MULTI_WRITER",
|
|
||||||
].includes(capability.access_mode.mode)
|
|
||||||
) {
|
) {
|
||||||
message = `invalid access_mode, ${capability.access_mode.mode}`;
|
message = `invalid access_mode, ${capability.access_mode.mode}`;
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -2070,15 +2104,9 @@ class FreeNASApiDriver extends CsiBaseDriver {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
![
|
!this.getAccessModes(capability).includes(
|
||||||
"UNKNOWN",
|
capability.access_mode.mode
|
||||||
"SINGLE_NODE_WRITER",
|
)
|
||||||
"SINGLE_NODE_SINGLE_WRITER", // added in v1.5.0
|
|
||||||
"SINGLE_NODE_MULTI_WRITER", // added in v1.5.0
|
|
||||||
"SINGLE_NODE_READER_ONLY",
|
|
||||||
"MULTI_NODE_READER_ONLY",
|
|
||||||
"MULTI_NODE_SINGLE_WRITER",
|
|
||||||
].includes(capability.access_mode.mode)
|
|
||||||
) {
|
) {
|
||||||
message = `invalid access_mode, ${capability.access_mode.mode}`;
|
message = `invalid access_mode, ${capability.access_mode.mode}`;
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
|
|
@ -165,6 +165,14 @@ class NodeManualDriver extends CsiBaseDriver {
|
||||||
"MULTI_NODE_MULTI_WRITER",
|
"MULTI_NODE_MULTI_WRITER",
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
capability.access_type == "block" &&
|
||||||
|
!access_modes.includes("MULTI_NODE_MULTI_WRITER")
|
||||||
|
) {
|
||||||
|
access_modes.push("MULTI_NODE_MULTI_WRITER");
|
||||||
|
}
|
||||||
|
|
||||||
if (capability.access_type != "mount") {
|
if (capability.access_type != "mount") {
|
||||||
message = `invalid access_type ${capability.access_type}`;
|
message = `invalid access_type ${capability.access_type}`;
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -196,6 +204,14 @@ class NodeManualDriver extends CsiBaseDriver {
|
||||||
"MULTI_NODE_SINGLE_WRITER",
|
"MULTI_NODE_SINGLE_WRITER",
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
capability.access_type == "block" &&
|
||||||
|
!access_modes.includes("MULTI_NODE_MULTI_WRITER")
|
||||||
|
) {
|
||||||
|
access_modes.push("MULTI_NODE_MULTI_WRITER");
|
||||||
|
}
|
||||||
|
|
||||||
if (capability.access_type == "mount") {
|
if (capability.access_type == "mount") {
|
||||||
if (
|
if (
|
||||||
capability.mount.fs_type &&
|
capability.mount.fs_type &&
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue