mirror of
https://github.com/retspen/webvirtcloud
synced 2026-11-11 04:36:48 +00:00
feat(instances): PCI devices of the host given to a shut-off VM
- The Host devices tab gives a shut-off VM a PCI device of its host and takes it back; libvirt binds the device to vfio-pci when the VM starts and gives it back when it stops (managed). The VM's PCI devices are listed with whether the running VM and its next start have them. - A device is offered, and accepted on the server under the compute's claim, only when it is no bridge of any kind (bridge header, PCIe port, or of the bridge class: host bridge, LPC), the host has none of its own network interfaces, disks or graphics card on it (else: bind it to vfio-pci on the host first), no other VM names it, and every other endpoint of its IOMMU group is the VM's too or has no driver or vfio-pci and no other VM; bridges in the group stay with pcieport, and a member that cannot be read keeps the group. Nothing in the group is taken implicitly. - A snapshot revert checks the PCI devices of the snapshot with the same rules; migration and clones already leave host devices out. - The add forms of the tab load together, when the tab opens.
This commit is contained in:
parent
ac8ff62e7e
commit
80dd145bcf
19 changed files with 509 additions and 103 deletions
|
|
@ -428,19 +428,19 @@
|
|||
});
|
||||
</script>
|
||||
<script>
|
||||
// the Host devices tab's add form: loaded once, when the tab first opens
|
||||
var hostUsb = document.getElementById("host-usb");
|
||||
if (hostUsb) {
|
||||
// the Host devices tab's add forms: loaded once, when the tab first opens
|
||||
var hostDevices = document.getElementById("host-devices");
|
||||
if (hostDevices) {
|
||||
document.querySelector('[data-bs-target="#hostdevs"]').addEventListener("shown.bs.tab", function () {
|
||||
if (hostUsb.dataset.loaded) return;
|
||||
hostUsb.dataset.loaded = "true";
|
||||
fetch(hostUsb.dataset.url).then(function (response) {
|
||||
if (hostDevices.dataset.loaded) return;
|
||||
hostDevices.dataset.loaded = "true";
|
||||
fetch(hostDevices.dataset.url).then(function (response) {
|
||||
if (!response.ok) throw new Error(response.statusText);
|
||||
return response.text();
|
||||
}).then(function (html) {
|
||||
hostUsb.innerHTML = html;
|
||||
hostDevices.innerHTML = html;
|
||||
}).catch(function () {
|
||||
hostUsb.textContent = "{{ _("The host's USB devices could not be read.")|escapejs }}";
|
||||
hostDevices.textContent = "{{ _("The host's devices could not be read.")|escapejs }}";
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue