new path for controller-zfs base driver
Signed-off-by: Travis Glenn Hansen <travisghansen@yahoo.com>
This commit is contained in:
parent
8913dfb58e
commit
dbe827937a
|
|
@ -1,11 +1,8 @@
|
||||||
const { CsiBaseDriver } = require("../index");
|
const { CsiBaseDriver } = require("../index");
|
||||||
const SshClient = require("../../utils/ssh").SshClient;
|
|
||||||
const { GrpcError, grpc } = require("../../utils/grpc");
|
const { GrpcError, grpc } = require("../../utils/grpc");
|
||||||
const sleep = require("../../utils/general").sleep;
|
const sleep = require("../../utils/general").sleep;
|
||||||
const getLargestNumber = require("../../utils/general").getLargestNumber;
|
const getLargestNumber = require("../../utils/general").getLargestNumber;
|
||||||
|
|
||||||
const { Zetabyte, ZfsSshProcessManager } = require("../../utils/zfs");
|
|
||||||
|
|
||||||
const Handlebars = require("handlebars");
|
const Handlebars = require("handlebars");
|
||||||
const uuidv4 = require("uuid").v4;
|
const uuidv4 = require("uuid").v4;
|
||||||
const semver = require("semver");
|
const semver = require("semver");
|
||||||
|
|
@ -34,12 +31,15 @@ const VOLUME_CONTEXT_PROVISIONER_INSTANCE_ID_PROPERTY_NAME =
|
||||||
/**
|
/**
|
||||||
* Base driver to provisin zfs assets over ssh.
|
* Base driver to provisin zfs assets over ssh.
|
||||||
* Derived drivers only need to implement:
|
* Derived drivers only need to implement:
|
||||||
|
* - getExecClient()
|
||||||
|
* - async getZetabyte()
|
||||||
|
* - async setZetabyteCustomOptions(options) // optional
|
||||||
* - getDriverZfsResourceType() // return "filesystem" or "volume"
|
* - getDriverZfsResourceType() // return "filesystem" or "volume"
|
||||||
* - async createShare(call, datasetName) // return appropriate volume_context for Node operations
|
* - async createShare(call, datasetName) // return appropriate volume_context for Node operations
|
||||||
* - async deleteShare(call, datasetName) // no return expected
|
* - async deleteShare(call, datasetName) // no return expected
|
||||||
* - async expandVolume(call, datasetName) // no return expected, used for restarting services etc if needed
|
* - async expandVolume(call, datasetName) // no return expected, used for restarting services etc if needed
|
||||||
*/
|
*/
|
||||||
class ControllerZfsSshBaseDriver extends CsiBaseDriver {
|
class ControllerZfsBaseDriver extends CsiBaseDriver {
|
||||||
constructor(ctx, options) {
|
constructor(ctx, options) {
|
||||||
super(...arguments);
|
super(...arguments);
|
||||||
|
|
||||||
|
|
@ -146,42 +146,6 @@ class ControllerZfsSshBaseDriver extends CsiBaseDriver {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
getSshClient() {
|
|
||||||
return new SshClient({
|
|
||||||
logger: this.ctx.logger,
|
|
||||||
connection: this.options.sshConnection,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
async getZetabyte() {
|
|
||||||
const sshClient = this.getSshClient();
|
|
||||||
const options = {};
|
|
||||||
options.executor = new ZfsSshProcessManager(sshClient);
|
|
||||||
options.idempotent = true;
|
|
||||||
|
|
||||||
if (
|
|
||||||
this.options.zfs.hasOwnProperty("cli") &&
|
|
||||||
this.options.zfs.cli &&
|
|
||||||
this.options.zfs.cli.hasOwnProperty("paths")
|
|
||||||
) {
|
|
||||||
options.paths = this.options.zfs.cli.paths;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (
|
|
||||||
this.options.zfs.hasOwnProperty("cli") &&
|
|
||||||
this.options.zfs.cli &&
|
|
||||||
this.options.zfs.cli.hasOwnProperty("sudoEnabled")
|
|
||||||
) {
|
|
||||||
options.sudo = this.getSudoEnabled();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof this.setZetabyteCustomOptions === "function") {
|
|
||||||
await this.setZetabyteCustomOptions(options);
|
|
||||||
}
|
|
||||||
|
|
||||||
return new Zetabyte(options);
|
|
||||||
}
|
|
||||||
|
|
||||||
getSudoEnabled() {
|
getSudoEnabled() {
|
||||||
return this.options.zfs.cli && this.options.zfs.cli.sudoEnabled === true;
|
return this.options.zfs.cli && this.options.zfs.cli.sudoEnabled === true;
|
||||||
}
|
}
|
||||||
|
|
@ -402,7 +366,7 @@ class ControllerZfsSshBaseDriver extends CsiBaseDriver {
|
||||||
*/
|
*/
|
||||||
async getMaxZvolNameLength() {
|
async getMaxZvolNameLength() {
|
||||||
const driver = this;
|
const driver = this;
|
||||||
const sshClient = driver.getSshClient();
|
const execClient = driver.getExecClient();
|
||||||
|
|
||||||
let response;
|
let response;
|
||||||
let command;
|
let command;
|
||||||
|
|
@ -412,7 +376,7 @@ class ControllerZfsSshBaseDriver extends CsiBaseDriver {
|
||||||
// get kernel
|
// get kernel
|
||||||
command = "uname -s";
|
command = "uname -s";
|
||||||
driver.ctx.logger.verbose("uname command: %s", command);
|
driver.ctx.logger.verbose("uname command: %s", command);
|
||||||
response = await sshClient.exec(command);
|
response = await execClient.exec(command);
|
||||||
if (response.code !== 0) {
|
if (response.code !== 0) {
|
||||||
throw new Error("failed to run uname to determine max zvol name length");
|
throw new Error("failed to run uname to determine max zvol name length");
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -429,7 +393,7 @@ class ControllerZfsSshBaseDriver extends CsiBaseDriver {
|
||||||
// get kernel_release
|
// get kernel_release
|
||||||
command = "uname -r";
|
command = "uname -r";
|
||||||
driver.ctx.logger.verbose("uname command: %s", command);
|
driver.ctx.logger.verbose("uname command: %s", command);
|
||||||
response = await sshClient.exec(command);
|
response = await execClient.exec(command);
|
||||||
if (response.code !== 0) {
|
if (response.code !== 0) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
"failed to run uname to determine max zvol name length"
|
"failed to run uname to determine max zvol name length"
|
||||||
|
|
@ -485,9 +449,9 @@ class ControllerZfsSshBaseDriver extends CsiBaseDriver {
|
||||||
* - ensure csh is not the operative shell
|
* - ensure csh is not the operative shell
|
||||||
*/
|
*/
|
||||||
if (!driver.currentSSHShell || timerEnabled === false) {
|
if (!driver.currentSSHShell || timerEnabled === false) {
|
||||||
const sshClient = this.getSshClient();
|
const execClient = this.getExecClient();
|
||||||
driver.ctx.logger.debug("performing ssh sanity check..");
|
driver.ctx.logger.debug("performing ssh sanity check..");
|
||||||
const response = await sshClient.exec("echo $0");
|
const response = await execClient.exec("echo $0");
|
||||||
driver.currentSSHShell = response.stdout.split("\n")[0];
|
driver.currentSSHShell = response.stdout.split("\n")[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -497,8 +461,8 @@ class ControllerZfsSshBaseDriver extends CsiBaseDriver {
|
||||||
driver.currentSSHShellInterval = setInterval(async () => {
|
driver.currentSSHShellInterval = setInterval(async () => {
|
||||||
try {
|
try {
|
||||||
driver.ctx.logger.debug("performing ssh sanity check..");
|
driver.ctx.logger.debug("performing ssh sanity check..");
|
||||||
const sshClient = this.getSshClient();
|
const execClient = this.getExecClient();
|
||||||
const response = await sshClient.exec("echo $0");
|
const response = await execClient.exec("echo $0");
|
||||||
driver.currentSSHShell = response.stdout.split("\n")[0];
|
driver.currentSSHShell = response.stdout.split("\n")[0];
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
delete driver.currentSSHShell;
|
delete driver.currentSSHShell;
|
||||||
|
|
@ -533,7 +497,7 @@ class ControllerZfsSshBaseDriver extends CsiBaseDriver {
|
||||||
async CreateVolume(call) {
|
async CreateVolume(call) {
|
||||||
const driver = this;
|
const driver = this;
|
||||||
const driverZfsResourceType = this.getDriverZfsResourceType();
|
const driverZfsResourceType = this.getDriverZfsResourceType();
|
||||||
const sshClient = this.getSshClient();
|
const execClient = this.getExecClient();
|
||||||
const zb = await this.getZetabyte();
|
const zb = await this.getZetabyte();
|
||||||
|
|
||||||
let datasetParentName = this.getVolumeParentDatasetName();
|
let datasetParentName = this.getVolumeParentDatasetName();
|
||||||
|
|
@ -1028,7 +992,7 @@ class ControllerZfsSshBaseDriver extends CsiBaseDriver {
|
||||||
|
|
||||||
// set mode
|
// set mode
|
||||||
if (this.options.zfs.datasetPermissionsMode) {
|
if (this.options.zfs.datasetPermissionsMode) {
|
||||||
command = sshClient.buildCommand("chmod", [
|
command = execClient.buildCommand("chmod", [
|
||||||
this.options.zfs.datasetPermissionsMode,
|
this.options.zfs.datasetPermissionsMode,
|
||||||
properties.mountpoint.value,
|
properties.mountpoint.value,
|
||||||
]);
|
]);
|
||||||
|
|
@ -1037,7 +1001,7 @@ class ControllerZfsSshBaseDriver extends CsiBaseDriver {
|
||||||
}
|
}
|
||||||
|
|
||||||
driver.ctx.logger.verbose("set permission command: %s", command);
|
driver.ctx.logger.verbose("set permission command: %s", command);
|
||||||
response = await sshClient.exec(command);
|
response = await execClient.exec(command);
|
||||||
if (response.code != 0) {
|
if (response.code != 0) {
|
||||||
throw new GrpcError(
|
throw new GrpcError(
|
||||||
grpc.status.UNKNOWN,
|
grpc.status.UNKNOWN,
|
||||||
|
|
@ -1053,7 +1017,7 @@ class ControllerZfsSshBaseDriver extends CsiBaseDriver {
|
||||||
this.options.zfs.datasetPermissionsUser ||
|
this.options.zfs.datasetPermissionsUser ||
|
||||||
this.options.zfs.datasetPermissionsGroup
|
this.options.zfs.datasetPermissionsGroup
|
||||||
) {
|
) {
|
||||||
command = sshClient.buildCommand("chown", [
|
command = execClient.buildCommand("chown", [
|
||||||
(this.options.zfs.datasetPermissionsUser
|
(this.options.zfs.datasetPermissionsUser
|
||||||
? this.options.zfs.datasetPermissionsUser
|
? this.options.zfs.datasetPermissionsUser
|
||||||
: "") +
|
: "") +
|
||||||
|
|
@ -1068,7 +1032,7 @@ class ControllerZfsSshBaseDriver extends CsiBaseDriver {
|
||||||
}
|
}
|
||||||
|
|
||||||
driver.ctx.logger.verbose("set ownership command: %s", command);
|
driver.ctx.logger.verbose("set ownership command: %s", command);
|
||||||
response = await sshClient.exec(command);
|
response = await execClient.exec(command);
|
||||||
if (response.code != 0) {
|
if (response.code != 0) {
|
||||||
throw new GrpcError(
|
throw new GrpcError(
|
||||||
grpc.status.UNKNOWN,
|
grpc.status.UNKNOWN,
|
||||||
|
|
@ -1082,7 +1046,7 @@ class ControllerZfsSshBaseDriver extends CsiBaseDriver {
|
||||||
// probably could see if ^-.*\s and split and then shell escape
|
// probably could see if ^-.*\s and split and then shell escape
|
||||||
if (this.options.zfs.datasetPermissionsAcls) {
|
if (this.options.zfs.datasetPermissionsAcls) {
|
||||||
for (const acl of this.options.zfs.datasetPermissionsAcls) {
|
for (const acl of this.options.zfs.datasetPermissionsAcls) {
|
||||||
command = sshClient.buildCommand("setfacl", [
|
command = execClient.buildCommand("setfacl", [
|
||||||
acl,
|
acl,
|
||||||
properties.mountpoint.value,
|
properties.mountpoint.value,
|
||||||
]);
|
]);
|
||||||
|
|
@ -1091,7 +1055,7 @@ class ControllerZfsSshBaseDriver extends CsiBaseDriver {
|
||||||
}
|
}
|
||||||
|
|
||||||
driver.ctx.logger.verbose("set acl command: %s", command);
|
driver.ctx.logger.verbose("set acl command: %s", command);
|
||||||
response = await sshClient.exec(command);
|
response = await execClient.exec(command);
|
||||||
if (response.code != 0) {
|
if (response.code != 0) {
|
||||||
throw new GrpcError(
|
throw new GrpcError(
|
||||||
grpc.status.UNKNOWN,
|
grpc.status.UNKNOWN,
|
||||||
|
|
@ -1562,7 +1526,6 @@ class ControllerZfsSshBaseDriver extends CsiBaseDriver {
|
||||||
}
|
}
|
||||||
entries = this.ctx.cache.get(`ListVolumes:result:${uuid}`);
|
entries = this.ctx.cache.get(`ListVolumes:result:${uuid}`);
|
||||||
if (entries) {
|
if (entries) {
|
||||||
entries = JSON.parse(JSON.stringify(entries));
|
|
||||||
entries_length = entries.length;
|
entries_length = entries.length;
|
||||||
entries = entries.slice(start_position, end_position);
|
entries = entries.slice(start_position, end_position);
|
||||||
if (max_entries > 0 && end_position > entries_length) {
|
if (max_entries > 0 && end_position > entries_length) {
|
||||||
|
|
@ -1659,10 +1622,7 @@ class ControllerZfsSshBaseDriver extends CsiBaseDriver {
|
||||||
|
|
||||||
if (max_entries && entries.length > max_entries) {
|
if (max_entries && entries.length > max_entries) {
|
||||||
uuid = uuidv4();
|
uuid = uuidv4();
|
||||||
this.ctx.cache.set(
|
this.ctx.cache.set(`ListVolumes:result:${uuid}`, entries);
|
||||||
`ListVolumes:result:${uuid}`,
|
|
||||||
JSON.parse(JSON.stringify(entries))
|
|
||||||
);
|
|
||||||
next_token = `${uuid}:${max_entries}`;
|
next_token = `${uuid}:${max_entries}`;
|
||||||
entries = entries.slice(0, max_entries);
|
entries = entries.slice(0, max_entries);
|
||||||
}
|
}
|
||||||
|
|
@ -2366,4 +2326,4 @@ class ControllerZfsSshBaseDriver extends CsiBaseDriver {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports.ControllerZfsSshBaseDriver = ControllerZfsSshBaseDriver;
|
module.exports.ControllerZfsBaseDriver = ControllerZfsBaseDriver;
|
||||||
Loading…
Reference in New Issue