From a13b30ab3d1f3f754e029dce9cdf9971fcca9035 Mon Sep 17 00:00:00 2001 From: Travis Glenn Hansen Date: Fri, 25 Jun 2021 14:17:34 -0600 Subject: [PATCH] fixup bad Object.assign usage Signed-off-by: Travis Glenn Hansen --- src/driver/controller-synology/http/index.js | 83 ++++++++++++-------- src/driver/controller-synology/index.js | 32 +++++--- 2 files changed, 71 insertions(+), 44 deletions(-) diff --git a/src/driver/controller-synology/http/index.js b/src/driver/controller-synology/http/index.js index fe8895a..59b632c 100644 --- a/src/driver/controller-synology/http/index.js +++ b/src/driver/controller-synology/http/index.js @@ -46,7 +46,7 @@ class SynologyHttpClient { 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 isAuth = data.api == "SYNO.API.Auth" && data.method == "login"; let sid; @@ -56,6 +56,8 @@ class SynologyHttpClient { }); } + const invoke_options = options; + return new Promise((resolve, reject) => { if (data.api != "SYNO.API.Auth") { data._sid = sid; @@ -67,9 +69,11 @@ class SynologyHttpClient { headers: { Accept: "application/json", "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: { rejectUnauthorized: !!!client.options.allowInsecure, }, @@ -80,7 +84,12 @@ class SynologyHttpClient { options.qs = data; break; default: - options.body = data; + if (invoke_options.use_form_encoded) { + //options.body = URLSearchParams(data); + options.form = data; + } else { + options.body = data; + } break; } @@ -91,6 +100,15 @@ class SynologyHttpClient { 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) { reject(response); } @@ -134,6 +152,15 @@ class SynologyHttpClient { return target; } + async GetTargetByIQN(iqn) { + let targets = await this.ListTargets(); + let target = targets.find((i) => { + return i.iqn == iqn; + }); + + return target; + } + async ListTargets() { const iscsi_target_list = { api: "SYNO.Core.ISCSI.Target", @@ -148,7 +175,7 @@ class SynologyHttpClient { async CreateLun(data = {}) { let response; - let iscsi_lun_create = Object.assign(data, { + let iscsi_lun_create = Object.assign({}, data, { api: "SYNO.Core.ISCSI.LUN", version: "1", method: "create", @@ -178,7 +205,7 @@ class SynologyHttpClient { async MapLun(data = {}) { // 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", method: "map_target", version: "1", @@ -199,42 +226,33 @@ class SynologyHttpClient { } async DeleteLun(uuid) { + uuid = uuid || ""; let iscsi_lun_delete = { api: "SYNO.Core.ISCSI.LUN", method: "delete", version: 1, - uuid: uuid || "", + //uuid: uuid, + uuid: "", + uuids: JSON.stringify([uuid]), + //is_soft_feas_ignored: false, + is_soft_feas_ignored: true, }; try { await this.do_request("GET", "entry.cgi", iscsi_lun_delete); } catch (err) { + /** + * 18990710 = already gone + * LUN_BAD_LUN_UUID = 18990505 + * LUN_NO_SUCH_SNAPSHOT = 18990532 + */ if (![18990505].includes(err.body.error.code)) { 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 = {}) { - let iscsi_target_create = Object.assign(data, { + let iscsi_target_create = Object.assign({}, data, { api: "SYNO.Core.ISCSI.Target", version: "1", method: "create", @@ -262,8 +280,11 @@ class SynologyHttpClient { return i.iqn == iscsi_target_create.iqn; }); - let target_id = target.target_id; - return target_id; + if (target) { + return target.target_id; + } else { + throw err; + } } else { throw err; } @@ -282,7 +303,7 @@ class SynologyHttpClient { await this.do_request( "GET", "entry.cgi", - Object.assign(iscsi_target_delete, { + Object.assign({}, iscsi_target_delete, { target_id: JSON.stringify(String(target_id || "")), }) ); @@ -306,7 +327,7 @@ class SynologyHttpClient { await this.do_request( "GET", "entry.cgi", - Object.assign(iscsi_lun_extend, { uuid: uuid, new_size: size }) + Object.assign({}, iscsi_lun_extend, { uuid: uuid, new_size: size }) ); } } diff --git a/src/driver/controller-synology/index.js b/src/driver/controller-synology/index.js index d0a9d6c..889e21b 100644 --- a/src/driver/controller-synology/index.js +++ b/src/driver/controller-synology/index.js @@ -274,32 +274,36 @@ class ControllerSynologyDriver extends CsiBaseDriver { let target; let lun_mapping; - let iqn = driver.options.iscsi.baseiqn + iscsiName; - data = Object.assign(driver.options.iscsi.targetAttributes, { - name: iscsiName, - iqn, - }); - - let target_id = await httpClient.CreateTarget(data); - data = Object.assign(driver.options.iscsi.lunAttributes, { + // create lun + data = Object.assign({}, driver.options.iscsi.lunAttributes, { name: iscsiName, location: driver.options.synology.location, size: capacity_bytes, }); 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) { throw new GrpcError( 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) => { return lun.lun_uuid == lun_uuid; }); + // create mapping if not present already if (!lun_mapping) { data = { uuid: lun_uuid, @@ -403,11 +407,13 @@ class ControllerSynologyDriver extends CsiBaseDriver { let iscsiName = driver.buildIscsiName(name); 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); await httpClient.DeleteLun(response); - - response = await httpClient.GetTargetIDByIQN(iqn); - await httpClient.DeleteTarget(response); break; default: throw new GrpcError(