diff --git a/examples/freenas-api-iscsi.yaml b/examples/freenas-api-iscsi.yaml index 3b2d922..22d87ee 100644 --- a/examples/freenas-api-iscsi.yaml +++ b/examples/freenas-api-iscsi.yaml @@ -33,6 +33,8 @@ zfs: # "org.freenas:description": "{{ parameters.[csi.storage.k8s.io/pvc/namespace] }}/{{ parameters.[csi.storage.k8s.io/pvc/name] }}" # "org.freenas:test": "{{ parameters.foo }}" # "org.freenas:test2": "some value" + # snapshotProperties: + # "org.freenas:key": "value" # total volume name (zvol//) length cannot exceed 63 chars # https://www.ixsystems.com/documentation/freenas/11.2-U5/storage.html#zfs-zvol-config-opts-tab diff --git a/examples/freenas-api-nfs.yaml b/examples/freenas-api-nfs.yaml index 1ec960e..d0a2206 100644 --- a/examples/freenas-api-nfs.yaml +++ b/examples/freenas-api-nfs.yaml @@ -33,6 +33,8 @@ zfs: # "org.freenas:description": "{{ parameters.[csi.storage.k8s.io/pvc/namespace] }}/{{ parameters.[csi.storage.k8s.io/pvc/name] }}" # "org.freenas:test": "{{ parameters.foo }}" # "org.freenas:test2": "some value" + # snapshotProperties: + # "org.freenas:key": "value" datasetParentName: tank/k8s/a/vols # do NOT make datasetParentName and detachedSnapshotsDatasetParentName overlap diff --git a/examples/freenas-api-smb.yaml b/examples/freenas-api-smb.yaml index 9d13cef..ea057d7 100644 --- a/examples/freenas-api-smb.yaml +++ b/examples/freenas-api-smb.yaml @@ -33,6 +33,8 @@ zfs: # "org.freenas:description": "{{ parameters.[csi.storage.k8s.io/pvc/namespace] }}/{{ parameters.[csi.storage.k8s.io/pvc/name] }}" # "org.freenas:test": "{{ parameters.foo }}" # "org.freenas:test2": "some value" + # snapshotProperties: + # "org.freenas:key": "value" # these are managed automatically via the volume creation process when flagged as an smb volume #datasetProperties: diff --git a/examples/freenas-iscsi.yaml b/examples/freenas-iscsi.yaml index 6a20b6b..980c051 100644 --- a/examples/freenas-iscsi.yaml +++ b/examples/freenas-iscsi.yaml @@ -43,6 +43,8 @@ zfs: # "org.freenas:description": "{{ parameters.[csi.storage.k8s.io/pvc/namespace] }}/{{ parameters.[csi.storage.k8s.io/pvc/name] }}" # "org.freenas:test": "{{ parameters.foo }}" # "org.freenas:test2": "some value" + # snapshotProperties: + # "org.freenas:key": "value" # total volume name (zvol//) length cannot exceed 63 chars # https://www.ixsystems.com/documentation/freenas/11.2-U5/storage.html#zfs-zvol-config-opts-tab diff --git a/examples/freenas-nfs.yaml b/examples/freenas-nfs.yaml index 3ed9ec4..9934d52 100644 --- a/examples/freenas-nfs.yaml +++ b/examples/freenas-nfs.yaml @@ -43,6 +43,8 @@ zfs: # "org.freenas:description": "{{ parameters.[csi.storage.k8s.io/pvc/namespace] }}/{{ parameters.[csi.storage.k8s.io/pvc/name] }}" # "org.freenas:test": "{{ parameters.foo }}" # "org.freenas:test2": "some value" + # snapshotProperties: + # "org.freenas:key": "value" datasetParentName: tank/k8s/a/vols # do NOT make datasetParentName and detachedSnapshotsDatasetParentName overlap diff --git a/examples/freenas-smb.yaml b/examples/freenas-smb.yaml index 8124e17..fa490bf 100644 --- a/examples/freenas-smb.yaml +++ b/examples/freenas-smb.yaml @@ -43,6 +43,8 @@ zfs: # "org.freenas:description": "{{ parameters.[csi.storage.k8s.io/pvc/namespace] }}/{{ parameters.[csi.storage.k8s.io/pvc/name] }}" # "org.freenas:test": "{{ parameters.foo }}" # "org.freenas:test2": "some value" + # snapshotProperties: + # "org.freenas:key": "value" datasetProperties: aclmode: restricted diff --git a/examples/zfs-generic-iscsi.yaml b/examples/zfs-generic-iscsi.yaml index af5df37..8e38e42 100644 --- a/examples/zfs-generic-iscsi.yaml +++ b/examples/zfs-generic-iscsi.yaml @@ -27,6 +27,8 @@ zfs: # "org.freenas:description": "{{ parameters.[csi.storage.k8s.io/pvc/namespace] }}/{{ parameters.[csi.storage.k8s.io/pvc/name] }}" # "org.freenas:test": "{{ parameters.foo }}" # "org.freenas:test2": "some value" + # snapshotProperties: + # "org.freenas:key": "value" datasetParentName: tank/k8s/test # do NOT make datasetParentName and detachedSnapshotsDatasetParentName overlap diff --git a/examples/zfs-generic-nfs.yaml b/examples/zfs-generic-nfs.yaml index 7b6a2d2..620775f 100644 --- a/examples/zfs-generic-nfs.yaml +++ b/examples/zfs-generic-nfs.yaml @@ -27,6 +27,8 @@ zfs: # "org.freenas:description": "{{ parameters.[csi.storage.k8s.io/pvc/namespace] }}/{{ parameters.[csi.storage.k8s.io/pvc/name] }}" # "org.freenas:test": "{{ parameters.foo }}" # "org.freenas:test2": "some value" + # snapshotProperties: + # "org.freenas:key": "value" datasetParentName: tank/k8s/test # do NOT make datasetParentName and detachedSnapshotsDatasetParentName overlap diff --git a/examples/zfs-generic-nvmeof.yaml b/examples/zfs-generic-nvmeof.yaml index b56b3ae..d236665 100644 --- a/examples/zfs-generic-nvmeof.yaml +++ b/examples/zfs-generic-nvmeof.yaml @@ -27,6 +27,8 @@ zfs: # "org.freenas:description": "{{ parameters.[csi.storage.k8s.io/pvc/namespace] }}/{{ parameters.[csi.storage.k8s.io/pvc/name] }}" # "org.freenas:test": "{{ parameters.foo }}" # "org.freenas:test2": "some value" + # snapshotProperties: + # "org.freenas:key": "value" datasetParentName: tank/k8s/test # do NOT make datasetParentName and detachedSnapshotsDatasetParentName overlap diff --git a/examples/zfs-generic-smb.yaml b/examples/zfs-generic-smb.yaml index cbc8f8f..361b860 100644 --- a/examples/zfs-generic-smb.yaml +++ b/examples/zfs-generic-smb.yaml @@ -28,6 +28,8 @@ zfs: #aclinherit: passthrough #acltype: nfsv4 casesensitivity: insensitive + # snapshotProperties: + # "org.freenas:key": "value" datasetParentName: tank/k8s/test # do NOT make datasetParentName and detachedSnapshotsDatasetParentName overlap diff --git a/examples/zfs-local-dataset.yaml b/examples/zfs-local-dataset.yaml index fd91346..273614d 100644 --- a/examples/zfs-local-dataset.yaml +++ b/examples/zfs-local-dataset.yaml @@ -6,6 +6,8 @@ zfs: datasetProperties: # key: value + snapshotProperties: + # "org.freenas:key": "value" datasetEnableQuotas: true datasetEnableReservation: false diff --git a/examples/zfs-local-zvol.yaml b/examples/zfs-local-zvol.yaml index e08da1d..4e7485a 100644 --- a/examples/zfs-local-zvol.yaml +++ b/examples/zfs-local-zvol.yaml @@ -6,6 +6,8 @@ zfs: datasetProperties: # key: value + snapshotProperties: + # "org.freenas:key": "value" zvolCompression: zvolDedup: diff --git a/src/driver/controller-zfs/index.js b/src/driver/controller-zfs/index.js index d665979..2865df4 100644 --- a/src/driver/controller-zfs/index.js +++ b/src/driver/controller-zfs/index.js @@ -2106,6 +2106,19 @@ class ControllerZfsBaseDriver extends CsiBaseDriver { ); } + // user-supplied properties + // put early to prevent stupid (user-supplied values overwriting system values) + if (driver.options.zfs.snapshotProperties) { + for (let property in driver.options.zfs.snapshotProperties) { + let value = driver.options.zfs.snapshotProperties[property]; + const template = Handlebars.compile(value); + + snapshotProperties[property] = template({ + parameters: call.request.parameters, + }); + } + } + const volumeDatasetName = volumeParentDatasetName + "/" + source_volume_id; const datasetName = datasetParentName + "/" + source_volume_id; snapshotProperties[SNAPSHOT_CSI_NAME_PROPERTY_NAME] = name; diff --git a/src/driver/freenas/api.js b/src/driver/freenas/api.js index 600b167..c944f21 100644 --- a/src/driver/freenas/api.js +++ b/src/driver/freenas/api.js @@ -4000,6 +4000,19 @@ class FreeNASApiDriver extends CsiBaseDriver { ); } + // user-supplied properties + // put early to prevent stupid (user-supplied values overwriting system values) + if (driver.options.zfs.snapshotProperties) { + for (let property in driver.options.zfs.snapshotProperties) { + let value = driver.options.zfs.snapshotProperties[property]; + const template = Handlebars.compile(value); + + snapshotProperties[property] = template({ + parameters: call.request.parameters, + }); + } + } + const datasetName = datasetParentName + "/" + source_volume_id; snapshotProperties[SNAPSHOT_CSI_NAME_PROPERTY_NAME] = name; snapshotProperties[SNAPSHOT_CSI_SOURCE_VOLUME_ID_PROPERTY_NAME] =