support normalized data on the node driver
This commit is contained in:
parent
18ea054a8c
commit
fabe465243
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
Loading…
Reference in New Issue