fix: switch libvirt libs

This commit is contained in:
Alexis Tyler
2021-05-27 14:44:29 +09:30
parent 3ac1fdb8f9
commit 36a1f58632
4 changed files with 62 additions and 44 deletions

View File

@@ -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<CoreResult> => {
});
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
]
};
};

View File

@@ -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;
};

51
package-lock.json generated
View File

@@ -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",

View File

@@ -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"
]
}
}