more robust TrueNAS Probe calls, better version detection

Signed-off-by: Travis Glenn Hansen <travisghansen@yahoo.com>
This commit is contained in:
Travis Glenn Hansen 2024-03-18 09:38:07 -06:00
parent f607c2a6d5
commit d73183e841
7 changed files with 58 additions and 16 deletions

View File

@ -107,6 +107,7 @@ if (!args.serverSocket && !args.serverAddress && !args.serverPort) {
} }
//console.log(args); //console.log(args);
//console.log(process.env);
const package = require("../package.json"); const package = require("../package.json");
args.version = package.version; args.version = package.version;

View File

@ -617,9 +617,9 @@ class ControllerZfsBaseDriver extends CsiBaseDriver {
); );
} }
return { ready: { value: true } }; return super.Probe(...arguments);
} else { } else {
return { ready: { value: true } }; return super.Probe(...arguments);
} }
} }

View File

@ -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())) { if (!(await httpApiClient.getIsScale())) {
throw new GrpcError( throw new GrpcError(
grpc.status.FAILED_PRECONDITION, grpc.status.FAILED_PRECONDITION,
@ -2203,9 +2212,9 @@ class FreeNASApiDriver extends CsiBaseDriver {
); );
} }
return { ready: { value: true } }; return super.Probe(...arguments);
} else { } else {
return { ready: { value: true } }; return super.Probe(...arguments);
} }
} }

View File

