Improve Synology error handling
This commit is contained in:
parent
19197f9515
commit
c76750a303
|
|
@ -4,10 +4,50 @@ const https = require("https");
|
||||||
const { axios_request, stringify } = require("../../../utils/general");
|
const { axios_request, stringify } = require("../../../utils/general");
|
||||||
const Mutex = require("async-mutex").Mutex;
|
const Mutex = require("async-mutex").Mutex;
|
||||||
const registry = require("../../../utils/registry");
|
const registry = require("../../../utils/registry");
|
||||||
|
const { GrpcError, grpc } = require("../../../utils/grpc");
|
||||||
|
|
||||||
const USER_AGENT = "democratic-csi";
|
const USER_AGENT = "democratic-csi";
|
||||||
const __REGISTRY_NS__ = "SynologyHttpClient";
|
const __REGISTRY_NS__ = "SynologyHttpClient";
|
||||||
|
|
||||||
|
SYNO_ERROR_MESSAGES = {
|
||||||
|
18990002: "The synology volume is out of disk space.",
|
||||||
|
18990538: "A LUN with this name already exists.",
|
||||||
|
18990541: "The maximum number of LUNS has been reached.",
|
||||||
|
18990542: "The maximum number if iSCSI target has been reached.",
|
||||||
|
18990744: "An iSCSI target with this name already exists.",
|
||||||
|
18990532: "No such snapshot.",
|
||||||
|
18990500: "Bad LUN type",
|
||||||
|
18990543: "Maximum number of snapshots reached.",
|
||||||
|
18990635: "Invalid ioPolicy."
|
||||||
|
}
|
||||||
|
|
||||||
|
SYNO_GRPC_CODES = {
|
||||||
|
18990002: grpc.status.RESOURCE_EXHAUSTED,
|
||||||
|
18990538: grpc.status.ALREADY_EXISTS,
|
||||||
|
18990541: grpc.status.RESOURCE_EXHAUSTED,
|
||||||
|
18990542: grpc.status.RESOURCE_EXHAUSTED,
|
||||||
|
18990744: grpc.status.ALREADY_EXISTS,
|
||||||
|
18990532: grpc.status.NOT_FOUND,
|
||||||
|
18990500: grpc.status.INVALID_ARGUMENT,
|
||||||
|
18990543: grpc.status.RESOURCE_EXHAUSTED,
|
||||||
|
18990635: grpc.status.INVALID_ARGUMENT
|
||||||
|
}
|
||||||
|
|
||||||
|
class SynologyError extends GrpcError {
|
||||||
|
constructor(code, httpCode = undefined) {
|
||||||
|
super(0, "");
|
||||||
|
this.synoCode = code;
|
||||||
|
this.httpCode = httpCode;
|
||||||
|
if (code > 0) {
|
||||||
|
this.code = SYNO_GRPC_CODES[code] ?? grpc.status.UNKNOWN;
|
||||||
|
this.message = SYNO_ERROR_MESSAGES[code] ?? `An unknown error occurred when executing a synology command (code = ${code}).`;
|
||||||
|
} else {
|
||||||
|
this.code = grpc.status.UNKNOWN;
|
||||||
|
this.message = `The synology webserver returned a status code ${httpCode}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class SynologyHttpClient {
|
class SynologyHttpClient {
|
||||||
constructor(options = {}) {
|
constructor(options = {}) {
|
||||||
this.options = JSON.parse(JSON.stringify(options));
|
this.options = JSON.parse(JSON.stringify(options));
|
||||||
|
|
@ -149,7 +189,7 @@ class SynologyHttpClient {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (response.statusCode > 299 || response.statusCode < 200) {
|
if (response.statusCode > 299 || response.statusCode < 200) {
|
||||||
reject(response);
|
reject(new SynologyError(-1, response.statusCode))
|
||||||
}
|
}
|
||||||
|
|
||||||
if (response.body.success === false) {
|
if (response.body.success === false) {
|
||||||
|
|
@ -157,7 +197,7 @@ class SynologyHttpClient {
|
||||||
if (response.body.error.code == 119 && sid == client.sid) {
|
if (response.body.error.code == 119 && sid == client.sid) {
|
||||||
client.sid = null;
|
client.sid = null;
|
||||||
}
|
}
|
||||||
reject(response);
|
reject(new SynologyError(response.body.error.code, response.statusCode));
|
||||||
}
|
}
|
||||||
|
|
||||||
resolve(response);
|
resolve(response);
|
||||||
|
|
@ -412,7 +452,7 @@ class SynologyHttpClient {
|
||||||
response = await this.do_request("GET", "entry.cgi", iscsi_lun_create);
|
response = await this.do_request("GET", "entry.cgi", iscsi_lun_create);
|
||||||
return response.body.data.uuid;
|
return response.body.data.uuid;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if ([18990538].includes(err.body.error.code)) {
|
if (err.synoCode === 18990538) {
|
||||||
response = await this.do_request("GET", "entry.cgi", lun_list);
|
response = await this.do_request("GET", "entry.cgi", lun_list);
|
||||||
let lun = response.body.data.luns.find((i) => {
|
let lun = response.body.data.luns.find((i) => {
|
||||||
return i.name == iscsi_lun_create.name;
|
return i.name == iscsi_lun_create.name;
|
||||||
|
|
@ -503,7 +543,7 @@ class SynologyHttpClient {
|
||||||
|
|
||||||
return response.body.data.target_id;
|
return response.body.data.target_id;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if ([18990744].includes(err.body.error.code)) {
|
if (err.synoCode === 18990744) {
|
||||||
//do lookup
|
//do lookup
|
||||||
const iscsi_target_list = {
|
const iscsi_target_list = {
|
||||||
api: "SYNO.Core.ISCSI.Target",
|
api: "SYNO.Core.ISCSI.Target",
|
||||||
|
|
@ -549,7 +589,7 @@ class SynologyHttpClient {
|
||||||
/**
|
/**
|
||||||
* 18990710 = non-existant
|
* 18990710 = non-existant
|
||||||
*/
|
*/
|
||||||
//if (![18990710].includes(err.body.error.code)) {
|
//if (err.synoCode !== 18990710) {
|
||||||
throw err;
|
throw err;
|
||||||
//}
|
//}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue