fixup bad Object.assign usage

Signed-off-by: Travis Glenn Hansen <travisghansen@yahoo.com>
This commit is contained in:
Travis Glenn Hansen 2021-06-25 14:17:34 -06:00
parent 30941409f4
commit a13b30ab3d
2 changed files with 71 additions and 44 deletions

View File

@ -46,7 +46,7 @@ class SynologyHttpClient {
this.logger.debug("SYNOLOGY HTTP BODY: " + JSON.stringify(body)); this.logger.debug("SYNOLOGY HTTP BODY: " + JSON.stringify(body));
} }
async do_request(method, path, data = {}) { async do_request(method, path, data = {}, options = {}) {
const client = this; const client = this;
const isAuth = data.api == "SYNO.API.Auth" && data.method == "login"; const isAuth = data.api == "SYNO.API.Auth" && data.method == "login";
let sid; let sid;
@ -56,6 +56,8 @@ class SynologyHttpClient {
}); });
} }
const invoke_options = options;
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (data.api != "SYNO.API.Auth") { if (data.api != "SYNO.API.Auth") {
data._sid = sid; data._sid = sid;
@ -67,9 +69,11 @@ class SynologyHttpClient {
headers: { headers: {
Accept: "application/json", Accept: "application/json",
"User-Agent": USER_AGENT, "User-Agent": USER_AGENT,
"Content-Type": "application/json", "Content-Type": invoke_options.use_form_encoded
? "application/x-www-form-urlencoded"
: "application/json",
}, },
json: true, json: invoke_options.use_form_encoded ? false : true,
agentOptions: { agentOptions: {
rejectUnauthorized: !!!client.options.allowInsecure, rejectUnauthorized: !!!client.options.allowInsecure,
}, },
@ -80,7 +84,12 @@ class SynologyHttpClient {
options.qs = data; options.qs = data;
break; break;
default: default:
options.body = data; if (invoke_options.use_form_encoded) {
//options.body = URLSearchParams(data);
options.form = data;
} else {
options.body = data;
}
break; break;
} }
@ -91,6 +100,15 @@ class SynologyHttpClient {
reject(error); reject(error);
} }
if (
typeof response.body !== "object" &&
response.body !== null &&
response.headers["content-type"] &&
response.headers["content-type"].includes("application/json")
) {
response.body = JSON.parse(response.body);
}
if (response.statusCode > 299 || response.statusCode < 200) { if (response.statusCode > 299 || response.statusCode < 200) {
reject(response); reject(response);
} }
@ -134,6 +152,15 @@ class SynologyHttpClient {
return target; return target;
} }
async GetTargetByIQN(iqn) {
let targets = await this.ListTargets();
let target = targets.find((i) => {
return i.iqn == iqn;
});
return target;
}
async ListTargets() { async ListTargets() {
const iscsi_target_list = { const iscsi_target_list = {
api: "SYNO.Core.ISCSI.Target", api: "SYNO.Core.ISCSI.Target",
@ -148,7 +175,7 @@ class SynologyHttpClient {
async CreateLun(data = {}) { async CreateLun(data = {}) {
let response; let response;
let iscsi_lun_create = Object.assign(data, { let iscsi_lun_create = Object.assign({}, data, {
api: "SYNO.Core.ISCSI.LUN", api: "SYNO.Core.ISCSI.LUN",
version: "1", version: "1",
method: "create", method: "create",
@ -178,7 +205,7 @@ class SynologyHttpClient {
async MapLun(data = {}) { async MapLun(data = {}) {
// this is mapping from the perspective of the lun // this is mapping from the perspective of the lun
let iscsi_target_map = Object.assign(data, { let iscsi_target_map = Object.assign({}, data, {
api: "SYNO.Core.ISCSI.LUN", api: "SYNO.Core.ISCSI.LUN",
method: "map_target", method: "map_target",
version: "1", version: "1",
@ -199,42 +226,33 @@ class SynologyHttpClient {
} }
async DeleteLun(uuid) { async DeleteLun(uuid) {
uuid = uuid || "";
let iscsi_lun_delete = { let iscsi_lun_delete = {
api: "SYNO.Core.ISCSI.LUN", api: "SYNO.Core.ISCSI.LUN",
method: "delete", method: "delete",
version: 1, version: 1,
uuid: uuid || "", //uuid: uuid,
uuid: "",
uuids: JSON.stringify([uuid]),
//is_soft_feas_ignored: false,
is_soft_feas_ignored: true,
}; };
try { try {
await this.do_request("GET", "entry.cgi", iscsi_lun_delete); await this.do_request("GET", "entry.cgi", iscsi_lun_delete);
} catch (err) { } catch (err) {
/**
* 18990710 = already gone
* LUN_BAD_LUN_UUID = 18990505
* LUN_NO_SUCH_SNAPSHOT = 18990532
*/
if (![18990505].includes(err.body.error.code)) { if (![18990505].includes(err.body.error.code)) {
throw err; throw err;
} }
} }
} }
async GetTargetIDByIQN(iqn) {
const iscsi_target_list = {
api: "SYNO.Core.ISCSI.Target",
version: "1",
path: "entry.cgi",
method: "list",
additional: '["mapped_lun", "status", "acls", "connected_sessions"]',
};
let response = await this.do_request("GET", "entry.cgi", iscsi_target_list);
let target = response.body.data.targets.find((i) => {
return i.iqn == iqn;
});
if (target) {
return target.target_id;
}
}
async CreateTarget(data = {}) { async CreateTarget(data = {}) {
let iscsi_target_create = Object.assign(data, { let iscsi_target_create = Object.assign({}, data, {
api: "SYNO.Core.ISCSI.Target", api: "SYNO.Core.ISCSI.Target",
version: "1", version: "1",
method: "create", method: "create",
@ -262,8 +280,11 @@ class SynologyHttpClient {
return i.iqn == iscsi_target_create.iqn; return i.iqn == iscsi_target_create.iqn;
}); });
let target_id = target.target_id; if (target) {
return target_id; return target.target_id;
} else {
throw err;
}
} else { } else {
throw err; throw err;
} }
@ -282,7 +303,7 @@ class SynologyHttpClient {
await this.do_request( await this.do_request(
"GET", "GET",
"entry.cgi", "entry.cgi",
Object.assign(iscsi_target_delete, { Object.assign({}, iscsi_target_delete, {
target_id: JSON.stringify(String(target_id || "")), target_id: JSON.stringify(String(target_id || "")),
}) })
); );
@ -306,7 +327,7 @@ class SynologyHttpClient {
await this.do_request( await this.do_request(
"GET", "GET",
"entry.cgi", "entry.cgi",
Object.assign(iscsi_lun_extend, { uuid: uuid, new_size: size }) Object.assign({}, iscsi_lun_extend, { uuid: uuid, new_size: size })
); );
} }
} }

View File

@ -274,32 +274,36 @@ class ControllerSynologyDriver extends CsiBaseDriver {
let target; let target;
let lun_mapping; let lun_mapping;
let iqn = driver.options.iscsi.baseiqn + iscsiName; // create lun
data = Object.assign(driver.options.iscsi.targetAttributes, { data = Object.assign({}, driver.options.iscsi.lunAttributes, {
name: iscsiName,
iqn,
});
let target_id = await httpClient.CreateTarget(data);
data = Object.assign(driver.options.iscsi.lunAttributes, {
name: iscsiName, name: iscsiName,
location: driver.options.synology.location, location: driver.options.synology.location,
size: capacity_bytes, size: capacity_bytes,
}); });
let lun_uuid = await httpClient.CreateLun(data); let lun_uuid = await httpClient.CreateLun(data);
target = await httpClient.GetTargetByTargetID(target_id);
// create target
let iqn = driver.options.iscsi.baseiqn + iscsiName;
data = Object.assign({}, driver.options.iscsi.targetAttributes, {
name: iscsiName,
iqn,
});
let target_id = await httpClient.CreateTarget(data);
//target = await httpClient.GetTargetByTargetID(target_id);
target = await httpClient.GetTargetByIQN(iqn);
if (!target) { if (!target) {
throw new GrpcError( throw new GrpcError(
grpc.status.UNKNOWN, grpc.status.UNKNOWN,
`failed to lookup target: ${target_id}` `failed to lookup target: ${iqn}`
); );
} }
// check if mapping of lun <-> target already exists
lun_mapping = target.mapped_luns.find((lun) => { lun_mapping = target.mapped_luns.find((lun) => {
return lun.lun_uuid == lun_uuid; return lun.lun_uuid == lun_uuid;
}); });
// create mapping if not present already
if (!lun_mapping) { if (!lun_mapping) {
data = { data = {
uuid: lun_uuid, uuid: lun_uuid,
@ -403,11 +407,13 @@ class ControllerSynologyDriver extends CsiBaseDriver {
let iscsiName = driver.buildIscsiName(name); let iscsiName = driver.buildIscsiName(name);
let iqn = driver.options.iscsi.baseiqn + iscsiName; let iqn = driver.options.iscsi.baseiqn + iscsiName;
response = await httpClient.GetTargetByIQN(iqn);
if (response) {
await httpClient.DeleteTarget(response.target_id);
}
response = await httpClient.GetLunUUIDByName(iscsiName); response = await httpClient.GetLunUUIDByName(iscsiName);
await httpClient.DeleteLun(response); await httpClient.DeleteLun(response);
response = await httpClient.GetTargetIDByIQN(iqn);
await httpClient.DeleteTarget(response);
break; break;
default: default:
throw new GrpcError( throw new GrpcError(