@ -243,7 +243,7 @@ class Api {
* TrueNAS-SCALE-20.11-MASTER-20201127-092915 * TrueNAS-SCALE-20.11-MASTER-20201127-092915
*/ */
try { try {
response = await httpClient.get(endpoint); response = await httpClient.get(endpoint, null, { timeout: 5 * 1000 });
versionResponses.v2 = response; versionResponses.v2 = response;
if (response.statusCode == 200) { if (response.statusCode == 200) {
versionInfo.v2 = response.body; versionInfo.v2 = response.body;
@ -267,7 +267,7 @@ class Api {
* {"fullversion": "FreeNAS-11.2-U5 (c129415c52)", "name": "FreeNAS", "version": ""} * {"fullversion": "FreeNAS-11.2-U5 (c129415c52)", "name": "FreeNAS", "version": ""}
*/ */
try { try {
response = await httpClient.get(endpoint); response = await httpClient.get(endpoint, null, { timeout: 5 * 1000 });
versionResponses.v1 = response; versionResponses.v1 = response;
if (response.statusCode == 200 && IsJsonString(response.body)) { if (response.statusCode == 200 && IsJsonString(response.body)) {
versionInfo.v1 = response.body; versionInfo.v1 = response.body;

View File

@ -150,14 +150,14 @@ class Client {
this.logger.debug("FREENAS HTTP RESPONSE BODY: " + stringify(body)); this.logger.debug("FREENAS HTTP RESPONSE BODY: " + stringify(body));
} }
async get(endpoint, data) { async get(endpoint, data, options = {}) {
const client = this; const client = this;
if (this.options.apiVersion == 1 && !endpoint.endsWith("/")) { if (this.options.apiVersion == 1 && !endpoint.endsWith("/")) {
endpoint += "/"; endpoint += "/";
} }
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const options = client.getRequestCommonOptions(); options = { ...client.getRequestCommonOptions(), ...options };
options.method = "GET"; options.method = "GET";
options.url = this.getBaseURL() + endpoint; options.url = this.getBaseURL() + endpoint;
options.params = data; options.params = data;
@ -172,14 +172,14 @@ class Client {
}); });
} }
async post(endpoint, data) { async post(endpoint, data, options = {}) {
const client = this; const client = this;
if (this.options.apiVersion == 1 && !endpoint.endsWith("/")) { if (this.options.apiVersion == 1 && !endpoint.endsWith("/")) {
endpoint += "/"; endpoint += "/";
} }
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const options = client.getRequestCommonOptions(); options = { ...client.getRequestCommonOptions(), ...options };
options.method = "POST"; options.method = "POST";
options.url = this.getBaseURL() + endpoint; options.url = this.getBaseURL() + endpoint;
options.data = data; options.data = data;
@ -195,14 +195,14 @@ class Client {
}); });
} }
async put(endpoint, data) { async put(endpoint, data, options = {}) {
const client = this; const client = this;
if (this.options.apiVersion == 1 && !endpoint.endsWith("/")) { if (this.options.apiVersion == 1 && !endpoint.endsWith("/")) {
endpoint += "/"; endpoint += "/";
} }
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const options = client.getRequestCommonOptions(); options = { ...client.getRequestCommonOptions(), ...options };
options.method = "PUT"; options.method = "PUT";
options.url = this.getBaseURL() + endpoint; options.url = this.getBaseURL() + endpoint;
options.data = data; options.data = data;
@ -218,14 +218,14 @@ class Client {
}); });
} }
async delete(endpoint, data) { async delete(endpoint, data, options = {}) {
const client = this; const client = this;
if (this.options.apiVersion == 1 && !endpoint.endsWith("/")) { if (this.options.apiVersion == 1 && !endpoint.endsWith("/")) {
endpoint += "/"; endpoint += "/";
} }
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const options = client.getRequestCommonOptions(); options = { ...client.getRequestCommonOptions(), ...options };
options.method = "DELETE"; options.method = "DELETE";
options.url = this.getBaseURL() + endpoint; options.url = this.getBaseURL() + endpoint;
options.data = data; options.data = data;

View File

@ -28,6 +28,34 @@ const FREENAS_SYSTEM_VERSION_CACHE_KEY = "freenas:system_version";
const __REGISTRY_NS__ = "FreeNASSshDriver"; const __REGISTRY_NS__ = "FreeNASSshDriver";
class FreeNASSshDriver extends ControllerZfsBaseDriver { 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() { getExecClient() {
return registry.get(`${__REGISTRY_NS__}:exec_client`, () => { return registry.get(`${__REGISTRY_NS__}:exec_client`, () => {
return new SshClient({ return new SshClient({
@ -2235,7 +2263,7 @@ class FreeNASSshDriver extends ControllerZfsBaseDriver {
* TrueNAS-SCALE-20.11-MASTER-20201127-092915 * TrueNAS-SCALE-20.11-MASTER-20201127-092915
*/ */
try { try {
response = await httpClient.get(endpoint); response = await httpClient.get(endpoint, null, { timeout: 5 * 1000 });
versionResponses.v2 = response; versionResponses.v2 = response;
if (response.statusCode == 200) { if (response.statusCode == 200) {
versionInfo.v2 = response.body; versionInfo.v2 = response.body;
@ -2259,7 +2287,7 @@ class FreeNASSshDriver extends ControllerZfsBaseDriver {
* {"fullversion": "FreeNAS-11.2-U5 (c129415c52)", "name": "FreeNAS", "version": ""} * {"fullversion": "FreeNAS-11.2-U5 (c129415c52)", "name": "FreeNAS", "version": ""}
*/ */
try { try {
response = await httpClient.get(endpoint); response = await httpClient.get(endpoint, null, { timeout: 5 * 1000 });
versionResponses.v1 = response; versionResponses.v1 = response;
if (response.statusCode == 200 && IsJsonString(response.body)) { if (response.statusCode == 200 && IsJsonString(response.body)) {
versionInfo.v1 = response.body; versionInfo.v1 = response.body;

View File

@ -3,3 +3,7 @@ if (typeof String.prototype.replaceAll == "undefined") {
return this.replace(new RegExp(match, "g"), () => replace); return this.replace(new RegExp(match, "g"), () => replace);
}; };
} }
Array.prototype.random = function () {
return this[Math.floor(Math.random() * this.length)];
};