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: | ||||
|           - zfs-generic/iscsi.yaml | ||||
|           - zfs-generic/nfs.yaml | ||||
|           - zfs-generic/smb.yaml | ||||
|     runs-on: | ||||
|       - self-hosted | ||||
|       - 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 fs = require("fs"); | ||||
|  |  | |||
|  | @ -11,7 +11,7 @@ zfs: | |||
|   detachedSnapshotsDatasetParentName: tank/ci/${CI_BUILD_KEY}/s | ||||
| 
 | ||||
|   datasetEnableQuotas: true | ||||
|   datasetEnableReservation: true | ||||
|   datasetEnableReservation: false | ||||
|   datasetPermissionsMode: "0777" | ||||
|   datasetPermissionsUser: 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() { | ||||
|     switch (this.options.driver) { | ||||
|       case "zfs-generic-nfs": | ||||
|       case "zfs-generic-smb": | ||||
|         return "filesystem"; | ||||
|       case "zfs-generic-iscsi": | ||||
|         return "volume"; | ||||
|  | @ -109,6 +110,48 @@ class ControllerZfsGenericDriver extends ControllerZfsBaseDriver { | |||
|         }; | ||||
|         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": | ||||
|         let basename; | ||||
|         let iscsiName; | ||||
|  | @ -268,6 +311,36 @@ create /backstores/block/${iscsiName} | |||
|         } | ||||
|         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": | ||||
|         let basename; | ||||
|         let iscsiName; | ||||
|  |  | |||
|  | @ -33,6 +33,7 @@ function factory(ctx, options) { | |||
|     case "synology-iscsi": | ||||
|       return new ControllerSynologyDriver(ctx, options); | ||||
|     case "zfs-generic-nfs": | ||||
|     case "zfs-generic-smb": | ||||
|     case "zfs-generic-iscsi": | ||||
|       return new ControllerZfsGenericDriver(ctx, options); | ||||
|     case "zfs-local-dataset": | ||||
|  |  | |||
|  | @ -679,6 +679,10 @@ class CsiBaseDriver { | |||
|               if (!has_guest) { | ||||
|                 mount_flags.push("guest"); | ||||
|               } | ||||
| 
 | ||||
|               if (volume_mount_group) { | ||||
|                 mount_flags.push(`gid=${volume_mount_group}`); | ||||
|               } | ||||
|             } | ||||
|             break; | ||||
|           case "iscsi": | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue