From f3c44f18c45275a06493f1c748443e19a3bee717 Mon Sep 17 00:00:00 2001 From: catborise Date: Thu, 5 Nov 2026 15:53:29 +0300 Subject: [PATCH] fix(instances): a busy host is reported as busy, not as unreachable A web request refused because this process's requests to the host (HOST_REQUESTS) all still wait for it raised the same ConnectionFailed as a host that is down, so the VM page said the host cannot be reached. It now raises HostBusy; the VM page and the error users who do not see hosts get say the host is busy and to try again in a moment. --- instances/tests/test_host_busy.py | 38 +++++ instances/views.py | 6 +- locale/tr/LC_MESSAGES/django.mo | Bin 192136 -> 192348 bytes locale/tr/LC_MESSAGES/django.po | 248 +++++++++++++++--------------- locale/zh/LC_MESSAGES/django.mo | Bin 179645 -> 179840 bytes locale/zh/LC_MESSAGES/django.po | 246 ++++++++++++++--------------- operations/utils.py | 5 +- vrtManager/connection.py | 4 +- vrtManager/util.py | 5 + 9 files changed, 307 insertions(+), 245 deletions(-) create mode 100644 instances/tests/test_host_busy.py diff --git a/instances/tests/test_host_busy.py b/instances/tests/test_host_busy.py new file mode 100644 index 00000000..1c7e1cf2 --- /dev/null +++ b/instances/tests/test_host_busy.py @@ -0,0 +1,38 @@ +"""A host whose web requests in this process all still wait for it is busy, +not unreachable: users are told to try again.""" + +from unittest.mock import PropertyMock, patch + +from accounts.models import UserInstance +from computes.models import Compute +from django.contrib.auth import get_user_model +from django.contrib.messages import get_messages +from django.test import TestCase +from django.urls import reverse +from instances.models import Instance +from operations.utils import public_error_text +from vrtManager import util + +BUSY = "The host of this virtual machine is busy with other requests right now: try again in a moment." + + +def busy(host="192.0.2.1"): + return util.HostBusy("Connection Failed: %(host)s does not answer: %(requests)s requests still wait for it", + host=host, requests=2) + + +class HostBusyTests(TestCase): + def test_a_refused_request_tells_users_the_host_is_busy(self): + self.assertEqual(public_error_text(busy()), BUSY) + + def test_the_vm_page_of_a_busy_host_says_it_is_busy(self): + compute = Compute.objects.create(name="c", hostname="192.0.2.1", login="u", password="p", type=1) + vm = Instance.objects.create(compute=compute, name="vm", uuid="11111111-1111-1111-1111-111111111111") + owner = get_user_model().objects.create_user("owner", password="pw") + UserInstance.objects.create(user=owner, instance=vm) + self.client.force_login(owner) + with patch.object(Compute, "connection", new_callable=PropertyMock, return_value=busy()): + response = self.client.get(reverse("instances:instance", args=[vm.pk])) + self.assertRedirects(response, reverse("instances:index"), fetch_redirect_response=False) + self.assertEqual([str(m) for m in get_messages(response.wsgi_request)], + [BUSY + " Jobs on it can be followed under Jobs in the menu."]) diff --git a/instances/views.py b/instances/views.py index 319bf07a..b843fe0a 100755 --- a/instances/views.py +++ b/instances/views.py @@ -51,7 +51,7 @@ from libvirt import (VIR_DOMAIN_PAUSED, from logs.audit import audit, audit_vm, changed_fields, failed_vm from logs.audit import snapshot as audit_snapshot from operations import claims, jobs -from operations.utils import busy_message, summary +from operations.utils import HOST_BUSY, busy_message, summary from webvirtcloud.middleware import error_text, same_origin_referer from vrtManager import util from vrtManager.connection import CONNECT_TIMEOUT @@ -253,7 +253,9 @@ def instance(request, pk): # the page reads the VM from libvirt throughout; without the host it would # be the error page, with a connection error that names the host if compute.status is not True: - if request.user.is_superuser or request.user.has_perm("instances.view_instances"): + if isinstance(compute.connection, util.HostBusy): + msg = _(HOST_BUSY) + elif request.user.is_superuser or request.user.has_perm("instances.view_instances"): msg = _("The host %(host)s of '%(name)s' cannot be reached: %(error)s") % { "host": compute.name, "name": instance.name, diff --git a/locale/tr/LC_MESSAGES/django.mo b/locale/tr/LC_MESSAGES/django.mo index d42e8243f932e977928b0f23393743ca91a4b6eb..13c2b904d0621db6811632127b39c5e0beaa40e1 100644 GIT binary patch delta 43057 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, 2020\n" "Language-Team: Turkish (https://www.transifex.com/catborise/teams/110663/tr/)\n" @@ -2922,7 +2922,7 @@ msgstr "" msgid "Create VM" msgstr "Sanal makine oluştur" -#: instances/jobs.py:756 instances/views.py:2480 +#: instances/jobs.py:756 instances/views.py:2482 msgid "A virtual machine with this name already exists" msgstr "Bu isimde bir sanal makine mevcut" @@ -3282,7 +3282,7 @@ msgid "Disk source" msgstr "Disk kaynağı" #: instances/templates/add_instance_volume.html:21 -#: instances/templates/create_instance_w2.html:134 instances/views.py:2499 +#: instances/templates/create_instance_w2.html:134 instances/views.py:2501 msgid "New disk" msgstr "Yeni disk" @@ -3654,7 +3654,7 @@ msgstr "Özel CPU modelleri" msgid "Size (GiB)" msgstr "Boyut (GiB)" -#: instances/templates/create_instance_w2.html:161 instances/views.py:2500 +#: instances/templates/create_instance_w2.html:161 instances/views.py:2502 msgid "Existing volumes" msgstr "Mevcut birimler" @@ -3690,7 +3690,7 @@ msgstr "Aygıt" msgid "Remove" msgstr "Kaldır" -#: instances/templates/create_instance_w2.html:194 instances/views.py:2501 +#: instances/templates/create_instance_w2.html:194 instances/views.py:2503 msgid "Clone from template" msgstr "Şablondan klonla" @@ -5861,30 +5861,30 @@ msgstr "Bir IP adresi, 192.0.2.0/24 gibi bir ağ ya da bir MAC adresi girin." msgid "Too many searches are still running; try again shortly." msgstr "Çok fazla arama hâlâ çalışıyor; birazdan yeniden deneyin." -#: instances/views.py:257 +#: instances/views.py:259 #, python-format msgid "The host %(host)s of '%(name)s' cannot be reached: %(error)s" msgstr "'%(name)s' sanal makinesinin sunucusu %(host)s erişilemiyor: %(error)s" -#: instances/views.py:263 +#: instances/views.py:265 #, python-format msgid "The host of '%(name)s' cannot be reached right now." msgstr "'%(name)s' sanal makinesinin sunucusuna şu anda erişilemiyor." -#: instances/views.py:264 +#: instances/views.py:266 msgid " Jobs on it can be followed under Jobs in the menu." msgstr " Üzerindeki işler menüdeki İşler bölümünden izlenebilir." -#: instances/views.py:366 +#: instances/views.py:368 msgid "There is no other host to migrate to." msgstr "Taşınacak başka bir sunucu yok." -#: instances/views.py:368 +#: instances/views.py:370 msgid "A VM migrates when it is running, paused or shut off." msgstr "" "Sanal makine çalışırken, duraklatılmışken ya da kapalıyken taşınabilir." -#: instances/views.py:370 +#: instances/views.py:372 msgid "" "A VM with snapshots cannot be migrated: its snapshots stay on this host. " "Delete them first." @@ -5892,7 +5892,7 @@ msgstr "" "Anlık görüntüsü olan bir sanal makine taşınamaz: anlık görüntüleri bu " "sunucuda kalır. Önce onları silin." -#: instances/views.py:372 +#: instances/views.py:374 msgid "" "A VM with host devices cannot be migrated: the destination may not have them." " Remove them first." @@ -5900,11 +5900,11 @@ msgstr "" "Sunucu aygıtları olan bir sanal makine taşınamaz: hedefte bu aygıtlar " "olmayabilir. Önce onları kaldırın." -#: instances/views.py:634 +#: instances/views.py:636 msgid "The VM was moved meanwhile; try again." msgstr "Sanal makine bu arada taşındı; yeniden deneyin." -#: instances/views.py:746 +#: instances/views.py:748 msgid "" "The running VM has no free PCI slot for another disk on this bus: choose the " "scsi bus if the VM has a SCSI controller, or shut the VM down and add the " @@ -5917,7 +5917,7 @@ msgstr "" "yuvaları ekle, sonraki başlatmadan itibaren ona boş yuvalar verir. Yeni bir " "birim havuzunda kalır, mevcut birim olarak eklenebilir." -#: instances/views.py:750 +#: instances/views.py:752 msgid "" "The running VM has no free PCI slot for the SCSI controller the disk needs: " "shut the VM down and add the disk then; Add PCIe slots on the Disks tab gives" @@ -5929,191 +5929,191 @@ msgstr "" "PCIe yuvaları ekle, sonraki başlatmadan itibaren ona boş yuvalar verir. Yeni " "bir birim havuzunda kalır, mevcut birim olarak eklenebilir." -#: instances/views.py:768 +#: instances/views.py:770 #, python-format msgid "Invalid disk options: %(options)s" msgstr "Geçersiz disk seçenekleri: %(options)s" -#: instances/views.py:778 instances/views.py:793 +#: instances/views.py:780 instances/views.py:795 msgid "Templates cannot be started." msgstr "Şablon makineler başlatılamaz." -#: instances/views.py:889 +#: instances/views.py:891 #, python-format msgid "Disk %(path)s was kept: a disk file that stays needs it" msgstr "%(path)s diski korundu: kalan bir disk dosyası ona ihtiyaç duyuyor" -#: instances/views.py:895 +#: instances/views.py:897 #, python-format msgid "The VM is removed, but disk %(path)s was not deleted: %(err)s" msgstr "Sanal makine kaldırıldı, ancak %(path)s diski silinmedi: %(err)s" -#: instances/views.py:904 +#: instances/views.py:906 #, python-format msgid "Disk %(path)s is used by another VM and was kept" msgstr "" "%(path)s diski başka bir sanal makine tarafından kullanılıyor ve korundu" -#: instances/views.py:1026 +#: instances/views.py:1028 #, python-format msgid "Set the gstfsd key of %(compute)s first (Computes, edit the host)" msgstr "" "Önce %(compute)s sunucusunun gstfsd anahtarını ayarlayın (Sunucular, sunucuyu" " düzenle)" -#: instances/views.py:1033 instances/views.py:1048 instances/views.py:1057 +#: instances/views.py:1035 instances/views.py:1050 instances/views.py:1059 #, python-format msgid "gstfsd error: %(err)s" msgstr "gstfsd hatası: %(err)s" -#: instances/views.py:1058 +#: instances/views.py:1060 msgid "the reply is not signed with the key" msgstr "yanıt anahtarla imzalanmamış" -#: instances/views.py:1066 +#: instances/views.py:1068 msgid "Shut the VM down, or start its QEMU guest agent, and try again" msgstr "" "Sanal makineyi kapatın ya da QEMU konuk ajanını başlatın ve yeniden deneyin" -#: instances/views.py:1079 +#: instances/views.py:1081 msgid "The change may still be made when the agent answers again." msgstr "Ajan yeniden yanıt verdiğinde değişiklik yine de yapılabilir." -#: instances/views.py:1106 +#: instances/views.py:1108 msgid "Reset root password" msgstr "Root parolasını sıfırla" -#: instances/views.py:1110 +#: instances/views.py:1112 msgid "Enter a password" msgstr "Bir parola girin" -#: instances/views.py:1124 +#: instances/views.py:1126 msgid "Select an SSH public key" msgstr "Bir SSH açık anahtarı seçin" -#: instances/views.py:1146 +#: instances/views.py:1148 #, python-format msgid "Installed new SSH public key %(keyname)s" msgstr "Yeni %(keyname)s SSH açık anahtarı yüklendi" -#: instances/views.py:1166 +#: instances/views.py:1168 msgid "Enter a whole number of vCPUs" msgstr "vCPU sayısı için bir tam sayı girin" -#: instances/views.py:1170 +#: instances/views.py:1172 msgid "Shut off the VM to change its vCPUs" msgstr "vCPU'larını değiştirmek için sanal makineyi kapatın" -#: instances/views.py:1173 +#: instances/views.py:1175 msgid "The current vCPUs cannot be more than the maximum" msgstr "Geçerli vCPU sayısı en fazla değerden büyük olamaz" -#: instances/views.py:1180 +#: instances/views.py:1182 #, python-format msgid "%(quota)s: cannot resize the CPU of '%(instance_name)s'." msgstr "%(quota)s: '%(instance_name)s' CPU'su yeniden boyutlandırılamıyor." -#: instances/views.py:1188 +#: instances/views.py:1190 #, python-format msgid "vCPUs set to %(cur)s (maximum %(max)s)" msgstr "vCPU sayısı %(cur)s olarak ayarlandı (en fazla %(max)s)" -#: instances/views.py:1207 +#: instances/views.py:1209 msgid "Enter a whole number for memory" msgstr "Bellek için bir tam sayı girin" -#: instances/views.py:1210 +#: instances/views.py:1212 msgid "The current memory cannot be more than the maximum" msgstr "Geçerli bellek en fazla değerden büyük olamaz" -#: instances/views.py:1214 +#: instances/views.py:1216 #, python-format msgid "%(quota)s: cannot resize the memory of '%(instance_name)s'." msgstr "%(quota)s: '%(instance_name)s' belleği yeniden boyutlandırılamıyor." -#: instances/views.py:1220 +#: instances/views.py:1222 #, python-format msgid "Memory set to %(cur)s MiB (maximum %(max)s MiB)" msgstr "Bellek %(cur)s MiB olarak ayarlandı (en fazla %(max)s MiB)" -#: instances/views.py:1240 +#: instances/views.py:1242 msgid "Enter disk sizes as whole GiB" msgstr "Disk boyutlarını tam GiB olarak girin" -#: instances/views.py:1244 +#: instances/views.py:1246 #, python-format msgid "%(dev)s is %(size)s: a disk cannot shrink" msgstr "%(dev)s boyutu %(size)s: disk küçültülemez" -#: instances/views.py:1252 +#: instances/views.py:1254 msgid "No disks were selected or valid for resizing." msgstr "Boyutlandırma için seçilmiş ya da geçerli disk yok." -#: instances/views.py:1261 +#: instances/views.py:1263 #, python-format msgid "%(quota)s: cannot resize the disks of '%(instance_name)s'." msgstr "%(quota)s: '%(instance_name)s' diskleri yeniden boyutlandırılamıyor." -#: instances/views.py:1273 +#: instances/views.py:1275 #, python-format msgid "The storage pool of %(dev)s cannot resize its volumes" msgstr "%(dev)s diskinin depolama havuzu birimlerini boyutlandıramaz" -#: instances/views.py:1275 +#: instances/views.py:1277 #, python-format msgid "Disk is resized: %(dev)s" msgstr "Disk boyutu değiştirildi: %(dev)s" -#: instances/views.py:1369 +#: instances/views.py:1371 msgid "The VM's machine has no PCIe slots to add" msgstr "Sanal makinenin makine tipinde eklenecek PCIe yuvası yok" -#: instances/views.py:1374 +#: instances/views.py:1376 #, python-format msgid "%(count)s PCIe slots added" msgstr "%(count)s PCIe yuvası eklendi" -#: instances/views.py:1376 +#: instances/views.py:1378 #, python-format msgid "%(count)s PCIe slots added: the VM gets them at its next start" msgstr "" "%(count)s PCIe yuvası eklendi: sanal makine bunları sonraki başlatmasında " "alır" -#: instances/views.py:1422 +#: instances/views.py:1424 #, python-format msgid "%(volume)s is already a disk of this VM" msgstr "%(volume)s zaten bu sanal makinenin bir diski" -#: instances/views.py:1512 +#: instances/views.py:1514 msgid "Volume changes are applied. But it will be activated after shutdown" msgstr "" "Birim değişiklikleri uygulandı. Ama yeniden başlatıldıktan sonra uygulanacak" -#: instances/views.py:1517 +#: instances/views.py:1519 msgid "Volume is changed successfully." msgstr "Birim başarıyla değiştirildi." -#: instances/views.py:1535 +#: instances/views.py:1537 #, python-format msgid "Disk %(dev)s is not a storage volume of this instance" msgstr "%(dev)s diski bu sanal makinenin bir depolama birimi değil" -#: instances/views.py:1542 +#: instances/views.py:1544 #, python-format msgid "Disk %(dev)s has a pending change; delete it once the VM is shut down" msgstr "" "%(dev)s diskinin bekleyen bir değişikliği var; sanal makine kapatıldığında " "silin" -#: instances/views.py:1557 +#: instances/views.py:1559 #, python-format msgid "Volume %(vol)s is used by another VM; detach it instead" msgstr "" "%(vol)s birimi başka bir sanal makine tarafından kullanılıyor; onun yerine " "ayırın" -#: instances/views.py:1569 +#: instances/views.py:1571 #, python-format msgid "" "The guest has not released disk %(dev)s yet; volume %(vol)s was kept. Delete " @@ -6122,57 +6122,57 @@ msgstr "" "Konuk sistem %(dev)s diskini henüz bırakmadı; %(vol)s birimi korundu. Sanal " "makine kapatıldığında depolama havuzundan silin." -#: instances/views.py:1580 +#: instances/views.py:1582 #, python-format msgid "Disk %(dev)s was detached, but its volume was kept: %(err)s" msgstr "%(dev)s diski ayrıldı, ancak birimi korundu: %(err)s" -#: instances/views.py:1606 +#: instances/views.py:1608 #, python-format msgid "This VM cannot take a CD-ROM on the %(bus)s bus now" msgstr "Bu sanal makineye şu anda %(bus)s veri yolunda CD-ROM eklenemez" -#: instances/views.py:1609 +#: instances/views.py:1611 msgid "A USB CD-ROM needs an ISO image: libvirt has no empty USB drive" msgstr "USB CD-ROM bir ISO imajı ister: libvirt boş USB sürücü desteklemiyor" -#: instances/views.py:1690 +#: instances/views.py:1692 #, python-format msgid "Pool %(pool)s was not read again: %(err)s" msgstr "%(pool)s havuzu yeniden okunamadı: %(err)s" -#: instances/views.py:1711 +#: instances/views.py:1713 #, python-format msgid "Snapshot was not deleted: %(err)s" msgstr "Anlık görüntü silinmedi: %(err)s" -#: instances/views.py:1826 +#: instances/views.py:1828 msgid "Add at least one device to the boot order." msgstr "Ön yükleme sırasına en az bir aygıt ekleyin." -#: instances/views.py:1840 +#: instances/views.py:1842 msgid "Boot order changed. It applies at the next start." msgstr "Ön yükleme sırası değiştirildi. Sonraki başlatmada uygulanır." -#: instances/views.py:1842 +#: instances/views.py:1844 msgid "Boot order changed successfully." msgstr "Ön yükleme sırası başarıyla değiştirildi." -#: instances/views.py:1862 +#: instances/views.py:1864 msgid "The XML is empty" msgstr "XML boş" -#: instances/views.py:1866 instances/views.py:2490 +#: instances/views.py:1868 instances/views.py:2492 #, python-format msgid "The XML is not well-formed: %(error)s" msgstr "XML düzgün biçimlendirilmemiş: %(error)s" -#: instances/views.py:1868 +#: instances/views.py:1870 #, python-format msgid "The XML must keep the VM's UUID %(uuid)s." msgstr "XML, sanal makinenin %(uuid)s UUID'sini korumalıdır." -#: instances/views.py:1872 +#: instances/views.py:1874 msgid "" "The definition has changed since the editor was opened. Reload the page to " "edit the current one." @@ -6180,40 +6180,40 @@ msgstr "" "Düzenleyici açıldığından beri tanım değişti. Geçerli tanımı düzenlemek için " "sayfayı yeniden yükleyin." -#: instances/views.py:1884 +#: instances/views.py:1886 msgid "The XML definition was saved." msgstr "XML tanımı kaydedildi." -#: instances/views.py:1886 +#: instances/views.py:1888 msgid "The XML definition was saved; the VM uses it from its next start." msgstr "" "XML tanımı kaydedildi; sanal makine onu sonraki başlatmasından itibaren " "kullanır." -#: instances/views.py:1967 +#: instances/views.py:1969 msgid "Select one network interface to change" msgstr "Değiştirilecek bir ağ arabirimi seçin" -#: instances/views.py:2005 +#: instances/views.py:2007 msgid "Network Device Config is changed. Please shutdown instance to activate." msgstr "" "Ağ aygıtı yapılandırması değiştirildi. Aktifleştirmek için lütfen sanal " "makineyi kapatın." -#: instances/views.py:2007 +#: instances/views.py:2009 msgid "Network device changed" msgstr "Ağ aygıtı değiştirildi" -#: instances/views.py:2019 +#: instances/views.py:2021 msgid "No network selected" msgstr "Ağ seçilmedi" -#: instances/views.py:2024 +#: instances/views.py:2026 #, python-format msgid "The VM already has a network device with MAC %(mac)s" msgstr "Sanal makinede %(mac)s MAC adresli bir ağ aygıtı zaten var" -#: instances/views.py:2043 +#: instances/views.py:2045 msgid "" "The running VM has no free PCI slot for another network device: shut it down " "and add the device then; Add PCIe slots on the Disks tab gives it free ones " @@ -6223,21 +6223,21 @@ msgstr "" "aygıtı sonra ekleyin; Diskler sekmesindeki PCIe yuvaları ekle, sonraki " "başlatmadan itibaren ona boş yuvalar verir." -#: instances/views.py:2084 instances/views.py:2090 +#: instances/views.py:2086 instances/views.py:2092 msgid "The VM has it" msgstr "Sanal makinede var" -#: instances/views.py:2121 +#: instances/views.py:2123 #, python-format msgid "The host has no USB device %(device)s" msgstr "Sunucuda %(device)s USB aygıtı yok" -#: instances/views.py:2142 +#: instances/views.py:2144 #, python-format msgid "The host has no PCI device %(device)s" msgstr "Sunucuda %(device)s PCI aygıtı yok" -#: instances/views.py:2160 +#: instances/views.py:2162 #, python-format msgid "" "Removal of PCI device %(address)s requested: the guest has not let it go yet;" @@ -6247,20 +6247,20 @@ msgstr "" "bırakmadı; bırakana ya da sanal makine durana kadar çalışan sanal makinede " "kalır." -#: instances/views.py:2205 instances/views.py:2235 +#: instances/views.py:2207 instances/views.py:2237 msgid "Select a network interface and a QoS direction" msgstr "Bir ağ arabirimi ve bir QoS yönü seçin" -#: instances/views.py:2208 vrtManager/network.py:459 +#: instances/views.py:2210 vrtManager/network.py:459 msgid "QoS rates must be whole numbers" msgstr "QoS hızları tam sayı olmalıdır" -#: instances/views.py:2215 networks/views.py:229 +#: instances/views.py:2217 networks/views.py:229 #, python-format msgid "%(qos_dir)s QoS is set" msgstr "%(qos_dir)s QoS ayarlandı" -#: instances/views.py:2220 +#: instances/views.py:2222 #, python-format msgid "" "%(qos_dir)s QoS is set. A running VM gets it after it is powered off and on." @@ -6268,12 +6268,12 @@ msgstr "" "%(qos_dir)s QoS ayarlandı. Çalışan bir sanal makine, kapatılıp açıldıktan " "sonra bunu alır." -#: instances/views.py:2242 networks/views.py:255 +#: instances/views.py:2244 networks/views.py:255 #, python-format msgid "%(qos_dir)s QoS is deleted" msgstr "%(qos_dir)s QoS silindi" -#: instances/views.py:2247 +#: instances/views.py:2249 #, python-format msgid "" "%(qos_dir)s QoS is deleted. A running VM keeps the old limit until it is " @@ -6282,21 +6282,21 @@ msgstr "" "%(qos_dir)s QoS silindi. Çalışan bir sanal makine, kapatılıp açılana kadar " "eski sınırı korur." -#: instances/views.py:2275 +#: instances/views.py:2277 msgid "Only one owner is allowed and the one already added" msgstr "Sadece bir sahibe izin verilmiştir ve bir sahip zaten eklenmiş" -#: instances/views.py:2277 +#: instances/views.py:2279 #, python-format msgid "%(user)s is already an owner" msgstr "%(user)s zaten bir sahip" -#: instances/views.py:2321 +#: instances/views.py:2323 #, python-format msgid "Console settings were not saved: %(errors)s" msgstr "Konsol ayarları kaydedilmedi: %(errors)s" -#: instances/views.py:2343 +#: instances/views.py:2345 msgid "" "Error setting console password. You should check that your instance have an " "graphic device." @@ -6304,65 +6304,65 @@ msgstr "" "Konsol parolası ayarlanırken hata oluştu. Sanal makinenin bir grafik aygıtına" " sahip olduğundan emin olunuz." -#: instances/views.py:2390 +#: instances/views.py:2392 msgid "Shut the VM down to change whether it is a template." msgstr "Şablon olup olmadığını değiştirmek için sanal makineyi kapatın." -#: instances/views.py:2396 +#: instances/views.py:2398 #, python-format msgid "%(quota)s: '%(instance_name)s' stays a template." msgstr "%(quota)s: '%(instance_name)s' şablon olarak kalıyor." -#: instances/views.py:2478 +#: instances/views.py:2480 msgid "The XML has no name" msgstr "XML'de ad yok" -#: instances/views.py:2492 webvirtcloud/middleware.py:79 +#: instances/views.py:2494 webvirtcloud/middleware.py:126 #, python-format msgid "libvirt Error - %(exception)s" msgstr "libvirt Hatası - %(exception)s" -#: instances/views.py:2499 +#: instances/views.py:2501 msgid "An empty disk of the size you set" msgstr "Belirlediğiniz boyutta boş bir disk" -#: instances/views.py:2500 +#: instances/views.py:2502 msgid "Volumes already in a pool" msgstr "Bir havuzda zaten bulunan birimler" -#: instances/views.py:2501 +#: instances/views.py:2503 msgid "A copy of a template volume" msgstr "Bir şablon biriminin kopyası" -#: instances/views.py:2590 +#: instances/views.py:2592 msgid "You haven't defined any storage pools" msgstr "Hiç bir depolama havuzu tanımlamadınız" -#: instances/views.py:2592 +#: instances/views.py:2594 msgid "You haven't defined any network pools" msgstr "Hiç bir ağ havuzu tanımlamadınız" -#: instances/views.py:2655 +#: instances/views.py:2657 msgid "Flavor Created" msgstr "Flavor Oluşturuldu" -#: instances/views.py:2663 +#: instances/views.py:2665 msgid "Create Flavor" msgstr "Kullanıcı Oluştur" -#: instances/views.py:2678 +#: instances/views.py:2680 msgid "Flavor Updated" msgstr "Flavor Güncellendi" -#: instances/views.py:2684 +#: instances/views.py:2686 msgid "Update Flavor" msgstr "Flavor Güncelle" -#: instances/views.py:2696 +#: instances/views.py:2698 msgid "Flavor Deleted" msgstr "Flavor Silindi" -#: instances/views.py:2702 +#: instances/views.py:2704 msgid "Only the size template goes; VMs made from it keep their size." msgstr "" "Yalnızca boyut şablonu silinir; ondan oluşturulan sanal makineler boyutlarını" @@ -7854,12 +7854,20 @@ msgstr "İptal edilemedi: sunucuya ulaşılamadı." msgid "The host of this virtual machine cannot be reached right now." msgstr "Bu sanal makinenin sunucusuna şu anda ulaşılamıyor." -#: operations/utils.py:157 +#: operations/utils.py:53 +msgid "" +"The host of this virtual machine is busy with other requests right now: try " +"again in a moment." +msgstr "" +"Bu sanal makinenin sunucusu şu anda başka isteklerle meşgul: biraz sonra " +"yeniden deneyin." + +#: operations/utils.py:160 msgid "" "A short operation is in progress on this resource; try again in a moment." msgstr "Bu kaynakta kısa bir işlem sürüyor; birazdan yeniden deneyin." -#: operations/utils.py:160 +#: operations/utils.py:163 #, python-format msgid "" "%(label)s is %(state)s on this resource (started by %(user)s, %(since)s ago);" @@ -7868,7 +7876,7 @@ msgstr "" "%(label)s bu kaynakta %(state)s (%(user)s başlattı, %(since)s önce); İşler " "sayfasına bakın." -#: operations/utils.py:162 +#: operations/utils.py:165 #, python-format msgid "%(label)s is %(state)s on this resource (since %(since)s)." msgstr "%(label)s bu kaynakta %(state)s (%(since)s beri)." @@ -8809,23 +8817,23 @@ msgstr "" "Eski değerin yerini hemen alır; bir parolanın şifrelediği veriler yeniden " "şifrelenmez." -#: vrtManager/connection.py:50 +#: vrtManager/connection.py:51 msgid "Connection closed (error)" msgstr "Bağlantı kapandı (hata)" -#: vrtManager/connection.py:51 +#: vrtManager/connection.py:52 msgid "Connection closed (end of file)" msgstr "Bağlantı kapandı (dosya sonu)" -#: vrtManager/connection.py:52 +#: vrtManager/connection.py:53 msgid "Connection closed (keepalive timeout)" msgstr "Bağlantı kapandı (canlı tutma zaman aşımı)" -#: vrtManager/connection.py:53 +#: vrtManager/connection.py:54 msgid "Connection closed (client closed)" msgstr "Bağlantı kapandı (istemci kapattı)" -#: vrtManager/connection.py:139 +#: vrtManager/connection.py:147 #, python-format msgid "" "Connection Failed: %(host)s does not answer: %(requests)s requests still wait" @@ -8834,26 +8842,26 @@ msgstr "" "Bağlantı başarısız: %(host)s yanıt vermiyor: %(requests)s istek hâlâ onu " "bekliyor" -#: vrtManager/connection.py:210 +#: vrtManager/connection.py:219 #, python-format msgid "Connection Failed: %(host)s did not answer within %(seconds)s s" msgstr "Bağlantı başarısız: %(host)s %(seconds)s sn içinde yanıt vermedi" -#: vrtManager/connection.py:220 +#: vrtManager/connection.py:230 msgid "the connection closed right after opening" msgstr "bağlantı açıldıktan hemen sonra kapandı" -#: vrtManager/connection.py:233 +#: vrtManager/connection.py:243 #, python-format msgid "Connection Failed: %(error)s" msgstr "Bağlantı başarısız: %(error)s" -#: vrtManager/connection.py:293 +#: vrtManager/connection.py:312 #, python-format msgid "Connection closed (%(reason)s)" msgstr "Bağlantı kapandı (%(reason)s)" -#: vrtManager/connection.py:435 +#: vrtManager/connection.py:455 #, python-format msgid "Connection Failed: %(host)s is not connected" msgstr "Bağlantı başarısız: %(host)s bağlı değil" @@ -9848,12 +9856,12 @@ msgstr "" "%(name)s birimi kullanımda: bir sanal makinenin diski, bir temel (backing) " "dosya ya da bir anlık görüntünün dosyası" -#: vrtManager/util.py:140 +#: vrtManager/util.py:145 #, python-format msgid "The XML is not valid: %(err)s" msgstr "XML geçerli değil: %(err)s" -#: vrtManager/util.py:142 +#: vrtManager/util.py:147 msgid "The XML may not declare a DTD" msgstr "XML bir DTD bildiremez" @@ -9878,10 +9886,10 @@ msgid "Secret %(uuid)s is used by %(named)s; remove it from them first" msgstr "" "%(uuid)s parolası %(named)s tarafından kullanılıyor; önce onlardan kaldırın" -#: webvirtcloud/settings.py:327 +#: webvirtcloud/settings.py:332 msgid "Localhost" msgstr "Yerel sunucu" -#: webvirtcloud/settings.py:328 +#: webvirtcloud/settings.py:333 msgid "All interfaces" msgstr "Tüm arabirimler" diff --git a/locale/zh/LC_MESSAGES/django.mo b/locale/zh/LC_MESSAGES/django.mo index 2b9314be29e7a7d3d80d7c5284d6a56d5e90129e..48c08d03f03bd7c12a256a5266abc7decae112dc 100644 GIT binary patch delta 43037 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 CDQnpP delta 42907 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 Q4=TIE%i<3Fqv1=1--xm&7XSbN diff --git a/locale/zh/LC_MESSAGES/django.po b/locale/zh/LC_MESSAGES/django.po index f844f414..97a5f4c8 100644 --- a/locale/zh/LC_MESSAGES/django.po +++ b/locale/zh/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-11-05 08:41+0000\n" +"POT-Creation-Date: 2026-11-05 12:53+0000\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -2807,7 +2807,7 @@ msgstr "libvirt 没有复制的结果;请检查这些卷,然后处理此任 msgid "Create VM" msgstr "创建虚拟机" -#: instances/jobs.py:756 instances/views.py:2480 +#: instances/jobs.py:756 instances/views.py:2482 msgid "A virtual machine with this name already exists" msgstr "同名虚拟机已存在" @@ -3157,7 +3157,7 @@ msgid "Disk source" msgstr "磁盘来源" #: instances/templates/add_instance_volume.html:21 -#: instances/templates/create_instance_w2.html:134 instances/views.py:2499 +#: instances/templates/create_instance_w2.html:134 instances/views.py:2501 msgid "New disk" msgstr "新磁盘" @@ -3521,7 +3521,7 @@ msgstr "自定义 CPU 型号" msgid "Size (GiB)" msgstr "大小(GiB)" -#: instances/templates/create_instance_w2.html:161 instances/views.py:2500 +#: instances/templates/create_instance_w2.html:161 instances/views.py:2502 msgid "Existing volumes" msgstr "已有卷" @@ -3557,7 +3557,7 @@ msgstr "设备" msgid "Remove" msgstr "移除" -#: instances/templates/create_instance_w2.html:194 instances/views.py:2501 +#: instances/templates/create_instance_w2.html:194 instances/views.py:2503 msgid "Clone from template" msgstr "从模板克隆" @@ -5571,45 +5571,45 @@ msgstr "请输入 IP 地址、网络(如 192.0.2.0/24)或 MAC 地址。" msgid "Too many searches are still running; try again shortly." msgstr "仍在运行的搜索过多;请稍后再试。" -#: instances/views.py:257 +#: instances/views.py:259 #, python-format msgid "The host %(host)s of '%(name)s' cannot be reached: %(error)s" msgstr "无法连接“%(name)s”所在的主机 %(host)s:%(error)s" -#: instances/views.py:263 +#: instances/views.py:265 #, python-format msgid "The host of '%(name)s' cannot be reached right now." msgstr "目前无法连接“%(name)s”所在的主机。" -#: instances/views.py:264 +#: instances/views.py:266 msgid " Jobs on it can be followed under Jobs in the menu." msgstr " 其上的任务可在菜单的“任务”中跟踪。" -#: instances/views.py:366 +#: instances/views.py:368 msgid "There is no other host to migrate to." msgstr "没有其他可迁移到的主机。" -#: instances/views.py:368 +#: instances/views.py:370 msgid "A VM migrates when it is running, paused or shut off." msgstr "虚拟机在运行、暂停或关机状态下均可迁移。" -#: instances/views.py:370 +#: instances/views.py:372 msgid "" "A VM with snapshots cannot be migrated: its snapshots stay on this host. " "Delete them first." msgstr "有快照的虚拟机无法迁移:其快照保留在本主机上。请先删除快照。" -#: instances/views.py:372 +#: instances/views.py:374 msgid "" "A VM with host devices cannot be migrated: the destination may not have them." " Remove them first." msgstr "有主机设备的虚拟机无法迁移:目标主机可能没有这些设备。请先移除它们。" -#: instances/views.py:634 +#: instances/views.py:636 msgid "The VM was moved meanwhile; try again." msgstr "该虚拟机在此期间已被移动;请重试。" -#: instances/views.py:746 +#: instances/views.py:748 msgid "" "The running VM has no free PCI slot for another disk on this bus: choose the " "scsi bus if the VM has a SCSI controller, or shut the VM down and add the " @@ -5619,7 +5619,7 @@ msgstr "" "运行中的虚拟机在此总线上没有可用 PCI 插槽来添加磁盘:如果虚拟机有 SCSI 控制器,请选择 scsi " "总线;或关闭虚拟机后再添加磁盘。“磁盘”选项卡上的“添加 PCIe 插槽”可使其从下次启动起获得可用插槽。新卷会保留在其存储池中,可作为现有卷挂载。" -#: instances/views.py:750 +#: instances/views.py:752 msgid "" "The running VM has no free PCI slot for the SCSI controller the disk needs: " "shut the VM down and add the disk then; Add PCIe slots on the Disks tab gives" @@ -5629,272 +5629,272 @@ msgstr "" "运行中的虚拟机没有可用 PCI 插槽来添加磁盘所需的 SCSI 控制器:请关闭虚拟机后再添加磁盘。“磁盘”选项卡上的“添加 PCIe " "插槽”可使其从下次启动起获得可用插槽。新卷会保留在其存储池中,可作为现有卷挂载。" -#: instances/views.py:768 +#: instances/views.py:770 #, python-format msgid "Invalid disk options: %(options)s" msgstr "无效的磁盘选项:%(options)s" -#: instances/views.py:778 instances/views.py:793 +#: instances/views.py:780 instances/views.py:795 msgid "Templates cannot be started." msgstr "模板无法启动。" -#: instances/views.py:889 +#: instances/views.py:891 #, python-format msgid "Disk %(path)s was kept: a disk file that stays needs it" msgstr "磁盘 %(path)s 已保留:某个保留的磁盘文件依赖它" -#: instances/views.py:895 +#: instances/views.py:897 #, python-format msgid "The VM is removed, but disk %(path)s was not deleted: %(err)s" msgstr "虚拟机已删除,但磁盘 %(path)s 未被删除:%(err)s" -#: instances/views.py:904 +#: instances/views.py:906 #, python-format msgid "Disk %(path)s is used by another VM and was kept" msgstr "磁盘 %(path)s 正被另一台虚拟机使用,已保留" -#: instances/views.py:1026 +#: instances/views.py:1028 #, python-format msgid "Set the gstfsd key of %(compute)s first (Computes, edit the host)" msgstr "请先设置 %(compute)s 的 gstfsd 密钥(计算节点,编辑该主机)" -#: instances/views.py:1033 instances/views.py:1048 instances/views.py:1057 +#: instances/views.py:1035 instances/views.py:1050 instances/views.py:1059 #, python-format msgid "gstfsd error: %(err)s" msgstr "gstfsd 错误:%(err)s" -#: instances/views.py:1058 +#: instances/views.py:1060 msgid "the reply is not signed with the key" msgstr "回复未使用该密钥签名" -#: instances/views.py:1066 +#: instances/views.py:1068 msgid "Shut the VM down, or start its QEMU guest agent, and try again" msgstr "请关闭虚拟机,或启动其 QEMU 客户机代理,然后重试" -#: instances/views.py:1079 +#: instances/views.py:1081 msgid "The change may still be made when the agent answers again." msgstr "当代理再次响应时,此更改仍可能生效。" -#: instances/views.py:1106 +#: instances/views.py:1108 msgid "Reset root password" msgstr "重置 root 密码" -#: instances/views.py:1110 +#: instances/views.py:1112 msgid "Enter a password" msgstr "请输入密码" -#: instances/views.py:1124 +#: instances/views.py:1126 msgid "Select an SSH public key" msgstr "请选择 SSH 公钥" -#: instances/views.py:1146 +#: instances/views.py:1148 #, python-format msgid "Installed new SSH public key %(keyname)s" msgstr "已安装新的 SSH 公钥 %(keyname)s" -#: instances/views.py:1166 +#: instances/views.py:1168 msgid "Enter a whole number of vCPUs" msgstr "请输入整数个 vCPU" -#: instances/views.py:1170 +#: instances/views.py:1172 msgid "Shut off the VM to change its vCPUs" msgstr "请关闭虚拟机以更改其 vCPU" -#: instances/views.py:1173 +#: instances/views.py:1175 msgid "The current vCPUs cannot be more than the maximum" msgstr "当前 vCPU 数不能超过最大值" -#: instances/views.py:1180 +#: instances/views.py:1182 #, python-format msgid "%(quota)s: cannot resize the CPU of '%(instance_name)s'." msgstr "%(quota)s:无法调整“%(instance_name)s”的 CPU。" -#: instances/views.py:1188 +#: instances/views.py:1190 #, python-format msgid "vCPUs set to %(cur)s (maximum %(max)s)" msgstr "vCPU 已设为 %(cur)s(最大 %(max)s)" -#: instances/views.py:1207 +#: instances/views.py:1209 msgid "Enter a whole number for memory" msgstr "请输入整数内存值" -#: instances/views.py:1210 +#: instances/views.py:1212 msgid "The current memory cannot be more than the maximum" msgstr "当前内存不能超过最大值" -#: instances/views.py:1214 +#: instances/views.py:1216 #, python-format msgid "%(quota)s: cannot resize the memory of '%(instance_name)s'." msgstr "%(quota)s:无法调整“%(instance_name)s”的内存。" -#: instances/views.py:1220 +#: instances/views.py:1222 #, python-format msgid "Memory set to %(cur)s MiB (maximum %(max)s MiB)" msgstr "内存已设为 %(cur)s MiB(最大 %(max)s MiB)" -#: instances/views.py:1240 +#: instances/views.py:1242 msgid "Enter disk sizes as whole GiB" msgstr "请以整数 GiB 输入磁盘大小" -#: instances/views.py:1244 +#: instances/views.py:1246 #, python-format msgid "%(dev)s is %(size)s: a disk cannot shrink" msgstr "%(dev)s 为 %(size)s:磁盘不能缩小" -#: instances/views.py:1252 +#: instances/views.py:1254 msgid "No disks were selected or valid for resizing." msgstr "未选择磁盘或没有可调整大小的有效磁盘。" -#: instances/views.py:1261 +#: instances/views.py:1263 #, python-format msgid "%(quota)s: cannot resize the disks of '%(instance_name)s'." msgstr "%(quota)s:无法调整“%(instance_name)s”的磁盘。" -#: instances/views.py:1273 +#: instances/views.py:1275 #, python-format msgid "The storage pool of %(dev)s cannot resize its volumes" msgstr "%(dev)s 所在的存储池无法调整其卷的大小" -#: instances/views.py:1275 +#: instances/views.py:1277 #, python-format msgid "Disk is resized: %(dev)s" msgstr "磁盘已调整大小:%(dev)s" -#: instances/views.py:1369 +#: instances/views.py:1371 msgid "The VM's machine has no PCIe slots to add" msgstr "该虚拟机的机器类型没有可添加的 PCIe 插槽" -#: instances/views.py:1374 +#: instances/views.py:1376 #, python-format msgid "%(count)s PCIe slots added" msgstr "已添加 %(count)s 个 PCIe 插槽" -#: instances/views.py:1376 +#: instances/views.py:1378 #, python-format msgid "%(count)s PCIe slots added: the VM gets them at its next start" msgstr "已添加 %(count)s 个 PCIe 插槽:虚拟机在下次启动时获得它们" -#: instances/views.py:1422 +#: instances/views.py:1424 #, python-format msgid "%(volume)s is already a disk of this VM" msgstr "%(volume)s 已是此虚拟机的磁盘" -#: instances/views.py:1512 +#: instances/views.py:1514 msgid "Volume changes are applied. But it will be activated after shutdown" msgstr "卷更改已应用,但将在关机后生效" -#: instances/views.py:1517 +#: instances/views.py:1519 msgid "Volume is changed successfully." msgstr "卷已成功更改。" -#: instances/views.py:1535 +#: instances/views.py:1537 #, python-format msgid "Disk %(dev)s is not a storage volume of this instance" msgstr "磁盘 %(dev)s 不是此虚拟机的存储卷" -#: instances/views.py:1542 +#: instances/views.py:1544 #, python-format msgid "Disk %(dev)s has a pending change; delete it once the VM is shut down" msgstr "磁盘 %(dev)s 有待生效的更改;请在虚拟机关机后删除它" -#: instances/views.py:1557 +#: instances/views.py:1559 #, python-format msgid "Volume %(vol)s is used by another VM; detach it instead" msgstr "卷 %(vol)s 正被另一台虚拟机使用;请改为分离它" -#: instances/views.py:1569 +#: instances/views.py:1571 #, python-format msgid "" "The guest has not released disk %(dev)s yet; volume %(vol)s was kept. Delete " "it from the storage pool once the VM is shut down." msgstr "客户机尚未释放磁盘 %(dev)s;卷 %(vol)s 已保留。请在虚拟机关机后从存储池中删除它。" -#: instances/views.py:1580 +#: instances/views.py:1582 #, python-format msgid "Disk %(dev)s was detached, but its volume was kept: %(err)s" msgstr "磁盘 %(dev)s 已分离,但其卷已保留:%(err)s" -#: instances/views.py:1606 +#: instances/views.py:1608 #, python-format msgid "This VM cannot take a CD-ROM on the %(bus)s bus now" msgstr "该虚拟机现在无法在 %(bus)s 总线上添加 CD-ROM" -#: instances/views.py:1609 +#: instances/views.py:1611 msgid "A USB CD-ROM needs an ISO image: libvirt has no empty USB drive" msgstr "USB CD-ROM 需要 ISO 镜像:libvirt 不支持空的 USB 驱动器" -#: instances/views.py:1690 +#: instances/views.py:1692 #, python-format msgid "Pool %(pool)s was not read again: %(err)s" msgstr "未重新读取存储池 %(pool)s:%(err)s" -#: instances/views.py:1711 +#: instances/views.py:1713 #, python-format msgid "Snapshot was not deleted: %(err)s" msgstr "快照未删除:%(err)s" -#: instances/views.py:1826 +#: instances/views.py:1828 msgid "Add at least one device to the boot order." msgstr "请至少向启动顺序中添加一个设备。" -#: instances/views.py:1840 +#: instances/views.py:1842 msgid "Boot order changed. It applies at the next start." msgstr "启动顺序已更改,将在下次启动时生效。" -#: instances/views.py:1842 +#: instances/views.py:1844 msgid "Boot order changed successfully." msgstr "启动顺序已成功更改。" -#: instances/views.py:1862 +#: instances/views.py:1864 msgid "The XML is empty" msgstr "XML 为空" -#: instances/views.py:1866 instances/views.py:2490 +#: instances/views.py:1868 instances/views.py:2492 #, python-format msgid "The XML is not well-formed: %(error)s" msgstr "XML 格式不正确:%(error)s" -#: instances/views.py:1868 +#: instances/views.py:1870 #, python-format msgid "The XML must keep the VM's UUID %(uuid)s." msgstr "XML 必须保留虚拟机的 UUID %(uuid)s。" -#: instances/views.py:1872 +#: instances/views.py:1874 msgid "" "The definition has changed since the editor was opened. Reload the page to " "edit the current one." msgstr "自打开编辑器以来定义已被更改。请重新加载页面以编辑当前定义。" -#: instances/views.py:1884 +#: instances/views.py:1886 msgid "The XML definition was saved." msgstr "XML 定义已保存。" -#: instances/views.py:1886 +#: instances/views.py:1888 msgid "The XML definition was saved; the VM uses it from its next start." msgstr "XML 定义已保存;虚拟机从下次启动起使用它。" -#: instances/views.py:1967 +#: instances/views.py:1969 msgid "Select one network interface to change" msgstr "请选择一个要更改的网络接口" -#: instances/views.py:2005 +#: instances/views.py:2007 msgid "Network Device Config is changed. Please shutdown instance to activate." msgstr "网络设备配置已更改。请关闭虚拟机以使其生效。" -#: instances/views.py:2007 +#: instances/views.py:2009 msgid "Network device changed" msgstr "网络设备已更改" -#: instances/views.py:2019 +#: instances/views.py:2021 msgid "No network selected" msgstr "未选择网络" -#: instances/views.py:2024 +#: instances/views.py:2026 #, python-format msgid "The VM already has a network device with MAC %(mac)s" msgstr "虚拟机已有 MAC 地址为 %(mac)s 的网络设备" -#: instances/views.py:2043 +#: instances/views.py:2045 msgid "" "The running VM has no free PCI slot for another network device: shut it down " "and add the device then; Add PCIe slots on the Disks tab gives it free ones " @@ -5902,137 +5902,137 @@ msgid "" msgstr "" "运行中的虚拟机没有可用 PCI 插槽来添加网络设备:请关机后再添加设备。“磁盘”选项卡上的“添加 PCIe 插槽”可使其从下次启动起获得可用插槽。" -#: instances/views.py:2084 instances/views.py:2090 +#: instances/views.py:2086 instances/views.py:2092 msgid "The VM has it" msgstr "虚拟机已有此设备" -#: instances/views.py:2121 +#: instances/views.py:2123 #, python-format msgid "The host has no USB device %(device)s" msgstr "主机上没有 USB 设备 %(device)s" -#: instances/views.py:2142 +#: instances/views.py:2144 #, python-format msgid "The host has no PCI device %(device)s" msgstr "主机上没有 PCI 设备 %(device)s" -#: instances/views.py:2160 +#: instances/views.py:2162 #, python-format msgid "" "Removal of PCI device %(address)s requested: the guest has not let it go yet;" " it stays in the running VM until it does or the VM stops." msgstr "已请求移除 PCI 设备 %(address)s:客户机尚未释放它;在客户机释放或虚拟机停止之前,它仍保留在运行中的虚拟机中。" -#: instances/views.py:2205 instances/views.py:2235 +#: instances/views.py:2207 instances/views.py:2237 msgid "Select a network interface and a QoS direction" msgstr "请选择网络接口和 QoS 方向" -#: instances/views.py:2208 vrtManager/network.py:459 +#: instances/views.py:2210 vrtManager/network.py:459 msgid "QoS rates must be whole numbers" msgstr "QoS 速率必须为整数" -#: instances/views.py:2215 networks/views.py:229 +#: instances/views.py:2217 networks/views.py:229 #, python-format msgid "%(qos_dir)s QoS is set" msgstr "%(qos_dir)s QoS 已设置" -#: instances/views.py:2220 +#: instances/views.py:2222 #, python-format msgid "" "%(qos_dir)s QoS is set. A running VM gets it after it is powered off and on." msgstr "%(qos_dir)s QoS 已设置。运行中的虚拟机需关机再开机后才能生效。" -#: instances/views.py:2242 networks/views.py:255 +#: instances/views.py:2244 networks/views.py:255 #, python-format msgid "%(qos_dir)s QoS is deleted" msgstr "%(qos_dir)s QoS 已删除" -#: instances/views.py:2247 +#: instances/views.py:2249 #, python-format msgid "" "%(qos_dir)s QoS is deleted. A running VM keeps the old limit until it is " "powered off and on." msgstr "%(qos_dir)s QoS 已删除。运行中的虚拟机在关机再开机之前保留旧的限制。" -#: instances/views.py:2275 +#: instances/views.py:2277 msgid "Only one owner is allowed and the one already added" msgstr "只允许一个所有者,且已添加" -#: instances/views.py:2277 +#: instances/views.py:2279 #, python-format msgid "%(user)s is already an owner" msgstr "%(user)s 已是所有者" -#: instances/views.py:2321 +#: instances/views.py:2323 #, python-format msgid "Console settings were not saved: %(errors)s" msgstr "控制台设置未保存:%(errors)s" -#: instances/views.py:2343 +#: instances/views.py:2345 msgid "" "Error setting console password. You should check that your instance have an " "graphic device." msgstr "设置控制台密码出错。请检查虚拟机是否有图形设备。" -#: instances/views.py:2390 +#: instances/views.py:2392 msgid "Shut the VM down to change whether it is a template." msgstr "请关闭虚拟机以更改其是否为模板。" -#: instances/views.py:2396 +#: instances/views.py:2398 #, python-format msgid "%(quota)s: '%(instance_name)s' stays a template." msgstr "%(quota)s:“%(instance_name)s”仍为模板。" -#: instances/views.py:2478 +#: instances/views.py:2480 msgid "The XML has no name" msgstr "XML 中没有名称" -#: instances/views.py:2492 webvirtcloud/middleware.py:79 +#: instances/views.py:2494 webvirtcloud/middleware.py:126 #, python-format msgid "libvirt Error - %(exception)s" msgstr "libvirt 错误 - %(exception)s" -#: instances/views.py:2499 +#: instances/views.py:2501 msgid "An empty disk of the size you set" msgstr "按设定大小创建的空磁盘" -#: instances/views.py:2500 +#: instances/views.py:2502 msgid "Volumes already in a pool" msgstr "存储池中已有的卷" -#: instances/views.py:2501 +#: instances/views.py:2503 msgid "A copy of a template volume" msgstr "模板卷的副本" -#: instances/views.py:2590 +#: instances/views.py:2592 msgid "You haven't defined any storage pools" msgstr "您尚未定义任何存储池" -#: instances/views.py:2592 +#: instances/views.py:2594 msgid "You haven't defined any network pools" msgstr "您尚未定义任何网络池" -#: instances/views.py:2655 +#: instances/views.py:2657 msgid "Flavor Created" msgstr "规格已创建" -#: instances/views.py:2663 +#: instances/views.py:2665 msgid "Create Flavor" msgstr "创建规格" -#: instances/views.py:2678 +#: instances/views.py:2680 msgid "Flavor Updated" msgstr "规格已更新" -#: instances/views.py:2684 +#: instances/views.py:2686 msgid "Update Flavor" msgstr "更新规格" -#: instances/views.py:2696 +#: instances/views.py:2698 msgid "Flavor Deleted" msgstr "规格已删除" -#: instances/views.py:2702 +#: instances/views.py:2704 msgid "Only the size template goes; VMs made from it keep their size." msgstr "仅删除此规格;由它创建的虚拟机保持其大小。" @@ -7454,19 +7454,25 @@ msgstr "取消失败:无法连接到服务器。" msgid "The host of this virtual machine cannot be reached right now." msgstr "当前无法连接此虚拟机所在的主机。" -#: operations/utils.py:157 +#: operations/utils.py:53 +msgid "" +"The host of this virtual machine is busy with other requests right now: try " +"again in a moment." +msgstr "此虚拟机所在的主机正忙于处理其他请求:请稍后重试。" + +#: operations/utils.py:160 msgid "" "A short operation is in progress on this resource; try again in a moment." msgstr "此资源上正在进行一项短时操作,请稍后重试。" -#: operations/utils.py:160 +#: operations/utils.py:163 #, python-format msgid "" "%(label)s is %(state)s on this resource (started by %(user)s, %(since)s ago);" " see the Jobs page." msgstr "此资源上的%(label)s%(state)s(由 %(user)s 于 %(since)s前发起),请查看任务页面。" -#: operations/utils.py:162 +#: operations/utils.py:165 #, python-format msgid "%(label)s is %(state)s on this resource (since %(since)s)." msgstr "此资源上的%(label)s%(state)s(自 %(since)s起)。" @@ -8362,49 +8368,49 @@ msgid "" "encrypted anew." msgstr "新值会立即替换旧值;之前用口令加密的内容不会重新加密。" -#: vrtManager/connection.py:50 +#: vrtManager/connection.py:51 msgid "Connection closed (error)" msgstr "连接已关闭(错误)" -#: vrtManager/connection.py:51 +#: vrtManager/connection.py:52 msgid "Connection closed (end of file)" msgstr "连接已关闭(文件结束)" -#: vrtManager/connection.py:52 +#: vrtManager/connection.py:53 msgid "Connection closed (keepalive timeout)" msgstr "连接已关闭(保活超时)" -#: vrtManager/connection.py:53 +#: vrtManager/connection.py:54 msgid "Connection closed (client closed)" msgstr "连接已关闭(客户端已关闭)" -#: vrtManager/connection.py:139 +#: vrtManager/connection.py:147 #, python-format msgid "" "Connection Failed: %(host)s does not answer: %(requests)s requests still wait" " for it" msgstr "连接失败:%(host)s 无响应:仍有 %(requests)s 个请求在等待它" -#: vrtManager/connection.py:210 +#: vrtManager/connection.py:219 #, python-format msgid "Connection Failed: %(host)s did not answer within %(seconds)s s" msgstr "连接失败:%(host)s 在 %(seconds)s 秒内未响应" -#: vrtManager/connection.py:220 +#: vrtManager/connection.py:230 msgid "the connection closed right after opening" msgstr "连接在打开后立即关闭" -#: vrtManager/connection.py:233 +#: vrtManager/connection.py:243 #, python-format msgid "Connection Failed: %(error)s" msgstr "连接失败:%(error)s" -#: vrtManager/connection.py:293 +#: vrtManager/connection.py:312 #, python-format msgid "Connection closed (%(reason)s)" msgstr "连接已关闭(%(reason)s)" -#: vrtManager/connection.py:435 +#: vrtManager/connection.py:455 #, python-format msgid "Connection Failed: %(host)s is not connected" msgstr "连接失败:%(host)s 未连接" @@ -9298,12 +9304,12 @@ msgid "" "Volume %(name)s is in use: a VM's disk, a backing file or a snapshot's file" msgstr "卷 %(name)s 正在使用中:它是虚拟机的磁盘、后备文件或快照文件" -#: vrtManager/util.py:140 +#: vrtManager/util.py:145 #, python-format msgid "The XML is not valid: %(err)s" msgstr "XML 无效:%(err)s" -#: vrtManager/util.py:142 +#: vrtManager/util.py:147 msgid "The XML may not declare a DTD" msgstr "XML 不能声明 DTD" @@ -9326,10 +9332,10 @@ msgstr "存储池 %(names)s" msgid "Secret %(uuid)s is used by %(named)s; remove it from them first" msgstr "机密 %(uuid)s 正被 %(named)s 使用;请先从中移除它" -#: webvirtcloud/settings.py:327 +#: webvirtcloud/settings.py:332 msgid "Localhost" msgstr "本机" -#: webvirtcloud/settings.py:328 +#: webvirtcloud/settings.py:333 msgid "All interfaces" msgstr "所有接口" diff --git a/operations/utils.py b/operations/utils.py index d0321949..a8486e20 100644 --- a/operations/utils.py +++ b/operations/utils.py @@ -19,7 +19,7 @@ from libvirt import libvirtError from accounts.models import UserInstance from appsettings.models import AppSettings from instances.models import Instance -from vrtManager.util import ConnectionFailed, OperationError, render +from vrtManager.util import ConnectionFailed, HostBusy, OperationError, render from . import jobs @@ -50,6 +50,7 @@ TRANSPORT_ERROR_CODES = { libvirt.VIR_ERR_LIBSSH, } UNREACHABLE = gettext_noop("The host of this virtual machine cannot be reached right now.") +HOST_BUSY = gettext_noop("The host of this virtual machine is busy with other requests right now: try again in a moment.") BOUNDS = {"WORKER_CONCURRENCY": (1, 16, 4), "JOB_RETENTION_DAYS": (1, 3650, 30), "LOG_RETENTION_DAYS": (1, 3650, 365)} @@ -102,6 +103,8 @@ def public_error(exception): and exception.get_error_domain() in TRANSPORT_ERROR_DOMAINS and exception.get_error_code() in TRANSPORT_ERROR_CODES ) + if isinstance(exception, HostBusy): + return say(HOST_BUSY) return say(UNREACHABLE) if connection_error else said(exception) diff --git a/vrtManager/connection.py b/vrtManager/connection.py index 7f19059c..398f3a42 100644 --- a/vrtManager/connection.py +++ b/vrtManager/connection.py @@ -144,8 +144,8 @@ def _count_on(connection): _leave_host() if not connection.requests.acquire(timeout=CONNECT_TIMEOUT): logger.warning("%s: request refused, %s requests still wait for the host", connection.host, HOST_REQUESTS) - raise util.ConnectionFailed(gettext_noop("Connection Failed: %(host)s does not answer: %(requests)s requests still wait for it"), - host=connection.host, requests=HOST_REQUESTS) + raise util.HostBusy(gettext_noop("Connection Failed: %(host)s does not answer: %(requests)s requests still wait for it"), + host=connection.host, requests=HOST_REQUESTS) _request.held = connection diff --git a/vrtManager/util.py b/vrtManager/util.py index eda7ae6a..8fd232d4 100644 --- a/vrtManager/util.py +++ b/vrtManager/util.py @@ -56,6 +56,11 @@ class ConnectionFailed(OperationError): is reached.""" +class HostBusy(ConnectionFailed): + """The host is connected, but this process's web requests to it + (HOST_REQUESTS) still wait for its answers.""" + + def is_kvm_available(xml): kvm_domains = get_xml_path(xml, "//domain/@type='kvm'") return kvm_domains > 0