1
0
Fork 0
mirror of https://github.com/retspen/webvirtcloud synced 2026-04-05 21:15:25 +00:00

Compare commits

..

No commits in common. "ad7781b5452c67fcf6a71e945c43a75f3292b1fc" and "7db75784c63b73d4157e4f6498a21183a122bd56" have entirely different histories.

3 changed files with 93 additions and 54 deletions

View file

@ -135,7 +135,10 @@ class VolumeViewSet(viewsets.ViewSet):
)
state = conn.is_active()
volume_queryset = conn.get_volume_details(pk) if state else None
if state:
volume_queryset = conn.get_volume_details(pk)
else:
volume_queryset = None
conn.close()
serializer = VolumeSerializer(
volume_queryset, many=False, context={"request": request}

View file

@ -38,22 +38,22 @@ class AddStgPool(forms.Form):
def clean_target(self):
storage_type = self.cleaned_data["stg_type"]
target = self.cleaned_data["target"]
have_symbol = re.match("^[^-][a-zA-Z0-9/_-]+$", target) and not re.match(
".*/-", target
)
if storage_type in ["dir", "netfs"] and not have_symbol:
raise forms.ValidationError(
_("The target must not contain any special characters")
)
if storage_type in ["dir", "netfs"] and not target:
raise forms.ValidationError(_("No path has been entered"))
have_symbol = re.match("^[a-zA-Z0-9/]+$", target)
if storage_type == "dir" or storage_type == "netfs":
if not have_symbol:
raise forms.ValidationError(
_("The target must not contain any special characters")
)
if storage_type == "dir" or storage_type == "netfs":
if not target:
raise forms.ValidationError(_("No path has been entered"))
return target
def clean_source(self):
storage_type = self.cleaned_data["stg_type"]
source = self.cleaned_data["source"]
have_symbol = re.match("^[a-zA-Z0-9\/]+$", source)
if storage_type in ["logical", "netfs"]:
if storage_type == "logical" or storage_type == "netfs":
if not source:
raise forms.ValidationError(_("No device or path has been entered"))
if not have_symbol:

View file

@ -21,7 +21,7 @@ try:
libvirtError,
)
from libvirt_qemu import VIR_DOMAIN_QEMU_AGENT_COMMAND_DEFAULT, qemuAgentCommand
except Exception:
except:
from libvirt import libvirtError, VIR_DOMAIN_XML_SECURE, VIR_MIGRATE_LIVE
from collections import OrderedDict
@ -48,7 +48,11 @@ class wvmInstances(wvmConnect):
def get_instance_vcpu(self, name):
inst = self.get_instance(name)
cur_vcpu = util.get_xml_path(inst.XMLDesc(0), "/domain/vcpu/@current")
return cur_vcpu or util.get_xml_path(inst.XMLDesc(0), "/domain/vcpu")
if cur_vcpu:
vcpu = cur_vcpu
else:
vcpu = util.get_xml_path(inst.XMLDesc(0), "/domain/vcpu")
return vcpu
def get_instance_managed_save_image(self, name):
inst = self.get_instance(name)
@ -131,7 +135,9 @@ class wvmInstances(wvmConnect):
console_type = util.get_xml_path(
inst.XMLDesc(0), "/domain/devices/graphics/@type"
)
return "None" if console_type is None else console_type
if console_type is None:
return "None"
return console_type
def graphics_listen(self, name):
inst = self.get_instance(name)
@ -142,26 +148,34 @@ class wvmInstances(wvmConnect):
listener_addr = util.get_xml_path(
inst.XMLDesc(0), "/domain/devices/graphics/listen/@address"
)
return "None" if listener_addr is None else listener_addr
if listener_addr is None:
return "None"
return listener_addr
def graphics_port(self, name):
inst = self.get_instance(name)
console_port = util.get_xml_path(
inst.XMLDesc(0), "/domain/devices/graphics/@port"
)
return "None" if console_port is None else console_port
if console_port is None:
return "None"
return console_port
def domain_name(self, name):
inst = self.get_instance(name)
domname = util.get_xml_path(inst.XMLDesc(0), "/domain/name")
return "NoName" if domname is None else domname
if domname is None:
return "NoName"
return domname
def graphics_passwd(self, name):
inst = self.get_instance(name)
password = util.get_xml_path(
inst.XMLDesc(VIR_DOMAIN_XML_SECURE), "/domain/devices/graphics/@passwd"
)
return "None" if password is None else password
if password is None:
return "None"
return password
class wvmInstance(wvmConnect):
@ -256,7 +270,10 @@ class wvmInstance(wvmConnect):
def get_cur_vcpu(self):
cur_vcpu = util.get_xml_path(self._XMLDesc(0), "/domain/vcpu/@current")
return int(cur_vcpu) if cur_vcpu else self.get_vcpu()
if cur_vcpu:
return int(cur_vcpu)
else:
return self.get_vcpu()
def get_vcpu_mode(self):
return util.get_xml_path(self._XMLDesc(0), "/domain/cpu/@current")
@ -306,7 +323,7 @@ class wvmInstance(wvmConnect):
def get_title(self):
title = util.get_xml_path(self._XMLDesc(0), "/domain/title")
return title or ""
return title if title else ""
def get_filterrefs(self):
def filterrefs(ctx):
@ -321,7 +338,7 @@ class wvmInstance(wvmConnect):
def get_description(self):
description = util.get_xml_path(self._XMLDesc(0), "/domain/description")
return description or ""
return description if description else ""
def get_max_memory(self):
return self.wvm.getInfo()[1] * 1048576
@ -330,7 +347,8 @@ class wvmInstance(wvmConnect):
"""Get number of physical CPUs."""
hostinfo = self.wvm.getInfo()
pcpus = hostinfo[4] * hostinfo[5] * hostinfo[6] * hostinfo[7]
return range(1, int(pcpus + 1))
range_pcpus = range(1, int(pcpus + 1))
return range_pcpus
def get_interface_addresses(self, iface_mac):
if self._ip_cache is None:
@ -366,21 +384,27 @@ class wvmInstance(wvmConnect):
return ipv4, ipv6
for ips in [qemuga] + leases + [arp]:
ipv4, ipv6 = extract_lease(ips) if "expirytime" in ips else extract_dom(ips)
if "expirytime" in ips:
ipv4, ipv6 = extract_lease(ips)
else:
ipv4, ipv6 = extract_dom(ips)
if ipv4 or ipv6:
return ipv4, ipv6
return None, None
def _get_interface_addresses(self, source):
# ("Calling interfaceAddresses source=%s", source)
with contextlib.suppress(libvirtError):
try:
return self.instance.interfaceAddresses(source)
except libvirtError:
# log.debug("interfaceAddresses failed: %s", str(e))
pass
return {}
def refresh_interface_addresses(self):
self._ip_cache = {"qemuga": {}, "arp": {}}
if self.get_status() != 1:
if not self.get_status() == 1:
return
if self.is_agent_ready():
@ -399,10 +423,17 @@ class wvmInstance(wvmConnect):
interface_type = net.xpath("@type")[0]
mac_inst = net.xpath("mac/@address")[0]
nic_inst = net.xpath("source/@network|source/@bridge|source/@dev")[0]
target_inst = net.xpath("target/@dev")[0] if net.xpath("target/@dev") else ""
link_state = net.xpath("link/@state")[0] if net.xpath("link") else "up"
filterref_inst = net.xpath("filterref/@filter")[0] if net.xpath("filterref/@filter") else ""
target_inst = (
"" if not net.xpath("target/@dev") else net.xpath("target/@dev")[0]
)
link_state = (
"up" if not net.xpath("link") else net.xpath("link/@state")[0]
)
filterref_inst = (
""
if not net.xpath("filterref/@filter")
else net.xpath("filterref/@filter")[0]
)
model_type = net.xpath("model/@type")[0]
if net.xpath("bandwidth/inbound"):
in_attr = net.xpath("bandwidth/inbound")[0]
@ -480,8 +511,8 @@ class wvmInstance(wvmConnect):
with contextlib.suppress(Exception):
disk_zeroes = disk.xpath("driver/@detect_zeroes")[0]
readonly = bool(disk.xpath("readonly"))
shareable = bool(disk.xpath("shareable"))
readonly = True if disk.xpath("readonly") else False
shareable = True if disk.xpath("shareable") else False
serial = (
disk.xpath("serial")[0].text
if disk.xpath("serial")
@ -543,7 +574,7 @@ class wvmInstance(wvmConnect):
volume = vol.name()
stg = vol.storagePoolLookupByVolume()
storage = stg.name()
except Exception:
except:
pass
finally:
result.append(
@ -561,7 +592,7 @@ class wvmInstance(wvmConnect):
def get_bootmenu(self):
menu = util.get_xml_path(self._XMLDesc(0), "/domain/os/bootmenu/@enable")
return menu == "yes"
return True if menu == "yes" else False
def set_bootmenu(self, flag):
tree = ElementTree.fromstring(self._XMLDesc(0))
@ -589,26 +620,26 @@ class wvmInstance(wvmConnect):
def get_bootorder(self):
boot_order = {}
dev_type = target = None
type = target = None
tree = ElementTree.fromstring(self._XMLDesc(0))
os = tree.find("os")
boot = os.findall("boot")
for idx, b in enumerate(boot):
dev = b.get("dev")
if dev == "cdrom":
target = "cdrom"
dev_type = "file"
if dev == "hd":
target = "disk"
type = "file"
elif dev == "fd":
target = "floppy"
dev_type = "file"
elif dev == "hd":
target = "disk"
dev_type = "file"
type = "file"
elif dev == "cdrom":
target = "cdrom"
type = "file"
elif dev == "network":
target = "network"
dev_type = "network"
boot_order[idx] = {"type": dev_type, "dev": dev, "target": target}
type = "network"
boot_order[idx] = {"type": type, "dev": dev, "target": target}
devices = tree.find("devices")
for dev in devices:
@ -625,8 +656,10 @@ class wvmInstance(wvmConnect):
elif dev_type == "network":
dev_mac = dev.find("mac").get("address")
dev_device = "network"
dev_target = f"nic-{dev_mac[9:]}"
# pass dev_type usb
dev_target = "nic-{}".format(dev_mac[9:])
elif dev_type == "usb":
pass
boot_order[int(idx) - 1] = {
"type": dev_type,
"dev": dev_device,
@ -683,11 +716,12 @@ class wvmInstance(wvmConnect):
def attach_iso(dev, disk, vol):
if disk.get("device") == "cdrom":
for elm in disk:
if elm.tag == "target" and elm.get("dev") == dev:
src_media = ElementTree.Element("source")
src_media.set("file", vol.path())
disk.insert(2, src_media)
return True
if elm.tag == "target":
if elm.get("dev") == dev:
src_media = ElementTree.Element("source")
src_media.set("file", vol.path())
disk.insert(2, src_media)
return True
vol = None
storages = self.get_storages(only_actives=True)
@ -714,10 +748,12 @@ class wvmInstance(wvmConnect):
for disk in tree.findall("devices/disk"):
if disk.get("device") == "cdrom":
for elm in disk:
if elm.tag == "source" and elm.get("file") == image:
src_media = elm
if elm.tag == "target" and elm.get("dev") == dev:
disk.remove(src_media)
if elm.tag == "source":
if elm.get("file") == image:
src_media = elm
if elm.tag == "target":
if elm.get("dev") == dev:
disk.remove(src_media)
if self.get_status() == 1:
xml_disk = ElementTree.tostring(disk).decode()
self.instance.attachDevice(xml_disk)