From 0b4a601ecba3261dbbe17db6d800caf00ec87b85 Mon Sep 17 00:00:00 2001 From: catborise Date: Sat, 7 Nov 2026 16:00:35 +0300 Subject: [PATCH] fix(quota): a disk whose size is unknown is not counted as 0 GiB A disk of the user's VMs whose size could not be read (its volume not in a pool, the pool stopped) counted as 0 GiB, so a disk-limited user's increase could pass over the limit. A disk no pool holds now has the size libvirt reads from the file or device (blockInfo, also for a shut-off VM); one whose size is still unknown makes the usage unverified and the increase is refused, as when a host cannot be reached. Users without a disk limit are not affected. --- instances/tests/test_quota.py | 10 +- instances/utils.py | 12 +- locale/tr/LC_MESSAGES/django.mo | Bin 194896 -> 194978 bytes locale/tr/LC_MESSAGES/django.po | 181 +++++++++++----------- locale/zh/LC_MESSAGES/django.mo | Bin 182242 -> 182321 bytes locale/zh/LC_MESSAGES/django.po | 179 ++++++++++----------- vrtManager/instance.py | 5 + vrtManager/tests/test_instance_getters.py | 9 ++ vrtManager/tests/test_read_cache.py | 3 + 9 files changed, 215 insertions(+), 184 deletions(-) diff --git a/instances/tests/test_quota.py b/instances/tests/test_quota.py index 4bde91e4..2fa10fea 100644 --- a/instances/tests/test_quota.py +++ b/instances/tests/test_quota.py @@ -40,7 +40,8 @@ def vm_reader(vcpu=2, memory=1024, disk_gib=10, pending=None): return values(config)["memory"] def get_disk_devices(self, config=False): - return [{"size": values(config)["disk_gib"] << 30}] + size = values(config)["disk_gib"] + return [{"size": None if size is None else size << 30}] def values(persistent): return config if persistent else live @@ -98,6 +99,13 @@ class QuotaTests(TestCase): self.assertEqual(self.check(0, 0, 512, 0, reader=gone)[0], QUOTA_UNVERIFIED) + def test_a_disk_whose_size_is_unknown_refuses_an_increase(self): + # not 0 GiB: a volume not read (its pool stopped) may be the largest + self.own(self.up, 1) + self.assertEqual(self.check(0, 1, 0, 0, reader=vm_reader(disk_gib=None))[0], QUOTA_UNVERIFIED) + UserAttributes.objects.filter(user=self.user).update(max_disk_size=-1) # disks not limited: not needed + self.assertEqual(self.check(0, 1, 0, 0, reader=vm_reader(disk_gib=None))[0], "") + def test_each_host_is_checked_once(self): for n in range(3): self.own(self.up, n) diff --git a/instances/utils.py b/instances/utils.py index b563b1db..07f7f4d2 100644 --- a/instances/utils.py +++ b/instances/utils.py @@ -78,7 +78,8 @@ def disk_gib(disks): # check_user_quota could not read every VM of the user: an increase is refused QUOTA_UNVERIFIED = "unverified" QUOTA_UNVERIFIED_TEXT = gettext_noop( - "The quota cannot be checked because a host of your virtual machines cannot be reached. Nothing was changed.") + "The quota cannot be checked: a host of your virtual machines cannot be reached, or the size of one of " + "their disks cannot be read. Nothing was changed.") # The quota a change would exceed: instance, cpu, memory or disk, the total it # would make and the limit @@ -106,8 +107,8 @@ def check_user_quota(user, instance, cpu, memory, disk_size): The quota the user would exceed by adding these amounts (instances, vCPUs, memory MiB, disk GiB) to their VMs, a QuotaExceeded, or "". A quota of -1 has no limit; 0 allows none. QUOTA_UNVERIFIED if a - VM that counts cannot be read (its host is down, the VM is gone): the - usage is unknown, so an increase is refused. + VM that counts cannot be read (its host is down, the VM is gone, a disk's + size is unknown): the usage is unknown, so an increase is refused. """ ua, attributes_created = UserAttributes.objects.get_or_create(user=user) msg = "" @@ -156,7 +157,10 @@ def check_user_quota(user, instance, cpu, memory, disk_size): with conn.cached_reads(): cpu += max(conn.get_vcpu(), conn.get_vcpu(config=True)) memory += max(conn.get_memory(), conn.get_memory(config=True)) - disk_size += max(disk_gib(conn.get_disk_devices()), disk_gib(conn.get_disk_devices(config=True))) + disks = conn.get_disk_devices(), conn.get_disk_devices(config=True) + if ua.max_disk_size >= 0 and any(disk["size"] is None for devices in disks for disk in devices): + return QUOTA_UNVERIFIED # not 0 GiB + disk_size += max(map(disk_gib, disks)) except libvirtError: return QUOTA_UNVERIFIED diff --git a/locale/tr/LC_MESSAGES/django.mo b/locale/tr/LC_MESSAGES/django.mo index 2984eb017a9dcf63705410a44ef7ceacdc0a4664..fc0f227b6db2fbb7e800d433f17ab5bca35d3bdf 100644 GIT binary patch delta 19370 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 delta 19312 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 D&#%^( diff --git a/locale/tr/LC_MESSAGES/django.po b/locale/tr/LC_MESSAGES/django.po index 7f7ade86..af3ced5d 100644 --- a/locale/tr/LC_MESSAGES/django.po +++ b/locale/tr/LC_MESSAGES/django.po @@ -2792,7 +2792,7 @@ msgstr "" msgid "Delete snapshot" msgstr "Anlık görüntüyü sil" -#: instances/jobs.py:318 vrtManager/instance.py:2278 +#: instances/jobs.py:318 vrtManager/instance.py:2281 #, python-format msgid "The VM has no external snapshot named %(name)s" msgstr "Sanal makinede %(name)s adında harici anlık görüntü yok" @@ -2827,7 +2827,7 @@ msgstr "Sanal makine artık işin çalıştığı sunucuda değil" msgid "Take snapshot" msgstr "Anlık görüntü al" -#: instances/jobs.py:386 instances/jobs.py:395 vrtManager/instance.py:1874 +#: instances/jobs.py:386 instances/jobs.py:395 vrtManager/instance.py:1877 #, python-format msgid "A snapshot named %(name)s already exists" msgstr "%(name)s adında bir anlık görüntü zaten var" @@ -3025,7 +3025,7 @@ msgstr "cloud-init tohumu, disk için bir dizin depolama havuzu gerektirir" msgid "This host offers no firmware %(firmware)s" msgstr "Bu sunucu %(firmware)s firmware'ini sunmuyor" -#: instances/jobs.py:839 vrtManager/instance.py:3010 +#: instances/jobs.py:839 vrtManager/instance.py:3013 msgid "This host offers no TPM 2.0: install swtpm on it" msgstr "Bu sunucu TPM 2.0 sunmuyor: üzerine swtpm kurun" @@ -5873,47 +5873,48 @@ msgstr "Disk dosyaları %(host)s üzerinde denetlenemiyor: %(err)s" #: instances/utils.py:81 msgid "" -"The quota cannot be checked because a host of your virtual machines cannot be" -" reached. Nothing was changed." +"The quota cannot be checked: a host of your virtual machines cannot be " +"reached, or the size of one of their disks cannot be read. Nothing was " +"changed." msgstr "" -"Sanal makinelerinizin bir sunucusuna erişilemediği için kota denetlenemiyor. " -"Hiçbir şey değiştirilmedi." +"Kota denetlenemiyor: sanal makinelerinizin bir sunucusuna erişilemiyor ya da " +"disklerinden birinin boyutu okunamıyor. Hiçbir şey değiştirilmedi." -#: instances/utils.py:87 +#: instances/utils.py:88 msgid "The quota of virtual machines is reached" msgstr "Sanal makine kotası doldu" -#: instances/utils.py:88 +#: instances/utils.py:89 msgid "The vCPU quota is reached" msgstr "vCPU kotası doldu" -#: instances/utils.py:89 +#: instances/utils.py:90 msgid "The memory quota is reached" msgstr "Bellek kotası doldu" -#: instances/utils.py:90 +#: instances/utils.py:91 msgid "The disk quota is reached" msgstr "Disk kotası doldu" -#: instances/utils.py:99 +#: instances/utils.py:100 #, python-format msgid "%(quota)s (%(total)s > %(limit)s)" msgstr "%(quota)s (%(total)s > %(limit)s)" -#: instances/utils.py:195 +#: instances/utils.py:199 msgid "None available device name" msgstr "Hiçbiri uygun aygıt adı değil" -#: instances/utils.py:402 +#: instances/utils.py:406 #, python-format msgid "%(hostname)s via %(address)s" msgstr "%(address)s üzerinden %(hostname)s" -#: instances/utils.py:441 +#: instances/utils.py:445 msgid "Invalid MAC address" msgstr "Geçersiz MAC adresi" -#: instances/utils.py:443 +#: instances/utils.py:447 msgid "More MAC addresses than networks" msgstr "Ağlardan daha fazla MAC adresi" @@ -9076,7 +9077,7 @@ msgstr "" "Anlık görüntü adları 1-64 harf, rakam, '.', '_' veya '-' karakterinden oluşur" " ve '.' ile başlamaz" -#: vrtManager/instance.py:1076 +#: vrtManager/instance.py:1079 msgid "" "A device other than a disk or NIC is in the boot order: change it in the XML " "editor" @@ -9084,104 +9085,104 @@ msgstr "" "Önyükleme sırasında disk veya NIC dışında bir aygıt var: bunu XML " "düzenleyicide değiştirin" -#: vrtManager/instance.py:1088 +#: vrtManager/instance.py:1091 msgid "Invalid Device Type for boot order" msgstr "Ön yükleme sırası için geçersiz aygıt türü" -#: vrtManager/instance.py:1091 +#: vrtManager/instance.py:1094 #, python-format msgid "Boot device %(dev)s is not in the definition" msgstr "Ön yükleme aygıtı %(dev)s tanımda yok" -#: vrtManager/instance.py:1111 +#: vrtManager/instance.py:1114 #, python-format msgid "CD-ROM %(dev)s is not in the running definition" msgstr "CD-ROM %(dev)s çalışan tanımda yok" -#: vrtManager/instance.py:1112 +#: vrtManager/instance.py:1115 #, python-format msgid "CD-ROM %(dev)s is not in the persistent definition" msgstr "CD-ROM %(dev)s kalıcı tanımda yok" -#: vrtManager/instance.py:1124 +#: vrtManager/instance.py:1127 #, python-format msgid "Media of %(dev)s changed in the running VM only: %(err)s" msgstr "%(dev)s ortamı yalnızca çalışan sanal makinede değişti: %(err)s" -#: vrtManager/instance.py:1135 +#: vrtManager/instance.py:1138 #, python-format msgid "ISO image %(image)s was not found" msgstr "ISO imajı %(image)s bulunamadı" -#: vrtManager/instance.py:1137 +#: vrtManager/instance.py:1140 #, python-format msgid "ISO image %(image)s is in more than one storage pool" msgstr "ISO imajı %(image)s birden fazla depolama havuzunda var" -#: vrtManager/instance.py:1244 +#: vrtManager/instance.py:1247 #, python-format msgid "Disk %(target_dev)s is not in the VM's definition" msgstr "Disk %(target_dev)s sanal makinenin tanımında yok" -#: vrtManager/instance.py:1372 +#: vrtManager/instance.py:1375 msgid "Please shutdown the instance then try to enable vCPU hotplug" msgstr "" "vCPU hotplug özelliğini etkinleştirmek için önce sanal makineyi kapatın" -#: vrtManager/instance.py:1659 +#: vrtManager/instance.py:1662 msgid "The VM has no video card" msgstr "Sanal makinede ekran kartı yok" -#: vrtManager/instance.py:1833 +#: vrtManager/instance.py:1836 msgid "" "The VM has external snapshots; internal snapshots cannot be mixed with them" msgstr "" "Sanal makinenin harici anlık görüntüleri var; dahili anlık görüntüler " "bunlarla karıştırılamaz" -#: vrtManager/instance.py:1865 +#: vrtManager/instance.py:1868 msgid "A snapshot with memory is not quiesced; it keeps the whole guest state" msgstr "" "Bellekli bir anlık görüntüde dosya sistemleri dondurulmaz; tüm konuk durumunu" " saklar" -#: vrtManager/instance.py:1867 +#: vrtManager/instance.py:1870 msgid "Only a running VM's file systems can be frozen" msgstr "Yalnızca çalışan bir sanal makinenin dosya sistemleri dondurulabilir" -#: vrtManager/instance.py:1869 +#: vrtManager/instance.py:1872 msgid "The QEMU guest agent is not connected; it freezes the file systems" msgstr "QEMU konuk aracısı bağlı değil; dosya sistemlerini o dondurur" -#: vrtManager/instance.py:1872 +#: vrtManager/instance.py:1875 msgid "" "The VM has internal snapshots; external snapshots cannot be mixed with them" msgstr "" "Sanal makinenin dahili anlık görüntüleri var; harici anlık görüntüler " "bunlarla karıştırılamaz" -#: vrtManager/instance.py:1877 +#: vrtManager/instance.py:1880 msgid "Newer snapshots exist after the last revert; delete them first" msgstr "" "Son geri dönüşten sonra daha yeni anlık görüntüler var; önce onları silin" -#: vrtManager/instance.py:1880 +#: vrtManager/instance.py:1883 msgid "No snapshot is current; revert to a snapshot first" msgstr "Geçerli anlık görüntü yok; önce bir anlık görüntüye geri dönün" -#: vrtManager/instance.py:1886 +#: vrtManager/instance.py:1889 #, python-format msgid "Eject the media from %(dev)s first" msgstr "Önce %(dev)s içindeki ortamı çıkarın" -#: vrtManager/instance.py:1888 +#: vrtManager/instance.py:1891 #, python-format msgid "Disk %(dev)s is not a file; external snapshots need file disks" msgstr "" "Disk %(dev)s bir dosya değil; harici anlık görüntüler dosya diskleri " "gerektirir" -#: vrtManager/instance.py:1896 +#: vrtManager/instance.py:1899 #, python-format msgid "" "The storage pools could not be refreshed, so their free space is unknown: " @@ -9189,21 +9190,21 @@ msgid "" msgstr "" "Depolama havuzları yenilenemedi, bu yüzden boş alanları bilinmiyor: %(err)s" -#: vrtManager/instance.py:1917 +#: vrtManager/instance.py:1920 msgid "Memory is saved only from a running VM" msgstr "Bellek yalnızca çalışan bir sanal makineden kaydedilir" -#: vrtManager/instance.py:1919 +#: vrtManager/instance.py:1922 msgid "The VM has no disk to keep its memory next to" msgstr "Sanal makinenin, belleğinin yanına kaydedileceği bir diski yok" -#: vrtManager/instance.py:1923 +#: vrtManager/instance.py:1926 #, python-format msgid "%(disk)s is not in a storage pool; memory is saved only into one" msgstr "" "%(disk)s bir depolama havuzunda değil; bellek yalnızca bir havuza kaydedilir" -#: vrtManager/instance.py:1954 +#: vrtManager/instance.py:1957 #, python-format msgid "" "Storage pool %(pool)s has %(free).1f GiB free; the snapshot needs %(size).1f " @@ -9214,7 +9215,7 @@ msgstr "" "%(size).1f GiB gerektiriyor (sanal makinenin oradaki disklerinin " "%%%(percent)g kadarı, en az %(minimum)g GiB, ve kaydediliyorsa bellek)" -#: vrtManager/instance.py:1972 +#: vrtManager/instance.py:1975 msgid "" "This snapshot was taken by an older version on a UEFI VM and cannot be " "reverted; delete it instead" @@ -9222,7 +9223,7 @@ msgstr "" "Bu anlık görüntü UEFI bir sanal makinede eski bir sürümle alındı ve geri " "dönülemez; bunun yerine silin" -#: vrtManager/instance.py:2002 +#: vrtManager/instance.py:2005 #, python-format msgid "" "The revert failed twice; try again in a moment (%(error)s). The VM is " @@ -9231,7 +9232,7 @@ msgstr "" "Geri dönüş iki kez başarısız oldu; biraz sonra tekrar deneyin (%(error)s). " "Sanal makine çalışıyor." -#: vrtManager/instance.py:2004 +#: vrtManager/instance.py:2007 #, python-format msgid "" "The revert failed twice; try again in a moment (%(error)s). The VM is shut " @@ -9240,13 +9241,13 @@ msgstr "" "Geri dönüş iki kez başarısız oldu; biraz sonra tekrar deneyin (%(error)s). " "Sanal makine kapalı." -#: vrtManager/instance.py:2167 +#: vrtManager/instance.py:2170 msgid "A disk moves when its VM is defined and running, paused or shut off" msgstr "" "Bir disk, sanal makinesi tanımlıyken ve çalışırken, duraklatılmışken veya " "kapalıyken taşınır" -#: vrtManager/instance.py:2169 +#: vrtManager/instance.py:2172 msgid "" "A disk of a VM with snapshots, a saved state or a running block job does not " "move" @@ -9254,7 +9255,7 @@ msgstr "" "Anlık görüntüleri, kaydedilmiş durumu veya çalışan bir blok işi olan sanal " "makinenin diski taşınmaz" -#: vrtManager/instance.py:2177 +#: vrtManager/instance.py:2180 #, python-format msgid "" "%(dev)s is not a disk file of the VM, the same in its running and next " @@ -9263,132 +9264,132 @@ msgstr "" "%(dev)s, sanal makinenin çalışan ve sonraki başlatma tanımlarında aynı olan " "bir disk dosyası değil" -#: vrtManager/instance.py:2182 +#: vrtManager/instance.py:2185 #, python-format msgid "%(dev)s does not move: only writable raw and qcow2 disks do" msgstr "%(dev)s taşınmaz: yalnızca yazılabilir raw ve qcow2 diskler taşınır" -#: vrtManager/instance.py:2189 +#: vrtManager/instance.py:2192 #, python-format msgid "%(dev)s does not move: no storage pool has %(path)s" msgstr "%(dev)s taşınmaz: hiçbir depolama havuzunda %(path)s yok" -#: vrtManager/instance.py:2191 +#: vrtManager/instance.py:2194 #, python-format msgid "%(dev)s does not move: it has a backing file" msgstr "%(dev)s taşınmaz: temel (backing) dosyası var" -#: vrtManager/instance.py:2194 +#: vrtManager/instance.py:2197 #, python-format msgid "%(pool_name)s is not an active pool of disk files of this host" msgstr "%(pool_name)s bu sunucunun etkin bir disk dosyası havuzu değil" -#: vrtManager/instance.py:2197 +#: vrtManager/instance.py:2200 #, python-format msgid "%(dev)s is in pool %(pool_name)s already" msgstr "%(dev)s zaten %(pool_name)s havuzunda" -#: vrtManager/instance.py:2201 +#: vrtManager/instance.py:2204 #, python-format msgid "Pool %(pool_name)s already has a file %(name)s" msgstr "%(pool_name)s havuzunda zaten %(name)s dosyası var" -#: vrtManager/instance.py:2225 +#: vrtManager/instance.py:2228 #, python-format msgid "The copy of %(dev)s ended before it was complete" msgstr "%(dev)s kopyası tamamlanmadan sona erdi" -#: vrtManager/instance.py:2270 +#: vrtManager/instance.py:2273 #, python-format msgid "%(error)s; remove %(dest)s if it is there: %(cleanup_error)s" msgstr "%(error)s; varsa %(dest)s dosyasını kaldırın: %(cleanup_error)s" -#: vrtManager/instance.py:2272 +#: vrtManager/instance.py:2275 #, python-format msgid "%(error)s; the VM may use %(dest)s now: check its disk %(dev)s" msgstr "" "%(error)s; sanal makine şu anda %(dest)s dosyasını kullanıyor olabilir: " "%(dev)s diskini kontrol edin" -#: vrtManager/instance.py:2279 +#: vrtManager/instance.py:2282 #, python-format msgid "The VM has no internal snapshot named %(name)s" msgstr "Sanal makinenin %(name)s adlı dahili anlık görüntüsü yok" -#: vrtManager/instance.py:2288 +#: vrtManager/instance.py:2291 msgid "The VM has a saved state; start it or remove the saved state first" msgstr "" "Sanal makinenin kaydedilmiş durumu var; önce başlatın veya kaydedilmiş durumu" " kaldırın" -#: vrtManager/instance.py:2290 +#: vrtManager/instance.py:2293 msgid "A snapshot job is still running on this VM; try again when it ends" msgstr "" "Bu sanal makinede hâlâ bir anlık görüntü işi çalışıyor; bittiğinde tekrar " "deneyin" -#: vrtManager/instance.py:2300 +#: vrtManager/instance.py:2303 msgid "Shut the VM down to revert to an internal snapshot" msgstr "Dahili bir anlık görüntüye geri dönmek için sanal makineyi kapatın" -#: vrtManager/instance.py:2398 +#: vrtManager/instance.py:2401 msgid "Cannot clone a VM whose NVRAM is not a file" msgstr "NVRAM'i dosya olmayan bir sanal makine klonlanamaz" -#: vrtManager/instance.py:2466 +#: vrtManager/instance.py:2469 #, python-format msgid "Clone failed (%(err)s); remove these copies by hand: %(path)s" msgstr "" "Klonlama başarısız oldu (%(err)s); bu kopyaları elle kaldırın: %(path)s" -#: vrtManager/instance.py:2476 +#: vrtManager/instance.py:2479 msgid "Shut the VM down before cloning it" msgstr "Klonlamadan önce sanal makineyi kapatın" -#: vrtManager/instance.py:2530 +#: vrtManager/instance.py:2533 #, python-format msgid "Clone failed (%(err)s); remove these copies by hand: %(leftovers)s" msgstr "" "Klonlama başarısız oldu (%(err)s); bu kopyaları elle kaldırın: %(leftovers)s" -#: vrtManager/instance.py:2541 +#: vrtManager/instance.py:2544 msgid "Live clone needs libvirt 11.10 or later; shut the VM down to clone it" msgstr "" "Canlı klonlama libvirt 11.10 veya sonrasını gerektirir; klonlamak için sanal " "makineyi kapatın" -#: vrtManager/instance.py:2544 +#: vrtManager/instance.py:2547 msgid "A VM with a TPM is cloned only shut down" msgstr "TPM'i olan bir sanal makine yalnızca kapalıyken klonlanır" -#: vrtManager/instance.py:2547 +#: vrtManager/instance.py:2550 #, python-format msgid "Disk %(dev)s is not a local file; shut the VM down to clone it" msgstr "" "Disk %(dev)s yerel bir dosya değil; klonlamak için sanal makineyi kapatın" -#: vrtManager/instance.py:2549 +#: vrtManager/instance.py:2552 #, python-format msgid "Disk %(dev)s is shareable; shut the VM down to clone it" msgstr "Disk %(dev)s paylaşılabilir; klonlamak için sanal makineyi kapatın" -#: vrtManager/instance.py:2554 +#: vrtManager/instance.py:2557 #, python-format msgid "Disk %(dev)s changes at the next start; shut the VM down to clone it" msgstr "" "Disk %(dev)s sonraki başlatmada değişiyor; klonlamak için sanal makineyi " "kapatın" -#: vrtManager/instance.py:2556 +#: vrtManager/instance.py:2559 msgid "Another job is running on the VM; clone it when that ends" msgstr "Sanal makinede başka bir iş çalışıyor; o bittiğinde klonlayın" -#: vrtManager/instance.py:2569 +#: vrtManager/instance.py:2572 #, python-format msgid "Volume %(name)s already exists in storage pool %(pool)s" msgstr "%(name)s birimi %(pool)s depolama havuzunda zaten var" -#: vrtManager/instance.py:2588 +#: vrtManager/instance.py:2591 #, python-format msgid "" "Storage pool %(pool)s has %(free).1f GiB free; the clone needs %(size).1f GiB" @@ -9398,20 +9399,20 @@ msgstr "" "gerektiriyor (kopyalanan diskler, artı bunların %%%(percent)g kadarı, en az " "%(minimum)g GiB)" -#: vrtManager/instance.py:2727 +#: vrtManager/instance.py:2730 msgid "A network interface that is a host device is removed in the XML editor" msgstr "Sunucu aygıtı olan bir ağ arabirimi XML düzenleyicide kaldırılır" -#: vrtManager/instance.py:2743 +#: vrtManager/instance.py:2746 #, python-format msgid "No network interface with MAC %(old_mac)s" msgstr "MAC adresi %(old_mac)s olan ağ arabirimi yok" -#: vrtManager/instance.py:2746 +#: vrtManager/instance.py:2749 msgid "A network interface that is a host device is changed in the XML editor" msgstr "Sunucu aygıtı olan bir ağ arabirimi XML düzenleyicide değiştirilir" -#: vrtManager/instance.py:2837 +#: vrtManager/instance.py:2840 msgid "" "A VM changes its PCI devices while it runs, or is shut off without a saved " "state" @@ -9419,14 +9420,14 @@ msgstr "" "Sanal makine PCI aygıtlarını çalışırken veya kaydedilmiş durumu olmadan " "kapalıyken değiştirir" -#: vrtManager/instance.py:2849 +#: vrtManager/instance.py:2852 #, python-format msgid "%(err)s; whether the VM has PCI device %(address)s now is not known" msgstr "" "%(err)s; sanal makinede şu anda %(address)s PCI aygıtının olup olmadığı " "bilinmiyor" -#: vrtManager/instance.py:2851 +#: vrtManager/instance.py:2854 #, python-format msgid "" "%(err)s; PCI device %(address)s: the VM is not running, its next start has it" @@ -9434,7 +9435,7 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: sanal makine çalışmıyor, sonraki başlatmada " "var" -#: vrtManager/instance.py:2853 +#: vrtManager/instance.py:2856 #, python-format msgid "" "%(err)s; PCI device %(address)s: the VM is not running, its next start does " @@ -9443,7 +9444,7 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: sanal makine çalışmıyor, sonraki başlatmada " "yok" -#: vrtManager/instance.py:2854 +#: vrtManager/instance.py:2857 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM has it, its next start has it" @@ -9451,7 +9452,7 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: çalışan sanal makinede var, sonraki " "başlatmada var" -#: vrtManager/instance.py:2856 +#: vrtManager/instance.py:2859 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM has it, its next start does " @@ -9460,7 +9461,7 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: çalışan sanal makinede var, sonraki " "başlatmada yok" -#: vrtManager/instance.py:2858 +#: vrtManager/instance.py:2861 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM does not have it, its next " @@ -9469,7 +9470,7 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: çalışan sanal makinede yok, sonraki " "başlatmada var" -#: vrtManager/instance.py:2860 +#: vrtManager/instance.py:2863 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM does not have it, its next " @@ -9478,34 +9479,34 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: çalışan sanal makinede yok, sonraki " "başlatmada yok" -#: vrtManager/instance.py:2894 +#: vrtManager/instance.py:2897 #, python-format msgid "The VM has no PCI device %(address)s" msgstr "Sanal makinede %(address)s PCI aygıtı yok" -#: vrtManager/instance.py:2912 +#: vrtManager/instance.py:2915 msgid "The VM has no USB controller" msgstr "Sanal makinede USB denetleyicisi yok" -#: vrtManager/instance.py:2931 +#: vrtManager/instance.py:2934 msgid "The VM has no such USB device" msgstr "Sanal makinede böyle bir USB aygıtı yok" -#: vrtManager/instance.py:2945 +#: vrtManager/instance.py:2948 #, python-format msgid "The VM has no network interface %(mac)s" msgstr "Sanal makinede %(mac)s ağ arabirimi yok" -#: vrtManager/instance.py:2976 +#: vrtManager/instance.py:2979 msgid "The VM has its own RNG device: change it in the XML editor" msgstr "" "Sanal makinenin kendi RNG aygıtı var: bunu XML düzenleyicide değiştirin" -#: vrtManager/instance.py:3003 +#: vrtManager/instance.py:3006 msgid "The VM has its own TPM: change it in the XML editor" msgstr "Sanal makinenin kendi TPM'i var: bunu XML düzenleyicide değiştirin" -#: vrtManager/instance.py:3022 +#: vrtManager/instance.py:3025 #, python-format msgid "Unknown crash action %(action)s" msgstr "Bilinmeyen çökme eylemi %(action)s" diff --git a/locale/zh/LC_MESSAGES/django.mo b/locale/zh/LC_MESSAGES/django.mo index 89cd34c887842a0d290f4cc60e0e6536fbf04e7a..069b3b1d433688ccdd109531926f32b6052b637c 100644 GIT binary patch delta 19368 zcmXxrcc6~-|Htv`zB#tY>=?O?WA71J$4avImJuQ{jupvebHYJ5j#JqqqsZY%p%NJ( zBH6QpBxLnX#_##MKkwh~pT}oh*Jr#xYvKNVJR%czJOQs^fSpi9g~}{2TM&M;`{fD)>1T!K>H`)6EEY6|pns zz*+bbF2{QK4d%yZ7>)U62E0<(b*3NiB1ufAKrTl`URvexpuu@?FB7=?NL*)Ak?u>%F`u@a`5<3e5)bCK_l$v7T! zW7W9EoRn5 z?!|nl&=o{A(8z3w1;}?qt>t@GJ{Pl+UxcM`9co~|VJ6I+s1Aq#YEu@)oLB?ZPAg19 z|K2+!G{T{%2FIGSP)o5GwYK|FGrfu0Jdd$3hCX)n4X_#czNk=dK}GIs^AKuc7cd=O zLti1gLqa2dfQ>Qmi93ExF*Es5s28T78ji!)a6W1vXHdu1`_x6UJnFeBsI{(via>2t zdu>n??fEI^Um=R2K%p6j*>FDUg*B)d@4y%E5bDLVR({KTf@&wzV%Nb-7!ElqvNcfe zH$+9G9kThnw-yzJ%I`5BAGtRow z4YUZV!OEy5Xp6ead!Pn97WLj_)RHVl4J66c``#}kG~zQD!t1E>nQm3U%ZCN9IMzf( zqz@`WBe6YBMLmBW75WFL0aRM;HgO9qMScu+!quoH_tvN#&R=>GI=7M78C#$>;W|{q zJ5dduu=2a8k4dV}+)@<85cy)L=Nh4oZEw_`ibE~MN0wiPy5d)1UY-BbBy@Zpq6QMR z)^*SYb-YHKOHeoEUaWwZusdd3=Q@r-MJf(8<87!taupTf4C~$Q&yCuQCD7N}#E{Th z%|vaY`Q~CP{|vRsHlZ5YidyU4R)56mPnu^@oAi>^UqglbHtP8OgSr9JZ{Ymv+!xy5 zc4;+KNA)p;jZiQ4M|B*7>exr^>KSG{YT(OI6IqYyC<*ocUevKZV)=8Zc2YKQ{FD(LGSid;^P6J^;0;=3q(u8Vh5JnSPVo17%RZ58l8r*b_CNbEpAcK~3OK zR7CveBs9~^U%GqXWmE{GP%|!r3RN^}X_}ypUrSWOJuKfBHRF+}_s63KJl)DSqu$?v z&GCCAa=w>!v-?QoK#eFjs>3K$Xe*%Bz6$DNQV+GOUqd}N5OwU{Lp?Vi6`5tI=l7y! zzTZ5Cn!p)+QRn|A361y(YEz|7awE-xnqdx9$nu~fRTed{Xw-Z4QKzU0s^LDU8+C-$ zk43#V8Fis8Kt*OV=F#~-M?y3I2diPk7PscLQ60R63f%y6h&clF-Wb$Cr=ubghq`JL zQKxGoDq?$4&)q_`cMpB7**_%oVqhz47+^2pE97%0yKg{qY)yVD7RS?A27}w&W-O1I zSr@E?@1Zu~2GlvdnzIsWh@(kYvygJw$^%u}8d<{>bI(+$i_lHV9>_>hRw#CTZZXo_3656%j zqQ1*Nqi(3%SQfMX;C_xrV;}NkP#s-Dg*y8l_kKAnMm`$#)qESZ>&KxYHyahHm8h@l z0pxS-d*?{#+~(cu*0eajNxmL-!(~?f9NUqP{Lz&UMm2aCHK2P~4x{$D&DIWUke_Y- zgnBORez$q6V=4B>OsT8ECg@=Dl99{0b}Jebgq6I_W0T>?G%(UFZ#_Kz@O0;4fT- z#eQ=GI*d9_mrx-rdCDED!B~&{HdOgz)NzhJ?QT#Xdyr2?J(v4Tz}t?UQ8#4{|EznV z5h}FPaXhX=o#RsH+*%IBCgkU%LVO7ofqzjUZGPT$xDaoVKZ08OZ!Wk<1~1wYp!#Ww zUC|#zLSMa~P*?9s^CqSt|ICcIZVM> zNS*&9R&m2BA}+g*La2_)n^jS}yEf`VX^Og{d!jlVhMLG!E1zqwFt?&k*FMzV`VBMb z{HMF(8pw&dh>Dw4P{*vE<=?dY0LxD^=cB#}%TNQ^Zsmti$NDttRQ(V2F^anC2GSBU z>HPN~ksjYg&3F`QrsFI>)0}4}V)$mX{BzVm)BNr%gqlcgvx${=wES?(Pe5Or;ZqXw zTk|q%EmNhqD>)L2kgtS#t|RJ{j6rS2E!Y7MqkcC;U332y)D?BAzC{iA8EUh3z3$pu zb=`jdAEZDtzhquVh3YnjF!F}$s52Tof>`#;4az)hFWXl6r2E)v5_Vm3hy zw4+Z#AsdDIczl5+@E6p_;t8sQ=6|}-w?pMeVJ{qqYWOm0z_+dbnHh1*m1jb|m(TKr zQJdATM4}dnhN$yD8TDWSYUE2$OR)#_8}SaN!v9d4^f~HWXa36_zmlj4R6#|oJF0#R zs@;XC0WU`Oj_<7}q20R&HG@m2P~Jto@EA3az->2>qNtI#LM{-mx0R1WJ--&y;U?6d z-P_Ims0sXr+7nm9dCuQM5}HxqjvHA7s)KB(QxJvP^)<|Hs2TX?Omh+Hm(OZcBzK}d zHpi^~U(^z(x$90rNi3)HKa7O_BwB&$@Sd6OZ`a_=T1>e)D74l!{%}B=-LaR-Y-#^3ggW$57eu1D8g-sGqZ&AXeeo#v!KzPO`KPFhXeH{n z?ZPtnA1dS}p1MfXL>;@k1QknBAC)!sz%A4!3qEseoENq0>zZv)OVtO} z(Fn^=M=e8GS^Z}Q zN25Zt7qzKgNEh_9L`_hUh(pb22kHWPg8D{OP9F^a#nT$=ke`JW@Cd3OFN5nitLf(_ zp^B1LP~ChTvr^s`^)>5bjz*p9Sr}d-EI>XPE8Y5)Vx(Wv&OT0Q}_nOEUU zI{!PZ;-q;sT)__zRLAKvyADdBB2p1USRWOE-l!XKl;tO&W;`FYR3D=vd;k@J)2Pq! zJH&y6GH-lCfLEc9_H^rQ7E1{L84cPeL6GHz(jg@^Prm^&hIC7jnBzlM~fY9c+f} zQ5Vii)WwwdB^Qb6n2P)W)Bp#g+VOD_PW}IUDAGMp4AnqYvpp&TBd|R#L@mi}R6|jD zT{(aQIr=TX5fO>uvY9JfT9mpp1y+bbHrI^pKGY{s@>t2XKeU>Mp8j3@G zZWma7BWj?@mOo`)L=E5?YC!ibpC+Fz9cI({50TI&s$>4{$KvmS0Sr>JD2BKy*A9Wgbqc+zmRC_n9Jau6=;5?`Zv_dW65Y#{?73Tcw!kI;Z zMwnvWLfwq_QIV)wBpCkD_$I2uVW{$0)E}qot^6qJ%D#rWvP(p{fi**Q+zs{q5G$YR zlTgR;sDXTnA$*9MNv@*7@Sk24u?zXhxEe2EKAcv}UAZe!1Nj~GQ!9OOmwyx0{v^}@ zKD7L&SeCrMl7vEk+#a}O`TM3u@1H=<(6hXW+k7D8t6XM z1dgC4Z~?>T|4%D;W@aqyHrY$42kW3-Y=*6{o0V@wHN3<8!8~a7$50`^fSSPHsN;z$fNfe3kNK)Bx^UxmV6Lm>E@`19cx1L3Pjtqp_dmKSNDqtGNU9 z-Vdnfj+f*7s~~%MS5X*sPAj3#du!C5_`qC*x@xyt{twji5fxmhi=aBJYSu=z{~9W? z?N9?9V7^y@^RII}g#x{}#{2?x6K=H!Pob75#p<7-Hfcmf_g)s%kI!7FV;N=ELv`34 zHGqMrJu%Vp3w#n4vJ@Hpxss$9iwrkSWs_A}yL;ayr^%d9AB-9M& zp$4)RHPd9PKVY7=`ahh$_s9xTRdplHYUW1G;AK>3%UZq`YAKqbmY}bd4>8A^b1+2x zQq+LHH;S}82)+BNtDl77fB#D$p-s3Swd-%9LYK3;+x^8+$Fu=zAOlg)kF@#()VbbbbViMIRDy(ODRx8N37x|syt_HH-P%6hWempI@t0{ zt$rP96CXk?!Jnx1?x5bw80{jG6LoX8KrO}KXwH8mi76E5!6jG`*P=#z4qM_K)bD{h zbzB5uQIVU2dTuFdW=WPmgqg`-#LD;=h9g_ojw9+@(!eL7hT~Bqzldu1Dr!LY&8Mi2 z($;gwGY>8xAA{;RU41v>f~YIG7V4%Pj#~TA%)_X5?_qc^JRzY06lvgm7qvN(QFrtc z)Ppr&b0hDK>R1@&An%a1}P?0e&^U?OTJvF38r zru)X~_gnsFY)APyv*PRSLYj`6*`B~c7PI$?rma3#vEa{A>4jB%u+- zU^SeJYWN^(V8_g}R-S?y;4Lf9+0;E(05y;jr~$r$YNw&u%*xxMmZ*1A&c6mQ*dB;A z=b#!|X!(_>)3F}4rW>&t{%G|%nz;$&MRi;q^?qa2FQN{pzbO-~{2^*!!REe8q;Kxl zEGzb;q7bT~$>x0gnEXoAi*;JKrFb3nTxZlh@eaO=-{1f&(b8?c1?D=`#q=%e>v`5E z(Vj%HR&GY)P$NHt+Ek}eYZz$lI?j!%e;IWjl(KwnR7jgxzCG&ww=6#cHSh$~drK_u zZ?=N%R&dBXZk{nOqXu%r^3PBMiD=`#1=(-{`4*_>j-l$WqdI(mIu&W#x`9L@H>B@{ zte`CF{8vHEq`8%MLN(X}OX5h>?}25Q5jUaE_YTwykD=Z_WnM-7)qC3vwsZBlFpd8H zFGxZi6i1D?w&k0kM&8rPhno{n1C2vKaXL7kSnR^Pgld#)>LrhP3x((>c6IpuRu{aozC z`B%fYD9}tES;bRS2N^oM21BTjmqh&tt&bX57u1Ed05#wvSO#yRX82MU_g)>;dz~yl z6xH8{T{!;=&0Gp}18&9AcmlQA0$p80rBPRKTT};AP@mT%)KXkWeKm`9b2EDv)xj9l zuAhL4$UM}q=M|{W@(rJa9?blvdmsnuuh}Bl4=17`^e5`Mhp3C@3F@a=v+i!@gHa)! zf$cB>b+g_^b)2q;`@!)Ns-1UG<^E6-8p#B!Sd9wR=a%1#3jHBe2Pvol-9zo-C#VLq z^mOJzMJPXN37eqW?}>VUs+G@kdEZ-0LJcLO8am)AyrY&sZ~kunY4!Ik{~R^IG`-yW z1+WD9qBsXzq9S@3wPew6xqks2hDCJ#Gxv5gs)!muO;l*=TX`FdBi{`-;4Rcl7WHw@ zuSPA!=a&E3Jc)Ylyyb7ABKNoD|HHI8|G~cQ!3?NK|&~`+x^g}gW9bFQQ!A*sI^>U<-ejrcpd9v z-hS@*bwmB2h{r0p1>53H42QhGa~SIUuR)!bNBuefx=?Dq<7PS<8<9`4{1epLzA_*f z{J8c^{)HZua@unZtZ+4ScY25 zqo{k~9%_KO2DxL_2G#IjRA^_RcJ~U@O!wm;e1ht5z+iVJ&qMtHIcWK)Aua-4eG;vx zSdO*v0dB=gLxbV}RPqnh0NTX3rI>@-&AU*c%s0$MWB_WWTTvI%9n^(ZZnzs*bJPVk z5u0HWYH9tz2$v{_ODO1u3i(r1gSke!23w+*W)AAAJ&n4E9%6NDILiGrn}D^*Ct!9w ziTWJhMD4YQSO7D;7v3wrSCWJ(dZ7NvWdv&E38)cnLoG>)m8Tu;*1RZc3HqbHdOqqW zRWgpk;Fw_ef36>cn)zj{irLfShC8D|Iv2IZ$53k< z@qt^KGN`3^2X)N0;{^N>wTBvwbH{TaY9eE?2QJ1U^zS_tGCOrgKn{IEZQ>Fx}0xFzUQV<4~N4Z{q`0J6&Vl06#`8+1D6_kIm4BuHA;HhIpf4&i6H$9(8EW$$Kt2BtYO_|I zN}x2++glT zEzv2gf|=$7y@}}8BcYD>qDGv4u8T-jY)rl%Y6eNDtMfjpftNpWp=^ta+zixa{S9>* zQq6M%Z;hJJQ0$KDaWH0_AFlVk_em&(iKxwyZ260*8UKeGSZIN>IqHHMi+X+mD&)IR zd*&Ky&*YDH5sb#kECNjVhN5$ea9mgyAYQ^ zjkr7N=6Vm+&?eM#Kbsd(Grxm+zUUISS))-)HWzin?m*QaLq+H&`r6%@mb!vBP@7}` zYK@j)JIu1o{cz}m+LQxPOXH)KZY64F-u*PTZNN%^CU_pzpZ|n}8ce^z{d0L%R46N;${V9*&KxCq2ezWtcAxnNYE3hK;g+fxs^hU{ENY!=r7p_Zm2Y9O(w)3F{E%8TajsQ3OrMc_W_ zl%(I}ezxaBEk$Ki=-)t1q@UFJpG-obT8e65yZN)3V*Y2o_@#TU7^$LX;cL;eJ6&0pW@Y>lbNcS8-h=T^?Y5<{(E0xI-#%>*n-eu?D|qGoUmwU%d5 zGrNK6=n;l6knAE;2o>4dsE#{eIqZV%aE5+jX(pE`(98;Mb0KVj8dxt>2QjFn8IKx3 zJcgGH)$n%9@5JzFK&|yv)P#axx$^X=CCi1XujpH%73!)Sf@)v^s-xxD0XLx5HuZM* z(<(QrfgY$C`B)J*VjsMM>bTL@uDuqh3#TjUw`M$Qg8ttmG{e9*ZiZRRC{*Zcpk~+? z)!{p4Eb6#^X7xu=OK`&S7g49@D(bx)JKXb?P{*$eQto^4F5zu8Pnh>nBhI$d&A2Hl zLJLqGe{EhdGwgCRu84}@tEf%c5cMZpg4HLZBD*sz=Wibgy>QGPxPS_Eisk=jJ~z{R z>&|~>RAjQDLY>RZk2>!~Q0=^mI*v_Ik?xIpJ_bYd?~Nv*5hbDqveNw0%6FOj&0kOr zoI|bQRV%-bFOYv~^_jkN_1RJF7dFe7RWbbE|JJpFCT2UcyV)N#(_yFqjzSG!vgK!> z);IwZaT_Y+t-lX?9dQWe!2{;+sQTyMbN-dczuP@f151-{kNU_=Lj6|z8uioc4-8?p zAKdema3J~Ss2P5PiojmfF*|`;g1e~Wn`)06c%&KHS(C>KI)WAvHT`fq`tQ&4+5Ily8YDs0$_9@*Pnj>xCNF2dLdY z3-#P)RLFlqb$Aoi(QWe~>W+VcTC%J^y88TP5!6S_FGV7PM0r$4ub2%{4Yx;)v@>b| zy-@>*wesbtjyGUNOhSeJThsv0nvYTKMDBAx#R_Bi{C6dx2HrO(qDB^L#-Tzs&+^MH zzXlbdWb+tmDQ=+#o_oJ*Coih~5NZI$P)nizE1xRq(b(##f(*Oj_~xmDDQS`>PQH*K zn2bLc{y@2@UH%rcY>a-_YPeVJPY!6YAZ6 z*nnZ7w|Wj5G#nbuaQ)+i>xq+7R<23eH2d1ZrPq=c+}QX{%Ix@UgX4q4D*PYV+Dvi) delta 19288 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 %(limit)s)" msgstr "%(quota)s(%(total)s > %(limit)s)" -#: instances/utils.py:195 +#: instances/utils.py:199 msgid "None available device name" msgstr "没有可用的设备名称" -#: instances/utils.py:402 +#: instances/utils.py:406 #, python-format msgid "%(hostname)s via %(address)s" msgstr "%(hostname)s,经由 %(address)s" -#: instances/utils.py:441 +#: instances/utils.py:445 msgid "Invalid MAC address" msgstr "无效的 MAC 地址" -#: instances/utils.py:443 +#: instances/utils.py:447 msgid "More MAC addresses than networks" msgstr "MAC 地址数量多于网络数量" @@ -8597,120 +8598,120 @@ msgid "" "with '.'" msgstr "快照名称为 1-64 个字母、数字、'.'、'_' 或 '-',且不能以 '.' 开头" -#: vrtManager/instance.py:1076 +#: vrtManager/instance.py:1079 msgid "" "A device other than a disk or NIC is in the boot order: change it in the XML " "editor" msgstr "启动顺序中有磁盘或网卡以外的设备:请在 XML 编辑器中修改" -#: vrtManager/instance.py:1088 +#: vrtManager/instance.py:1091 msgid "Invalid Device Type for boot order" msgstr "启动顺序的设备类型无效" -#: vrtManager/instance.py:1091 +#: vrtManager/instance.py:1094 #, python-format msgid "Boot device %(dev)s is not in the definition" msgstr "启动设备 %(dev)s 不在定义中" -#: vrtManager/instance.py:1111 +#: vrtManager/instance.py:1114 #, python-format msgid "CD-ROM %(dev)s is not in the running definition" msgstr "CD-ROM %(dev)s 不在运行中的定义中" -#: vrtManager/instance.py:1112 +#: vrtManager/instance.py:1115 #, python-format msgid "CD-ROM %(dev)s is not in the persistent definition" msgstr "CD-ROM %(dev)s 不在持久定义中" -#: vrtManager/instance.py:1124 +#: vrtManager/instance.py:1127 #, python-format msgid "Media of %(dev)s changed in the running VM only: %(err)s" msgstr "%(dev)s 的介质仅在运行中的虚拟机中更改:%(err)s" -#: vrtManager/instance.py:1135 +#: vrtManager/instance.py:1138 #, python-format msgid "ISO image %(image)s was not found" msgstr "未找到 ISO 镜像 %(image)s" -#: vrtManager/instance.py:1137 +#: vrtManager/instance.py:1140 #, python-format msgid "ISO image %(image)s is in more than one storage pool" msgstr "ISO 镜像 %(image)s 位于多个存储池中" -#: vrtManager/instance.py:1244 +#: vrtManager/instance.py:1247 #, python-format msgid "Disk %(target_dev)s is not in the VM's definition" msgstr "磁盘 %(target_dev)s 不在虚拟机的定义中" -#: vrtManager/instance.py:1372 +#: vrtManager/instance.py:1375 msgid "Please shutdown the instance then try to enable vCPU hotplug" msgstr "请先关闭虚拟机,再启用 vCPU 热插拔" -#: vrtManager/instance.py:1659 +#: vrtManager/instance.py:1662 msgid "The VM has no video card" msgstr "虚拟机没有显卡" -#: vrtManager/instance.py:1833 +#: vrtManager/instance.py:1836 msgid "" "The VM has external snapshots; internal snapshots cannot be mixed with them" msgstr "虚拟机有外部快照;内部快照不能与其混用" -#: vrtManager/instance.py:1865 +#: vrtManager/instance.py:1868 msgid "A snapshot with memory is not quiesced; it keeps the whole guest state" msgstr "含内存的快照不会静默文件系统;它保存整个客户机状态" -#: vrtManager/instance.py:1867 +#: vrtManager/instance.py:1870 msgid "Only a running VM's file systems can be frozen" msgstr "只有运行中的虚拟机的文件系统可以冻结" -#: vrtManager/instance.py:1869 +#: vrtManager/instance.py:1872 msgid "The QEMU guest agent is not connected; it freezes the file systems" msgstr "QEMU 客户机代理未连接;文件系统由它冻结" -#: vrtManager/instance.py:1872 +#: vrtManager/instance.py:1875 msgid "" "The VM has internal snapshots; external snapshots cannot be mixed with them" msgstr "虚拟机有内部快照;外部快照不能与其混用" -#: vrtManager/instance.py:1877 +#: vrtManager/instance.py:1880 msgid "Newer snapshots exist after the last revert; delete them first" msgstr "上次还原后存在更新的快照;请先删除它们" -#: vrtManager/instance.py:1880 +#: vrtManager/instance.py:1883 msgid "No snapshot is current; revert to a snapshot first" msgstr "没有当前快照;请先还原到某个快照" -#: vrtManager/instance.py:1886 +#: vrtManager/instance.py:1889 #, python-format msgid "Eject the media from %(dev)s first" msgstr "请先弹出 %(dev)s 中的介质" -#: vrtManager/instance.py:1888 +#: vrtManager/instance.py:1891 #, python-format msgid "Disk %(dev)s is not a file; external snapshots need file disks" msgstr "磁盘 %(dev)s 不是文件;外部快照需要文件磁盘" -#: vrtManager/instance.py:1896 +#: vrtManager/instance.py:1899 #, python-format msgid "" "The storage pools could not be refreshed, so their free space is unknown: " "%(err)s" msgstr "无法刷新存储池,其可用空间未知:%(err)s" -#: vrtManager/instance.py:1917 +#: vrtManager/instance.py:1920 msgid "Memory is saved only from a running VM" msgstr "只能保存运行中的虚拟机的内存" -#: vrtManager/instance.py:1919 +#: vrtManager/instance.py:1922 msgid "The VM has no disk to keep its memory next to" msgstr "虚拟机没有可存放其内存的磁盘" -#: vrtManager/instance.py:1923 +#: vrtManager/instance.py:1926 #, python-format msgid "%(disk)s is not in a storage pool; memory is saved only into one" msgstr "%(disk)s 不在存储池中;内存只能保存到存储池中" -#: vrtManager/instance.py:1954 +#: vrtManager/instance.py:1957 #, python-format msgid "" "Storage pool %(pool)s has %(free).1f GiB free; the snapshot needs %(size).1f " @@ -8720,156 +8721,156 @@ msgstr "" "存储池 %(pool)s 可用 %(free).1f GiB;快照需要 %(size).1f GiB(其中虚拟机磁盘的 %(percent)g%%,至少 " "%(minimum)g GiB,若保存内存则另加内存)" -#: vrtManager/instance.py:1972 +#: vrtManager/instance.py:1975 msgid "" "This snapshot was taken by an older version on a UEFI VM and cannot be " "reverted; delete it instead" msgstr "此快照由旧版本在 UEFI 虚拟机上创建,无法还原;请将其删除" -#: vrtManager/instance.py:2002 +#: vrtManager/instance.py:2005 #, python-format msgid "" "The revert failed twice; try again in a moment (%(error)s). The VM is " "running." msgstr "还原两次失败;请稍后重试(%(error)s)。虚拟机正在运行。" -#: vrtManager/instance.py:2004 +#: vrtManager/instance.py:2007 #, python-format msgid "" "The revert failed twice; try again in a moment (%(error)s). The VM is shut " "off." msgstr "还原两次失败;请稍后重试(%(error)s)。虚拟机已关机。" -#: vrtManager/instance.py:2167 +#: vrtManager/instance.py:2170 msgid "A disk moves when its VM is defined and running, paused or shut off" msgstr "仅当虚拟机已定义且处于运行、暂停或关机状态时才能移动磁盘" -#: vrtManager/instance.py:2169 +#: vrtManager/instance.py:2172 msgid "" "A disk of a VM with snapshots, a saved state or a running block job does not " "move" msgstr "有快照、保存的状态或正在运行块任务的虚拟机的磁盘不能移动" -#: vrtManager/instance.py:2177 +#: vrtManager/instance.py:2180 #, python-format msgid "" "%(dev)s is not a disk file of the VM, the same in its running and next " "start's definition" msgstr "%(dev)s 不是该虚拟机在运行中的定义和下次启动定义中相同的磁盘文件" -#: vrtManager/instance.py:2182 +#: vrtManager/instance.py:2185 #, python-format msgid "%(dev)s does not move: only writable raw and qcow2 disks do" msgstr "%(dev)s 不能移动:只能移动可写的 raw 和 qcow2 磁盘" -#: vrtManager/instance.py:2189 +#: vrtManager/instance.py:2192 #, python-format msgid "%(dev)s does not move: no storage pool has %(path)s" msgstr "%(dev)s 不能移动:没有存储池包含 %(path)s" -#: vrtManager/instance.py:2191 +#: vrtManager/instance.py:2194 #, python-format msgid "%(dev)s does not move: it has a backing file" msgstr "%(dev)s 不能移动:它有后备文件" -#: vrtManager/instance.py:2194 +#: vrtManager/instance.py:2197 #, python-format msgid "%(pool_name)s is not an active pool of disk files of this host" msgstr "%(pool_name)s 不是此主机上活动的磁盘文件存储池" -#: vrtManager/instance.py:2197 +#: vrtManager/instance.py:2200 #, python-format msgid "%(dev)s is in pool %(pool_name)s already" msgstr "%(dev)s 已在存储池 %(pool_name)s 中" -#: vrtManager/instance.py:2201 +#: vrtManager/instance.py:2204 #, python-format msgid "Pool %(pool_name)s already has a file %(name)s" msgstr "存储池 %(pool_name)s 中已有文件 %(name)s" -#: vrtManager/instance.py:2225 +#: vrtManager/instance.py:2228 #, python-format msgid "The copy of %(dev)s ended before it was complete" msgstr "%(dev)s 的复制在完成前结束" -#: vrtManager/instance.py:2270 +#: vrtManager/instance.py:2273 #, python-format msgid "%(error)s; remove %(dest)s if it is there: %(cleanup_error)s" msgstr "%(error)s;如果 %(dest)s 存在请将其删除:%(cleanup_error)s" -#: vrtManager/instance.py:2272 +#: vrtManager/instance.py:2275 #, python-format msgid "%(error)s; the VM may use %(dest)s now: check its disk %(dev)s" msgstr "%(error)s;虚拟机现在可能在使用 %(dest)s:请检查其磁盘 %(dev)s" -#: vrtManager/instance.py:2279 +#: vrtManager/instance.py:2282 #, python-format msgid "The VM has no internal snapshot named %(name)s" msgstr "虚拟机没有名为 %(name)s 的内部快照" -#: vrtManager/instance.py:2288 +#: vrtManager/instance.py:2291 msgid "The VM has a saved state; start it or remove the saved state first" msgstr "虚拟机有保存的状态;请先启动它或删除保存的状态" -#: vrtManager/instance.py:2290 +#: vrtManager/instance.py:2293 msgid "A snapshot job is still running on this VM; try again when it ends" msgstr "此虚拟机上仍有快照任务在运行;请在其结束后重试" -#: vrtManager/instance.py:2300 +#: vrtManager/instance.py:2303 msgid "Shut the VM down to revert to an internal snapshot" msgstr "请关闭虚拟机后再还原到内部快照" -#: vrtManager/instance.py:2398 +#: vrtManager/instance.py:2401 msgid "Cannot clone a VM whose NVRAM is not a file" msgstr "NVRAM 不是文件的虚拟机无法克隆" -#: vrtManager/instance.py:2466 +#: vrtManager/instance.py:2469 #, python-format msgid "Clone failed (%(err)s); remove these copies by hand: %(path)s" msgstr "克隆失败(%(err)s);请手动删除这些副本:%(path)s" -#: vrtManager/instance.py:2476 +#: vrtManager/instance.py:2479 msgid "Shut the VM down before cloning it" msgstr "请先关闭虚拟机再克隆" -#: vrtManager/instance.py:2530 +#: vrtManager/instance.py:2533 #, python-format msgid "Clone failed (%(err)s); remove these copies by hand: %(leftovers)s" msgstr "克隆失败(%(err)s);请手动删除这些副本:%(leftovers)s" -#: vrtManager/instance.py:2541 +#: vrtManager/instance.py:2544 msgid "Live clone needs libvirt 11.10 or later; shut the VM down to clone it" msgstr "在线克隆需要 libvirt 11.10 或更高版本;请关闭虚拟机后再克隆" -#: vrtManager/instance.py:2544 +#: vrtManager/instance.py:2547 msgid "A VM with a TPM is cloned only shut down" msgstr "带 TPM 的虚拟机只能在关机时克隆" -#: vrtManager/instance.py:2547 +#: vrtManager/instance.py:2550 #, python-format msgid "Disk %(dev)s is not a local file; shut the VM down to clone it" msgstr "磁盘 %(dev)s 不是本地文件;请关闭虚拟机后再克隆" -#: vrtManager/instance.py:2549 +#: vrtManager/instance.py:2552 #, python-format msgid "Disk %(dev)s is shareable; shut the VM down to clone it" msgstr "磁盘 %(dev)s 是可共享的;请关闭虚拟机后再克隆" -#: vrtManager/instance.py:2554 +#: vrtManager/instance.py:2557 #, python-format msgid "Disk %(dev)s changes at the next start; shut the VM down to clone it" msgstr "磁盘 %(dev)s 在下次启动时会改变;请关闭虚拟机后再克隆" -#: vrtManager/instance.py:2556 +#: vrtManager/instance.py:2559 msgid "Another job is running on the VM; clone it when that ends" msgstr "虚拟机上有另一个任务正在运行;请在其结束后再克隆" -#: vrtManager/instance.py:2569 +#: vrtManager/instance.py:2572 #, python-format msgid "Volume %(name)s already exists in storage pool %(pool)s" msgstr "卷 %(name)s 已存在于存储池 %(pool)s 中" -#: vrtManager/instance.py:2588 +#: vrtManager/instance.py:2591 #, python-format msgid "" "Storage pool %(pool)s has %(free).1f GiB free; the clone needs %(size).1f GiB" @@ -8878,97 +8879,97 @@ msgstr "" "存储池 %(pool)s 可用 %(free).1f GiB;克隆需要 %(size).1f GiB(复制的磁盘,再加其 %(percent)g%%,至少" " %(minimum)g GiB)" -#: vrtManager/instance.py:2727 +#: vrtManager/instance.py:2730 msgid "A network interface that is a host device is removed in the XML editor" msgstr "作为主机设备的网络接口需在 XML 编辑器中删除" -#: vrtManager/instance.py:2743 +#: vrtManager/instance.py:2746 #, python-format msgid "No network interface with MAC %(old_mac)s" msgstr "没有 MAC 为 %(old_mac)s 的网络接口" -#: vrtManager/instance.py:2746 +#: vrtManager/instance.py:2749 msgid "A network interface that is a host device is changed in the XML editor" msgstr "作为主机设备的网络接口需在 XML 编辑器中修改" -#: vrtManager/instance.py:2837 +#: vrtManager/instance.py:2840 msgid "" "A VM changes its PCI devices while it runs, or is shut off without a saved " "state" msgstr "虚拟机只能在运行时或无保存的状态的关机时更改其 PCI 设备" -#: vrtManager/instance.py:2849 +#: vrtManager/instance.py:2852 #, python-format msgid "%(err)s; whether the VM has PCI device %(address)s now is not known" msgstr "%(err)s;虚拟机现在是否有 PCI 设备 %(address)s 未知" -#: vrtManager/instance.py:2851 +#: vrtManager/instance.py:2854 #, python-format msgid "" "%(err)s; PCI device %(address)s: the VM is not running, its next start has it" msgstr "%(err)s;PCI 设备 %(address)s:虚拟机未运行,下次启动时有它" -#: vrtManager/instance.py:2853 +#: vrtManager/instance.py:2856 #, python-format msgid "" "%(err)s; PCI device %(address)s: the VM is not running, its next start does " "not have it" msgstr "%(err)s;PCI 设备 %(address)s:虚拟机未运行,下次启动时没有它" -#: vrtManager/instance.py:2854 +#: vrtManager/instance.py:2857 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM has it, its next start has it" msgstr "%(err)s;PCI 设备 %(address)s:运行中的虚拟机有它,下次启动时有它" -#: vrtManager/instance.py:2856 +#: vrtManager/instance.py:2859 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM has it, its next start does " "not have it" msgstr "%(err)s;PCI 设备 %(address)s:运行中的虚拟机有它,下次启动时没有它" -#: vrtManager/instance.py:2858 +#: vrtManager/instance.py:2861 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM does not have it, its next " "start has it" msgstr "%(err)s;PCI 设备 %(address)s:运行中的虚拟机没有它,下次启动时有它" -#: vrtManager/instance.py:2860 +#: vrtManager/instance.py:2863 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM does not have it, its next " "start does not have it" msgstr "%(err)s;PCI 设备 %(address)s:运行中的虚拟机没有它,下次启动时没有它" -#: vrtManager/instance.py:2894 +#: vrtManager/instance.py:2897 #, python-format msgid "The VM has no PCI device %(address)s" msgstr "虚拟机没有 PCI 设备 %(address)s" -#: vrtManager/instance.py:2912 +#: vrtManager/instance.py:2915 msgid "The VM has no USB controller" msgstr "虚拟机没有 USB 控制器" -#: vrtManager/instance.py:2931 +#: vrtManager/instance.py:2934 msgid "The VM has no such USB device" msgstr "虚拟机没有此 USB 设备" -#: vrtManager/instance.py:2945 +#: vrtManager/instance.py:2948 #, python-format msgid "The VM has no network interface %(mac)s" msgstr "虚拟机没有网络接口 %(mac)s" -#: vrtManager/instance.py:2976 +#: vrtManager/instance.py:2979 msgid "The VM has its own RNG device: change it in the XML editor" msgstr "虚拟机有自己的 RNG 设备:请在 XML 编辑器中修改" -#: vrtManager/instance.py:3003 +#: vrtManager/instance.py:3006 msgid "The VM has its own TPM: change it in the XML editor" msgstr "虚拟机有自己的 TPM:请在 XML 编辑器中修改" -#: vrtManager/instance.py:3022 +#: vrtManager/instance.py:3025 #, python-format msgid "Unknown crash action %(action)s" msgstr "未知的崩溃操作 %(action)s" diff --git a/vrtManager/instance.py b/vrtManager/instance.py index e0bfb5e2..df14a667 100644 --- a/vrtManager/instance.py +++ b/vrtManager/instance.py @@ -926,6 +926,11 @@ class wvmInstance(wvmConnect): volume, disk_size, used_size, storage = details else: volume = src_file + # a disk no pool holds: libvirt reads its size from the file or device, + # named by its path: a target names the running VM's disk, which may + # be another file than the one saved for its next start (that one: unknown) + with contextlib.suppress(libvirtError): + disk_size, used_size = self.instance.blockInfo(src_file)[:2] except Exception as e: logger.warning("Disk %s of %s not fully read: %s", dev, self.instance.name(), e) finally: diff --git a/vrtManager/tests/test_instance_getters.py b/vrtManager/tests/test_instance_getters.py index cb969c33..cd82f697 100644 --- a/vrtManager/tests/test_instance_getters.py +++ b/vrtManager/tests/test_instance_getters.py @@ -48,6 +48,15 @@ class DeviceGettersTestCase(unittest.TestCase): self.assertEqual([(n["inbound"], n["outbound"]) for n in nics[1:]], [([], [])] * 2) self.assertEqual([(n["nic"], n["model"]) for n in nics], [("default", "virtio"), ("br0", ""), ("", "")]) + def test_a_disk_no_pool_holds_has_the_size_libvirt_reads(self): + p = proxy() + p.instance = MagicMock() + # vda: libvirt reads it, by its path; vdb: it cannot + p.instance.blockInfo.side_effect = lambda path: [20 << 30, 5 << 30, 20 << 30] if path == "/pool/a.qcow2" else \ + (_ for _ in ()).throw(libvirtError("cannot read")) + self.assertEqual([(d["dev"], d["size"], d["used"]) for d in p.get_disk_devices()], + [("vda", 20 << 30, 5 << 30), ("vdb", None, None)]) + def test_an_empty_cdrom_shows_no_pool(self): media = proxy().get_media_devices() self.assertEqual( diff --git a/vrtManager/tests/test_read_cache.py b/vrtManager/tests/test_read_cache.py index 37303d23..f2948bb7 100644 --- a/vrtManager/tests/test_read_cache.py +++ b/vrtManager/tests/test_read_cache.py @@ -25,6 +25,9 @@ class FakeDomain: self.reads.append(flags) return f"" + def blockInfo(self, dev): # a disk no pool holds that libvirt cannot read either + raise libvirtError("cannot read") + class FakeConn: def __init__(self):