support normalized data on the node driver

This commit is contained in:
Travis Glenn Hansen 2019-11-25 15:43:34 -07:00
parent 18ea054a8c
commit fabe465243
2 changed files with 64 additions and 13 deletions

View File

@ -21,6 +21,11 @@ const SNAPSHOT_CSI_NAME_PROPERTY_NAME = "democratic-csi:csi_snapshot_name";
const SNAPSHOT_CSI_SOURCE_VOLUME_ID_PROPERTY_NAME = const SNAPSHOT_CSI_SOURCE_VOLUME_ID_PROPERTY_NAME =
"democratic-csi:csi_snapshot_source_volume_id"; "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. * Base driver to provisin zfs assets over ssh.
* Derived drivers only need to implement: * Derived drivers only need to implement:
@ -326,6 +331,12 @@ class ControllerZfsSshBaseDriver extends CsiBaseDriver {
let volumeProperties = {}; let volumeProperties = {};
volumeProperties[VOLUME_CSI_NAME_PROPERTY_NAME] = name; volumeProperties[VOLUME_CSI_NAME_PROPERTY_NAME] = name;
volumeProperties[MANAGED_PROPERTY_NAME] = "true"; 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 access_mode as property?
// TODO: also set fsType as property? // TODO: also set fsType as property?
@ -678,6 +689,12 @@ class ControllerZfsSshBaseDriver extends CsiBaseDriver {
"'" + JSON.stringify(volume_context) + "'" "'" + 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 // 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 // this should give us a relatively sane way to clean up artifacts over time
await zb.zfs.set(datasetName, { [SUCCESS_PROPERTY_NAME]: "true" }); await zb.zfs.set(datasetName, { [SUCCESS_PROPERTY_NAME]: "true" });
@ -1034,7 +1051,9 @@ class ControllerZfsSshBaseDriver extends CsiBaseDriver {
"volsize", "volsize",
MANAGED_PROPERTY_NAME, MANAGED_PROPERTY_NAME,
SHARE_VOLUME_CONTEXT_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 } { types, recurse: true }
); );
@ -1064,6 +1083,25 @@ class ControllerZfsSshBaseDriver extends CsiBaseDriver {
} }
let volume_content_source; 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 ( if (
zb.helpers.isPropertyValueSet( zb.helpers.isPropertyValueSet(
row[VOLUME_CONTENT_SOURCE_TYPE_PROPERTY_NAME] row[VOLUME_CONTENT_SOURCE_TYPE_PROPERTY_NAME]
@ -1096,7 +1134,7 @@ class ControllerZfsSshBaseDriver extends CsiBaseDriver {
? row["refquota"] ? row["refquota"]
: row["volsize"], : row["volsize"],
content_source: volume_content_source, 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; let detachedSnapshot = false;
try { try {
let tmpDetachedSnapshot = JSON.parse( let tmpDetachedSnapshot = JSON.parse(
driver.getNormalizedParameterValue(call.request.parameters, "detachedSnapshots") driver.getNormalizedParameterValue(
call.request.parameters,
"detachedSnapshots"
)
); // snapshot class parameter ); // snapshot class parameter
if (typeof tmpDetachedSnapshot === "boolean") { if (typeof tmpDetachedSnapshot === "boolean") {
detachedSnapshot = tmpDetachedSnapshot; detachedSnapshot = tmpDetachedSnapshot;

View File

@ -30,26 +30,33 @@ class CsiBaseDriver {
* @param {*} parameters * @param {*} parameters
* @param {*} key * @param {*} key
*/ */
getNormalizedParameterValue(parameters, key) { getNormalizedParameterValue(parameters, key, driver, instance_id) {
const normalized = this.getNormalizedParameters(parameters); const normalized = this.getNormalizedParameters(
parameters,
driver,
instance_id
);
return normalized[key]; return normalized[key];
} }
getNormalizedParameters(parameters) { getNormalizedParameters(parameters, driver, instance_id) {
const normalized = JSON.parse(JSON.stringify(parameters)); const normalized = JSON.parse(JSON.stringify(parameters));
const base_key = "democratic-csi.org"; const base_key = "democratic-csi.org";
driver = driver || this.options.driver;
instance_id = instance_id || this.options.instance_id;
for (const key in parameters) { for (const key in parameters) {
let normalizedKey; let normalizedKey;
let prefixLength; let prefixLength;
if (key.startsWith(`${base_key}/${this.options.instance_id}/`)) { if (instance_id && key.startsWith(`${base_key}/${instance_id}/`)) {
prefixLength = `${base_key}/${this.options.instance_id}/`.length; prefixLength = `${base_key}/${instance_id}/`.length;
normalizedKey = key.slice(prefixLength); normalizedKey = key.slice(prefixLength);
normalized[normalizedKey] = parameters[key]; normalized[normalizedKey] = parameters[key];
delete normalized[key]; delete normalized[key];
} }
if (key.startsWith(`${base_key}/${this.options.driver}/`)) { if (driver && key.startsWith(`${base_key}/${driver}/`)) {
prefixLength = `${base_key}/${this.options.driver}/`.length; prefixLength = `${base_key}/${driver}/`.length;
normalizedKey = key.slice(prefixLength); normalizedKey = key.slice(prefixLength);
normalized[normalizedKey] = parameters[key]; normalized[normalizedKey] = parameters[key];
delete normalized[key]; delete normalized[key];
@ -294,11 +301,14 @@ class CsiBaseDriver {
// create DB entry // create DB entry
let nodeDB = {}; let nodeDB = {};
const nodeDBKeyPrefix = "node-db."; 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) { for (const key in normalizedSecrets) {
if (key.startsWith(nodeDBKeyPrefix)) { if (key.startsWith(nodeDBKeyPrefix)) {
nodeDB[key.substr(nodeDBKeyPrefix.length)] = nodeDB[key.substr(nodeDBKeyPrefix.length)] = normalizedSecrets[key];
normalizedSecrets[key];
} }
} }
await iscsi.iscsiadm.createNodeDBEntry( await iscsi.iscsiadm.createNodeDBEntry(