diff --git a/bin/democratic-csi b/bin/democratic-csi index 3160798..c1c23b1 100755 --- a/bin/democratic-csi +++ b/bin/democratic-csi @@ -107,6 +107,7 @@ if (!args.serverSocket && !args.serverAddress && !args.serverPort) { } //console.log(args); +//console.log(process.env); const package = require("../package.json"); args.version = package.version; diff --git a/src/driver/controller-zfs/index.js b/src/driver/controller-zfs/index.js index f1ff1d1..d665979 100644 --- a/src/driver/controller-zfs/index.js +++ b/src/driver/controller-zfs/index.js @@ -617,9 +617,9 @@ class ControllerZfsBaseDriver extends CsiBaseDriver { ); } - return { ready: { value: true } }; + return super.Probe(...arguments); } else { - return { ready: { value: true } }; + return super.Probe(...arguments); } } diff --git a/src/driver/freenas/api.js b/src/driver/freenas/api.js index 0af12e9..e728c37 100644 --- a/src/driver/freenas/api.js +++ b/src/driver/freenas/api.js @@ -2196,6 +2196,15 @@ class FreeNASApiDriver extends CsiBaseDriver { ); } + try { + await httpApiClient.getSystemVersion(); + } catch (err) { + throw new GrpcError( + grpc.status.FAILED_PRECONDITION, + `TrueNAS api is unavailable: ${err.getMessage()}` + ); + } + if (!(await httpApiClient.getIsScale())) { throw new GrpcError( grpc.status.FAILED_PRECONDITION, @@ -2203,9 +2212,9 @@ class FreeNASApiDriver extends CsiBaseDriver { ); } - return { ready: { value: true } }; + return super.Probe(...arguments); } else { - return { ready: { value: true } }; + return super.Probe(...arguments); } } diff --git a/src/driver/freenas/http/api.js b/src/driver/freenas/http/api.js index a153cbb..b9f0057 100644 --- a/src/driver/freenas/http/api.js +++ b/src/driver/freenas/http/api.js @@ -243,7 +243,7 @@ class Api { * TrueNAS-SCALE-20.11-MASTER-20201127-092915 */ try { - response = await httpClient.get(endpoint); + response = await httpClient.get(endpoint, null, { timeout: 5 * 1000 }); versionResponses.v2 = response; if (response.statusCode == 200) { versionInfo.v2 = response.body; @@ -267,7 +267,7 @@ class Api { * {"fullversion": "FreeNAS-11.2-U5 (c129415c52)", "name": "FreeNAS", "version": ""} */ try { - response = await httpClient.get(endpoint); + response = await httpClient.get(endpoint, null, { timeout: 5 * 1000 }); versionResponses.v1 = response; if (response.statusCode == 200 && IsJsonString(response.body)) { versionInfo.v1 = response.body; diff --git a/src/driver/freenas/http/index.js b/src/driver/freenas/http/index.js index 8dd7eae..54f4a34 100644 --- a/src/driver/freenas/http/index.js +++ b/src/driver/freenas/http/index.js @@ -150,14 +150,14 @@ class Client { this.logger.debug("FREENAS HTTP RESPONSE BODY: " + stringify(body)); } - async get(endpoint, data) { + async get(endpoint, data, options = {}) { const client = this; if (this.options.apiVersion == 1 && !endpoint.endsWith("/")) { endpoint += "/"; } return new Promise((resolve, reject) => { - const options = client.getRequestCommonOptions(); + options = { ...client.getRequestCommonOptions(), ...options }; options.method = "GET"; options.url = this.getBaseURL() + endpoint; options.params = data; @@ -172,14 +172,14 @@ class Client { }); } - async post(endpoint, data) { + async post(endpoint, data, options = {}) { const client = this; if (this.options.apiVersion == 1 && !endpoint.endsWith("/")) { endpoint += "/"; } return new Promise((resolve, reject) => { - const options = client.getRequestCommonOptions(); + options = { ...client.getRequestCommonOptions(), ...options }; options.method = "POST"; options.url = this.getBaseURL() + endpoint; options.data = data; @@ -195,14 +195,14 @@ class Client { }); } - async put(endpoint, data) { + async put(endpoint, data, options = {}) { const client = this; if (this.options.apiVersion == 1 && !endpoint.endsWith("/")) { endpoint += "/"; } return new Promise((resolve, reject) => { - const options = client.getRequestCommonOptions(); + options = { ...client.getRequestCommonOptions(), ...options }; options.method = "PUT"; options.url = this.getBaseURL() + endpoint; options.data = data; @@ -218,14 +218,14 @@ class Client { }); } - async delete(endpoint, data) { + async delete(endpoint, data, options = {}) { const client = this; if (this.options.apiVersion == 1 && !endpoint.endsWith("/")) { endpoint += "/"; } return new Promise((resolve, reject) => { - const options = client.getRequestCommonOptions(); + options = { ...client.getRequestCommonOptions(), ...options }; options.method = "DELETE"; options.url = this.getBaseURL() + endpoint; options.data = data; diff --git a/src/driver/freenas/ssh.js b/src/driver/freenas/ssh.js index 35018a7..29d90cb 100644 --- a/src/driver/freenas/ssh.js +++ b/src/driver/freenas/ssh.js @@ -28,6 +28,34 @@ const FREENAS_SYSTEM_VERSION_CACHE_KEY = "freenas:system_version"; const __REGISTRY_NS__ = "FreeNASSshDriver"; class FreeNASSshDriver extends ControllerZfsBaseDriver { + /** + * Ensure sane options are used etc + * true = ready + * false = not ready, but progressiong towards ready + * throw error = faulty setup + * + * @param {*} call + */ + async Probe(call) { + const driver = this; + + if (driver.ctx.args.csiMode.includes("controller")) { + const httpApiClient = await driver.getTrueNASHttpApiClient(); + try { + await httpApiClient.getSystemVersion(); + } catch (err) { + throw new GrpcError( + grpc.status.FAILED_PRECONDITION, + `TrueNAS api is unavailable: ${err.getMessage()}` + ); + } + + return super.Probe(...arguments); + } else { + return super.Probe(...arguments); + } + } + getExecClient() { return registry.get(`${__REGISTRY_NS__}:exec_client`, () => { return new SshClient({ @@ -2235,7 +2263,7 @@ class FreeNASSshDriver extends ControllerZfsBaseDriver { * TrueNAS-SCALE-20.11-MASTER-20201127-092915 */ try { - response = await httpClient.get(endpoint); + response = await httpClient.get(endpoint, null, { timeout: 5 * 1000 }); versionResponses.v2 = response; if (response.statusCode == 200) { versionInfo.v2 = response.body; @@ -2259,7 +2287,7 @@ class FreeNASSshDriver extends ControllerZfsBaseDriver { * {"fullversion": "FreeNAS-11.2-U5 (c129415c52)", "name": "FreeNAS", "version": ""} */ try { - response = await httpClient.get(endpoint); + response = await httpClient.get(endpoint, null, { timeout: 5 * 1000 }); versionResponses.v1 = response; if (response.statusCode == 200 && IsJsonString(response.body)) { versionInfo.v1 = response.body; diff --git a/src/utils/polyfills.js b/src/utils/polyfills.js index 0e22848..0d1023b 100644 --- a/src/utils/polyfills.js +++ b/src/utils/polyfills.js @@ -3,3 +3,7 @@ if (typeof String.prototype.replaceAll == "undefined") { return this.replace(new RegExp(match, "g"), () => replace); }; } + +Array.prototype.random = function () { + return this[Math.floor(Math.random() * this.length)]; +};