implement normalized parameters, driver factory

This commit is contained in:
Travis Glenn Hansen
2019-11-25 10:21:01 -07:00
parent 380caec9ed
commit 78fa1d8f2e
5 changed files with 62 additions and 34 deletions
+15 -15
View File
@@ -93,33 +93,33 @@ const packageDefinition = protoLoader.loadSync(PROTO_PATH, {
const protoDescriptor = grpc.loadPackageDefinition(packageDefinition);
const csi = protoDescriptor.csi.v1;
// include available drivers
const { FreeNASDriver } = require("../src/driver/freenas");
logger.info("initializing csi driver: %s", options.driver);
let driver;
switch (options.driver) {
case "freenas-nfs":
case "freenas-iscsi":
driver = new FreeNASDriver({ logger, args, cache, package }, options);
break;
default:
logger.error("invalid csi driver: %s", args.driver);
break;
try {
driver = require("../src/driver/factory").factory({ logger, args, cache, package }, options);
} catch (err) {
logger.error(err.toString());
process.exit(1);
}
async function requestHandlerProxy(call, callback, serviceMethodName) {
const cleansedCall = JSON.parse(JSON.stringify(call));
for (const key in cleansedCall.request) {
if (key.includes("secret")) {
cleansedCall.request[key] = "redacted";
}
}
try {
logger.debug(
logger.info(
"new request - driver: %s method: %s call: %j",
driver.constructor.name,
serviceMethodName,
call
cleansedCall
);
//const response = await handler.call(driver, call);
const response = await driver[serviceMethodName](call);
logger.debug(
logger.info(
"new response - driver: %s method: %s response: %j",
driver.constructor.name,
serviceMethodName,
@@ -133,7 +133,7 @@ async function requestHandlerProxy(call, callback, serviceMethodName) {
serviceMethodName,
JSON.stringify(e)
);
console.log(e);
if (e.name == "GrpcError") {
callback(e);
} else {
+1 -1
View File
@@ -5,7 +5,7 @@ httpConnection:
host: server address
port: 80
username: root
password:
password:
allowInsecure: true
sshConnection:
host: server address
+3 -3
View File
@@ -351,7 +351,7 @@ class ControllerZfsSshBaseDriver extends CsiBaseDriver {
case "snapshot":
try {
let tmpDetachedClone = JSON.parse(
driver.getParameterValue(
driver.getNormalizedParameterValue(
call.request.parameters,
"detachedVolumesFromSnapshots"
)
@@ -465,7 +465,7 @@ class ControllerZfsSshBaseDriver extends CsiBaseDriver {
case "volume":
try {
let tmpDetachedClone = JSON.parse(
driver.getParameterValue(
driver.getNormalizedParameterValue(
call.request.parameters,
"detachedVolumesFromVolumes"
)
@@ -1363,7 +1363,7 @@ class ControllerZfsSshBaseDriver extends CsiBaseDriver {
let detachedSnapshot = false;
try {
let tmpDetachedSnapshot = JSON.parse(
driver.getParameterValue(call.request.parameters, "detachedSnapshots")
driver.getNormalizedParameterValue(call.request.parameters, "detachedSnapshots")
); // snapshot class parameter
if (typeof tmpDetachedSnapshot === "boolean") {
detachedSnapshot = tmpDetachedSnapshot;
+13
View File
@@ -0,0 +1,13 @@
const { FreeNASDriver } = require("./freenas");
function factory(ctx, options) {
switch (options.driver) {
case "freenas-nfs":
case "freenas-iscsi":
return new FreeNASDriver(ctx, options);
default:
throw new Error("invalid csi driver: " + options.driver);
}
}
module.exports.factory = factory;
+30 -15
View File
@@ -1,5 +1,4 @@
const os = require("os");
const path = require("path");
const grpc = require("grpc");
const fs = require("fs");
const { GrpcError } = require("../utils/grpc");
@@ -31,24 +30,40 @@ class CsiBaseDriver {
* @param {*} parameters
* @param {*} key
*/
getParameterValue(parameters, key) {
getNormalizedParameterValue(parameters, key) {
const normalized = this.getNormalizedParameters(parameters);
return normalized[key];
}
getNormalizedParameters(parameters) {
const normalized = JSON.parse(JSON.stringify(parameters));
const base_key = "democratic-csi.org";
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;
normalizedKey = key.slice(prefixLength);
normalized[normalizedKey] = parameters[key];
delete normalized[key];
}
if (
this.options.instance_id &&
parameters[`${base_key}/${this.options.instance_id}/${key}`]
) {
return parameters[`${base_key}/${this.options.instance_id}/${key}`];
if (key.startsWith(`${base_key}/${this.options.driver}/`)) {
prefixLength = `${base_key}/${this.options.driver}/`.length;
normalizedKey = key.slice(prefixLength);
normalized[normalizedKey] = parameters[key];
delete normalized[key];
}
if (key.startsWith(`${base_key}/`)) {
prefixLength = `${base_key}/`.length;
normalizedKey = key.slice(prefixLength);
normalized[normalizedKey] = parameters[key];
delete normalized[key];
}
}
if (
this.options.driver &&
parameters[`${base_key}/${this.options.driver}/${key}`]
) {
return parameters[`${base_key}/${this.options.driver}/${key}`];
}
return parameters[key];
return normalized;
}
async GetPluginInfo(call) {