UNPKG

@vmngr/libvirt

Version:

Libvirt bindings for Node.js®

432 lines (431 loc) 18.1 kB
"use strict"; /** * Copyright 2019 Leon Rinkel <leon@rinkel.me> and vmngr/libvirt contributers. * * This file is part of the vmngr/libvirt project and is subject to the MIT * license as in the LICENSE file in the project root. * * @brief Contains helper functions to deserialize / serialize domain * descriptions from / to XML. */ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var xml2js_1 = __importDefault(require("xml2js")); exports.domainOsXml = { serialize: function (osDesc) { // tslint:disable-next-line:no-any var os = { $: {} }; if (osDesc.type) { os.type = { $: {} }; if (osDesc.type.arch) os.type.$.arch = osDesc.type.arch; if (osDesc.type.machine) os.type.$.machine = osDesc.type.machine; if (osDesc.type.value) os.type._ = osDesc.type.value; } if (osDesc.boot) { os.boot = { $: {} }; if (osDesc.boot.dev) os.boot.$.dev = osDesc.boot.dev; } return os; }, // tslint:disable-next-line:no-any deserialize: function (os) { var osDesc = {}; if (os.type[0]) { osDesc.type = {}; if (os.type[0].$.arch) { osDesc.type.arch = os.type[0].$.arch; } if (os.type[0].$.machine) { osDesc.type.machine = os.type[0].$.machine; } if (os.type[0]._) osDesc.type.value = os.type[0]._; } if (os.boot[0]) { osDesc.boot = {}; if (os.boot[0].$.dev) osDesc.boot.dev = os.boot[0].$.dev; } return osDesc; }, }; exports.domainDiskXml = { serialize: function (diskDesc) { // tslint:disable-next-line:no-any var disk = { $: {} }; if (diskDesc.type) disk.$.type = diskDesc.type; if (diskDesc.device) disk.$.device = diskDesc.device; if (diskDesc.driver) { disk.driver = { $: {} }; if (diskDesc.driver.name) disk.driver.$.name = diskDesc.driver.name; if (diskDesc.driver.type) disk.driver.$.type = diskDesc.driver.type; } if (diskDesc.source) { disk.source = { $: {} }; if (diskDesc.source.file) disk.source.$.file = diskDesc.source.file; } if (diskDesc.target) { disk.target = { $: {} }; if (diskDesc.target.dev) disk.target.$.dev = diskDesc.target.dev; if (diskDesc.target.bus) disk.target.$.bus = diskDesc.target.bus; } return disk; }, // tslint:disable-next-line:no-any deserialize: function (disk) { var diskDesc = {}; if (disk.$.type) diskDesc.type = disk.$.type; if (disk.$.device) diskDesc.device = disk.$.device; if (disk.driver[0]) { diskDesc.driver = {}; if (disk.driver[0].$.name) { diskDesc.driver.name = disk.driver[0].$.name; } if (disk.driver[0].$.type) { diskDesc.driver.type = disk.driver[0].$.type; } } if (disk.source[0]) { diskDesc.source = {}; if (disk.source[0].$.file) { diskDesc.source.file = disk.source[0].$.file; } } if (disk.target[0]) { diskDesc.target = {}; if (disk.target[0].$.dev) { diskDesc.target.dev = disk.target[0].$.dev; } if (disk.target[0].$.bus) { diskDesc.target.bus = disk.target[0].$.bus; } } return diskDesc; }, }; exports.domainInterfaceXml = { serialize: function (interfaceDesc) { // tslint:disable-next-line:no-any var iface = { $: {} }; if (interfaceDesc.type) iface.$.type = interfaceDesc.type; if (interfaceDesc.source) { iface.source = { $: {} }; if (interfaceDesc.source.network) { iface.source.$.network = interfaceDesc.source.network; } } if (interfaceDesc.mac) { iface.mac = { $: {} }; if (interfaceDesc.mac.address) { iface.mac.$.address = interfaceDesc.mac.address; } } if (interfaceDesc.model) { iface.model = { $: {} }; if (interfaceDesc.model.type) { iface.model.$.type = interfaceDesc.model.type; } } return iface; }, // tslint:disable-next-line:no-any deserialize: function (iface) { var interfaceDesc = {}; if (iface.$.type) interfaceDesc.type = iface.$.type; if (iface.source[0]) { interfaceDesc.source = {}; if (iface.source[0].$.network) { interfaceDesc.source.network = iface.source[0].$.network; } } if (iface.mac[0]) { interfaceDesc.mac = {}; if (iface.mac[0].$.address) { interfaceDesc.mac.address = iface.mac[0].$.address; } } if (iface.model[0]) { interfaceDesc.model = {}; if (iface.model[0].$.type) { interfaceDesc.model.type = iface.model[0].$.type; } } return interfaceDesc; }, }; exports.domainGraphicsXml = { serialize: function (graphicsDesc) { // tslint:disable-next-line:no-any var graphics = { $: {} }; if (graphicsDesc.type) graphics.$.type = graphicsDesc.type; if (graphicsDesc.port) graphics.$.port = graphicsDesc.port; if (graphicsDesc.listen) graphics.$.listen = graphicsDesc.listen; if (graphicsDesc.passwd) graphics.$.passwd = graphicsDesc.passwd; return graphics; }, // tslint:disable-next-line:no-any deserialize: function (graphics) { var graphicsDesc = {}; if (graphics.$.type) graphicsDesc.type = graphics.$.type; if (graphics.$.port) graphicsDesc.port = Number(graphics.$.port); if (graphics.$.listen) graphicsDesc.listen = graphics.$.listen; if (graphics.$.passwd) graphicsDesc.passwd = graphics.$.passwd; return graphicsDesc; }, }; function domainDescToXml(desc) { // tslint:disable-next-line:no-any var domain = { $: {} }; if (desc.type) domain.$.type = desc.type; if (desc.id) domain.$.id = desc.id; if (desc.name) domain.name = desc.name; if (desc.uuid) domain.uuid = desc.uuid; if (desc.memory) { domain.memory = { $: {} }; if (desc.memory.unit) domain.memory.$.unit = desc.memory.unit; if (desc.memory.value) domain.memory._ = desc.memory.value; } if (desc.currentMemory) { domain.currentMemory = { $: {} }; if (desc.currentMemory.unit) { domain.currentMemory.$.unit = desc.currentMemory.unit; } if (desc.currentMemory.value) { domain.currentMemory._ = desc.currentMemory.value; } } if (desc.vcpu) { domain.vcpu = { $: {} }; if (desc.vcpu.placement) domain.vcpu.$.placement = desc.vcpu.placement; if (desc.vcpu.value) domain.vcpu._ = desc.vcpu.value; } if (desc.os) domain.os = exports.domainOsXml.serialize(desc.os); if (desc.devices) { domain.devices = { emulator: [], disk: [], interface: [], console: [], graphics: [], }; for (var _i = 0, _a = desc.devices; _i < _a.length; _i++) { var deviceDesc = _a[_i]; // tslint:disable-next-line:no-any var device = { $: {} }; switch (deviceDesc.type) { case "emulator": var emulatorDesc = deviceDesc.emulator; if (emulatorDesc.value) device._ = emulatorDesc.value; domain.devices.emulator.push(device); break; case "disk": domain.devices.disk.push(exports.domainDiskXml.serialize(deviceDesc.disk)); break; case "interface": domain.devices.interface.push(exports.domainInterfaceXml.serialize(deviceDesc.interface)); break; case "console": var consoleDesc = deviceDesc.console; if (consoleDesc.type) device.$.type = consoleDesc.type; domain.devices.console.push(device); break; case "graphics": domain.devices.graphics.push(exports.domainGraphicsXml.serialize(deviceDesc.graphics)); break; default: } } } var builder = new xml2js_1.default.Builder({ headless: true }); return builder.buildObject({ domain: domain }); } exports.domainDescToXml = domainDescToXml; function domainDescFromXml(xml) { return __awaiter(this, void 0, void 0, function () { var domainDesc, parsed, _i, _a, disk, _b, _c, iface, _d, _e, cnsole, _f, _g, graphics; return __generator(this, function (_h) { switch (_h.label) { case 0: domainDesc = {}; return [4 /*yield*/, xml2js_1.default.parseStringPromise(xml)]; case 1: parsed = _h.sent(); if (!parsed.domain) throw new Error("Unable to parse domain xml"); if (parsed.domain.$.type) domainDesc.type = parsed.domain.$.type; if (parsed.domain.$.id) domainDesc.id = parsed.domain.$.id; if (parsed.domain.name && parsed.domain.name[0]) { domainDesc.name = parsed.domain.name[0]; } if (parsed.domain.uuid && parsed.domain.uuid[0]) { domainDesc.uuid = parsed.domain.uuid[0]; } if (parsed.domain.memory && parsed.domain.memory[0]) { if (typeof parsed.domain.memory[0] === "object") { domainDesc.memory = { value: Number(parsed.domain.memory[0]._), unit: parsed.domain.memory[0].$.unit, }; } else if (typeof parsed.domain.memory[0] === "string") { domainDesc.memory = { value: Number(parsed.domain.memory[0]) }; } } if (parsed.domain.currentMemory && parsed.domain.currentMemory[0]) { if (typeof parsed.domain.currentMemory[0] === "object") { domainDesc.currentMemory = { value: Number(parsed.domain.currentMemory[0]._), unit: parsed.domain.currentMemory[0].$.unit, }; } else if (typeof parsed.domain.currentMemory[0] === "string") { domainDesc.currentMemory = { value: Number(parsed.domain.currentMemory[0]), }; } } if (parsed.domain.vcpu && parsed.domain.vcpu[0]) { if (typeof parsed.domain.vcpu[0] === "object") { domainDesc.vcpu = { value: Number(parsed.domain.vcpu[0]._), placement: parsed.domain.vcpu[0].$.placement, }; } else if (typeof parsed.domain.vcpu[0] === "string") { domainDesc.vcpu = { value: Number(parsed.domain.vcpu[0]), }; } } if (parsed.domain.os && parsed.domain.os[0]) { domainDesc.os = exports.domainOsXml.deserialize(parsed.domain.os[0]); } if (parsed.domain.devices && parsed.domain.devices[0]) { domainDesc.devices = []; if (parsed.domain.devices[0].emulator) { domainDesc.devices.push({ type: "emulator", emulator: { value: parsed.domain.devices[0].emulator[0] }, }); } if (parsed.domain.devices[0].disk) { for (_i = 0, _a = parsed.domain.devices[0].disk; _i < _a.length; _i++) { disk = _a[_i]; domainDesc.devices.push({ type: "disk", disk: exports.domainDiskXml.deserialize(disk), }); } } if (parsed.domain.devices[0].interface) { for (_b = 0, _c = parsed.domain.devices[0].interface; _b < _c.length; _b++) { iface = _c[_b]; domainDesc.devices.push({ type: "interface", interface: exports.domainInterfaceXml.deserialize(iface), }); } } if (parsed.domain.devices[0].console) { for (_d = 0, _e = parsed.domain.devices[0].console; _d < _e.length; _d++) { cnsole = _e[_d]; domainDesc.devices.push({ type: "console", console: { type: cnsole.$.type }, }); } } if (parsed.domain.devices[0].graphics) { for (_f = 0, _g = parsed.domain.devices[0].graphics; _f < _g.length; _f++) { graphics = _g[_f]; domainDesc.devices.push({ type: "graphics", graphics: exports.domainGraphicsXml.deserialize(graphics), }); } } } return [2 /*return*/, domainDesc]; } }); }); } exports.domainDescFromXml = domainDescFromXml;