From 444305b9b984fe3a2f1c67ed31afe6608e646f85 Mon Sep 17 00:00:00 2001 From: Simon Kobyda Date: Fri, 24 Sep 2021 14:58:33 +0200 Subject: [PATCH] Introduce virt-xml into disk attachement --- src/components/vm/disks/diskAdd.jsx | 2 -- src/libvirt-xml-create.js | 44 ----------------------------- src/libvirtApi/domain.js | 44 +++++++++++++++++------------ src/libvirtApi/storageVolume.js | 5 ++-- 4 files changed, 28 insertions(+), 67 deletions(-) diff --git a/src/components/vm/disks/diskAdd.jsx b/src/components/vm/disks/diskAdd.jsx index fa123a813..7b4e60456 100644 --- a/src/components/vm/disks/diskAdd.jsx +++ b/src/components/vm/disks/diskAdd.jsx @@ -570,7 +570,6 @@ export class AddDiskModalBody extends React.Component { permanent: this.state.permanent, hotplug: this.state.hotplug, vmName: vm.name, - vmId: vm.id, cacheMode: this.state.cacheMode, busType: this.state.busType, serial: clearSerial(this.state.serial) @@ -602,7 +601,6 @@ export class AddDiskModalBody extends React.Component { permanent: this.state.permanent, hotplug: this.state.hotplug, vmName: vm.name, - vmId: vm.id, cacheMode: this.state.cacheMode, shareable: volume && volume.format === "raw" && isVolumeUsed[this.state.existingVolumeName], busType: this.state.busType, diff --git a/src/libvirt-xml-create.js b/src/libvirt-xml-create.js index a8c59a1cb..14b7f54f1 100644 --- a/src/libvirt-xml-create.js +++ b/src/libvirt-xml-create.js @@ -1,47 +1,3 @@ -export function getDiskXML(type, file, device, poolName, volumeName, format, target, cacheMode, shareable, busType, serial) { - const doc = document.implementation.createDocument('', '', null); - - const diskElem = doc.createElement('disk'); - diskElem.setAttribute('type', type); - diskElem.setAttribute('device', device); - - const driverElem = doc.createElement('driver'); - driverElem.setAttribute('name', 'qemu'); - if (format && ['qcow2', 'raw'].includes(format)) - driverElem.setAttribute('type', format); - driverElem.setAttribute('cache', cacheMode); - diskElem.appendChild(driverElem); - - const sourceElem = doc.createElement('source'); - if (type === 'file') { - sourceElem.setAttribute('file', file); - } else { - sourceElem.setAttribute('volume', volumeName); - sourceElem.setAttribute('pool', poolName); - } - diskElem.appendChild(sourceElem); - - const targetElem = doc.createElement('target'); - targetElem.setAttribute('dev', target); - targetElem.setAttribute('bus', busType); - diskElem.appendChild(targetElem); - - if (shareable) { - const shareableElem = doc.createElement('shareable'); - diskElem.appendChild(shareableElem); - } - - if (serial) { - const serialElem = doc.createElement('serial'); - serialElem.appendChild(doc.createTextNode(serial)); - diskElem.appendChild(serialElem); - } - - doc.appendChild(diskElem); - - return new XMLSerializer().serializeToString(doc.documentElement); -} - export function getNetworkXML({ name, forwardMode, device, ipv4, netmask, ipv6, prefix, ipv4DhcpRangeStart, ipv4DhcpRangeEnd, ipv6DhcpRangeStart, ipv6DhcpRangeEnd }) { const doc = document.implementation.createDocument('', '', null); diff --git a/src/libvirtApi/domain.js b/src/libvirtApi/domain.js index 0bbe194e8..55cd3943f 100644 --- a/src/libvirtApi/domain.js +++ b/src/libvirtApi/domain.js @@ -38,9 +38,6 @@ import { undefineVm, updateOrAddVm, } from '../actions/store-actions.js'; -import { - getDiskXML, -} from '../libvirt-xml-create.js'; import { finishVmCreateInProgress, setVmCreateInProgress, @@ -101,17 +98,6 @@ function buildConsoleVVFile(consoleDetail) { 'fullscreen=0\n'; } -function domainAttachDevice({ connectionName, vmId, permanent, hotplug, xmlDesc }) { - let flags = Enum.VIR_DOMAIN_AFFECT_CURRENT; - if (hotplug) - flags |= Enum.VIR_DOMAIN_AFFECT_LIVE; - if (permanent) - flags |= Enum.VIR_DOMAIN_AFFECT_CONFIG; - - // Error handling is done from the calling side - return call(connectionName, vmId, 'org.libvirt.Domain', 'AttachDevice', [xmlDesc, flags], { timeout, type: 'su' }); -} - export function getPythonPath() { return cockpit.spawn(["/bin/sh", "-c", "which /usr/libexec/platform-python 2>/dev/null || which python3 2>/dev/null || which python"]).then(pyexe => { pythonPath = pyexe.trim() }); } @@ -125,7 +111,6 @@ export function domainAttachDisk({ volumeName, format, target, - vmId, vmName, permanent, hotplug, @@ -134,9 +119,32 @@ export function domainAttachDisk({ busType, serial, }) { - const xmlDesc = getDiskXML(type, file, device, poolName, volumeName, format, target, cacheMode, shareable, busType, serial); - - return domainAttachDevice({ connectionName, vmId, permanent, hotplug, xmlDesc }); + const options = { err: "message" }; + if (connectionName === "system") + options.superuser = "try"; + let update = ""; + if (hotplug) + update = "--update"; + let define = "--define"; + if (hotplug && !permanent) + define = "--no-define"; + let source = ""; + if (type === 'file') + source = `,source.file=${file}`; + else + source = `,source.pool=${poolName},source.volume=${volumeName}`; + let driverType = ""; + if (format && ['qcow2', 'raw'].includes(format)) + driverType = `,driver.type=${format}`; + let serialNum = ""; + if (serial) + serialNum = `,serial=${serial}`; + const shareableOption = shareable ? "yes" : "no"; + + return cockpit.script( + `virt-xml -c qemu:///${connectionName} ${vmName} --add-device --disk type=${type},shareable=${shareableOption},target.bus=${busType},target.dev=${target},driver.name=qemu,cache=${cacheMode},device=${device}${source}${driverType}${serialNum} ${define} ${update}`, + options + ); } export function domainAttachHostDevices({ connectionName, vmName, live, devices }) { diff --git a/src/libvirtApi/storageVolume.js b/src/libvirtApi/storageVolume.js index 34e9d5c11..2b779d161 100644 --- a/src/libvirtApi/storageVolume.js +++ b/src/libvirtApi/storageVolume.js @@ -46,7 +46,6 @@ export function storageVolumeCreateAndAttach({ size, format, target, - vmId, vmName, permanent, hotplug, @@ -63,8 +62,8 @@ export function storageVolumeCreateAndAttach({ return storagePoolRefresh({ connectionName, objPath: storagePoolPath[0] }); }); }) - .then((volPath) => { - return domainAttachDisk({ connectionName, type: "volume", device: "disk", poolName, volumeName, format, target, vmId, permanent, hotplug, cacheMode, busType, serial }); + .then(() => { + return domainAttachDisk({ connectionName, type: "volume", device: "disk", poolName, volumeName, format, target, vmName, permanent, hotplug, cacheMode, busType, serial }); }); }