From aab8dbf1df1fa009a320af945c7169f7245ea6dd Mon Sep 17 00:00:00 2001 From: catborise Date: Sat, 7 Nov 2026 15:31:05 +0300 Subject: [PATCH] perf(instances): a VM page does not wait for the guest agent's addresses A running VM's page read its addresses while it rendered: the guest agent, when its channel is connected but it does not answer, holds the page (and a gunicorn worker) for its whole 10 s timeout, on every load. The page now shows them once it has loaded: vm_addresses.js asks the new instances//addresses/ for each NIC's addresses and fills the header's IPv4 and each network card's IPv4 and IPv6. --- instances/api/serializers.py | 12 + instances/templates/instance.html | 3 +- .../templates/instances/settings_tab.html | 4 +- instances/tests/js/vm_addresses.test.js | 35 ++ instances/tests/test_page_controls.py | 3 +- instances/tests/test_pending_edits.py | 10 + instances/tests/test_vm_addresses.py | 59 +++ instances/urls.py | 1 + instances/views.py | 13 +- locale/tr/LC_MESSAGES/django.mo | Bin 194507 -> 194562 bytes locale/tr/LC_MESSAGES/django.po | 420 +++++++++--------- locale/zh/LC_MESSAGES/django.mo | Bin 181882 -> 181941 bytes locale/zh/LC_MESSAGES/django.po | 420 +++++++++--------- static/js/vm_addresses.js | 20 + vrtManager/instance.py | 20 +- vrtManager/tests/test_instance_getters.py | 1 - vrtManager/tests/test_interface_addresses.py | 27 +- .../tests/test_authorization_matrix.py | 1 + 18 files changed, 600 insertions(+), 449 deletions(-) create mode 100644 instances/tests/js/vm_addresses.test.js create mode 100644 instances/tests/test_vm_addresses.py create mode 100644 static/js/vm_addresses.js diff --git a/instances/api/serializers.py b/instances/api/serializers.py index 0ea3946b..e0b18971 100644 --- a/instances/api/serializers.py +++ b/instances/api/serializers.py @@ -2,6 +2,7 @@ from computes.models import Compute from django.conf import settings from instances.models import Flavor, Instance from instances.utils import nic_macs +from libvirt import libvirtError from rest_framework import serializers @@ -12,6 +13,17 @@ class InstanceSerializer(serializers.ModelSerializer): class InstanceDetailsSerializer(serializers.ModelSerializer): + networks = serializers.SerializerMethodField() + + def get_networks(self, instance) -> list[dict]: + """Each NIC with its addresses (None: none known), which the VM page + reads after it loads (views.nic_addresses).""" + try: + found = instance.proxy.get_addresses() + except libvirtError: + found = {} + return [{**nic, **dict(zip(("ipv4", "ipv6"), found.get(nic["mac"], (None, None))))} for nic in instance.networks] + def get_fields(self): fields = super().get_fields() # the host's ISO images are a superuser's, as on the VM page diff --git a/instances/templates/instance.html b/instances/templates/instance.html index dff83085..52fbc8f4 100644 --- a/instances/templates/instance.html +++ b/instances/templates/instance.html @@ -67,7 +67,7 @@ {% if not instance.is_template %}
{% trans "IPv4" %}
-
{{ ipv4_addresses|join:", "|default:"—" }}
+
{% trans "Reading…" %}
{% endif %} @@ -133,6 +133,7 @@ {% if not instance.is_template %}{% endif %} + {% job_panel_script job_resource %} diff --git a/instances/templates/instances/settings_tab.html b/instances/templates/instances/settings_tab.html index 6485d0a9..487a4384 100644 --- a/instances/templates/instances/settings_tab.html +++ b/instances/templates/instances/settings_tab.html @@ -318,7 +318,7 @@
- {% if network.ipv4 %}{{ network.ipv4|join:", " }}{% else %}{% trans "No IPv4 address known" %}{% endif %} + {% trans "Reading…" %}
{% csrf_token %} @@ -337,7 +337,7 @@
{% trans "Type" %}
{{ network.type }}
{% trans "Host device" %}
{{ network.target|default:_("no target") }}
-
{% trans "IPv6" %}
{{ network.ipv6|join:", "|default:_("unknown") }}
+
{% trans "IPv6" %}
{% trans "Reading…" %}
{% if network.inbound or network.outbound %} diff --git a/instances/tests/js/vm_addresses.test.js b/instances/tests/js/vm_addresses.test.js new file mode 100644 index 00000000..8b0c7d43 --- /dev/null +++ b/instances/tests/js/vm_addresses.test.js @@ -0,0 +1,35 @@ +// Behaviour of static/js/vm_addresses.js with a fake document and fetch. +// Run by instances/tests/test_vm_addresses.py: +// node vm_addresses.test.js static/js/vm_addresses.js +const fs = require("fs"); +const assert = require("assert"); + +function place(family, macs, empty) { + const classes = new Set(["text-body-secondary"]); + return { dataset: { addressFamily: family, addressMac: macs, empty }, textContent: "Reading…", + classList: { toggle(name, on) { if (on) classes.add(name); else classes.delete(name); } }, classes }; +} +// the header (the VM's NICs), a NIC's IPv4 and IPv6, a NIC the guest has no address on +const header = place("ipv4", "52:54:00:00:00:01 52:54:00:00:00:02 ", "—"); +const ipv4 = place("ipv4", "52:54:00:00:00:01", "No IPv4 address known"); +const ipv6 = place("ipv6", "52:54:00:00:00:01", "unknown"); +const other = place("ipv4", "52:54:00:00:00:02", "No IPv4 address known"); +global.document = { querySelectorAll: () => [header, ipv4, ipv6, other], currentScript: { dataset: { url: "/instances/7/addresses/" } } }; +let asked = null; +global.fetch = (url) => { + asked = url; + // a guest's own bridge (docker0) is not one of the VM's NICs + return Promise.resolve({ ok: true, json: () => ({ + "52:54:00:00:00:01": { ipv4: ["192.0.2.10"], ipv6: ["2001:db8::10/64"] }, + "02:42:ac:11:00:01": { ipv4: ["172.17.0.1"], ipv6: [] } }) }); +}; +eval(fs.readFileSync(process.argv[2], "utf8")); +setTimeout(() => { + assert.strictEqual(asked, "/instances/7/addresses/"); + assert.strictEqual(header.textContent, "192.0.2.10", "only the VM's NICs"); + assert.strictEqual(ipv4.textContent, "192.0.2.10"); + assert.strictEqual(ipv6.textContent, "2001:db8::10/64"); + assert.ok(!ipv4.classes.has("text-body-secondary"), "an address is not muted"); + assert.strictEqual(other.textContent, "No IPv4 address known"); + assert.ok(other.classes.has("text-body-secondary")); +}, 0); diff --git a/instances/tests/test_page_controls.py b/instances/tests/test_page_controls.py index a08c547c..223dbbd2 100644 --- a/instances/tests/test_page_controls.py +++ b/instances/tests/test_page_controls.py @@ -140,7 +140,8 @@ class PageControlsTestCase(PageControls, TestCase): self.assertEqual([a.text_content().strip() for a in owner_page.xpath(links)], ["Instances"]) self.assertIn("Guest agent not connected", self.last_page) self.assertIn("vda 2.0\xa0GB · vdb 1.0\xa0GB", self.last_page) - self.assertEqual(owner_page.xpath("normalize-space(//dt[.='IPv4']/following-sibling::dd)"), "—") + # filled by its script once the page has loaded ("—" when it has none) + self.assertEqual(owner_page.xpath("//dt[.='IPv4']/following-sibling::dd/@data-empty"), ["—"]) def test_superuser_sees_every_control(self): superuser = get_user_model().objects.create_superuser("ctl_super", "ctl_super@example.com", "x") diff --git a/instances/tests/test_pending_edits.py b/instances/tests/test_pending_edits.py index d63ef94e..f1d953a3 100644 --- a/instances/tests/test_pending_edits.py +++ b/instances/tests/test_pending_edits.py @@ -82,6 +82,16 @@ class PendingEditsTestCase(TestCase): self.assertEqual(doc.xpath("//form[.//input[@name='qos_average']]//input[@name='qos_direction']/@value"), ["inbound", "outbound"]) + def test_the_page_leaves_the_addresses_to_its_script(self): + nic = {"type": "network", "mac": "52:54:10:00:00:01", "nic": "default", "state": "up", "model": "virtio", + "filterref": "", "target": "vnet0", "inbound": [], "outbound": []} + doc = self.page(nics=([nic], [nic])) + self.assertEqual(doc.xpath("//*[@data-address-family]/@data-address-family"), ["ipv4", "ipv4", "ipv6"]) + # the header's are those of the VM's NICs, not the guest's own bridges + self.assertEqual(doc.xpath("//dt[.='IPv4']/following-sibling::dd/@data-address-mac"), ["52:54:10:00:00:01 "]) + self.assertEqual(doc.xpath("//script[contains(@src, 'vm_addresses')]/@data-url"), + [reverse("instances:nic_addresses", args=[self.instance.id])]) + def test_the_nics_are_rows_of_one_list_with_their_dialogs(self): nic = {"type": "network", "mac": "52:54:10:00:00:01", "nic": "default", "state": "up", "model": "virtio", "ipv4": None, "ipv6": None, "filterref": "", "target": "", "inbound": [], "outbound": []} diff --git a/instances/tests/test_vm_addresses.py b/instances/tests/test_vm_addresses.py new file mode 100644 index 00000000..f6fd51f5 --- /dev/null +++ b/instances/tests/test_vm_addresses.py @@ -0,0 +1,59 @@ +"""A VM page does not wait for the guest agent, which may take its whole +timeout: its script asks for the addresses once the page has loaded.""" + +import shutil +import subprocess +import unittest +from pathlib import Path +from unittest.mock import PropertyMock, patch + +from django.conf import settings + +from django.contrib.auth import get_user_model +from django.test import TestCase +from django.urls import reverse +from libvirt import libvirtError + +from computes.models import Compute +from instances.api.serializers import InstanceDetailsSerializer +from instances.models import Instance + + +class AddressesTestCase(TestCase): + def setUp(self): + self.client.force_login(get_user_model().objects.create_superuser("ad-admin", "ad@example.com", "x")) + compute = Compute.objects.create(name="ad", hostname="127.0.0.1:1", login="root", password="", type=1) + self.instance = Instance.objects.create(compute=compute, name="ad-vm", uuid="aaaaaaaa-1111-2222-3333-555555555555") + self.url = reverse("instances:nic_addresses", args=[self.instance.id]) + + def addresses(self, **proxy): + with patch("instances.models.wvmInstance") as wvm: + wvm.return_value.configure_mock(**proxy) + return self.client.get(self.url).json() + + def test_each_nic_s_addresses_by_mac(self): + found = {"52:54:10:00:00:01": (["192.0.2.10"], ["2001:db8::10/64"]), "52:54:10:00:00:02": (["192.0.2.20"], None)} + self.assertEqual(self.addresses(**{"get_addresses.return_value": found}), { + "52:54:10:00:00:01": {"ipv4": ["192.0.2.10"], "ipv6": ["2001:db8::10/64"]}, + "52:54:10:00:00:02": {"ipv4": ["192.0.2.20"], "ipv6": []}}) + + def test_a_host_that_cannot_be_read_gives_none(self): + self.assertEqual(self.addresses(**{"get_addresses.side_effect": libvirtError("unable to connect")}), {}) + + def test_the_api_s_vm_details_keep_each_nic_s_addresses(self): + nics = [{"mac": "52:54:10:00:00:01", "type": "network"}, {"mac": "52:54:10:00:00:02", "type": "network"}] + with patch("instances.models.wvmInstance") as wvm, \ + patch.object(Instance, "networks", new_callable=PropertyMock, return_value=nics): + wvm.return_value.get_addresses.return_value = {"52:54:10:00:00:01": (["192.0.2.10"], None)} + networks = InstanceDetailsSerializer(self.instance).get_networks(self.instance) + self.assertEqual(networks, [{"mac": "52:54:10:00:00:01", "type": "network", "ipv4": ["192.0.2.10"], "ipv6": None}, + {"mac": "52:54:10:00:00:02", "type": "network", "ipv4": None, "ipv6": None}]) + + +class AddressesScriptTestCase(unittest.TestCase): + @unittest.skipUnless(shutil.which("node"), "node is not installed") + def test_vm_addresses_js(self): + base = Path(settings.BASE_DIR) + result = subprocess.run(["node", str(base / "instances/tests/js/vm_addresses.test.js"), + str(base / "static/js/vm_addresses.js")], capture_output=True, text=True, timeout=60) + self.assertEqual(result.returncode, 0, result.stderr) diff --git a/instances/urls.py b/instances/urls.py index ac26173c..429563ce 100755 --- a/instances/urls.py +++ b/instances/urls.py @@ -21,6 +21,7 @@ urlpatterns = [ path("/destroy/", views.destroy, name="destroy"), path("/migrate/", views.migrate, name="migrate"), path("/status/", views.status, name="status"), + path("/addresses/", views.nic_addresses, name="nic_addresses"), path("/stats/", views.stats, name="stats"), path("/osinfo/", views.osinfo, name="osinfo"), path("/rootpasswd/", views.set_root_pass, name="rootpasswd"), diff --git a/instances/views.py b/instances/views.py index 3e3ccc58..59b076a2 100755 --- a/instances/views.py +++ b/instances/views.py @@ -296,7 +296,6 @@ def _instance_page(request, pk, instance, compute): if can_manage_console: console_form = ConsoleForm(instance=instance, is_superuser=request.user.is_superuser) console_listener_addresses = settings.QEMU_CONSOLE_LISTENER_ADDRESSES - ipv4_addresses = [address for net in instance.networks for address in net["ipv4"] or []] try: userinstance = UserInstance.objects.get(instance=instance, user=request.user) except UserInstance.DoesNotExist: @@ -390,6 +389,18 @@ def status(request, pk): return JsonResponse({"status": instance.proxy.get_status()}) +def nic_addresses(request, pk): + """The VM's addresses by MAC, which its page shows once it has loaded + (vm_addresses.js): the guest agent may take its whole timeout. A host + that cannot be read gives none.""" + instance = get_instance(request.user, pk) + try: + found = instance.proxy.get_addresses() + except libvirtError: + found = {} + return JsonResponse({mac: {"ipv4": ipv4 or [], "ipv6": ipv6 or []} for mac, (ipv4, ipv6) in found.items()}) + + def _valid_ssh_target(compute): """The login and hostname reach ssh as a command-line argument; a compute whose values would inject an ssh option (an existing or bypassed row that diff --git a/locale/tr/LC_MESSAGES/django.mo b/locale/tr/LC_MESSAGES/django.mo index f788e810301431e39e7f307533e30cc88bb17087..1c863a3f9e730f8cfb74536ea584d5a4761296b5 100644 GIT binary patch delta 42968 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 delta 42922 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 diff --git a/locale/tr/LC_MESSAGES/django.po b/locale/tr/LC_MESSAGES/django.po index 3482fd1e..aee9fcd0 100644 --- a/locale/tr/LC_MESSAGES/django.po +++ b/locale/tr/LC_MESSAGES/django.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-11-07 11:22+0000\n" +"POT-Creation-Date: 2026-11-07 12:30+0000\n" "PO-Revision-Date: 2020-11-04 12:00+0000\n" "Last-Translator: catborise , 2020\n" "Language-Team: Turkish (https://www.transifex.com/catborise/teams/110663/tr/)\n" @@ -617,40 +617,40 @@ msgstr "" msgid "Password Changed" msgstr "Parola Değişti" -#: accounts/views.py:252 +#: accounts/views.py:254 msgid "Create User Instance" msgstr "Yeni Kullanıcı Sanal Makinesi Oluştur" -#: accounts/views.py:286 +#: accounts/views.py:288 msgid "Update User Instance" msgstr "Kullanıcı Sanal Makinesini Güncelle" -#: accounts/views.py:304 +#: accounts/views.py:306 msgid "The user loses access to this VM; the VM itself is not changed." msgstr "" "Kullanıcı bu sanal makineye erişimini kaybeder; sanal makinenin kendisi " "değişmez." -#: accounts/views.py:337 +#: accounts/views.py:341 #, python-format msgid "OTP Sent to %(email)s" msgstr "OTP %(email)s ye gönderildi" -#: accounts/views.py:346 +#: accounts/views.py:350 msgid "Email OTP" msgstr "OTP E-Postası" -#: accounts/views.py:380 +#: accounts/views.py:384 #, python-format msgid "The OTP QR code could not be mailed to %(user)s: %(error)s" msgstr "OTP QR kodu %(user)s kullanıcısına e-postayla gönderilemedi: %(error)s" -#: accounts/views.py:384 +#: accounts/views.py:388 #, python-format msgid "OTP QR code was emailed to user %(user)s" msgstr "OTP QR kodu %(user)s kullanıcısına gönderildi" -#: accounts/views.py:388 +#: accounts/views.py:392 msgid "User email not set, failed to send QR code" msgstr "Kullanıcı e-postası girilmemiş, QR kod gönderimi başarısız" @@ -914,7 +914,7 @@ msgid "IP" msgstr "IP" #: admin/templates/admin/logs.html:56 admin/views.py:288 instances/states.py:19 -#: instances/views.py:419 instances/views.py:421 logs/views.py:17 +#: instances/views.py:430 instances/views.py:432 logs/views.py:17 msgid "Unknown" msgstr "Bilinmeyen" @@ -2656,7 +2656,7 @@ msgstr "" "VNC olarak değiştirin." #: instances/api/viewsets.py:148 instances/api/viewsets.py:166 -#: instances/views.py:792 instances/views.py:807 +#: instances/views.py:803 instances/views.py:818 msgid "Templates cannot be started." msgstr "Şablon makineler başlatılamaz." @@ -2792,7 +2792,7 @@ msgstr "" msgid "Delete snapshot" msgstr "Anlık görüntüyü sil" -#: instances/jobs.py:318 vrtManager/instance.py:2288 +#: instances/jobs.py:318 vrtManager/instance.py:2278 #, 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:1884 +#: instances/jobs.py:386 instances/jobs.py:395 vrtManager/instance.py:1874 #, python-format msgid "A snapshot named %(name)s already exists" msgstr "%(name)s adında bir anlık görüntü zaten var" @@ -2961,7 +2961,7 @@ msgstr "" msgid "Create VM" msgstr "Sanal makine oluştur" -#: instances/jobs.py:778 instances/jobs.py:823 instances/views.py:2463 +#: instances/jobs.py:778 instances/jobs.py:823 instances/views.py:2474 msgid "A virtual machine with this name already exists" msgstr "Bu isimde bir sanal makine mevcut" @@ -3011,7 +3011,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:807 vrtManager/instance.py:3020 +#: instances/jobs.py:807 vrtManager/instance.py:3010 msgid "This host offers no TPM 2.0: install swtpm on it" msgstr "Bu sunucu TPM 2.0 sunmuyor: üzerine swtpm kurun" @@ -3072,74 +3072,74 @@ msgstr "Sanal makineyi taşı" msgid "Migrating the VM" msgstr "Sanal makine taşınıyor" -#: instances/jobs.py:1094 +#: instances/jobs.py:1093 msgid "libvirt is still migrating the VM" msgstr "libvirt sanal makineyi hâlâ taşıyor" -#: instances/jobs.py:1105 +#: instances/jobs.py:1104 msgid "The VM stayed on the source host" msgstr "Sanal makine kaynak sunucuda kaldı" -#: instances/jobs.py:1107 +#: instances/jobs.py:1106 msgid "" "The VM is on both computes or on neither; check them, then resolve this job." msgstr "" "Sanal makine ya iki sunucuda da var ya da hiçbirinde yok; kontrol edin, sonra" " bu işi çözün." -#: instances/jobs.py:1155 +#: instances/jobs.py:1154 msgid "Move disk" msgstr "Diski taşı" -#: instances/jobs.py:1162 +#: instances/jobs.py:1161 msgid "Choose a disk of the VM" msgstr "Sanal makinenin bir diskini seçin" -#: instances/jobs.py:1186 +#: instances/jobs.py:1185 msgid "Copying the disk" msgstr "Disk kopyalanıyor" -#: instances/jobs.py:1229 +#: instances/jobs.py:1228 #, python-format msgid "Another block job runs on %(dev)s; check the VM" msgstr "" "%(dev)s üzerinde başka bir blok işi çalışıyor; sanal makineyi kontrol edin" -#: instances/jobs.py:1235 +#: instances/jobs.py:1234 #, python-format msgid "The disk stayed in %(path)s; remove %(dest)s if it is there" msgstr "Disk %(path)s içinde kaldı; varsa %(dest)s dosyasını silin" -#: instances/jobs.py:1237 +#: instances/jobs.py:1236 #, python-format msgid "The definitions of %(dev)s name %(paths)s; check the VM" msgstr "%(dev)s tanımları %(paths)s gösteriyor; sanal makineyi kontrol edin" -#: instances/jobs.py:1244 +#: instances/jobs.py:1243 #, 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/jobs.py:1245 +#: instances/jobs.py:1244 #, 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/jobs.py:1246 +#: instances/jobs.py:1245 #, 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/jobs.py:1300 +#: instances/jobs.py:1299 msgid "Delete VM" msgstr "Sanal makineyi sil" -#: instances/jobs.py:1330 +#: instances/jobs.py:1329 msgid "Deleting the VM" msgstr "Sanal makine siliniyor" -#: instances/jobs.py:1342 +#: instances/jobs.py:1341 msgid "The VM was not deleted; it may have been shut off" msgstr "Sanal makine silinmedi; kapatılmış olabilir" @@ -3326,7 +3326,7 @@ msgid "Disk source" msgstr "Disk kaynağı" #: instances/templates/add_instance_volume.html:21 -#: instances/templates/create_instance_w2.html:134 instances/views.py:2482 +#: instances/templates/create_instance_w2.html:134 instances/views.py:2493 msgid "New disk" msgstr "Yeni disk" @@ -3698,7 +3698,7 @@ msgstr "Özel CPU modelleri" msgid "Size (GiB)" msgstr "Boyut (GiB)" -#: instances/templates/create_instance_w2.html:161 instances/views.py:2483 +#: instances/templates/create_instance_w2.html:161 instances/views.py:2494 msgid "Existing volumes" msgstr "Mevcut birimler" @@ -3734,7 +3734,7 @@ msgstr "Aygıt" msgid "Remove" msgstr "Kaldır" -#: instances/templates/create_instance_w2.html:194 instances/views.py:2484 +#: instances/templates/create_instance_w2.html:194 instances/views.py:2495 msgid "Clone from template" msgstr "Şablondan klonla" @@ -3879,6 +3879,12 @@ msgstr "vCPU" msgid "IPv4" msgstr "IPv4" +#: instances/templates/instance.html:70 +#: instances/templates/instances/settings_tab.html:321 +#: instances/templates/instances/settings_tab.html:340 +msgid "Reading…" +msgstr "Okunuyor…" + #: instances/templates/instance.html:76 msgid "Instance actions" msgstr "Sanal makine işlemleri" @@ -5884,16 +5890,16 @@ msgstr "%(quota)s (%(total)s > %(limit)s)" msgid "None available device name" msgstr "Hiçbiri uygun aygıt adı değil" -#: instances/utils.py:398 +#: instances/utils.py:402 #, python-format msgid "%(hostname)s via %(address)s" msgstr "%(address)s üzerinden %(hostname)s" -#: instances/utils.py:437 +#: instances/utils.py:441 msgid "Invalid MAC address" msgstr "Geçersiz MAC adresi" -#: instances/utils.py:439 +#: instances/utils.py:443 msgid "More MAC addresses than networks" msgstr "Ağlardan daha fazla MAC adresi" @@ -5924,16 +5930,16 @@ msgstr " Üzerindeki işler menüdeki İşler bölümünden izlenebilir." msgid "'%(name)s' is no longer on its host." msgstr "'%(name)s' artık sunucusunda yok." -#: instances/views.py:374 +#: instances/views.py:373 msgid "There is no other host to migrate to." msgstr "Taşınacak başka bir sunucu yok." -#: instances/views.py:376 +#: instances/views.py:375 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:378 +#: instances/views.py:377 msgid "" "A VM with snapshots cannot be migrated: its snapshots stay on this host. " "Delete them first." @@ -5941,7 +5947,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:380 +#: instances/views.py:379 msgid "" "A VM with host devices cannot be migrated: the destination may not have them." " Remove them first." @@ -5949,11 +5955,11 @@ msgstr "" "Sunucu aygıtları olan bir sanal makine taşınamaz: hedefte bu aygıtlar " "olmayabilir. Önce onları kaldırın." -#: instances/views.py:643 instances/views.py:644 +#: instances/views.py:654 instances/views.py:655 msgid "The VM was moved meanwhile; try again." msgstr "Sanal makine bu arada taşındı; yeniden deneyin." -#: instances/views.py:760 +#: instances/views.py:771 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 " @@ -5966,7 +5972,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:764 +#: instances/views.py:775 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" @@ -5978,171 +5984,171 @@ 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:782 +#: instances/views.py:793 #, python-format msgid "Invalid disk options: %(options)s" msgstr "Geçersiz disk seçenekleri: %(options)s" -#: instances/views.py:999 +#: instances/views.py:1010 #, 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:1006 instances/views.py:1024 instances/views.py:1033 +#: instances/views.py:1017 instances/views.py:1035 instances/views.py:1044 #, python-format msgid "gstfsd error: %(err)s" msgstr "gstfsd hatası: %(err)s" -#: instances/views.py:1034 +#: instances/views.py:1045 msgid "the reply is not signed with the key" msgstr "yanıt anahtarla imzalanmamış" -#: instances/views.py:1042 +#: instances/views.py:1053 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:1055 +#: instances/views.py:1066 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:1083 +#: instances/views.py:1094 msgid "Reset root password" msgstr "Root parolasını sıfırla" -#: instances/views.py:1087 +#: instances/views.py:1098 msgid "Enter a password" msgstr "Bir parola girin" -#: instances/views.py:1101 +#: instances/views.py:1112 msgid "Select an SSH public key" msgstr "Bir SSH açık anahtarı seçin" -#: instances/views.py:1123 +#: instances/views.py:1134 #, python-format msgid "Installed new SSH public key %(keyname)s" msgstr "Yeni %(keyname)s SSH açık anahtarı yüklendi" -#: instances/views.py:1143 +#: instances/views.py:1154 msgid "Enter a whole number of vCPUs" msgstr "vCPU sayısı için bir tam sayı girin" -#: instances/views.py:1147 +#: instances/views.py:1158 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:1150 +#: instances/views.py:1161 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:1157 +#: instances/views.py:1168 #, 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:1165 +#: instances/views.py:1176 #, 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:1184 +#: instances/views.py:1195 msgid "Enter a whole number for memory" msgstr "Bellek için bir tam sayı girin" -#: instances/views.py:1187 +#: instances/views.py:1198 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:1191 +#: instances/views.py:1202 #, 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:1197 +#: instances/views.py:1208 #, 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:1217 +#: instances/views.py:1228 msgid "Enter disk sizes as whole GiB" msgstr "Disk boyutlarını tam GiB olarak girin" -#: instances/views.py:1221 +#: instances/views.py:1232 #, 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:1229 +#: instances/views.py:1240 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:1238 +#: instances/views.py:1249 #, 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:1250 +#: instances/views.py:1261 #, 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:1252 +#: instances/views.py:1263 #, python-format msgid "Disk is resized: %(dev)s" msgstr "Disk boyutu değiştirildi: %(dev)s" -#: instances/views.py:1346 +#: instances/views.py:1357 msgid "The VM's machine has no PCIe slots to add" msgstr "Sanal makinenin makine tipinde eklenecek PCIe yuvası yok" -#: instances/views.py:1351 +#: instances/views.py:1362 #, python-format msgid "%(count)s PCIe slots added" msgstr "%(count)s PCIe yuvası eklendi" -#: instances/views.py:1353 +#: instances/views.py:1364 #, 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:1399 +#: instances/views.py:1410 #, python-format msgid "%(volume)s is already a disk of this VM" msgstr "%(volume)s zaten bu sanal makinenin bir diski" -#: instances/views.py:1489 +#: instances/views.py:1500 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:1494 +#: instances/views.py:1505 msgid "Volume is changed successfully." msgstr "Birim başarıyla değiştirildi." -#: instances/views.py:1512 +#: instances/views.py:1523 #, 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:1519 +#: instances/views.py:1530 #, 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:1534 +#: instances/views.py:1545 #, 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:1546 +#: instances/views.py:1557 #, python-format msgid "" "The guest has not released disk %(dev)s yet; volume %(vol)s was kept. Delete " @@ -6151,62 +6157,62 @@ 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:1557 +#: instances/views.py:1568 #, 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:1583 +#: instances/views.py:1594 #, 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:1586 +#: instances/views.py:1597 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:1591 +#: instances/views.py:1602 #, python-format msgid "%(image)s is already in a CD-ROM of this VM" msgstr "%(image)s bu sanal makinenin bir CD-ROM'unda zaten takılı" -#: instances/views.py:1672 +#: instances/views.py:1683 #, python-format msgid "Pool %(pool)s was not read again: %(err)s" msgstr "%(pool)s havuzu yeniden okunamadı: %(err)s" -#: instances/views.py:1693 +#: instances/views.py:1704 #, python-format msgid "Snapshot was not deleted: %(err)s" msgstr "Anlık görüntü silinmedi: %(err)s" -#: instances/views.py:1808 +#: instances/views.py:1819 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:1822 +#: instances/views.py:1833 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:1824 +#: instances/views.py:1835 msgid "Boot order changed successfully." msgstr "Ön yükleme sırası başarıyla değiştirildi." -#: instances/views.py:1844 +#: instances/views.py:1855 msgid "The XML is empty" msgstr "XML boş" -#: instances/views.py:1848 instances/views.py:2473 +#: instances/views.py:1859 instances/views.py:2484 #, python-format msgid "The XML is not well-formed: %(error)s" msgstr "XML düzgün biçimlendirilmemiş: %(error)s" -#: instances/views.py:1850 +#: instances/views.py:1861 #, 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:1854 +#: instances/views.py:1865 msgid "" "The definition has changed since the editor was opened. Reload the page to " "edit the current one." @@ -6214,40 +6220,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:1866 +#: instances/views.py:1877 msgid "The XML definition was saved." msgstr "XML tanımı kaydedildi." -#: instances/views.py:1868 +#: instances/views.py:1879 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:1949 +#: instances/views.py:1960 msgid "Select one network interface to change" msgstr "Değiştirilecek bir ağ arabirimi seçin" -#: instances/views.py:1987 +#: instances/views.py:1998 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:1989 +#: instances/views.py:2000 msgid "Network device changed" msgstr "Ağ aygıtı değiştirildi" -#: instances/views.py:2001 +#: instances/views.py:2012 msgid "No network selected" msgstr "Ağ seçilmedi" -#: instances/views.py:2006 +#: instances/views.py:2017 #, 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:2025 +#: instances/views.py:2036 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 " @@ -6257,21 +6263,21 @@ msgstr "" "aygıtı sonra ekleyin; Diskler sekmesindeki PCIe yuvaları ekle, sonraki " "başlatmadan itibaren ona boş yuvalar verir." -#: instances/views.py:2066 instances/views.py:2072 +#: instances/views.py:2077 instances/views.py:2083 msgid "The VM has it" msgstr "Sanal makinede var" -#: instances/views.py:2103 +#: instances/views.py:2114 #, python-format msgid "The host has no USB device %(device)s" msgstr "Sunucuda %(device)s USB aygıtı yok" -#: instances/views.py:2124 +#: instances/views.py:2135 #, python-format msgid "The host has no PCI device %(device)s" msgstr "Sunucuda %(device)s PCI aygıtı yok" -#: instances/views.py:2142 +#: instances/views.py:2153 #, python-format msgid "" "Removal of PCI device %(address)s requested: the guest has not let it go yet;" @@ -6281,20 +6287,20 @@ msgstr "" "bırakmadı; bırakana ya da sanal makine durana kadar çalışan sanal makinede " "kalır." -#: instances/views.py:2187 instances/views.py:2217 +#: instances/views.py:2198 instances/views.py:2228 msgid "Select a network interface and a QoS direction" msgstr "Bir ağ arabirimi ve bir QoS yönü seçin" -#: instances/views.py:2190 vrtManager/network.py:454 +#: instances/views.py:2201 vrtManager/network.py:454 msgid "QoS rates must be whole numbers" msgstr "QoS hızları tam sayı olmalıdır" -#: instances/views.py:2197 networks/views.py:230 +#: instances/views.py:2208 networks/views.py:230 #, python-format msgid "%(qos_dir)s QoS is set" msgstr "%(qos_dir)s QoS ayarlandı" -#: instances/views.py:2202 +#: instances/views.py:2213 #, python-format msgid "" "%(qos_dir)s QoS is set. A running VM gets it after it is powered off and on." @@ -6302,12 +6308,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:2224 networks/views.py:256 +#: instances/views.py:2235 networks/views.py:256 #, python-format msgid "%(qos_dir)s QoS is deleted" msgstr "%(qos_dir)s QoS silindi" -#: instances/views.py:2229 +#: instances/views.py:2240 #, python-format msgid "" "%(qos_dir)s QoS is deleted. A running VM keeps the old limit until it is " @@ -6316,21 +6322,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:2257 +#: instances/views.py:2268 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:2259 +#: instances/views.py:2270 #, python-format msgid "%(user)s is already an owner" msgstr "%(user)s zaten bir sahip" -#: instances/views.py:2304 +#: instances/views.py:2315 #, python-format msgid "Console settings were not saved: %(errors)s" msgstr "Konsol ayarları kaydedilmedi: %(errors)s" -#: instances/views.py:2326 +#: instances/views.py:2337 msgid "" "Error setting console password. You should check that your instance have an " "graphic device." @@ -6338,57 +6344,57 @@ msgstr "" "Konsol parolası ayarlanırken hata oluştu. Sanal makinenin bir grafik aygıtına" " sahip olduğundan emin olunuz." -#: instances/views.py:2373 +#: instances/views.py:2384 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:2379 +#: instances/views.py:2390 #, python-format msgid "%(quota)s: '%(instance_name)s' stays a template." msgstr "%(quota)s: '%(instance_name)s' şablon olarak kalıyor." -#: instances/views.py:2461 +#: instances/views.py:2472 msgid "The XML has no name" msgstr "XML'de ad yok" -#: instances/views.py:2475 webvirtcloud/middleware.py:151 +#: instances/views.py:2486 webvirtcloud/middleware.py:156 #, python-format msgid "libvirt Error - %(exception)s" msgstr "libvirt Hatası - %(exception)s" -#: instances/views.py:2482 +#: instances/views.py:2493 msgid "An empty disk of the size you set" msgstr "Belirlediğiniz boyutta boş bir disk" -#: instances/views.py:2483 +#: instances/views.py:2494 msgid "Volumes already in a pool" msgstr "Bir havuzda zaten bulunan birimler" -#: instances/views.py:2484 +#: instances/views.py:2495 msgid "A copy of a template volume" msgstr "Bir şablon biriminin kopyası" -#: instances/views.py:2573 +#: instances/views.py:2584 msgid "You haven't defined any storage pools" msgstr "Hiç bir depolama havuzu tanımlamadınız" -#: instances/views.py:2575 +#: instances/views.py:2586 msgid "You haven't defined any network pools" msgstr "Hiç bir ağ havuzu tanımlamadınız" -#: instances/views.py:2638 +#: instances/views.py:2649 msgid "Flavor Created" msgstr "Flavor Oluşturuldu" -#: instances/views.py:2646 +#: instances/views.py:2657 msgid "Create Flavor" msgstr "Kullanıcı Oluştur" -#: instances/views.py:2658 +#: instances/views.py:2669 msgid "Flavor Deleted" msgstr "Flavor Silindi" -#: instances/views.py:2664 +#: instances/views.py:2675 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ı" @@ -7649,32 +7655,32 @@ msgstr "" msgid "%(phase)s (over its time limit)" msgstr "%(phase)s (süre sınırını aştı)" -#: operations/jobs.py:151 +#: operations/jobs.py:153 msgid "This form was already submitted for another request; reload the page" msgstr "" "Bu form başka bir istek için zaten gönderildi; sayfayı yeniden yükleyin" -#: operations/jobs.py:157 +#: operations/jobs.py:159 msgid "The form has no valid submission key; reload the page" msgstr "Formun geçerli bir gönderim anahtarı yok; sayfayı yeniden yükleyin" -#: operations/jobs.py:203 +#: operations/jobs.py:205 msgid "This job cannot be cancelled once it has started" msgstr "Bu iş başladıktan sonra iptal edilemez" -#: operations/jobs.py:206 +#: operations/jobs.py:211 msgid "The job has already ended" msgstr "İş zaten bitti" -#: operations/jobs.py:254 +#: operations/jobs.py:265 msgid "Choose succeeded or failed" msgstr "Başarılı ya da başarısız seçin" -#: operations/jobs.py:257 +#: operations/jobs.py:268 msgid "Write a note on what was checked" msgstr "Neyin kontrol edildiğine dair bir not yazın" -#: operations/jobs.py:261 +#: operations/jobs.py:272 msgid "Only an uncertain job can be resolved" msgstr "Yalnızca belirsiz bir iş çözülebilir" @@ -9056,7 +9062,7 @@ msgstr "" "Anlık görüntü adları 1-64 harf, rakam, '.', '_' veya '-' karakterinden oluşur" " ve '.' ile başlamaz" -#: vrtManager/instance.py:1086 +#: vrtManager/instance.py:1076 msgid "" "A device other than a disk or NIC is in the boot order: change it in the XML " "editor" @@ -9064,104 +9070,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:1098 +#: vrtManager/instance.py:1088 msgid "Invalid Device Type for boot order" msgstr "Ön yükleme sırası için geçersiz aygıt türü" -#: vrtManager/instance.py:1101 +#: vrtManager/instance.py:1091 #, 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:1121 +#: vrtManager/instance.py:1111 #, 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:1122 +#: vrtManager/instance.py:1112 #, 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:1134 +#: vrtManager/instance.py:1124 #, 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:1145 +#: vrtManager/instance.py:1135 #, python-format msgid "ISO image %(image)s was not found" msgstr "ISO imajı %(image)s bulunamadı" -#: vrtManager/instance.py:1147 +#: vrtManager/instance.py:1137 #, 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:1254 +#: vrtManager/instance.py:1244 #, 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:1382 +#: vrtManager/instance.py:1372 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:1669 +#: vrtManager/instance.py:1659 msgid "The VM has no video card" msgstr "Sanal makinede ekran kartı yok" -#: vrtManager/instance.py:1843 +#: vrtManager/instance.py:1833 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:1875 +#: vrtManager/instance.py:1865 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:1877 +#: vrtManager/instance.py:1867 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:1879 +#: vrtManager/instance.py:1869 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:1882 +#: vrtManager/instance.py:1872 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:1887 +#: vrtManager/instance.py:1877 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:1890 +#: vrtManager/instance.py:1880 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:1896 +#: vrtManager/instance.py:1886 #, python-format msgid "Eject the media from %(dev)s first" msgstr "Önce %(dev)s içindeki ortamı çıkarın" -#: vrtManager/instance.py:1898 +#: vrtManager/instance.py:1888 #, 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:1906 +#: vrtManager/instance.py:1896 #, python-format msgid "" "The storage pools could not be refreshed, so their free space is unknown: " @@ -9169,21 +9175,21 @@ msgid "" msgstr "" "Depolama havuzları yenilenemedi, bu yüzden boş alanları bilinmiyor: %(err)s" -#: vrtManager/instance.py:1927 +#: vrtManager/instance.py:1917 msgid "Memory is saved only from a running VM" msgstr "Bellek yalnızca çalışan bir sanal makineden kaydedilir" -#: vrtManager/instance.py:1929 +#: vrtManager/instance.py:1919 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:1933 +#: vrtManager/instance.py:1923 #, 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:1964 +#: vrtManager/instance.py:1954 #, python-format msgid "" "Storage pool %(pool)s has %(free).1f GiB free; the snapshot needs %(size).1f " @@ -9194,7 +9200,7 @@ msgstr "" "%(size).1f GiB gerektiriyor (sanal makinenin oradaki disklerinin " "%%%(percent)g kadarı, en az %(minimum)g GiB, ve kaydediliyorsa bellek)" -#: vrtManager/instance.py:1982 +#: vrtManager/instance.py:1972 msgid "" "This snapshot was taken by an older version on a UEFI VM and cannot be " "reverted; delete it instead" @@ -9202,7 +9208,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:2012 +#: vrtManager/instance.py:2002 #, python-format msgid "" "The revert failed twice; try again in a moment (%(error)s). The VM is " @@ -9211,7 +9217,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:2014 +#: vrtManager/instance.py:2004 #, python-format msgid "" "The revert failed twice; try again in a moment (%(error)s). The VM is shut " @@ -9220,13 +9226,13 @@ msgstr "" "Geri dönüş iki kez başarısız oldu; biraz sonra tekrar deneyin (%(error)s). " "Sanal makine kapalı." -#: vrtManager/instance.py:2177 +#: vrtManager/instance.py:2167 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:2179 +#: vrtManager/instance.py:2169 msgid "" "A disk of a VM with snapshots, a saved state or a running block job does not " "move" @@ -9234,7 +9240,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:2187 +#: vrtManager/instance.py:2177 #, python-format msgid "" "%(dev)s is not a disk file of the VM, the same in its running and next " @@ -9243,132 +9249,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:2192 +#: vrtManager/instance.py:2182 #, 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:2199 +#: vrtManager/instance.py:2189 #, 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:2201 +#: vrtManager/instance.py:2191 #, 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:2204 +#: vrtManager/instance.py:2194 #, 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:2207 +#: vrtManager/instance.py:2197 #, python-format msgid "%(dev)s is in pool %(pool_name)s already" msgstr "%(dev)s zaten %(pool_name)s havuzunda" -#: vrtManager/instance.py:2211 +#: vrtManager/instance.py:2201 #, 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:2235 +#: vrtManager/instance.py:2225 #, python-format msgid "The copy of %(dev)s ended before it was complete" msgstr "%(dev)s kopyası tamamlanmadan sona erdi" -#: vrtManager/instance.py:2280 +#: vrtManager/instance.py:2270 #, 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:2282 +#: vrtManager/instance.py:2272 #, 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:2289 +#: vrtManager/instance.py:2279 #, 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:2298 +#: vrtManager/instance.py:2288 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:2300 +#: vrtManager/instance.py:2290 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:2310 +#: vrtManager/instance.py:2300 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:2408 +#: vrtManager/instance.py:2398 msgid "Cannot clone a VM whose NVRAM is not a file" msgstr "NVRAM'i dosya olmayan bir sanal makine klonlanamaz" -#: vrtManager/instance.py:2476 +#: vrtManager/instance.py:2466 #, 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:2486 +#: vrtManager/instance.py:2476 msgid "Shut the VM down before cloning it" msgstr "Klonlamadan önce sanal makineyi kapatın" -#: vrtManager/instance.py:2540 +#: vrtManager/instance.py:2530 #, 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:2551 +#: vrtManager/instance.py:2541 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:2554 +#: vrtManager/instance.py:2544 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:2557 +#: vrtManager/instance.py:2547 #, 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:2559 +#: vrtManager/instance.py:2549 #, 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:2564 +#: vrtManager/instance.py:2554 #, 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:2566 +#: vrtManager/instance.py:2556 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:2579 +#: vrtManager/instance.py:2569 #, 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:2598 +#: vrtManager/instance.py:2588 #, python-format msgid "" "Storage pool %(pool)s has %(free).1f GiB free; the clone needs %(size).1f GiB" @@ -9378,20 +9384,20 @@ msgstr "" "gerektiriyor (kopyalanan diskler, artı bunların %%%(percent)g kadarı, en az " "%(minimum)g GiB)" -#: vrtManager/instance.py:2737 +#: vrtManager/instance.py:2727 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:2753 +#: vrtManager/instance.py:2743 #, python-format msgid "No network interface with MAC %(old_mac)s" msgstr "MAC adresi %(old_mac)s olan ağ arabirimi yok" -#: vrtManager/instance.py:2756 +#: vrtManager/instance.py:2746 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:2847 +#: vrtManager/instance.py:2837 msgid "" "A VM changes its PCI devices while it runs, or is shut off without a saved " "state" @@ -9399,14 +9405,14 @@ msgstr "" "Sanal makine PCI aygıtlarını çalışırken veya kaydedilmiş durumu olmadan " "kapalıyken değiştirir" -#: vrtManager/instance.py:2859 +#: vrtManager/instance.py:2849 #, 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:2861 +#: vrtManager/instance.py:2851 #, python-format msgid "" "%(err)s; PCI device %(address)s: the VM is not running, its next start has it" @@ -9414,7 +9420,7 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: sanal makine çalışmıyor, sonraki başlatmada " "var" -#: vrtManager/instance.py:2863 +#: vrtManager/instance.py:2853 #, python-format msgid "" "%(err)s; PCI device %(address)s: the VM is not running, its next start does " @@ -9423,7 +9429,7 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: sanal makine çalışmıyor, sonraki başlatmada " "yok" -#: vrtManager/instance.py:2864 +#: vrtManager/instance.py:2854 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM has it, its next start has it" @@ -9431,7 +9437,7 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: çalışan sanal makinede var, sonraki " "başlatmada var" -#: vrtManager/instance.py:2866 +#: vrtManager/instance.py:2856 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM has it, its next start does " @@ -9440,7 +9446,7 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: çalışan sanal makinede var, sonraki " "başlatmada yok" -#: vrtManager/instance.py:2868 +#: vrtManager/instance.py:2858 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM does not have it, its next " @@ -9449,7 +9455,7 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: çalışan sanal makinede yok, sonraki " "başlatmada var" -#: vrtManager/instance.py:2870 +#: vrtManager/instance.py:2860 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM does not have it, its next " @@ -9458,34 +9464,34 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: çalışan sanal makinede yok, sonraki " "başlatmada yok" -#: vrtManager/instance.py:2904 +#: vrtManager/instance.py:2894 #, python-format msgid "The VM has no PCI device %(address)s" msgstr "Sanal makinede %(address)s PCI aygıtı yok" -#: vrtManager/instance.py:2922 +#: vrtManager/instance.py:2912 msgid "The VM has no USB controller" msgstr "Sanal makinede USB denetleyicisi yok" -#: vrtManager/instance.py:2941 +#: vrtManager/instance.py:2931 msgid "The VM has no such USB device" msgstr "Sanal makinede böyle bir USB aygıtı yok" -#: vrtManager/instance.py:2955 +#: vrtManager/instance.py:2945 #, python-format msgid "The VM has no network interface %(mac)s" msgstr "Sanal makinede %(mac)s ağ arabirimi yok" -#: vrtManager/instance.py:2986 +#: vrtManager/instance.py:2976 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:3013 +#: vrtManager/instance.py:3003 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:3032 +#: vrtManager/instance.py:3022 #, 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 7faa28fb032d4a25530f30296526d8e046f2f7e2..8a0ff608e348015d0f8e67f7df2c31af651f659d 100644 GIT binary patch delta 42980 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 z

