zfs-generic-smb driver (sharesmb=on)
Signed-off-by: Travis Glenn Hansen <travisghansen@yahoo.com>
This commit is contained in:
parent
88860d3192
commit
6cde0d3a70
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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");
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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"
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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":
|
||||||
|
|
|
||||||
|
|
@ -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":
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue