From 1cabae4f84f5c8871e3f94a629a4bb9bf5d14c03 Mon Sep 17 00:00:00 2001 From: Travis Glenn Hansen Date: Sat, 11 Jun 2022 10:24:47 -0600 Subject: [PATCH 1/3] SCALE 22.12 support/tests Signed-off-by: Travis Glenn Hansen --- .github/workflows/main.yml | 34 ++++++++++++- README.md | 2 + .../truenas/scale/22.12/scale-iscsi.yaml | 31 ++++++++++++ ci/configs/truenas/scale/22.12/scale-nfs.yaml | 29 +++++++++++ ci/configs/truenas/scale/22.12/scale-smb.yaml | 50 +++++++++++++++++++ package-lock.json | 4 +- package.json | 2 +- src/driver/freenas/api.js | 26 ++++++++-- src/driver/freenas/ssh.js | 27 ++++++++-- 9 files changed, 194 insertions(+), 11 deletions(-) create mode 100644 ci/configs/truenas/scale/22.12/scale-iscsi.yaml create mode 100644 ci/configs/truenas/scale/22.12/scale-nfs.yaml create mode 100644 ci/configs/truenas/scale/22.12/scale-smb.yaml diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index fafd564..ea7c393 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -146,6 +146,38 @@ jobs: TRUENAS_USERNAME: ${{ secrets.SANITY_TRUENAS_USERNAME }} TRUENAS_PASSWORD: ${{ secrets.SANITY_TRUENAS_PASSWORD }} + csi-sanity-truenas-scale-22_12: + needs: + - build-npm-linux-amd64 + strategy: + fail-fast: false + matrix: + config: + - truenas/scale/22.12/scale-iscsi.yaml + - truenas/scale/22.12/scale-nfs.yaml + # 80 char limit + - truenas/scale/22.12/scale-smb.yaml + runs-on: + - self-hosted + - Linux + - X64 + #- csi-sanity-truenas + - csi-sanity-zfs-generic + steps: + - uses: actions/checkout@v2 + - uses: actions/download-artifact@v2 + with: + name: node-modules-linux-amd64 + - name: csi-sanity + run: | + # run tests + ci/bin/run.sh + env: + TEMPLATE_CONFIG_FILE: "./ci/configs/${{ matrix.config }}" + TRUENAS_HOST: ${{ secrets.SANITY_TRUENAS_SCALE_22_12_HOST }} + TRUENAS_USERNAME: ${{ secrets.SANITY_TRUENAS_USERNAME }} + TRUENAS_PASSWORD: ${{ secrets.SANITY_TRUENAS_PASSWORD }} + # ssh-based drivers csi-sanity-truenas-core-12_0: needs: @@ -302,8 +334,6 @@ jobs: SHARE_NAME: tank_client_smb CSI_SANITY_SKIP: "should fail when requesting to create a snapshot with already existing name and different source volume ID|should fail when requesting to create a volume with already existing name and different capacity" - - # zfs-local drivers csi-sanity-zfs-local: needs: diff --git a/README.md b/README.md index ae5d8db..629a220 100644 --- a/README.md +++ b/README.md @@ -324,6 +324,8 @@ unecessarily: - https://askubuntu.com/questions/318592/how-can-i-remove-the-landscape-canonical-com-greeting-from-motd - https://linuxconfig.org/disable-dynamic-motd-and-news-on-ubuntu-20-04-focal-fossa-linux +- https://github.com/democratic-csi/democratic-csi/issues/151 (some notes on + using delegated zfs permissions) ``` ####### iscsi diff --git a/ci/configs/truenas/scale/22.12/scale-iscsi.yaml b/ci/configs/truenas/scale/22.12/scale-iscsi.yaml new file mode 100644 index 0000000..b6b6f43 --- /dev/null +++ b/ci/configs/truenas/scale/22.12/scale-iscsi.yaml @@ -0,0 +1,31 @@ +driver: freenas-api-iscsi + +httpConnection: + protocol: http + host: ${TRUENAS_HOST} + port: 80 + #apiKey: + username: ${TRUENAS_USERNAME} + password: ${TRUENAS_PASSWORD} + +zfs: + datasetParentName: tank/ci/${CI_BUILD_KEY}/v + detachedSnapshotsDatasetParentName: tank/ci/${CI_BUILD_KEY}/s + + zvolCompression: + zvolDedup: + zvolEnableReservation: false + zvolBlocksize: + +iscsi: + targetPortal: ${TRUENAS_HOST} + interface: "" + namePrefix: "csi-ci-${CI_BUILD_KEY}-" + nameSuffix: "" + targetGroups: + - targetGroupPortalGroup: 1 + targetGroupInitiatorGroup: 1 + targetGroupAuthType: None + targetGroupAuthGroup: + # 0-100 (0 == ignore) + extentAvailThreshold: 0 diff --git a/ci/configs/truenas/scale/22.12/scale-nfs.yaml b/ci/configs/truenas/scale/22.12/scale-nfs.yaml new file mode 100644 index 0000000..42818ae --- /dev/null +++ b/ci/configs/truenas/scale/22.12/scale-nfs.yaml @@ -0,0 +1,29 @@ +driver: freenas-api-nfs + +httpConnection: + protocol: http + host: ${TRUENAS_HOST} + port: 80 + #apiKey: + username: ${TRUENAS_USERNAME} + password: ${TRUENAS_PASSWORD} + +zfs: + datasetParentName: tank/ci/${CI_BUILD_KEY}/v + detachedSnapshotsDatasetParentName: tank/ci/${CI_BUILD_KEY}/s + + datasetEnableQuotas: true + datasetEnableReservation: false + datasetPermissionsMode: "0777" + datasetPermissionsUser: 0 + datasetPermissionsGroup: 0 + +nfs: + shareHost: ${TRUENAS_HOST} + shareAlldirs: false + shareAllowedHosts: [] + shareAllowedNetworks: [] + shareMaprootUser: root + shareMaprootGroup: root + shareMapallUser: "" + shareMapallGroup: "" diff --git a/ci/configs/truenas/scale/22.12/scale-smb.yaml b/ci/configs/truenas/scale/22.12/scale-smb.yaml new file mode 100644 index 0000000..2a8861e --- /dev/null +++ b/ci/configs/truenas/scale/22.12/scale-smb.yaml @@ -0,0 +1,50 @@ +driver: freenas-api-smb + +httpConnection: + protocol: http + host: ${TRUENAS_HOST} + port: 80 + #apiKey: + username: ${TRUENAS_USERNAME} + password: ${TRUENAS_PASSWORD} + +zfs: + datasetParentName: tank/ci/${CI_BUILD_KEY}/v + detachedSnapshotsDatasetParentName: tank/ci/${CI_BUILD_KEY}/s + + datasetEnableQuotas: true + datasetEnableReservation: false + datasetPermissionsMode: "0770" + datasetPermissionsUser: 1001 + datasetPermissionsGroup: 1001 + +smb: + shareHost: ${TRUENAS_HOST} + #nameTemplate: "" + namePrefix: "csi-ci-${CI_BUILD_KEY}-" + nameSuffix: "" + shareAuxiliaryConfigurationTemplate: | + #guest ok = yes + #guest only = yes + shareHome: false + shareAllowedHosts: [] + shareDeniedHosts: [] + #shareDefaultPermissions: true + shareGuestOk: false + #shareGuestOnly: true + #shareShowHiddenFiles: true + shareRecycleBin: false + shareBrowsable: false + shareAccessBasedEnumeration: true + shareTimeMachine: false + #shareStorageTask: + +node: + mount: + mount_flags: "username=smbroot,password=smbroot" + +_private: + csi: + volume: + idHash: + strategy: crc16 diff --git a/package-lock.json b/package-lock.json index a6d0980..64607d1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "democratic-csi", - "version": "1.7.0", + "version": "1.7.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "democratic-csi", - "version": "1.7.0", + "version": "1.7.1", "license": "MIT", "dependencies": { "@grpc/grpc-js": "^1.5.7", diff --git a/package.json b/package.json index 4d16cb0..c35ee58 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "democratic-csi", - "version": "1.7.0", + "version": "1.7.1", "description": "kubernetes csi driver framework", "main": "bin/democratic-csi", "scripts": { diff --git a/src/driver/freenas/api.js b/src/driver/freenas/api.js index 3dd86aa..0b83d84 100644 --- a/src/driver/freenas/api.js +++ b/src/driver/freenas/api.js @@ -182,6 +182,10 @@ class FreeNASApiDriver extends CsiBaseDriver { const httpApiClient = await this.getTrueNASHttpApiClient(); const apiVersion = httpClient.getApiVersion(); const zb = await this.getZetabyte(); + const truenasVersion = semver.coerce( + await httpApiClient.getSystemVersionMajorMinor() + ); + const isScale = await httpApiClient.getIsScale(); let volume_context; let properties; @@ -261,6 +265,12 @@ class FreeNASApiDriver extends CsiBaseDriver { break; } + if (isScale && semver.satisfies(truenasVersion, ">=22.12")) { + share.path = share.paths[0]; + delete share.paths; + delete share.alldirs; + } + response = await GeneralUtils.retry( 3, 1000, @@ -294,7 +304,11 @@ class FreeNASApiDriver extends CsiBaseDriver { sharePaths = response.body.nfs_paths; break; case 2: - sharePaths = response.body.paths; + if (response.body.path) { + sharePaths = [response.body.path]; + } else { + sharePaths = response.body.paths; + } break; } @@ -336,7 +350,9 @@ class FreeNASApiDriver extends CsiBaseDriver { properties.mountpoint.value )) || (item.paths && - item.paths.includes(properties.mountpoint.value)) + item.paths.includes(properties.mountpoint.value)) || + (item.path && + item.path == properties.mountpoint.value) ) { return true; } @@ -1393,7 +1409,11 @@ class FreeNASApiDriver extends CsiBaseDriver { sharePaths = response.body.nfs_paths; break; case 2: - sharePaths = response.body.paths; + if (response.body.path) { + sharePaths = [response.body.path]; + } else { + sharePaths = response.body.paths; + } break; } diff --git a/src/driver/freenas/ssh.js b/src/driver/freenas/ssh.js index 3debb76..1920202 100644 --- a/src/driver/freenas/ssh.js +++ b/src/driver/freenas/ssh.js @@ -9,6 +9,7 @@ const { Zetabyte, ZfsSshProcessManager } = require("../../utils/zfs"); const GeneralUtils = require("../../utils/general"); const Handlebars = require("handlebars"); +const semver = require("semver"); // freenas properties const FREENAS_NFS_SHARE_PROPERTY_NAME = "democratic-csi:freenas_nfs_share_id"; @@ -226,8 +227,13 @@ class FreeNASSshDriver extends ControllerZfsBaseDriver { const driverShareType = this.getDriverShareType(); const execClient = this.getExecClient(); const httpClient = await this.getHttpClient(); + const httpApiClient = await this.getTrueNASHttpApiClient(); const apiVersion = httpClient.getApiVersion(); const zb = await this.getZetabyte(); + const truenasVersion = semver.coerce( + await httpApiClient.getSystemVersionMajorMinor() + ); + const isScale = await httpApiClient.getIsScale(); let volume_context; let properties; @@ -308,6 +314,12 @@ class FreeNASSshDriver extends ControllerZfsBaseDriver { break; } + if (isScale && semver.satisfies(truenasVersion, ">=22.12")) { + share.path = share.paths[0]; + delete share.paths; + delete share.alldirs; + } + response = await GeneralUtils.retry( 3, 1000, @@ -341,7 +353,11 @@ class FreeNASSshDriver extends ControllerZfsBaseDriver { sharePaths = response.body.nfs_paths; break; case 2: - sharePaths = response.body.paths; + if (response.body.path) { + sharePaths = [response.body.path]; + } else { + sharePaths = response.body.paths; + } break; } @@ -382,7 +398,8 @@ class FreeNASSshDriver extends ControllerZfsBaseDriver { properties.mountpoint.value )) || (item.paths && - item.paths.includes(properties.mountpoint.value)) + item.paths.includes(properties.mountpoint.value)) || + (item.path && item.path == properties.mountpoint.value) ) { return true; } @@ -1441,7 +1458,11 @@ class FreeNASSshDriver extends ControllerZfsBaseDriver { sharePaths = response.body.nfs_paths; break; case 2: - sharePaths = response.body.paths; + if (response.body.path) { + sharePaths = [response.body.path]; + } else { + sharePaths = response.body.paths; + } break; } From d1aa8108c11e33e908ec0306f839b4c5b476a17e Mon Sep 17 00:00:00 2001 From: Travis Glenn Hansen Date: Sat, 11 Jun 2022 13:46:49 -0600 Subject: [PATCH 2/3] more robust api delete process, better failure logging Signed-off-by: Travis Glenn Hansen --- src/driver/freenas/api.js | 25 +++++++++++++++++++++---- src/driver/index.js | 2 +- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/driver/freenas/api.js b/src/driver/freenas/api.js index 0b83d84..0a0b969 100644 --- a/src/driver/freenas/api.js +++ b/src/driver/freenas/api.js @@ -3010,10 +3010,27 @@ class FreeNASApiDriver extends CsiBaseDriver { // NOTE: -R will recursively delete items + dependent filesets // delete dataset try { - await httpApiClient.DatasetDelete(datasetName, { - recursive: true, - force: true, - }); + await GeneralUtils.retry( + 12, + 5000, + async () => { + await httpApiClient.DatasetDelete(datasetName, { + recursive: true, + force: true, + }); + }, + { + retryCondition: (err) => { + if ( + err.toString().includes("dataset is busy") || + err.toString().includes("target is busy") + ) { + return true; + } + return false; + }, + } + ); } catch (err) { if (err.toString().includes("filesystem has dependent clones")) { throw new GrpcError( diff --git a/src/driver/index.js b/src/driver/index.js index a1db307..72efb3c 100644 --- a/src/driver/index.js +++ b/src/driver/index.js @@ -2607,7 +2607,7 @@ class CsiBaseDriver { if (!result) { throw new GrpcError( grpc.status.FAILED_PRECONDITION, - `it appears something else is already mounted at ${target_path}` + `it appears ${normalized_staging_device} is already mounted at ${target_path}, should be ${normalized_staging_path}` ); } } From ca0bddb1dca3c67b543ff518c57f29248e05aa72 Mon Sep 17 00:00:00 2001 From: Travis Glenn Hansen Date: Tue, 14 Jun 2022 10:41:56 -0600 Subject: [PATCH 3/3] fix invalid use of GrpcError class Signed-off-by: Travis Glenn Hansen --- README.md | 7 ++++ package-lock.json | 64 +++++++++++++++++----------------- src/driver/freenas/http/api.js | 3 +- 3 files changed, 40 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index 629a220..30005aa 100644 --- a/README.md +++ b/README.md @@ -328,6 +328,13 @@ unecessarily: using delegated zfs permissions) ``` +####### nfs +yum install -y nfs-utils +systemctl enable --now nfs-server.service + +apt-get install -y nfs-kernel-server +systemctl enable --now nfs-kernel-server.service + ####### iscsi yum install targetcli -y apt-get -y install targetcli-fb diff --git a/package-lock.json b/package-lock.json index 64607d1..fa38621 100644 --- a/package-lock.json +++ b/package-lock.json @@ -316,9 +316,9 @@ } }, "node_modules/@types/node": { - "version": "17.0.41", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.41.tgz", - "integrity": "sha512-xA6drNNeqb5YyV5fO3OAEsnXLfO7uF0whiOfPTz5AeDo8KeZFmODKnvwPymMNO8qE/an8pVY/O50tig2SQCrGw==" + "version": "17.0.42", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.42.tgz", + "integrity": "sha512-Q5BPGyGKcvQgAMbsr7qEGN/kIPN6zZecYYABeTDBizOsau+2NMdSVTar9UQw21A2+JyA2KRNDYaYrPB0Rpk2oQ==" }, "node_modules/@types/request": { "version": "2.48.8", @@ -2546,7 +2546,7 @@ "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", "dependencies": { "is-arrayish": "^0.3.1" } @@ -2560,9 +2560,9 @@ } }, "node_modules/ssh2": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.10.0.tgz", - "integrity": "sha512-OnKAAmf4j8wCRrXXZv3Tp5lCZkLJZtgZbn45ELiShCg27djDQ3XFGvIzuGsIsf4hdHslP+VdhA9BhUQdTdfd9w==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.11.0.tgz", + "integrity": "sha512-nfg0wZWGSsfUe/IBJkXVll3PEZ//YH2guww+mP88gTpuSU4FtZN7zu9JoeTGOyCNx2dTDtT9fOpWwlzyj4uOOw==", "hasInstallScript": true, "dependencies": { "asn1": "^0.2.4", @@ -2573,7 +2573,7 @@ }, "optionalDependencies": { "cpu-features": "~0.0.4", - "nan": "^2.15.0" + "nan": "^2.16.0" } }, "node_modules/sshpk": { @@ -2603,7 +2603,7 @@ "node_modules/stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", "engines": { "node": "*" } @@ -2726,7 +2726,7 @@ "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, "node_modules/tmp": { @@ -2773,7 +2773,7 @@ "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dependencies": { "safe-buffer": "^5.0.1" }, @@ -2784,7 +2784,7 @@ "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, "node_modules/type-check": { "version": "0.4.0", @@ -2846,7 +2846,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/uuid": { "version": "8.3.2", @@ -2865,7 +2865,7 @@ "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "engines": [ "node >=0.6.0" ], @@ -2934,7 +2934,7 @@ "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" }, "node_modules/wrap-ansi": { "version": "7.0.0", @@ -2955,7 +2955,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/ws": { "version": "7.5.8", @@ -3269,9 +3269,9 @@ } }, "@types/node": { - "version": "17.0.41", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.41.tgz", - "integrity": "sha512-xA6drNNeqb5YyV5fO3OAEsnXLfO7uF0whiOfPTz5AeDo8KeZFmODKnvwPymMNO8qE/an8pVY/O50tig2SQCrGw==" + "version": "17.0.42", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.42.tgz", + "integrity": "sha512-Q5BPGyGKcvQgAMbsr7qEGN/kIPN6zZecYYABeTDBizOsau+2NMdSVTar9UQw21A2+JyA2KRNDYaYrPB0Rpk2oQ==" }, "@types/request": { "version": "2.48.8", @@ -4973,7 +4973,7 @@ "simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", "requires": { "is-arrayish": "^0.3.1" } @@ -4984,14 +4984,14 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "ssh2": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.10.0.tgz", - "integrity": "sha512-OnKAAmf4j8wCRrXXZv3Tp5lCZkLJZtgZbn45ELiShCg27djDQ3XFGvIzuGsIsf4hdHslP+VdhA9BhUQdTdfd9w==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.11.0.tgz", + "integrity": "sha512-nfg0wZWGSsfUe/IBJkXVll3PEZ//YH2guww+mP88gTpuSU4FtZN7zu9JoeTGOyCNx2dTDtT9fOpWwlzyj4uOOw==", "requires": { "asn1": "^0.2.4", "bcrypt-pbkdf": "^1.0.2", "cpu-features": "~0.0.4", - "nan": "^2.15.0" + "nan": "^2.16.0" } }, "sshpk": { @@ -5013,7 +5013,7 @@ "stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==" }, "stream-buffers": { "version": "3.0.2", @@ -5099,7 +5099,7 @@ "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, "tmp": { @@ -5140,7 +5140,7 @@ "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "requires": { "safe-buffer": "^5.0.1" } @@ -5148,7 +5148,7 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, "type-check": { "version": "0.4.0", @@ -5192,7 +5192,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "uuid": { "version": "8.3.2", @@ -5208,7 +5208,7 @@ "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -5259,7 +5259,7 @@ "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" }, "wrap-ansi": { "version": "7.0.0", @@ -5274,7 +5274,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "ws": { "version": "7.5.8", diff --git a/src/driver/freenas/http/api.js b/src/driver/freenas/http/api.js index 9878d18..e5e378f 100644 --- a/src/driver/freenas/http/api.js +++ b/src/driver/freenas/http/api.js @@ -281,8 +281,7 @@ class Api { // throw error if cannot get v1 or v2 data // likely bad creds/url - throw new GrpcError( - grpc.status.UNKNOWN, + throw new Error( `FreeNAS error getting system version info: ${stringify({ errors: versionErrors, responses: versionResponses,