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 =
"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;

View File

@ -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(