fix nvme address parsing with older versions of nvme-cli package

Signed-off-by: Travis Glenn Hansen <travisghansen@yahoo.com>
This commit is contained in:
Travis Glenn Hansen 2022-12-28 21:08:51 -07:00
parent 263a72635a
commit 1d49644217
2 changed files with 56 additions and 3 deletions

View File

@ -147,8 +147,9 @@ class CsiBaseDriver {
* @returns NVMEoF
*/
getDefaultNVMEoFInstance() {
const driver = this;
return registry.get(`${__REGISTRY_NS__}:default_nvmeof_instance`, () => {
return new NVMEoF();
return new NVMEoF({ logger: driver.ctx.logger });
});
}

View File

@ -24,6 +24,12 @@ class NVMEoF {
spawn: cp.spawn,
};
}
if (nvmeof.options.logger) {
nvmeof.logger = nvmeof.options.logger;
} else {
nvmeof.logger = console;
}
}
/**
@ -46,7 +52,35 @@ class NVMEoF {
async listSubsys(args = []) {
const nvmeof = this;
args.unshift("list-subsys", "-o", "json");
await nvmeof.exec(nvmeof.options.paths.nvme, args);
let result = await nvmeof.exec(nvmeof.options.paths.nvme, args);
return result.parsed;
}
/**
* Discover NVMeoF subsystems
*
* @param {*} transport
* @param {*} args
* @returns
*/
async discover(transport, args = []) {
const nvmeof = this;
transport = nvmeof.parseTransport(transport);
let transport_args = [];
if (transport.type) {
transport_args.push("--transport", transport.type);
}
if (transport.address) {
transport_args.push("--traddr", transport.address);
}
if (transport.service) {
transport_args.push("--trsvcid", transport.service);
}
args.unshift("discover", "-o", "json", ...transport_args);
let result = await nvmeof.exec(nvmeof.options.paths.nvme, args);
return result.parsed;
}
/**
@ -218,6 +252,8 @@ class NVMEoF {
}
}
}
nvmeof.logger.warn(`failed to find subsystem for nqn: ${nqn}`);
}
async getControllerByTransportNQN(transport, nqn) {
@ -231,6 +267,12 @@ class NVMEoF {
}
let controllerAddress = controller.Address;
/**
* For backwards compatibility with older nvme-cli versions (at least < 2.2.1)
* old: "Address":"traddr=127.0.0.1 trsvcid=4420"
* new: "Address":"traddr=127.0.0.1,trsvcid=4420"
*/
controllerAddress = controllerAddress.replaceAll(" ", ",");
let parts = controllerAddress.split(",");
let traddr;
@ -258,6 +300,12 @@ class NVMEoF {
return controller;
}
}
nvmeof.logger.warn(
`failed to find controller for transport: ${JSON.stringify(
transport
)}, nqn: ${nqn}`
);
}
async nqnByNamespaceDeviceName(name) {
@ -318,7 +366,11 @@ class NVMEoF {
command = nvmeof.options.paths.sudo;
}
console.log("executing nvmeof command: %s %s", command, args.join(" "));
nvmeof.logger.verbose(
"executing nvmeof command: %s %s",
command,
args.join(" ")
);
return new Promise((resolve, reject) => {
const child = nvmeof.options.executor.spawn(command, args, options);