@vmngr/libvirt
Version:
Libvirt bindings for Node.js®
446 lines (333 loc) • 11.5 kB
text/typescript
/**
* 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 Tests for domain-xml.ts.
*/
import { expect } from "chai";
import xml2js from "xml2js";
import {
DomainOsDesc,
DomainDiskDesc,
DomainInterfaceDesc,
DomainGraphicsDesc,
DomainDesc
} from "./domain-desc";
import {
domainOsXml,
domainDiskXml,
domainInterfaceXml,
domainGraphicsXml,
domainDescToXml,
domainDescFromXml
} from "./domain-xml";
describe("DomainOs", () => {
describe("serialize", () => {
it("should work", () => {
const os = domainOsXml.serialize({
type: { arch: "x86_64", machine: "q35", value: "hvm" },
boot: { dev: "hd" },
});
const builder = new xml2js.Builder({ headless: true });
const actualXml = builder.buildObject({ os });
const expectedXml =
`<os>
<type arch="x86_64" machine="q35">hvm</type>
<boot dev="hd"/>
</os>`;
expect(actualXml).to.equal(expectedXml);
});
});
describe("deserialize", () => {
it("should work", async () => {
const parsed = await xml2js.parseStringPromise(
`<os>
<type arch="x86_64" machine="q35">hvm</type>
<boot dev="hd"/>
</os>`);
const actualOsDesc = domainOsXml.deserialize(parsed.os);
const expectedOsDesc: DomainOsDesc = {
type: { arch: "x86_64", machine: "q35", value: "hvm" },
boot: { dev: "hd" },
};
expect(actualOsDesc).to.deep.equal(expectedOsDesc);
});
});
});
describe("DomainDisk", () => {
describe("serialize", () => {
it("should work", () => {
const disk = domainDiskXml.serialize({
type: "file", device: "disk",
driver: { name: "qemu", type: "qcow2" },
source: { file: "/home/leon/test1.img" },
target: { dev: "vda", bus: "virtio" },
});
const builder = new xml2js.Builder({ headless: true });
const actualXml = builder.buildObject({ disk });
const expectedXml =
`<disk type="file" device="disk">
<driver name="qemu" type="qcow2"/>
<source file="/home/leon/test1.img"/>
<target dev="vda" bus="virtio"/>
</disk>`;
expect(actualXml).to.equal(expectedXml);
});
});
describe("deserialize", () => {
it("should work", async () => {
const parsed = await xml2js.parseStringPromise(
`<disk type="file" device="disk">
<driver name="qemu" type="qcow2"/>
<source file="/home/leon/test1.img"/>
<target dev="vda" bus="virtio"/>
</disk>`);
const actualDiskDesc = domainDiskXml.deserialize(parsed.disk);
const expectedDiskDesc: DomainDiskDesc = {
type: "file", device: "disk",
driver: { name: "qemu", type: "qcow2" },
source: { file: "/home/leon/test1.img" },
target: { dev: "vda", bus: "virtio" },
};
expect(actualDiskDesc).to.deep.equal(expectedDiskDesc);
});
});
});
describe("DomainInterface", () => {
describe("serialize", () => {
it("should work", () => {
const iface = domainInterfaceXml.serialize({
type: "network",
source: { network: "default" },
mac: { address: "52:54:00:8e:c6:5f" },
model: { type: "virtio" },
});
const builder = new xml2js.Builder({ headless: true });
const actualXml = builder.buildObject({ interface: iface });
const expectedXml =
`<interface type="network">
<source network="default"/>
<mac address="52:54:00:8e:c6:5f"/>
<model type="virtio"/>
</interface>`;
expect(actualXml).to.equal(expectedXml);
});
});
describe("deserialize", () => {
it("should work", async () => {
const parsed = await xml2js.parseStringPromise(
`<interface type="network">
<source network="default"/>
<mac address="52:54:00:8e:c6:5f"/>
<model type="virtio"/>
</interface>`);
const actualInterfaceDesc = domainInterfaceXml
.deserialize(parsed.interface);
const expectedInterfaceDesc: DomainInterfaceDesc = {
type: "network",
source: { network: "default" },
mac: { address: "52:54:00:8e:c6:5f" },
model: { type: "virtio" },
};
expect(actualInterfaceDesc).to.deep.equal(expectedInterfaceDesc);
});
});
});
describe("DomainGraphics", () => {
describe("serialize", () => {
it("should work", () => {
const graphics = domainGraphicsXml.serialize({
type: "vnc",
port: -1,
listen: "0.0.0.0",
passwd: "test1",
});
const builder = new xml2js.Builder({ headless: true });
const actualXml = builder.buildObject({ graphics });
const expectedXml =
`<graphics type="vnc" port="-1" listen="0.0.0.0" passwd="test1"/>`;
expect(actualXml).to.equal(expectedXml);
});
});
describe("deserialize", () => {
it("should work", async () => {
const parsed = await xml2js.parseStringPromise(
`<graphics type="vnc" port="-1" listen="0.0.0.0" passwd="test1"/>`);
const actualGraphicsDesc = domainGraphicsXml
.deserialize(parsed.graphics);
const expectedGraphicsDesc: DomainGraphicsDesc = {
type: "vnc",
port: -1,
listen: "0.0.0.0",
passwd: "test1",
};
expect(actualGraphicsDesc).to.deep.equal(expectedGraphicsDesc);
});
});
});
describe("domainDescToXml", () => {
it("should work", () => {
const domain: DomainDesc = {
type: "kvm",
name: "test1",
uuid: "148d0864-2354-4c27-b82c-731bdd3f320c",
memory: { value: 1048576 },
currentMemory: { value: 1048576 },
vcpu: { value: 1 },
os: {
type: { arch: "x86_64", machine: "q35", value: "hvm" },
boot: { dev: "hd" },
},
devices: [
{
type: "emulator",
emulator: { value: "/usr/bin/qemu-system-x86_64" },
},
{
type: "disk",
disk: {
type: "file", device: "disk",
driver: { name: "qemu", type: "qcow2" },
source: { file: "/home/leon/test1.img" },
target: { dev: "vda", bus: "virtio" },
},
},
{
type: "interface",
interface: {
type: "network",
source: { network: "default" },
mac: { address: "52:54:00:8e:c6:5f" },
model: { type: "virtio" },
},
},
{
type: "console",
console: { type: "pty" },
},
{
type: "graphics",
graphics: {
type: "vnc",
port: -1,
listen: "0.0.0.0",
passwd: "test1",
}
},
],
};
const actualXml = domainDescToXml(domain);
const expectedXml =
`<domain type="kvm">
<name>test1</name>
<uuid>148d0864-2354-4c27-b82c-731bdd3f320c</uuid>
<memory>1048576</memory>
<currentMemory>1048576</currentMemory>
<vcpu>1</vcpu>
<os>
<type arch="x86_64" machine="q35">hvm</type>
<boot dev="hd"/>
</os>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<disk type="file" device="disk">
<driver name="qemu" type="qcow2"/>
<source file="/home/leon/test1.img"/>
<target dev="vda" bus="virtio"/>
</disk>
<interface type="network">
<source network="default"/>
<mac address="52:54:00:8e:c6:5f"/>
<model type="virtio"/>
</interface>
<console type="pty"/>
<graphics type="vnc" port="-1" listen="0.0.0.0" passwd="test1"/>
</devices>
</domain>`;
expect(actualXml).to.equal(expectedXml);
});
});
describe("domainDescFromXml", () => {
it("should work", async () => {
const xml =
`<domain type="kvm">
<name>test1</name>
<uuid>148d0864-2354-4c27-b82c-731bdd3f320c</uuid>
<memory>1048576</memory>
<currentMemory>1048576</currentMemory>
<vcpu>1</vcpu>
<os>
<type arch="x86_64" machine="q35">hvm</type>
<boot dev="hd"/>
</os>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<disk type="file" device="disk">
<driver name="qemu" type="qcow2"/>
<source file="/home/leon/test1.img"/>
<target dev="vda" bus="virtio"/>
</disk>
<interface type="network">
<source network="default"/>
<mac address="52:54:00:8e:c6:5f"/>
<model type="virtio"/>
</interface>
<console type="pty"/>
<graphics type="vnc" port="-1" listen="0.0.0.0" passwd="test1"/>
</devices>
</domain>`;
const actualDomainDesc = await domainDescFromXml(xml);
const expectedDomainDesc: DomainDesc = {
type: "kvm",
name: "test1",
uuid: "148d0864-2354-4c27-b82c-731bdd3f320c",
memory: { value: 1048576 },
currentMemory: { value: 1048576 },
vcpu: { value: 1 },
os: {
type: { arch: "x86_64", machine: "q35", value: "hvm" },
boot: { dev: "hd" },
},
devices: [
{
type: "emulator",
emulator: { value: "/usr/bin/qemu-system-x86_64" },
},
{
type: "disk",
disk: {
type: "file", device: "disk",
driver: { name: "qemu", type: "qcow2" },
source: { file: "/home/leon/test1.img" },
target: { dev: "vda", bus: "virtio" },
},
},
{
type: "interface",
interface: {
type: "network",
source: { network: "default" },
mac: { address: "52:54:00:8e:c6:5f" },
model: { type: "virtio" },
},
},
{
type: "console",
console: { type: "pty" },
},
{
type: "graphics",
graphics: {
type: "vnc",
port: -1,
listen: "0.0.0.0",
passwd: "test1",
}
},
],
};
expect(actualDomainDesc).to.deep.equal(expectedDomainDesc);
});
});