diff --git a/src/driver/controller-zfs-ssh/index.js b/src/driver/controller-zfs-ssh/index.js index db978db..f9c2535 100644 --- a/src/driver/controller-zfs-ssh/index.js +++ b/src/driver/controller-zfs-ssh/index.js @@ -21,6 +21,11 @@ const SNAPSHOT_CSI_NAME_PROPERTY_NAME = "democratic-csi:csi_snapshot_name"; const SNAPSHOT_CSI_SOURCE_VOLUME_ID_PROPERTY_NAME = "democratic-csi:csi_snapshot_source_volume_id"; +const VOLUME_CONTEXT_PROVISIONER_DRIVER_PROPERTY_NAME = + "democratic-csi:volume_context_provisioner_driver"; +const VOLUME_CONTEXT_PROVISIONER_INSTANCE_ID_PROPERTY_NAME = + "democratic-csi:volume_context_provisioner_instance_id"; + /** * Base driver to provisin zfs assets over ssh. * Derived drivers only need to implement: @@ -326,6 +331,12 @@ class ControllerZfsSshBaseDriver extends CsiBaseDriver { let volumeProperties = {}; volumeProperties[VOLUME_CSI_NAME_PROPERTY_NAME] = name; volumeProperties[MANAGED_PROPERTY_NAME] = "true"; + volumeProperties[VOLUME_CONTEXT_PROVISIONER_DRIVER_PROPERTY_NAME] = + driver.options.driver; + if (driver.options.instance_id) { + volumeProperties[VOLUME_CONTEXT_PROVISIONER_INSTANCE_ID_PROPERTY_NAME] = + driver.options.instance_id; + } // TODO: also set access_mode as property? // TODO: also set fsType as property? @@ -678,6 +689,12 @@ class ControllerZfsSshBaseDriver extends CsiBaseDriver { "'" + JSON.stringify(volume_context) + "'" }); + volume_context["provisioner_driver"] = driver.options.driver; + if (driver.options.instance_id) { + volume_context["provisioner_driver_instance_id"] = + driver.options.instance_id; + } + // set this just before sending out response so we know if volume completed // this should give us a relatively sane way to clean up artifacts over time await zb.zfs.set(datasetName, { [SUCCESS_PROPERTY_NAME]: "true" }); @@ -1034,7 +1051,9 @@ class ControllerZfsSshBaseDriver extends CsiBaseDriver { "volsize", MANAGED_PROPERTY_NAME, SHARE_VOLUME_CONTEXT_PROPERTY_NAME, - SUCCESS_PROPERTY_NAME + SUCCESS_PROPERTY_NAME, + VOLUME_CONTEXT_PROVISIONER_INSTANCE_ID_PROPERTY_NAME, + VOLUME_CONTEXT_PROVISIONER_DRIVER_PROPERTY_NAME ], { types, recurse: true } ); @@ -1064,6 +1083,25 @@ class ControllerZfsSshBaseDriver extends CsiBaseDriver { } let volume_content_source; + let volume_context = JSON.parse(row[SHARE_VOLUME_CONTEXT_PROPERTY_NAME]); + if ( + zb.helpers.isPropertyValueSet( + row[VOLUME_CONTEXT_PROVISIONER_DRIVER_PROPERTY_NAME] + ) + ) { + volume_context["provisioner_driver"] = + row[VOLUME_CONTEXT_PROVISIONER_DRIVER_PROPERTY_NAME]; + } + + if ( + zb.helpers.isPropertyValueSet( + row[VOLUME_CONTEXT_PROVISIONER_INSTANCE_ID_PROPERTY_NAME] + ) + ) { + volume_context["provisioner_driver_instance_id"] = + row[VOLUME_CONTEXT_PROVISIONER_INSTANCE_ID_PROPERTY_NAME]; + } + if ( zb.helpers.isPropertyValueSet( row[VOLUME_CONTENT_SOURCE_TYPE_PROPERTY_NAME] @@ -1096,7 +1134,7 @@ class ControllerZfsSshBaseDriver extends CsiBaseDriver { ? row["refquota"] : row["volsize"], content_source: volume_content_source, - volume_context: JSON.parse(row[SHARE_VOLUME_CONTEXT_PROPERTY_NAME]) + volume_context } }); }); @@ -1363,7 +1401,10 @@ class ControllerZfsSshBaseDriver extends CsiBaseDriver { let detachedSnapshot = false; try { let tmpDetachedSnapshot = JSON.parse( - driver.getNormalizedParameterValue(call.request.parameters, "detachedSnapshots") + driver.getNormalizedParameterValue( + call.request.parameters, + "detachedSnapshots" + ) ); // snapshot class parameter if (typeof tmpDetachedSnapshot === "boolean") { detachedSnapshot = tmpDetachedSnapshot; diff --git a/src/driver/index.js b/src/driver/index.js index 467b8b7..a248635 100644 --- a/src/driver/index.js +++ b/src/driver/index.js @@ -30,26 +30,33 @@ class CsiBaseDriver { * @param {*} parameters * @param {*} key */ - getNormalizedParameterValue(parameters, key) { - const normalized = this.getNormalizedParameters(parameters); + getNormalizedParameterValue(parameters, key, driver, instance_id) { + const normalized = this.getNormalizedParameters( + parameters, + driver, + instance_id + ); return normalized[key]; } - getNormalizedParameters(parameters) { + getNormalizedParameters(parameters, driver, instance_id) { const normalized = JSON.parse(JSON.stringify(parameters)); const base_key = "democratic-csi.org"; + driver = driver || this.options.driver; + instance_id = instance_id || this.options.instance_id; + for (const key in parameters) { let normalizedKey; let prefixLength; - if (key.startsWith(`${base_key}/${this.options.instance_id}/`)) { - prefixLength = `${base_key}/${this.options.instance_id}/`.length; + if (instance_id && key.startsWith(`${base_key}/${instance_id}/`)) { + prefixLength = `${base_key}/${instance_id}/`.length; normalizedKey = key.slice(prefixLength); normalized[normalizedKey] = parameters[key]; delete normalized[key]; } - if (key.startsWith(`${base_key}/${this.options.driver}/`)) { - prefixLength = `${base_key}/${this.options.driver}/`.length; + if (driver && key.startsWith(`${base_key}/${driver}/`)) { + prefixLength = `${base_key}/${driver}/`.length; normalizedKey = key.slice(prefixLength); normalized[normalizedKey] = parameters[key]; delete normalized[key]; @@ -294,11 +301,14 @@ class CsiBaseDriver { // create DB entry let nodeDB = {}; const nodeDBKeyPrefix = "node-db."; - const normalizedSecrets = this.getNormalizedParameters(call.request.secrets); + const normalizedSecrets = this.getNormalizedParameters( + call.request.secrets, + call.request.volume_context.provisioner_driver, + call.request.volume_context.provisioner_driver_instance_id + ); for (const key in normalizedSecrets) { if (key.startsWith(nodeDBKeyPrefix)) { - nodeDB[key.substr(nodeDBKeyPrefix.length)] = - normalizedSecrets[key]; + nodeDB[key.substr(nodeDBKeyPrefix.length)] = normalizedSecrets[key]; } } await iscsi.iscsiadm.createNodeDBEntry(