From 36a1f58632849e4130d92e2187f22ce2decbfb02 Mon Sep 17 00:00:00 2001 From: Alexis Tyler Date: Thu, 27 May 2021 14:44:29 +0930 Subject: [PATCH] fix: switch libvirt libs --- app/core/modules/vms/get-domains.ts | 19 +++++++---- app/core/utils/vms/get-hypervisor.ts | 27 ++++++--------- package-lock.json | 51 ++++++++++++++++++---------- package.json | 9 ++--- 4 files changed, 62 insertions(+), 44 deletions(-) diff --git a/app/core/modules/vms/get-domains.ts b/app/core/modules/vms/get-domains.ts index efdc3ba56..eafe51c42 100644 --- a/app/core/modules/vms/get-domains.ts +++ b/app/core/modules/vms/get-domains.ts @@ -3,8 +3,10 @@ * Written by: Alexis Tyler */ +import { ConnectListAllDomainsFlags } from '@vmngr/libvirt'; +import { log } from '../../log'; import { CoreResult, CoreContext } from '../../types'; -import { parseDomains, getHypervisor, ensurePermission } from '../../utils'; +import { getHypervisor, ensurePermission } from '../../utils'; /** * Get vm domains. @@ -20,14 +22,19 @@ export const getDomains = async (context: CoreContext): Promise => { }); const hypervisor = await getHypervisor(); - const defined = await parseDomains('name', await hypervisor.listDefinedDomainsAsync()); - const active = await parseDomains('id', await hypervisor.listActiveDomainsAsync()); + const activeDomains = await hypervisor.connectListAllDomains(ConnectListAllDomainsFlags.ACTIVE); + const inactiveDomains = await hypervisor.connectListAllDomains(ConnectListAllDomainsFlags.INACTIVE); + const activeDomainNames = await Promise.all(activeDomains.map(async domain => hypervisor.domainGetName(domain))); + const inactiveDomainNames = await Promise.all(inactiveDomains.map(async domain => hypervisor.domainGetName(domain))); + + log.debug('Active: "%s"', activeDomains); + log.debug('Inactive: "%s"', inactiveDomains); return { - text: `Defined domains: ${JSON.stringify(defined, null, 2)}\nActive domains: ${JSON.stringify(active, null, 2)}`, + text: `Defined domains: ${JSON.stringify(activeDomainNames, null, 2)}\nActive domains: ${JSON.stringify(inactiveDomainNames, null, 2)}`, json: [ - ...defined, - ...active + ...activeDomains, + ...inactiveDomains ] }; }; diff --git a/app/core/utils/vms/get-hypervisor.ts b/app/core/utils/vms/get-hypervisor.ts index c19a17236..6706e5d1b 100644 --- a/app/core/utils/vms/get-hypervisor.ts +++ b/app/core/utils/vms/get-hypervisor.ts @@ -5,33 +5,26 @@ import fs from 'fs'; import { AppError } from '../../errors'; +import { Hypervisor } from '@vmngr/libvirt'; -// Libvirt is an optional dependency -let libvirt; -let client; +const uri = process.env.LIBVIRT_URI ?? 'qemu:///system'; + +let hypervisor: Hypervisor; export const getHypervisor = async () => { - // Return client if it's already connected - if (client) { - return client; + // Return hypervisor if it's already connected + if (hypervisor) { + return hypervisor; } // Check if libvirt service is running and then connect const running = fs.existsSync('/var/run/libvirt/libvirtd.pid'); - if (!running) { throw new AppError('Libvirt service is not running'); } - // Try and get dep loaded or throw error - try { - libvirt = require('libvirt'); - } catch { - throw new AppError('Libvirt dep is missing.'); - } + hypervisor = new Hypervisor({ uri }); + await hypervisor.connectOpen(); - // Connect to local socket - const { Hypervisor } = libvirt; - client = new Hypervisor('qemu:///system'); - await client.connectAsync(); + return hypervisor; }; diff --git a/package-lock.json b/package-lock.json index adf97daab..23c16e62f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1620,6 +1620,16 @@ "eslint-plugin-unicorn": "^27.0.0" } }, + "@vmngr/libvirt": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@vmngr/libvirt/-/libvirt-0.0.5.tgz", + "integrity": "sha512-T1GegDvrEBMaugzCeteAfhkOIgd7qEashXiUaW5wycsoCjDTvylVAkqcTAk972kuRMKmFIFnpOuOWSpDhMtodg==", + "requires": { + "bindings": "^1.5.0", + "node-addon-api": "^1.7.1", + "xml2js": "^0.4.22" + } + }, "@wry/context": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.6.0.tgz", @@ -2632,12 +2642,6 @@ "safe-buffer": "^5.1.1" } }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "optional": true - }, "blueimp-md5": { "version": "2.18.0", "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.18.0.tgz", @@ -9448,17 +9452,6 @@ "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz", "integrity": "sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g=" }, - "libvirt": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/libvirt/-/libvirt-1.2.1.tgz", - "integrity": "sha1-dQnjmYufjIho9kMowfvuHLdA7lQ=", - "optional": true, - "requires": { - "bindings": "^1.2.1", - "bluebird": "^3.1.1", - "nan": "^2.4.0" - } - }, "lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", @@ -10437,6 +10430,11 @@ } } }, + "node-addon-api": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", + "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==" + }, "node-cache": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-5.1.2.tgz", @@ -12506,6 +12504,11 @@ } } }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, "scheduler": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", @@ -14660,6 +14663,20 @@ "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.2.1.tgz", "integrity": "sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw==" }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + }, "xss": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.8.tgz", diff --git a/package.json b/package.json index 6ef89f87f..c1b0c7dba 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "@gridplus/docker-events": "OmgImAlexis/docker-events#master", "@schemastore/package": "0.0.6", "@sentry/node": "^6.3.6", + "@vmngr/libvirt": "0.0.5", "accesscontrol": "^2.2.1", "ain2": "^3.0.0", "am": "^1.1.0", @@ -165,9 +166,7 @@ "typescript": "4.2.4", "typescript-coverage-report": "^0.5.0" }, - "optionalDependencies": { - "libvirt": "^1.2.1" - }, + "optionalDependencies": {}, "config": { "commitizen": { "path": "./node_modules/cz-conventional-changelog" @@ -180,6 +179,7 @@ "@gridplus/docker-events", "@schemastore/package", "@sentry/node", + "@vmngr/libvirt", "accesscontrol", "ain2", "am", @@ -199,6 +199,7 @@ "cli-table", "command-exists", "cross-fetch", + "dedent-tabs", "deepmerge", "dl-tgz", "dockerode", @@ -270,4 +271,4 @@ "uuid-apikey", "xhr2" ] -} +} \ No newline at end of file