zfs-generic-smb driver (sharesmb=on)

Signed-off-by: Travis Glenn Hansen <travisghansen@yahoo.com>
This commit is contained in:
Travis Glenn Hansen 2022-04-18 10:23:31 -06:00
parent 88860d3192
commit 6cde0d3a70
8 changed files with 183 additions and 2 deletions

View File

@ -167,6 +167,7 @@ jobs:
config: config:
- zfs-generic/iscsi.yaml - zfs-generic/iscsi.yaml
- zfs-generic/nfs.yaml - zfs-generic/nfs.yaml
- zfs-generic/smb.yaml
runs-on: runs-on:
- self-hosted - self-hosted
- csi-sanity-zfs-generic - csi-sanity-zfs-generic

View File

@ -1,4 +1,9 @@
#!/usr/bin/env -S node --expose-gc ${NODE_OPTIONS_CSI_1} ${NODE_OPTIONS_CSI_2} ${NODE_OPTIONS_CSI_3} ${NODE_OPTIONS_CSI_4} ${NODE_OPTIONS_CSI_5} #!/usr/bin/env -S node --expose-gc ${NODE_OPTIONS_CSI_1} ${NODE_OPTIONS_CSI_2} ${NODE_OPTIONS_CSI_3} ${NODE_OPTIONS_CSI_4}
/**
* keep the shebang line length under 128
* https://github.com/democratic-csi/democratic-csi/issues/171
*/
const yaml = require("js-yaml"); const yaml = require("js-yaml");
const fs = require("fs"); const fs = require("fs");

View File

@ -11,7 +11,7 @@ zfs:
detachedSnapshotsDatasetParentName: tank/ci/${CI_BUILD_KEY}/s detachedSnapshotsDatasetParentName: tank/ci/${CI_BUILD_KEY}/s
datasetEnableQuotas: true datasetEnableQuotas: true
datasetEnableReservation: true datasetEnableReservation: false
datasetPermissionsMode: "0777" datasetPermissionsMode: "0777"
datasetPermissionsUser: 0 datasetPermissionsUser: 0
datasetPermissionsGroup: 0 datasetPermissionsGroup: 0

View File

@ -0,0 +1,40 @@
driver: zfs-generic-smb
sshConnection:
host: ${SERVER_HOST}
port: 22
username: ${SERVER_USERNAME}
password: ${SERVER_PASSWORD}
zfs:
datasetParentName: tank/ci/${CI_BUILD_KEY}/v
detachedSnapshotsDatasetParentName: tank/ci/${CI_BUILD_KEY}/s
datasetProperties:
#aclmode: restricted
#aclinherit: passthrough
#acltype: nfsv4
casesensitivity: insensitive
datasetEnableQuotas: true
datasetEnableReservation: false
datasetPermissionsMode: "0770"
datasetPermissionsUser: smbroot
datasetPermissionsGroup: smbroot
smb:
shareHost: ${SERVER_HOST}
shareStrategy: "setDatasetProperties"
shareStrategySetDatasetProperties:
properties:
sharesmb: "on"
node:
mount:
mount_flags: "username=smbroot,password=smbroot"
_private:
csi:
volume:
idHash:
strategy: crc16

View File

@ -0,0 +1,57 @@
driver: zfs-generic-smb
sshConnection:
host: server address
port: 22
username: root
# use either password or key
password: ""
privateKey: |
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----
zfs:
# can be used to override defaults if necessary
# the example below is useful for TrueNAS 12
#cli:
# sudoEnabled: true
# paths:
# zfs: /usr/local/sbin/zfs
# zpool: /usr/local/sbin/zpool
# sudo: /usr/local/bin/sudo
# chroot: /usr/sbin/chroot
# can be used to set arbitrary values on the dataset/zvol
# can use handlebars templates with the parameters from the storage class/CO
datasetProperties:
#aclmode: restricted
#aclinherit: passthrough
#acltype: nfsv4
casesensitivity: insensitive
datasetParentName: tank/k8s/test
# do NOT make datasetParentName and detachedSnapshotsDatasetParentName overlap
# they may be siblings, but neither should be nested in the other
detachedSnapshotsDatasetParentName: tanks/k8s/test-snapshots
datasetEnableQuotas: true
datasetEnableReservation: false
datasetPermissionsMode: "0770"
datasetPermissionsUser: smbroot
datasetPermissionsGroup: smbroot
#datasetPermissionsAclsBinary: nfs4_setfacl
#datasetPermissionsAcls:
#- "-m everyone@:full_set:allow"
#- -s group@:modify_set:fd:allow
#- -a owner@:full_set:fd:allow
smb:
# https://docs.oracle.com/cd/E23824_01/html/821-1448/gayne.html
# https://www.hiroom2.com/2016/05/18/ubuntu-16-04-share-zfs-storage-via-nfs-smb/
shareStrategy: "setDatasetProperties"
shareStrategySetDatasetProperties:
properties:
sharesmb: "on"
# share: ""
shareHost: "server address"