|Mh9Z+UlZF4JY!Bi$P}d{sUW?RPb)Nmgv)ovUj#Z{yI4nzAJbek!b(DwSUe9Rs z8EF&A)Q3veDKqLi%{_tmM9Q`#Z4}{)RNCR2IzCz6G1L={=eph!&P%>F7OzElegE(_ zl8}KO4W@#kWa>hEm`$Oce^2}Z&l>Y=n{`;}QD`KXXIV*min{6(E@vG{LfR!73{Sk^ zH}zGwyx}9b_PvVM+Ztp#L?y?mq_H|g_=9TYYUS{@SmmkcOb@~f$(NVAIN^i1nX)6X z6Y6S9zI;}{OL2dOAw4ku4D_(Q_2_GceC^P8=t`oBJ;J zOY#=PAZ}eh5&uHDMwI`K_)@FC7*?l^^4JXhpZOz{3{mku_g2EAtP+A=0V?^9%I5Rz z3YDE9E!Wq|tYiI&7iToJc~;$KZ5a;b`CFc4#&?wcdL5zu{nU3^^FNvg6UnfVry*os zO2MgC$wD&e8cLqW+&>cj)f%5qC7Azc^c;sKtou9i2_XVEapq_<< z&vM_d#GwmE*NlYu&C%^w8iZmh*qBe$n5T@ERPvu1P9v|Y!C-fZ!1BK?qE%*xDzw}<~ zn`lNOmOzs?H$4Y?p27P^|BHP8on!fylDEm@5H@kKW4s-5f5FlP4iPipilxv_68Bi- zC0fCk;s0UA0rfkb)dX&V(*^c}_!!-4NQgSU9kPR1>^b!b zco4pud`^$*M%SQRSHY8?tN3~X7G>sDI5U7DCjzT>lYqtg`r3#QhDPa^6ZhcU!0pQI zpudB!(Z7kVk^DEkyA00~2RLqtWxMn{iKXB<@DX@oVeljQ|DRz11CKzc&^M9N%eTSC zHUFtkI7z+6!d+Y}!yu3L($tOgZRna66V6jOVV(0(4-ouB{{ATjZQ;F$qJZDXlSDsJ z>>AOB=pF-0IPetSCk9Rt^L7g75G=@&7|{&R&}IYLU$~pPMKwYA)$m;MA+Qe6reqJq zyxkU@{&j|K;0E<5&9S0*>-6lai}xS+dwj!L*M&sZWx7&UvLB0Nre+T2moqOX66SW( GVDJn-4@Ery delta 42922 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 %(limit)s)" msgid "None available device name" msgstr "没有可用的设备名称" -#: instances/utils.py:398 +#: instances/utils.py:402 #, python-format msgid "%(hostname)s via %(address)s" msgstr "%(hostname)s,经由 %(address)s" -#: instances/utils.py:437 +#: instances/utils.py:441 msgid "Invalid MAC address" msgstr "无效的 MAC 地址" -#: instances/utils.py:439 +#: instances/utils.py:443 msgid "More MAC addresses than networks" msgstr "MAC 地址数量多于网络数量" @@ -5626,31 +5632,31 @@ msgstr " 其上的任务可在菜单的“任务”中跟踪。" msgid "'%(name)s' is no longer on its host." msgstr "“%(name)s”已不在其主机上。" -#: instances/views.py:374 +#: instances/views.py:373 msgid "There is no other host to migrate to." msgstr "没有其他可迁移到的主机。" -#: instances/views.py:376 +#: instances/views.py:375 msgid "A VM migrates when it is running, paused or shut off." msgstr "虚拟机在运行、暂停或关机状态下均可迁移。" -#: instances/views.py:378 +#: instances/views.py:377 msgid "" "A VM with snapshots cannot be migrated: its snapshots stay on this host. " "Delete them first." msgstr "有快照的虚拟机无法迁移:其快照保留在本主机上。请先删除快照。" -#: instances/views.py:380 +#: instances/views.py:379 msgid "" "A VM with host devices cannot be migrated: the destination may not have them." " Remove them first." msgstr "有主机设备的虚拟机无法迁移:目标主机可能没有这些设备。请先移除它们。" -#: instances/views.py:643 instances/views.py:644 +#: instances/views.py:654 instances/views.py:655 msgid "The VM was moved meanwhile; try again." msgstr "该虚拟机在此期间已被移动;请重试。" -#: instances/views.py:760 +#: instances/views.py:771 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 " @@ -5660,7 +5666,7 @@ msgstr "" "运行中的虚拟机在此总线上没有可用 PCI 插槽来添加磁盘:如果虚拟机有 SCSI 控制器,请选择 scsi " "总线;或关闭虚拟机后再添加磁盘。“磁盘”选项卡上的“添加 PCIe 插槽”可使其从下次启动起获得可用插槽。新卷会保留在其存储池中,可作为现有卷挂载。" -#: instances/views.py:764 +#: instances/views.py:775 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" @@ -5670,258 +5676,258 @@ msgstr "" "运行中的虚拟机没有可用 PCI 插槽来添加磁盘所需的 SCSI 控制器:请关闭虚拟机后再添加磁盘。“磁盘”选项卡上的“添加 PCIe " "插槽”可使其从下次启动起获得可用插槽。新卷会保留在其存储池中,可作为现有卷挂载。" -#: instances/views.py:782 +#: instances/views.py:793 #, python-format msgid "Invalid disk options: %(options)s" msgstr "无效的磁盘选项:%(options)s" -#: instances/views.py:999 +#: instances/views.py:1010 #, python-format msgid "Set the gstfsd key of %(compute)s first (Computes, edit the host)" msgstr "请先设置 %(compute)s 的 gstfsd 密钥(计算节点,编辑该主机)" -#: instances/views.py:1006 instances/views.py:1024 instances/views.py:1033 +#: instances/views.py:1017 instances/views.py:1035 instances/views.py:1044 #, python-format msgid "gstfsd error: %(err)s" msgstr "gstfsd 错误:%(err)s" -#: instances/views.py:1034 +#: instances/views.py:1045 msgid "the reply is not signed with the key" msgstr "回复未使用该密钥签名" -#: instances/views.py:1042 +#: instances/views.py:1053 msgid "Shut the VM down, or start its QEMU guest agent, and try again" msgstr "请关闭虚拟机,或启动其 QEMU 客户机代理,然后重试" -#: instances/views.py:1055 +#: instances/views.py:1066 msgid "The change may still be made when the agent answers again." msgstr "当代理再次响应时,此更改仍可能生效。" -#: instances/views.py:1083 +#: instances/views.py:1094 msgid "Reset root password" msgstr "重置 root 密码" -#: instances/views.py:1087 +#: instances/views.py:1098 msgid "Enter a password" msgstr "请输入密码" -#: instances/views.py:1101 +#: instances/views.py:1112 msgid "Select an SSH public key" msgstr "请选择 SSH 公钥" -#: instances/views.py:1123 +#: instances/views.py:1134 #, python-format msgid "Installed new SSH public key %(keyname)s" msgstr "已安装新的 SSH 公钥 %(keyname)s" -#: instances/views.py:1143 +#: instances/views.py:1154 msgid "Enter a whole number of vCPUs" msgstr "请输入整数个 vCPU" -#: instances/views.py:1147 +#: instances/views.py:1158 msgid "Shut off the VM to change its vCPUs" msgstr "请关闭虚拟机以更改其 vCPU" -#: instances/views.py:1150 +#: instances/views.py:1161 msgid "The current vCPUs cannot be more than the maximum" msgstr "当前 vCPU 数不能超过最大值" -#: instances/views.py:1157 +#: instances/views.py:1168 #, python-format msgid "%(quota)s: cannot resize the CPU of '%(instance_name)s'." msgstr "%(quota)s:无法调整“%(instance_name)s”的 CPU。" -#: instances/views.py:1165 +#: instances/views.py:1176 #, python-format msgid "vCPUs set to %(cur)s (maximum %(max)s)" msgstr "vCPU 已设为 %(cur)s(最大 %(max)s)" -#: instances/views.py:1184 +#: instances/views.py:1195 msgid "Enter a whole number for memory" msgstr "请输入整数内存值" -#: instances/views.py:1187 +#: instances/views.py:1198 msgid "The current memory cannot be more than the maximum" msgstr "当前内存不能超过最大值" -#: instances/views.py:1191 +#: instances/views.py:1202 #, python-format msgid "%(quota)s: cannot resize the memory of '%(instance_name)s'." msgstr "%(quota)s:无法调整“%(instance_name)s”的内存。" -#: instances/views.py:1197 +#: instances/views.py:1208 #, python-format msgid "Memory set to %(cur)s MiB (maximum %(max)s MiB)" msgstr "内存已设为 %(cur)s MiB(最大 %(max)s MiB)" -#: instances/views.py:1217 +#: instances/views.py:1228 msgid "Enter disk sizes as whole GiB" msgstr "请以整数 GiB 输入磁盘大小" -#: instances/views.py:1221 +#: instances/views.py:1232 #, python-format msgid "%(dev)s is %(size)s: a disk cannot shrink" msgstr "%(dev)s 为 %(size)s:磁盘不能缩小" -#: instances/views.py:1229 +#: instances/views.py:1240 msgid "No disks were selected or valid for resizing." msgstr "未选择磁盘或没有可调整大小的有效磁盘。" -#: instances/views.py:1238 +#: instances/views.py:1249 #, python-format msgid "%(quota)s: cannot resize the disks of '%(instance_name)s'." msgstr "%(quota)s:无法调整“%(instance_name)s”的磁盘。" -#: instances/views.py:1250 +#: instances/views.py:1261 #, python-format msgid "The storage pool of %(dev)s cannot resize its volumes" msgstr "%(dev)s 所在的存储池无法调整其卷的大小" -#: instances/views.py:1252 +#: instances/views.py:1263 #, python-format msgid "Disk is resized: %(dev)s" msgstr "磁盘已调整大小:%(dev)s" -#: instances/views.py:1346 +#: instances/views.py:1357 msgid "The VM's machine has no PCIe slots to add" msgstr "该虚拟机的机器类型没有可添加的 PCIe 插槽" -#: instances/views.py:1351 +#: instances/views.py:1362 #, python-format msgid "%(count)s PCIe slots added" msgstr "已添加 %(count)s 个 PCIe 插槽" -#: instances/views.py:1353 +#: instances/views.py:1364 #, python-format msgid "%(count)s PCIe slots added: the VM gets them at its next start" msgstr "已添加 %(count)s 个 PCIe 插槽:虚拟机在下次启动时获得它们" -#: instances/views.py:1399 +#: instances/views.py:1410 #, python-format msgid "%(volume)s is already a disk of this VM" msgstr "%(volume)s 已是此虚拟机的磁盘" -#: instances/views.py:1489 +#: instances/views.py:1500 msgid "Volume changes are applied. But it will be activated after shutdown" msgstr "卷更改已应用,但将在关机后生效" -#: instances/views.py:1494 +#: instances/views.py:1505 msgid "Volume is changed successfully." msgstr "卷已成功更改。" -#: instances/views.py:1512 +#: instances/views.py:1523 #, python-format msgid "Disk %(dev)s is not a storage volume of this instance" msgstr "磁盘 %(dev)s 不是此虚拟机的存储卷" -#: instances/views.py:1519 +#: instances/views.py:1530 #, python-format msgid "Disk %(dev)s has a pending change; delete it once the VM is shut down" msgstr "磁盘 %(dev)s 有待生效的更改;请在虚拟机关机后删除它" -#: instances/views.py:1534 +#: instances/views.py:1545 #, python-format msgid "Volume %(vol)s is used by another VM; detach it instead" msgstr "卷 %(vol)s 正被另一台虚拟机使用;请改为分离它" -#: instances/views.py:1546 +#: instances/views.py:1557 #, 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:1557 +#: instances/views.py:1568 #, python-format msgid "Disk %(dev)s was detached, but its volume was kept: %(err)s" msgstr "磁盘 %(dev)s 已分离,但其卷已保留:%(err)s" -#: instances/views.py:1583 +#: instances/views.py:1594 #, python-format msgid "This VM cannot take a CD-ROM on the %(bus)s bus now" msgstr "该虚拟机现在无法在 %(bus)s 总线上添加 CD-ROM" -#: instances/views.py:1586 +#: instances/views.py:1597 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:1591 +#: instances/views.py:1602 #, python-format msgid "%(image)s is already in a CD-ROM of this VM" msgstr "%(image)s 已在此虚拟机的某个光驱中" -#: instances/views.py:1672 +#: instances/views.py:1683 #, python-format msgid "Pool %(pool)s was not read again: %(err)s" msgstr "未重新读取存储池 %(pool)s:%(err)s" -#: instances/views.py:1693 +#: instances/views.py:1704 #, python-format msgid "Snapshot was not deleted: %(err)s" msgstr "快照未删除:%(err)s" -#: instances/views.py:1808 +#: instances/views.py:1819 msgid "Add at least one device to the boot order." msgstr "请至少向启动顺序中添加一个设备。" -#: instances/views.py:1822 +#: instances/views.py:1833 msgid "Boot order changed. It applies at the next start." msgstr "启动顺序已更改,将在下次启动时生效。" -#: instances/views.py:1824 +#: instances/views.py:1835 msgid "Boot order changed successfully." msgstr "启动顺序已成功更改。" -#: instances/views.py:1844 +#: instances/views.py:1855 msgid "The XML is empty" msgstr "XML 为空" -#: instances/views.py:1848 instances/views.py:2473 +#: instances/views.py:1859 instances/views.py:2484 #, python-format msgid "The XML is not well-formed: %(error)s" msgstr "XML 格式不正确:%(error)s" -#: instances/views.py:1850 +#: instances/views.py:1861 #, python-format msgid "The XML must keep the VM's UUID %(uuid)s." msgstr "XML 必须保留虚拟机的 UUID %(uuid)s。" -#: instances/views.py:1854 +#: instances/views.py:1865 msgid "" "The definition has changed since the editor was opened. Reload the page to " "edit the current one." msgstr "自打开编辑器以来定义已被更改。请重新加载页面以编辑当前定义。" -#: instances/views.py:1866 +#: instances/views.py:1877 msgid "The XML definition was saved." msgstr "XML 定义已保存。" -#: instances/views.py:1868 +#: instances/views.py:1879 msgid "The XML definition was saved; the VM uses it from its next start." msgstr "XML 定义已保存;虚拟机从下次启动起使用它。" -#: instances/views.py:1949 +#: instances/views.py:1960 msgid "Select one network interface to change" msgstr "请选择一个要更改的网络接口" -#: instances/views.py:1987 +#: instances/views.py:1998 msgid "Network Device Config is changed. Please shutdown instance to activate." msgstr "网络设备配置已更改。请关闭虚拟机以使其生效。" -#: instances/views.py:1989 +#: instances/views.py:2000 msgid "Network device changed" msgstr "网络设备已更改" -#: instances/views.py:2001 +#: instances/views.py:2012 msgid "No network selected" msgstr "未选择网络" -#: instances/views.py:2006 +#: instances/views.py:2017 #, python-format msgid "The VM already has a network device with MAC %(mac)s" msgstr "虚拟机已有 MAC 地址为 %(mac)s 的网络设备" -#: instances/views.py:2025 +#: instances/views.py:2036 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 " @@ -5929,129 +5935,129 @@ msgid "" msgstr "" "运行中的虚拟机没有可用 PCI 插槽来添加网络设备:请关机后再添加设备。“磁盘”选项卡上的“添加 PCIe 插槽”可使其从下次启动起获得可用插槽。" -#: instances/views.py:2066 instances/views.py:2072 +#: instances/views.py:2077 instances/views.py:2083 msgid "The VM has it" msgstr "虚拟机已有此设备" -#: instances/views.py:2103 +#: instances/views.py:2114 #, python-format msgid "The host has no USB device %(device)s" msgstr "主机上没有 USB 设备 %(device)s" -#: instances/views.py:2124 +#: instances/views.py:2135 #, python-format msgid "The host has no PCI device %(device)s" msgstr "主机上没有 PCI 设备 %(device)s" -#: instances/views.py:2142 +#: instances/views.py:2153 #, 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:2187 instances/views.py:2217 +#: instances/views.py:2198 instances/views.py:2228 msgid "Select a network interface and a QoS direction" msgstr "请选择网络接口和 QoS 方向" -#: instances/views.py:2190 vrtManager/network.py:454 +#: instances/views.py:2201 vrtManager/network.py:454 msgid "QoS rates must be whole numbers" msgstr "QoS 速率必须为整数" -#: instances/views.py:2197 networks/views.py:230 +#: instances/views.py:2208 networks/views.py:230 #, python-format msgid "%(qos_dir)s QoS is set" msgstr "%(qos_dir)s QoS 已设置" -#: instances/views.py:2202 +#: instances/views.py:2213 #, 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:2224 networks/views.py:256 +#: instances/views.py:2235 networks/views.py:256 #, python-format msgid "%(qos_dir)s QoS is deleted" msgstr "%(qos_dir)s QoS 已删除" -#: instances/views.py:2229 +#: instances/views.py:2240 #, 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:2257 +#: instances/views.py:2268 msgid "Only one owner is allowed and the one already added" msgstr "只允许一个所有者,且已添加" -#: instances/views.py:2259 +#: instances/views.py:2270 #, python-format msgid "%(user)s is already an owner" msgstr "%(user)s 已是所有者" -#: instances/views.py:2304 +#: instances/views.py:2315 #, python-format msgid "Console settings were not saved: %(errors)s" msgstr "控制台设置未保存:%(errors)s" -#: instances/views.py:2326 +#: instances/views.py:2337 msgid "" "Error setting console password. You should check that your instance have an " "graphic device." msgstr "设置控制台密码出错。请检查虚拟机是否有图形设备。" -#: instances/views.py:2373 +#: instances/views.py:2384 msgid "Shut the VM down to change whether it is a template." msgstr "请关闭虚拟机以更改其是否为模板。" -#: instances/views.py:2379 +#: instances/views.py:2390 #, python-format msgid "%(quota)s: '%(instance_name)s' stays a template." msgstr "%(quota)s:“%(instance_name)s”仍为模板。" -#: instances/views.py:2461 +#: instances/views.py:2472 msgid "The XML has no name" msgstr "XML 中没有名称" -#: instances/views.py:2475 webvirtcloud/middleware.py:151 +#: instances/views.py:2486 webvirtcloud/middleware.py:156 #, python-format msgid "libvirt Error - %(exception)s" msgstr "libvirt 错误 - %(exception)s" -#: instances/views.py:2482 +#: instances/views.py:2493 msgid "An empty disk of the size you set" msgstr "按设定大小创建的空磁盘" -#: instances/views.py:2483 +#: instances/views.py:2494 msgid "Volumes already in a pool" msgstr "存储池中已有的卷" -#: instances/views.py:2484 +#: instances/views.py:2495 msgid "A copy of a template volume" msgstr "模板卷的副本" -#: instances/views.py:2573 +#: instances/views.py:2584 msgid "You haven't defined any storage pools" msgstr "您尚未定义任何存储池" -#: instances/views.py:2575 +#: instances/views.py:2586 msgid "You haven't defined any network pools" msgstr "您尚未定义任何网络池" -#: instances/views.py:2638 +#: instances/views.py:2649 msgid "Flavor Created" msgstr "规格已创建" -#: instances/views.py:2646 +#: instances/views.py:2657 msgid "Create Flavor" msgstr "创建规格" -#: instances/views.py:2658 +#: instances/views.py:2669 msgid "Flavor Deleted" msgstr "规格已删除" -#: instances/views.py:2664 +#: instances/views.py:2675 msgid "Only the size template goes; VMs made from it keep their size." msgstr "仅删除此规格;由它创建的虚拟机保持其大小。" @@ -7245,31 +7251,31 @@ msgstr "字母、数字、点、短横线和下划线。副本包含该过滤器 msgid "%(phase)s (over its time limit)" msgstr "%(phase)s(已超出时间限制)" -#: operations/jobs.py:151 +#: operations/jobs.py:153 msgid "This form was already submitted for another request; reload the page" msgstr "此表单已为另一个请求提交过;请重新加载页面" -#: operations/jobs.py:157 +#: operations/jobs.py:159 msgid "The form has no valid submission key; reload the page" msgstr "表单没有有效的提交密钥;请重新加载页面" -#: operations/jobs.py:203 +#: operations/jobs.py:205 msgid "This job cannot be cancelled once it has started" msgstr "此任务开始后无法取消" -#: operations/jobs.py:206 +#: operations/jobs.py:211 msgid "The job has already ended" msgstr "任务已经结束" -#: operations/jobs.py:254 +#: operations/jobs.py:265 msgid "Choose succeeded or failed" msgstr "请选择成功或失败" -#: operations/jobs.py:257 +#: operations/jobs.py:268 msgid "Write a note on what was checked" msgstr "请写下检查了哪些内容" -#: operations/jobs.py:261 +#: operations/jobs.py:272 msgid "Only an uncertain job can be resolved" msgstr "只能处理状态不确定的任务" @@ -8579,120 +8585,120 @@ msgid "" "with '.'" msgstr "快照名称为 1-64 个字母、数字、'.'、'_' 或 '-',且不能以 '.' 开头" -#: vrtManager/instance.py:1086 +#: vrtManager/instance.py:1076 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:1098 +#: vrtManager/instance.py:1088 msgid "Invalid Device Type for boot order" msgstr "启动顺序的设备类型无效" -#: vrtManager/instance.py:1101 +#: vrtManager/instance.py:1091 #, python-format msgid "Boot device %(dev)s is not in the definition" msgstr "启动设备 %(dev)s 不在定义中" -#: vrtManager/instance.py:1121 +#: vrtManager/instance.py:1111 #, python-format msgid "CD-ROM %(dev)s is not in the running definition" msgstr "CD-ROM %(dev)s 不在运行中的定义中" -#: vrtManager/instance.py:1122 +#: vrtManager/instance.py:1112 #, python-format msgid "CD-ROM %(dev)s is not in the persistent definition" msgstr "CD-ROM %(dev)s 不在持久定义中" -#: vrtManager/instance.py:1134 +#: vrtManager/instance.py:1124 #, python-format msgid "Media of %(dev)s changed in the running VM only: %(err)s" msgstr "%(dev)s 的介质仅在运行中的虚拟机中更改:%(err)s" -#: vrtManager/instance.py:1145 +#: vrtManager/instance.py:1135 #, python-format msgid "ISO image %(image)s was not found" msgstr "未找到 ISO 镜像 %(image)s" -#: vrtManager/instance.py:1147 +#: vrtManager/instance.py:1137 #, python-format msgid "ISO image %(image)s is in more than one storage pool" msgstr "ISO 镜像 %(image)s 位于多个存储池中" -#: vrtManager/instance.py:1254 +#: vrtManager/instance.py:1244 #, python-format msgid "Disk %(target_dev)s is not in the VM's definition" msgstr "磁盘 %(target_dev)s 不在虚拟机的定义中" -#: vrtManager/instance.py:1382 +#: vrtManager/instance.py:1372 msgid "Please shutdown the instance then try to enable vCPU hotplug" msgstr "请先关闭虚拟机,再启用 vCPU 热插拔" -#: vrtManager/instance.py:1669 +#: vrtManager/instance.py:1659 msgid "The VM has no video card" msgstr "虚拟机没有显卡" -#: vrtManager/instance.py:1843 +#: vrtManager/instance.py:1833 msgid "" "The VM has external snapshots; internal snapshots cannot be mixed with them" msgstr "虚拟机有外部快照;内部快照不能与其混用" -#: vrtManager/instance.py:1875 +#: vrtManager/instance.py:1865 msgid "A snapshot with memory is not quiesced; it keeps the whole guest state" msgstr "含内存的快照不会静默文件系统;它保存整个客户机状态" -#: vrtManager/instance.py:1877 +#: vrtManager/instance.py:1867 msgid "Only a running VM's file systems can be frozen" msgstr "只有运行中的虚拟机的文件系统可以冻结" -#: vrtManager/instance.py:1879 +#: vrtManager/instance.py:1869 msgid "The QEMU guest agent is not connected; it freezes the file systems" msgstr "QEMU 客户机代理未连接;文件系统由它冻结" -#: vrtManager/instance.py:1882 +#: vrtManager/instance.py:1872 msgid "" "The VM has internal snapshots; external snapshots cannot be mixed with them" msgstr "虚拟机有内部快照;外部快照不能与其混用" -#: vrtManager/instance.py:1887 +#: vrtManager/instance.py:1877 msgid "Newer snapshots exist after the last revert; delete them first" msgstr "上次还原后存在更新的快照;请先删除它们" -#: vrtManager/instance.py:1890 +#: vrtManager/instance.py:1880 msgid "No snapshot is current; revert to a snapshot first" msgstr "没有当前快照;请先还原到某个快照" -#: vrtManager/instance.py:1896 +#: vrtManager/instance.py:1886 #, python-format msgid "Eject the media from %(dev)s first" msgstr "请先弹出 %(dev)s 中的介质" -#: vrtManager/instance.py:1898 +#: vrtManager/instance.py:1888 #, python-format msgid "Disk %(dev)s is not a file; external snapshots need file disks" msgstr "磁盘 %(dev)s 不是文件;外部快照需要文件磁盘" -#: vrtManager/instance.py:1906 +#: vrtManager/instance.py:1896 #, python-format msgid "" "The storage pools could not be refreshed, so their free space is unknown: " "%(err)s" msgstr "无法刷新存储池,其可用空间未知:%(err)s" -#: vrtManager/instance.py:1927 +#: vrtManager/instance.py:1917 msgid "Memory is saved only from a running VM" msgstr "只能保存运行中的虚拟机的内存" -#: vrtManager/instance.py:1929 +#: vrtManager/instance.py:1919 msgid "The VM has no disk to keep its memory next to" msgstr "虚拟机没有可存放其内存的磁盘" -#: vrtManager/instance.py:1933 +#: vrtManager/instance.py:1923 #, python-format msgid "%(disk)s is not in a storage pool; memory is saved only into one" msgstr "%(disk)s 不在存储池中;内存只能保存到存储池中" -#: vrtManager/instance.py:1964 +#: vrtManager/instance.py:1954 #, python-format msgid "" "Storage pool %(pool)s has %(free).1f GiB free; the snapshot needs %(size).1f " @@ -8702,156 +8708,156 @@ msgstr "" "存储池 %(pool)s 可用 %(free).1f GiB;快照需要 %(size).1f GiB(其中虚拟机磁盘的 %(percent)g%%,至少 " "%(minimum)g GiB,若保存内存则另加内存)" -#: vrtManager/instance.py:1982 +#: vrtManager/instance.py:1972 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:2012 +#: vrtManager/instance.py:2002 #, python-format msgid "" "The revert failed twice; try again in a moment (%(error)s). The VM is " "running." msgstr "还原两次失败;请稍后重试(%(error)s)。虚拟机正在运行。" -#: vrtManager/instance.py:2014 +#: vrtManager/instance.py:2004 #, 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:2177 +#: vrtManager/instance.py:2167 msgid "A disk moves when its VM is defined and running, paused or shut off" msgstr "仅当虚拟机已定义且处于运行、暂停或关机状态时才能移动磁盘" -#: vrtManager/instance.py:2179 +#: vrtManager/instance.py:2169 msgid "" "A disk of a VM with snapshots, a saved state or a running block job does not " "move" msgstr "有快照、保存的状态或正在运行块任务的虚拟机的磁盘不能移动" -#: vrtManager/instance.py:2187 +#: vrtManager/instance.py:2177 #, 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:2192 +#: vrtManager/instance.py:2182 #, python-format msgid "%(dev)s does not move: only writable raw and qcow2 disks do" msgstr "%(dev)s 不能移动:只能移动可写的 raw 和 qcow2 磁盘" -#: vrtManager/instance.py:2199 +#: vrtManager/instance.py:2189 #, python-format msgid "%(dev)s does not move: no storage pool has %(path)s" msgstr "%(dev)s 不能移动:没有存储池包含 %(path)s" -#: vrtManager/instance.py:2201 +#: vrtManager/instance.py:2191 #, python-format msgid "%(dev)s does not move: it has a backing file" msgstr "%(dev)s 不能移动:它有后备文件" -#: vrtManager/instance.py:2204 +#: vrtManager/instance.py:2194 #, python-format msgid "%(pool_name)s is not an active pool of disk files of this host" msgstr "%(pool_name)s 不是此主机上活动的磁盘文件存储池" -#: vrtManager/instance.py:2207 +#: vrtManager/instance.py:2197 #, python-format msgid "%(dev)s is in pool %(pool_name)s already" msgstr "%(dev)s 已在存储池 %(pool_name)s 中" -#: vrtManager/instance.py:2211 +#: vrtManager/instance.py:2201 #, python-format msgid "Pool %(pool_name)s already has a file %(name)s" msgstr "存储池 %(pool_name)s 中已有文件 %(name)s" -#: vrtManager/instance.py:2235 +#: vrtManager/instance.py:2225 #, python-format msgid "The copy of %(dev)s ended before it was complete" msgstr "%(dev)s 的复制在完成前结束" -#: vrtManager/instance.py:2280 +#: vrtManager/instance.py:2270 #, 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:2282 +#: vrtManager/instance.py:2272 #, 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:2289 +#: vrtManager/instance.py:2279 #, python-format msgid "The VM has no internal snapshot named %(name)s" msgstr "虚拟机没有名为 %(name)s 的内部快照" -#: vrtManager/instance.py:2298 +#: vrtManager/instance.py:2288 msgid "The VM has a saved state; start it or remove the saved state first" msgstr "虚拟机有保存的状态;请先启动它或删除保存的状态" -#: vrtManager/instance.py:2300 +#: vrtManager/instance.py:2290 msgid "A snapshot job is still running on this VM; try again when it ends" msgstr "此虚拟机上仍有快照任务在运行;请在其结束后重试" -#: vrtManager/instance.py:2310 +#: vrtManager/instance.py:2300 msgid "Shut the VM down to revert to an internal snapshot" msgstr "请关闭虚拟机后再还原到内部快照" -#: vrtManager/instance.py:2408 +#: vrtManager/instance.py:2398 msgid "Cannot clone a VM whose NVRAM is not a file" msgstr "NVRAM 不是文件的虚拟机无法克隆" -#: vrtManager/instance.py:2476 +#: vrtManager/instance.py:2466 #, python-format msgid "Clone failed (%(err)s); remove these copies by hand: %(path)s" msgstr "克隆失败(%(err)s);请手动删除这些副本:%(path)s" -#: vrtManager/instance.py:2486 +#: vrtManager/instance.py:2476 msgid "Shut the VM down before cloning it" msgstr "请先关闭虚拟机再克隆" -#: vrtManager/instance.py:2540 +#: vrtManager/instance.py:2530 #, python-format msgid "Clone failed (%(err)s); remove these copies by hand: %(leftovers)s" msgstr "克隆失败(%(err)s);请手动删除这些副本:%(leftovers)s" -#: vrtManager/instance.py:2551 +#: vrtManager/instance.py:2541 msgid "Live clone needs libvirt 11.10 or later; shut the VM down to clone it" msgstr "在线克隆需要 libvirt 11.10 或更高版本;请关闭虚拟机后再克隆" -#: vrtManager/instance.py:2554 +#: vrtManager/instance.py:2544 msgid "A VM with a TPM is cloned only shut down" msgstr "带 TPM 的虚拟机只能在关机时克隆" -#: vrtManager/instance.py:2557 +#: vrtManager/instance.py:2547 #, python-format msgid "Disk %(dev)s is not a local file; shut the VM down to clone it" msgstr "磁盘 %(dev)s 不是本地文件;请关闭虚拟机后再克隆" -#: vrtManager/instance.py:2559 +#: vrtManager/instance.py:2549 #, python-format msgid "Disk %(dev)s is shareable; shut the VM down to clone it" msgstr "磁盘 %(dev)s 是可共享的;请关闭虚拟机后再克隆" -#: vrtManager/instance.py:2564 +#: vrtManager/instance.py:2554 #, python-format msgid "Disk %(dev)s changes at the next start; shut the VM down to clone it" msgstr "磁盘 %(dev)s 在下次启动时会改变;请关闭虚拟机后再克隆" -#: vrtManager/instance.py:2566 +#: vrtManager/instance.py:2556 msgid "Another job is running on the VM; clone it when that ends" msgstr "虚拟机上有另一个任务正在运行;请在其结束后再克隆" -#: vrtManager/instance.py:2579 +#: vrtManager/instance.py:2569 #, python-format msgid "Volume %(name)s already exists in storage pool %(pool)s" msgstr "卷 %(name)s 已存在于存储池 %(pool)s 中" -#: vrtManager/instance.py:2598 +#: vrtManager/instance.py:2588 #, python-format msgid "" "Storage pool %(pool)s has %(free).1f GiB free; the clone needs %(size).1f GiB" @@ -8860,97 +8866,97 @@ msgstr "" "存储池 %(pool)s 可用 %(free).1f GiB;克隆需要 %(size).1f GiB(复制的磁盘,再加其 %(percent)g%%,至少" " %(minimum)g GiB)" -#: vrtManager/instance.py:2737 +#: vrtManager/instance.py:2727 msgid "A network interface that is a host device is removed in the XML editor" msgstr "作为主机设备的网络接口需在 XML 编辑器中删除" -#: vrtManager/instance.py:2753 +#: vrtManager/instance.py:2743 #, python-format msgid "No network interface with MAC %(old_mac)s" msgstr "没有 MAC 为 %(old_mac)s 的网络接口" -#: vrtManager/instance.py:2756 +#: vrtManager/instance.py:2746 msgid "A network interface that is a host device is changed in the XML editor" msgstr "作为主机设备的网络接口需在 XML 编辑器中修改" -#: vrtManager/instance.py:2847 +#: vrtManager/instance.py:2837 msgid "" "A VM changes its PCI devices while it runs, or is shut off without a saved " "state" msgstr "虚拟机只能在运行时或无保存的状态的关机时更改其 PCI 设备" -#: vrtManager/instance.py:2859 +#: vrtManager/instance.py:2849 #, 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:2861 +#: vrtManager/instance.py:2851 #, 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:2863 +#: vrtManager/instance.py:2853 #, 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:2864 +#: vrtManager/instance.py:2854 #, 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:2866 +#: vrtManager/instance.py:2856 #, 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:2868 +#: vrtManager/instance.py:2858 #, 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:2870 +#: vrtManager/instance.py:2860 #, 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:2904 +#: vrtManager/instance.py:2894 #, python-format msgid "The VM has no PCI device %(address)s" msgstr "虚拟机没有 PCI 设备 %(address)s" -#: vrtManager/instance.py:2922 +#: vrtManager/instance.py:2912 msgid "The VM has no USB controller" msgstr "虚拟机没有 USB 控制器" -#: vrtManager/instance.py:2941 +#: vrtManager/instance.py:2931 msgid "The VM has no such USB device" msgstr "虚拟机没有此 USB 设备" -#: vrtManager/instance.py:2955 +#: vrtManager/instance.py:2945 #, python-format msgid "The VM has no network interface %(mac)s" msgstr "虚拟机没有网络接口 %(mac)s" -#: vrtManager/instance.py:2986 +#: vrtManager/instance.py:2976 msgid "The VM has its own RNG device: change it in the XML editor" msgstr "虚拟机有自己的 RNG 设备:请在 XML 编辑器中修改" -#: vrtManager/instance.py:3013 +#: vrtManager/instance.py:3003 msgid "The VM has its own TPM: change it in the XML editor" msgstr "虚拟机有自己的 TPM:请在 XML 编辑器中修改" -#: vrtManager/instance.py:3032 +#: vrtManager/instance.py:3022 #, python-format msgid "Unknown crash action %(action)s" msgstr "未知的崩溃操作 %(action)s" diff --git a/static/js/vm_addresses.js b/static/js/vm_addresses.js new file mode 100644 index 00000000..9e30d8ad --- /dev/null +++ b/static/js/vm_addresses.js @@ -0,0 +1,20 @@ +// The VM's addresses come once the page has loaded: the guest agent may take +// its whole timeout (instances.views.nic_addresses). An element with +// data-address-family shows those of the NICs in data-address-mac (MACs +// separated by spaces: not the guest's own bridges); data-empty when there +// are none. +(function () { + const places = document.querySelectorAll("[data-address-family]"); + const show = (found) => { + for (const place of places) { + const nics = place.dataset.addressMac.split(" ").filter(Boolean).map((mac) => found[mac] || {}); + const addresses = nics.flatMap((nic) => nic[place.dataset.addressFamily] || []); + place.textContent = addresses.join(", ") || place.dataset.empty; + place.classList.toggle("text-body-secondary", !addresses.length); + } + }; + fetch(document.currentScript.dataset.url, {headers: {Accept: "application/json"}}) + .then((response) => (response.ok ? response.json() : {})) + .catch(() => ({})) + .then(show); +})(); diff --git a/vrtManager/instance.py b/vrtManager/instance.py index 7cdadf0d..e0bfb5e2 100644 --- a/vrtManager/instance.py +++ b/vrtManager/instance.py @@ -795,15 +795,11 @@ class wvmInstance(wvmConnect): pcpus = hostinfo[4] * hostinfo[5] * hostinfo[6] * hostinfo[7] return range(1, max(int(pcpus), at_least) + 1) - def get_interface_addresses(self, iface_mac): - """The running VM's addresses of the NIC with iface_mac: (IPv4, IPv6 - with prefix), from the guest agent when it has some, else from the - host's ARP table; (None, None) when neither has one. Read once in a - cached_reads block: the agent may take its whole timeout.""" - return self._cached("addresses", self._read_addresses).get(iface_mac, (None, None)) - - def _read_addresses(self): - """{MAC: (IPv4 list, IPv6 list)}: each MAC's addresses from the first source that has some.""" + def get_addresses(self): + """The running VM's addresses, {MAC: (IPv4 list, IPv6 list with + prefix)}, each MAC's from the first source that has some: the guest + agent, else the host's ARP table. The agent may take its whole + timeout: the VM page reads them after it loads (views.nic_addresses).""" if self.get_status() != 1: return {} sources = [] @@ -856,10 +852,6 @@ class wvmInstance(wvmConnect): out_burst = out_attr.get("burst") outbound = {"average": out_av, "peak": out_peak, "burst": out_burst} - try: - ipv4, ipv6 = self.get_interface_addresses(mac_inst) - except libvirtError: - ipv4, ipv6 = None, None result.append( { "type": interface_type, @@ -868,8 +860,6 @@ class wvmInstance(wvmConnect): "target": target_inst, "state": link_state, "model": model_type, - "ipv4": ipv4, - "ipv6": ipv6, "filterref": filterref_inst, "inbound": inbound, "outbound": outbound, diff --git a/vrtManager/tests/test_instance_getters.py b/vrtManager/tests/test_instance_getters.py index 3e625f52..cb969c33 100644 --- a/vrtManager/tests/test_instance_getters.py +++ b/vrtManager/tests/test_instance_getters.py @@ -26,7 +26,6 @@ XML = """ def proxy(): p = wvmInstance.__new__(wvmInstance) # no connection: only these calls - p._read_addresses = dict # no addresses p._XMLDesc = lambda flags: XML volumes = {"/iso/x.iso": ("x.iso", "iso")} diff --git a/vrtManager/tests/test_interface_addresses.py b/vrtManager/tests/test_interface_addresses.py index cda5b4f9..3dafc054 100644 --- a/vrtManager/tests/test_interface_addresses.py +++ b/vrtManager/tests/test_interface_addresses.py @@ -1,7 +1,7 @@ """A running VM's addresses come from the guest agent when it answers and from the host's ARP table, so a VM without an agent shows its IPv4 address. The agent is asked with a timeout: interfaceAddresses() would wait for a -hung agent indefinitely, and the VM page with it.""" +hung agent indefinitely; the VM page asks for them after it loads.""" import json import unittest @@ -38,32 +38,31 @@ class InterfaceAddressesTestCase(unittest.TestCase): def test_a_vm_without_an_agent_shows_its_arp_address(self): inst = vm(agent=False) - self.assertEqual(inst.get_interface_addresses(MAC), (["192.0.2.10"], [])) + self.assertEqual(inst.get_addresses(), {MAC: (["192.0.2.10"], [])}) self.agent.assert_not_called() def test_the_agents_address_comes_first_and_is_asked_with_a_timeout(self): inst = vm(agent=True) - self.assertEqual(inst.get_interface_addresses(MAC), (["192.0.2.20"], ["2001:db8::20/64"])) + self.assertEqual(inst.get_addresses(), {MAC: (["192.0.2.20"], ["2001:db8::20/64"])}) self.agent.assert_called_once_with(inst.instance, '{"execute": "guest-network-get-interfaces"}', 10, 0) self.assertEqual([c.args for c in inst.instance.interfaceAddresses.call_args_list], [(VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_ARP,)]) - def test_the_addresses_are_read_once_in_a_page_and_again_after_it(self): + def test_the_vm_s_definition_does_not_read_them(self): inst = vm(agent=True) - with inst.cached_reads(): - inst.get_interface_addresses(MAC) - inst.get_interface_addresses("52:54:00:00:00:02") - self.assertEqual(self.agent.call_count, 1) - # outside a page's block, a new read: a NIC's address can change - inst.get_interface_addresses(MAC) - self.assertEqual(self.agent.call_count, 2) + inst._XMLDesc = lambda flags: f"" + self.assertEqual([nic["mac"] for nic in inst.get_net_devices()], [MAC]) + self.agent.assert_not_called() + inst.instance.interfaceAddresses.assert_not_called() - def test_a_mac_without_addresses_has_none(self): - self.assertEqual(vm(agent=False).get_interface_addresses("52:54:00:00:00:02"), (None, None)) + def test_a_vm_that_does_not_run_has_none(self): + inst = vm(agent=True) + inst.get_status.return_value = 5 + self.assertEqual(inst.get_addresses(), {}) def test_an_agent_that_does_not_answer_leaves_the_arp_address(self): self.agent.side_effect = libvirtError("guest agent didn't respond to command within '10' seconds") - self.assertEqual(vm(agent=True).get_interface_addresses(MAC), (["192.0.2.10"], [])) + self.assertEqual(vm(agent=True).get_addresses(), {MAC: (["192.0.2.10"], [])}) class OsInfoTestCase(unittest.TestCase): diff --git a/webvirtcloud/tests/test_authorization_matrix.py b/webvirtcloud/tests/test_authorization_matrix.py index 5e8addab..96b585f4 100644 --- a/webvirtcloud/tests/test_authorization_matrix.py +++ b/webvirtcloud/tests/test_authorization_matrix.py @@ -83,6 +83,7 @@ DENIED = (403, 404) VIEW_VM = { "instances:instance", "instances:status", + "instances:nic_addresses", "instances:stats", "instances:osinfo", "instances:sshkeys",