From 78fa1d8f2e845808b62c30b9fa0ca70c624f5d31 Mon Sep 17 00:00:00 2001 From: Travis Glenn Hansen Date: Mon, 25 Nov 2019 10:21:01 -0700 Subject: [PATCH] implement normalized parameters, driver factory --- bin/democratic-csi | 30 ++++++++--------- examples/freenas-nfs.yaml | 2 +- src/driver/controller-zfs-ssh/index.js | 6 ++-- src/driver/factory.js | 13 ++++++++ src/driver/index.js | 45 +++++++++++++++++--------- 5 files changed, 62 insertions(+), 34 deletions(-) create mode 100644 src/driver/factory.js diff --git a/bin/democratic-csi b/bin/democratic-csi index 752db58..0b7b510 100755 --- a/bin/democratic-csi +++ b/bin/democratic-csi @@ -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 { diff --git a/examples/freenas-nfs.yaml b/examples/freenas-nfs.yaml index 5d667b1..e5da6d8 100644 --- a/examples/freenas-nfs.yaml +++ b/examples/freenas-nfs.yaml @@ -5,7 +5,7 @@ httpConnection: host: server address port: 80 username: root - password: + password: allowInsecure: true sshConnection: host: server address diff --git a/src/driver/controller-zfs-ssh/index.js b/src/driver/controller-zfs-ssh/index.js index f0b719b..db978db 100644 --- a/src/driver/controller-zfs-ssh/index.js +++ b/src/driver/controller-zfs-ssh/index.js @@ -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; diff --git a/src/driver/factory.js b/src/driver/factory.js new file mode 100644 index 0000000..9eb691c --- /dev/null +++ b/src/driver/factory.js @@ -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; diff --git a/src/driver/index.js b/src/driver/index.js index 591370f..e0aab63 100644 --- a/src/driver/index.js +++ b/src/driver/index.js @@ -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) {