View File

@ -52,6 +52,7 @@ class ControllerZfsGenericDriver extends ControllerZfsBaseDriver {
getDriverZfsResourceType() { getDriverZfsResourceType() {
switch (this.options.driver) { switch (this.options.driver) {
case "zfs-generic-nfs": case "zfs-generic-nfs":
case "zfs-generic-smb":
return "filesystem"; return "filesystem";
case "zfs-generic-iscsi": case "zfs-generic-iscsi":
return "volume"; return "volume";
@ -109,6 +110,48 @@ class ControllerZfsGenericDriver extends ControllerZfsBaseDriver {
}; };
return volume_context; return volume_context;
case "zfs-generic-smb":
let share;
switch (this.options.smb.shareStrategy) {
case "setDatasetProperties":
function generateShareName(dataset) {
let name = dataset;
name = name.replaceAll("/", "_");
name = name.replaceAll("-", "_");
return name;
}
for (let key of ["share", "sharesmb"]) {
if (
this.options.smb.shareStrategySetDatasetProperties.properties[
key
]
) {
await zb.zfs.set(datasetName, {
[key]:
this.options.smb.shareStrategySetDatasetProperties
.properties[key],
});
}
}
share = generateShareName(datasetName);
break;
default:
break;
}
properties = await zb.zfs.get(datasetName, ["mountpoint"]);
properties = properties[datasetName];
this.ctx.logger.debug("zfs props data: %j", properties);
volume_context = {
node_attach_driver: "smb",
server: this.options.smb.shareHost,
share,
};
return volume_context;
case "zfs-generic-iscsi": case "zfs-generic-iscsi":
let basename; let basename;
let iscsiName; let iscsiName;
@ -268,6 +311,36 @@ create /backstores/block/${iscsiName}
} }
break; break;
case "zfs-generic-smb":
switch (this.options.smb.shareStrategy) {
case "setDatasetProperties":
for (let key of ["share", "sharesmb"]) {
if (
this.options.smb.shareStrategySetDatasetProperties.properties[
key
]
) {
try {
await zb.zfs.inherit(datasetName, key);
} catch (err) {
if (err.toString().includes("dataset does not exist")) {
// do nothing
} else {
throw err;
}
}
}
}
await sleep(2000); // let things settle
break;
default:
throw new GrpcError(
grpc.status.FAILED_PRECONDITION,
`invalid configuration: unknown shareStrategy ${this.options.nfs.shareStrategy}`
);
}
break;
case "zfs-generic-iscsi": case "zfs-generic-iscsi":
let basename; let basename;
let iscsiName; let iscsiName;

View File

@ -33,6 +33,7 @@ function factory(ctx, options) {
case "synology-iscsi": case "synology-iscsi":
return new ControllerSynologyDriver(ctx, options); return new ControllerSynologyDriver(ctx, options);
case "zfs-generic-nfs": case "zfs-generic-nfs":
case "zfs-generic-smb":
case "zfs-generic-iscsi": case "zfs-generic-iscsi":
return new ControllerZfsGenericDriver(ctx, options); return new ControllerZfsGenericDriver(ctx, options);
case "zfs-local-dataset": case "zfs-local-dataset":

View File

@ -679,6 +679,10 @@ class CsiBaseDriver {
if (!has_guest) { if (!has_guest) {
mount_flags.push("guest"); mount_flags.push("guest");
} }
if (volume_mount_group) {
mount_flags.push(`gid=${volume_mount_group}`);
}
} }
break; break;
case "iscsi": case "iscsi":