broadcast accessibility contraints (topology) for zfs-local

Signed-off-by: Travis Glenn Hansen <travisghansen@yahoo.com>
This commit is contained in:
Travis Glenn Hansen 2022-02-02 09:15:57 -07:00
parent 5426f1ec12
commit f50e297d33
3 changed files with 56 additions and 26 deletions

View File

@ -1,3 +1,4 @@
const _ = require("lodash");
const { ControllerZfsBaseDriver } = require("../controller-zfs"); const { ControllerZfsBaseDriver } = require("../controller-zfs");
const { GrpcError, grpc } = require("../../utils/grpc"); const { GrpcError, grpc } = require("../../utils/grpc");
const LocalCliExecClient = require("./exec").LocalCliClient; const LocalCliExecClient = require("./exec").LocalCliClient;
@ -8,6 +9,26 @@ const ZFS_ASSET_NAME_PROPERTY_NAME = "zfs_asset_name";
const NODE_TOPOLOGY_KEY_NAME = "org.democratic-csi.topology/node"; const NODE_TOPOLOGY_KEY_NAME = "org.democratic-csi.topology/node";
class ControllerZfsLocalDriver extends ControllerZfsBaseDriver { class ControllerZfsLocalDriver extends ControllerZfsBaseDriver {
constructor(ctx, options) {
const i_caps = _.get(
options,
"service.identity.capabilities.service",
false
);
super(...arguments);
if (!i_caps) {
this.ctx.logger.debug("setting zfs-local identity service caps");
options.service.identity.capabilities.service = [
//"UNKNOWN",
"CONTROLLER_SERVICE",
"VOLUME_ACCESSIBILITY_CONSTRAINTS"
];
}
}
getExecClient() { getExecClient() {
return new LocalCliExecClient({ return new LocalCliExecClient({
logger: this.ctx.logger, logger: this.ctx.logger,

View File

@ -3123,7 +3123,6 @@ class FreeNASApiDriver extends CsiBaseDriver {
} }
entries = this.ctx.cache.get(`ListVolumes:result:${uuid}`); entries = this.ctx.cache.get(`ListVolumes:result:${uuid}`);
if (entries) { if (entries) {
entries = JSON.parse(JSON.stringify(entries));
entries_length = entries.length; entries_length = entries.length;
entries = entries.slice(start_position, end_position); entries = entries.slice(start_position, end_position);
if (max_entries > 0 && end_position > entries_length) { if (max_entries > 0 && end_position > entries_length) {
@ -3219,10 +3218,7 @@ class FreeNASApiDriver extends CsiBaseDriver {
if (max_entries && entries.length > max_entries) { if (max_entries && entries.length > max_entries) {
uuid = uuidv4(); uuid = uuidv4();
this.ctx.cache.set( this.ctx.cache.set(`ListVolumes:result:${uuid}`, entries);
`ListVolumes:result:${uuid}`,
JSON.parse(JSON.stringify(entries))
);
next_token = `${uuid}:${max_entries}`; next_token = `${uuid}:${max_entries}`;
entries = entries.slice(0, max_entries); entries = entries.slice(0, max_entries);
} }

View File

@ -106,6 +106,7 @@ class NodeManualDriver extends CsiBaseDriver {
let message = null; let message = null;
let driverResourceType; let driverResourceType;
let fs_types = []; let fs_types = [];
let access_modes = [];
//[{"access_mode":{"mode":"SINGLE_NODE_WRITER"},"mount":{"mount_flags":["noatime","_netdev"],"fs_type":"nfs"},"access_type":"mount"}] //[{"access_mode":{"mode":"SINGLE_NODE_WRITER"},"mount":{"mount_flags":["noatime","_netdev"],"fs_type":"nfs"},"access_type":"mount"}]
switch (node_attach_driver) { switch (node_attach_driver) {
case "nfs": case "nfs":
@ -124,6 +125,16 @@ class NodeManualDriver extends CsiBaseDriver {
driverResourceType = "volume"; driverResourceType = "volume";
fs_types = ["ext3", "ext4", "ext4dev", "xfs"]; fs_types = ["ext3", "ext4", "ext4dev", "xfs"];
break; break;
case "zfs-local":
driverResourceType = "volume";
fs_types = ["ext3", "ext4", "ext4dev", "xfs", "zfs"];
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",
];
default: default:
return { return {
valid: false, valid: false,
@ -134,6 +145,18 @@ class NodeManualDriver extends CsiBaseDriver {
const valid = capabilities.every((capability) => { const valid = capabilities.every((capability) => {
switch (driverResourceType) { switch (driverResourceType) {
case "filesystem": case "filesystem":
if (access_modes.length == 0) {
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 != "mount") { if (capability.access_type != "mount") {
message = `invalid access_type ${capability.access_type}`; message = `invalid access_type ${capability.access_type}`;
return false; return false;
@ -147,8 +170,15 @@ class NodeManualDriver extends CsiBaseDriver {
return false; return false;
} }
if ( if (!access_modes.includes(capability.access_mode.mode)) {
![ message = `invalid access_mode, ${capability.access_mode.mode}`;
return false;
}
return true;
case "volume":
if (access_modes.length == 0) {
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
@ -156,15 +186,8 @@ class NodeManualDriver extends CsiBaseDriver {
"SINGLE_NODE_READER_ONLY", "SINGLE_NODE_READER_ONLY",
"MULTI_NODE_READER_ONLY", "MULTI_NODE_READER_ONLY",
"MULTI_NODE_SINGLE_WRITER", "MULTI_NODE_SINGLE_WRITER",
"MULTI_NODE_MULTI_WRITER", ];
].includes(capability.access_mode.mode)
) {
message = `invalid access_mode, ${capability.access_mode.mode}`;
return false;
} }
return true;
case "volume":
if (capability.access_type == "mount") { if (capability.access_type == "mount") {
if ( if (
capability.mount.fs_type && capability.mount.fs_type &&
@ -175,17 +198,7 @@ class NodeManualDriver extends CsiBaseDriver {
} }
} }
if ( if (!access_modes.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",
].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;
} }