From 528b4492f615786e10ebf9c8cf96230e4f54139f Mon Sep 17 00:00:00 2001 From: catborise Date: Sat, 7 Nov 2026 14:22:47 +0300 Subject: [PATCH] fix(logs): a row says what happened: a recovered migration, a failed clone step, a device not there - A migration whose libvirt call failed but which recovery finds moved (or cannot tell) gets a row of that end; only a failure already logged by migrate_instance is not logged twice. - A clone made with its resize or start failed, and a recovered migration whose autostart or NVRAM step failed, write a failed row of that step, as migrate_instance does for its later steps. - Setting the link state of an interface or the video model of a VM that has none is refused: it changed nothing and was logged as done. - The rows of a removed VM record (deleted or expired) name its host, VM and UUID, so the VM's history has them. --- admin/tests/test_tombstones.py | 4 + admin/views.py | 3 +- computes/tests/test_ownership.py | 6 +- computes/utils.py | 2 +- instances/jobs.py | 25 ++- instances/tests/test_clone_job.py | 4 + instances/tests/test_migrate_job.py | 28 ++- instances/utils.py | 11 +- locale/tr/LC_MESSAGES/django.mo | Bin 194329 -> 194507 bytes locale/tr/LC_MESSAGES/django.po | 297 +++++++++++++------------- locale/zh/LC_MESSAGES/django.mo | Bin 181719 -> 181882 bytes locale/zh/LC_MESSAGES/django.po | 297 +++++++++++++------------- vrtManager/instance.py | 5 + vrtManager/tests/test_device_edits.py | 12 ++ 14 files changed, 390 insertions(+), 304 deletions(-) diff --git a/admin/tests/test_tombstones.py b/admin/tests/test_tombstones.py index 11e793ff..cce11668 100644 --- a/admin/tests/test_tombstones.py +++ b/admin/tests/test_tombstones.py @@ -8,6 +8,7 @@ from django.urls import reverse from django.utils import timezone from instances.models import InstanceTombstone +from logs.models import Logs UUID = "00000000-0000-4000-8000-000000000001" @@ -57,3 +58,6 @@ class TombstoneTests(TestCase): self.assertRedirects(response, reverse("admin:tombstone_list")) self.assertContains(response, "Removed VM ts-vm deleted") self.assertFalse(InstanceTombstone.objects.exists()) + # the VM's history (found by UUID) has it + self.assertEqual(list(Logs.objects.filter(message__startswith="Removed VM").values_list("host", "instance", "instance_uuid")), + [("ts-host", "ts-vm", UUID)]) diff --git a/admin/views.py b/admin/views.py index 998ee82e..cf32fe92 100644 --- a/admin/views.py +++ b/admin/views.py @@ -343,7 +343,8 @@ def tombstone_list(request): def tombstone_delete(request, pk): tombstone = get_object_or_404(InstanceTombstone, pk=pk) if request.method == "POST": - with audit(request, None, f"Removed VM {tombstone.name} ({tombstone.uuid})", "delete"): + with audit(request, tombstone.host or None, f"Removed VM {tombstone.name} ({tombstone.uuid})", "delete", + instance=tombstone.name, uuid=tombstone.uuid): tombstone.delete() messages.success(request, _("Removed VM %(name)s deleted") % {"name": tombstone.name}) return redirect("admin:tombstone_list") diff --git a/computes/tests/test_ownership.py b/computes/tests/test_ownership.py index 047fa02c..a074cdf3 100644 --- a/computes/tests/test_ownership.py +++ b/computes/tests/test_ownership.py @@ -109,7 +109,7 @@ class OwnershipTestCase(TestCase): self.assertEqual(self.ownership(self.host_a), (False, [])) self.assertFalse(InstanceTombstone.objects.exists()) - self.assertIn(("-", "-", f"VM vm ({UUID}): removed record expired"), self.rows()) + self.assertIn(("-", "host-a", f"VM vm ({UUID}): removed record expired"), self.rows()) @override_settings(INSTANCE_OWNERSHIP_RETENTION_DAYS=30) def test_a_removed_record_expires_while_nothing_changes(self): @@ -120,7 +120,9 @@ class OwnershipTestCase(TestCase): refresh_instance_database(self.host_b) # its VMs match the database self.assertFalse(InstanceTombstone.objects.exists()) - self.assertIn(("-", "-", f"VM vm ({UUID}): removed record expired"), self.rows()) + # the VM's history (found by UUID) has it + self.assertTrue(Logs.objects.filter(instance_uuid=UUID, instance="vm", message__endswith="expired").exists()) + self.assertIn(("-", "host-a", f"VM vm ({UUID}): removed record expired"), self.rows()) def test_deleted_users_are_skipped(self): self.owned_vm(self.host_a) diff --git a/computes/utils.py b/computes/utils.py index 2efd7393..c7605832 100644 --- a/computes/utils.py +++ b/computes/utils.py @@ -212,7 +212,7 @@ def refresh_instance_database(compute): # ownership is restored. expired = InstanceTombstone.objects.filter(removed__lt=cutoff) for t in expired: - write("-", "-", "", f"VM {t.name} ({t.uuid}): removed record expired", True) + write("-", t.host or "-", t.name, f"VM {t.name} ({t.uuid}): removed record expired", True, uuid=t.uuid) expired.delete() for uuid, name in host_domains.items(): if uuid not in db_uuids: diff --git a/instances/jobs.py b/instances/jobs.py index 1956a0bf..064c9747 100644 --- a/instances/jobs.py +++ b/instances/jobs.py @@ -225,6 +225,8 @@ def _finish_clone(op, clone, warning): proxy.start() except libvirtError as err: notes += say(_("The clone is made, but not as asked: %(error)s"), error=err) + write(op.username, c.name, op.intent["name"], f"VM {op.intent['name']}: resize or start the clone: " + f"{safe_text(err)}", False, uuid=op.intent["uuid"]) return {"warning": notes} if notes else {} @@ -966,17 +968,25 @@ def _moved(op, dest): stopped before it: autostart is per host, and the source keeps the NVRAM file. The job's result, with a warning for a step that failed.""" notes = [] + source, _sep, name = op.resource_label.rpartition("/") + target = Compute.objects.get(pk=op.params["target"]).name + + def failed(action, err): # as migrate_instance logs its later steps + write(op.username, source, name, f"VM {name}: {action}: {safe_text(err)}", False, uuid=op.intent["uuid"]) + if op.intent.get("autostart"): try: dest.setAutostart(1) except libvirtError as err: notes += say(_("The VM migrated, but autostart could not be set on the destination: %(error)s"), error=err) + failed(f"restore autostart on {target}", err) if nvram := op.intent.get("nvram"): try: _connect(op.intent["compute"]).remove_nvram(nvram, _connect(op.params["target"])) except libvirtError as err: notes += say(_("The VM migrated, but its NVRAM file stays on the source: %(error)s"), error=err) + failed(f"remove NVRAM file {nvram} on the source", err) return {"warning": notes} if notes else {} @@ -1034,8 +1044,13 @@ class MigrateInstance(Kind): try: utils.migrate_instance(Compute.objects.get(pk=p["target"]), instance, op.user, disk_pools=p["disk_pools"], + on_moved=lambda: ctx.record_intent(outcome_logged=True), **{k: p[k] for k in MIGRATE_OPTIONS}) - except libvirtError as err: + except Exception as err: + # migrate_instance wrote the error's Logs row; recovery may still find the VM moved + ctx.record_intent(failure_logged=True) + if not isinstance(err, libvirtError): + raise op.refresh_from_db(fields=["cancel_requested"]) if op.cancel_requested: raise Cancelled from None @@ -1045,15 +1060,13 @@ class MigrateInstance(Kind): if isinstance(err, util.OperationError): raise raise util.OperationError(str(err)) from err - finally: - # migrate_instance wrote the outcome's Logs row (log_entry) - ctx.record_intent(outcome_logged=True) return {} def log_entry(self, op, state): """A row for an end migrate_instance did not log: refused before it - ran, cancelled while queued, or ended by recovery.""" - if op.intent.get("outcome_logged"): + ran, cancelled while queued, or ended by recovery other than the + failure migrate_instance logged.""" + if op.intent.get("outcome_logged") or (op.intent.get("failure_logged") and state == Operation.FAILED): return None target = Compute.objects.filter(pk=op.params["target"]).values_list("name", flat=True).first() return _log(op, state, f"migrate to {target}") diff --git a/instances/tests/test_clone_job.py b/instances/tests/test_clone_job.py index bbcd6eeb..dd9d486c 100644 --- a/instances/tests/test_clone_job.py +++ b/instances/tests/test_clone_job.py @@ -17,6 +17,7 @@ from appsettings.settings import get_settings from computes.models import Compute from instances.jobs import CloneInstance from instances.models import Instance +from logs.models import Logs from operations.utils import words from operations.jobs import Cancelled, Context from vrtManager.util import ConnectionFailed, OperationError @@ -148,6 +149,9 @@ class CloneJobTestCase(TransactionTestCase): op, result = self.clone_with(**{"clone-start": "true"}) self.assertTrue(Instance.objects.filter(uuid=op.intent["uuid"]).exists()) self.assertIn("The clone is made, but not as asked", words(result["warning"])) + # the job succeeded: Logs has the step that failed too + self.assertTrue(Logs.objects.filter(instance_uuid=op.intent["uuid"], success=False, + message="VM copy: resize or start the clone: no memory").exists()) def queued(self): self.client.post(reverse("instances:clone", args=[self.source.pk]), diff --git a/instances/tests/test_migrate_job.py b/instances/tests/test_migrate_job.py index 8c72d25e..f528fcd2 100644 --- a/instances/tests/test_migrate_job.py +++ b/instances/tests/test_migrate_job.py @@ -11,6 +11,7 @@ from appsettings.settings import get_settings from computes.models import Compute from instances.jobs import MigrateInstance from instances.models import Instance +from logs.models import Logs from libvirt import VIR_DOMAIN_XML_INACTIVE, VIR_ERR_SYSTEM_ERROR, VIR_FROM_RPC, libvirtError from operations.jobs import Cancelled, Context, get_kind from operations.models import Claim, Operation, acquire @@ -124,6 +125,8 @@ class MigrateJobTestCase(TransactionTestCase): outcome = MigrateInstance().reconcile(op) self.assertEqual(outcome.state, Operation.SUCCEEDED) self.assertIn("autostart could not be set", outcome.result["warning"][0]["text"]) + self.assertTrue(Logs.objects.filter(instance_uuid=UUID, success=False, + message="VM mig-vm: restore autostart on mig-dst: refused").exists()) def test_a_copy_claims_its_volume_on_both_computes(self): Instance.proxy.get_disk_devices.return_value = [ @@ -261,8 +264,6 @@ class MigrateJobTestCase(TransactionTestCase): proxy.return_value.instance.abortJob.assert_not_called() def test_each_end_of_a_migration_leaves_one_logs_row(self): - from logs.models import Logs - op = self.queue(live_migrate="true") ctx = self.start(op) get_kind(op.kind).run(op, ctx) # migrate_instance writes its row @@ -275,6 +276,29 @@ class MigrateJobTestCase(TransactionTestCase): self.assertEqual(MigrateInstance().log_entry(queued, Operation.CANCELLED), ("mig-src", "mig-vm", UUID, "VM mig-vm: migrate to mig-dst (cancelled)")) + def test_a_failed_migration_recovery_finds_moved_has_a_row_of_that_end(self): + op = self.queue(live_migrate="true") + ctx = self.start(op) + self.dest_conn.moveto.side_effect = libvirtError("connection reset while migrating") + with self.assertRaises(Exception): + get_kind(op.kind).run(op, ctx) # migrate_instance writes the failed row + op.refresh_from_db() + self.assertIsNone(MigrateInstance().log_entry(op, Operation.FAILED)) # that row is the end + for state, message in ((Operation.SUCCEEDED, "VM mig-vm: migrate to mig-dst"), + (Operation.UNCERTAIN, "VM mig-vm: migrate to mig-dst (uncertain)")): + with self.subTest(state): + self.assertEqual(MigrateInstance().log_entry(op, state)[3], message) + + def test_a_migration_moved_then_failed_to_record_has_its_row_once(self): + op = self.queue(live_migrate="true") + ctx = self.start(op) + with patch("instances.utils.record_migration", side_effect=RuntimeError("database locked")), \ + self.assertRaises(RuntimeError): + get_kind(op.kind).run(op, ctx) # the migration's row, then the failed record's + op.refresh_from_db() + self.assertIsNone(MigrateInstance().log_entry(op, Operation.SUCCEEDED)) # recovery finds it moved + self.assertEqual(Logs.objects.filter(instance_uuid=UUID, message__startswith="VM mig-vm: migrate (").count(), 1) + def test_recording_a_migration_holds_the_ownership_lock(self): # a sync of a third compute must not move the owners at the same time from instances import utils diff --git a/instances/utils.py b/instances/utils.py index 4c94d317..bf5c9d92 100644 --- a/instances/utils.py +++ b/instances/utils.py @@ -214,13 +214,14 @@ def migrate_instance( compress=False, delete_source=False, disk_pools=None, + on_moved=None, ): """Migrates instance to new_compute and logs the outcome (the mode used, or the error), then each later step that failed in a row of its - own. disk_pools: {target: pool} of the disks copied into pools of - new_compute (moveto's pools); their source files go with delete_source - unless another VM or volume uses them, and are named in the log - otherwise. Returns the mode.""" + own; on_moved is called once the outcome's row is written. disk_pools: + {target: pool} of the disks copied into pools of new_compute (moveto's + pools); their source files go with delete_source unless another VM or + volume uses them, and are named in the log otherwise. Returns the mode.""" source, target = instance.compute, migration_target(new_compute) def log(action, error=None): @@ -259,6 +260,8 @@ def migrate_instance( # The VM runs on new_compute now: what follows must not stop it # from being recorded there. log(f"migrate ({mode}) to {target}") + if on_moved is not None: # its row is written: a later step that raises does not undo it + on_moved() if autostart: conn_new = None try: diff --git a/locale/tr/LC_MESSAGES/django.mo b/locale/tr/LC_MESSAGES/django.mo index 9c88723cf3f0b2cdd333bd6632b40bfdb7f64f4d..f788e810301431e39e7f307533e30cc88bb17087 100644 GIT binary patch delta 43000 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 HNzC~V0_WmC delta 42886 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ğKbd)fr9#g!MxCBw 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, 2020\n" "Language-Team: Turkish (https://www.transifex.com/catborise/teams/110663/tr/)\n" @@ -21,7 +21,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: accounts/auth.py:22 +#: accounts/auth.py:22 accounts/middleware.py:28 msgid "Change your password before using the API." msgstr "API'yi kullanmadan önce parolanızı değiştirin." @@ -1157,12 +1157,12 @@ msgstr "" msgid "deleted user" msgstr "silinmiş kullanıcı" -#: admin/views.py:348 +#: admin/views.py:349 #, python-format msgid "Removed VM %(name)s deleted" msgstr "Kaldırılan sanal makine %(name)s silindi" -#: admin/views.py:355 +#: admin/views.py:356 msgid "Its owners no longer get the VM back if its UUID shows up again." msgstr "" "UUID'si yeniden görünse bile sahipleri sanal makineyi artık geri almaz." @@ -2750,7 +2750,7 @@ msgstr "Klonun adını boş adlar listesinden seçin" msgid "%(quota)s: cannot create '%(clone_name)s'." msgstr "%(quota)s: '%(clone_name)s' oluşturulamıyor." -#: instances/jobs.py:200 instances/jobs.py:552 +#: instances/jobs.py:200 instances/jobs.py:554 #, python-format msgid "Instance '%(clone_name)s' already exists!" msgstr "'%(clone_name)s' sanal makinesi zaten mevcut!" @@ -2775,11 +2775,11 @@ msgstr "Disk adı '%(disk_name)s' geçersiz karakterler içeriyor!" msgid "The clone is made, but not as asked: %(error)s" msgstr "Klon oluşturuldu, ama istendiği gibi değil: %(error)s" -#: instances/jobs.py:283 +#: instances/jobs.py:285 msgid "The VM was not defined and no volume of it was left." msgstr "Sanal makine tanımlanmadı ve ondan geriye birim kalmadı." -#: instances/jobs.py:285 +#: instances/jobs.py:287 #, python-format msgid "" "The VM was not defined; check these volumes, then resolve this job: " @@ -2788,28 +2788,28 @@ msgstr "" "Sanal makine tanımlanmadı; şu birimleri kontrol edin, sonra bu işi çözün: " "%(volumes)s" -#: instances/jobs.py:306 +#: instances/jobs.py:308 msgid "Delete snapshot" msgstr "Anlık görüntüyü sil" -#: instances/jobs.py:316 vrtManager/instance.py:2287 +#: instances/jobs.py:318 vrtManager/instance.py:2288 #, 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" -#: instances/jobs.py:329 +#: instances/jobs.py:331 msgid "Merging the snapshot" msgstr "Anlık görüntü birleştiriliyor" -#: instances/jobs.py:348 +#: instances/jobs.py:350 msgid "The VM is no longer on its compute" msgstr "Sanal makine artık kendi sunucusunda değil" -#: instances/jobs.py:351 +#: instances/jobs.py:353 msgid "libvirt is still merging the snapshot" msgstr "libvirt anlık görüntüyü hâlâ birleştiriyor" -#: instances/jobs.py:359 +#: instances/jobs.py:361 msgid "" "The snapshot is still listed and no merge runs. It cannot be told whether the" " disks changed; check the VM before deleting the snapshot again or reverting " @@ -2819,44 +2819,44 @@ msgstr "" "değişmediği bilinemiyor; anlık görüntüyü yeniden silmeden ya da ona dönmeden " "önce sanal makineyi kontrol edin." -#: instances/jobs.py:366 +#: instances/jobs.py:368 msgid "The VM is no longer on the compute the job ran on" msgstr "Sanal makine artık işin çalıştığı sunucuda değil" -#: instances/jobs.py:372 +#: instances/jobs.py:374 msgid "Take snapshot" msgstr "Anlık görüntü al" -#: instances/jobs.py:384 instances/jobs.py:393 vrtManager/instance.py:1883 +#: instances/jobs.py:386 instances/jobs.py:395 vrtManager/instance.py:1884 #, python-format msgid "A snapshot named %(name)s already exists" msgstr "%(name)s adında bir anlık görüntü zaten var" -#: instances/jobs.py:399 +#: instances/jobs.py:401 msgid "Taking the snapshot" msgstr "Anlık görüntü alınıyor" -#: instances/jobs.py:412 +#: instances/jobs.py:414 msgid "libvirt is still taking the snapshot" msgstr "libvirt anlık görüntüyü hâlâ alıyor" -#: instances/jobs.py:415 +#: instances/jobs.py:417 msgid "The snapshot was not taken" msgstr "Anlık görüntü alınmadı" -#: instances/jobs.py:438 +#: instances/jobs.py:440 msgid "Revert snapshot" msgstr "Snapshota dön" -#: instances/jobs.py:469 +#: instances/jobs.py:471 msgid "Reverting the VM" msgstr "Sanal makine geri döndürülüyor" -#: instances/jobs.py:480 +#: instances/jobs.py:482 msgid "libvirt is still reverting the VM" msgstr "libvirt sanal makineyi hâlâ geri döndürüyor" -#: instances/jobs.py:484 +#: instances/jobs.py:486 msgid "" "It cannot be told whether the VM was reverted; check it, then revert again or" " resolve this job." @@ -2864,12 +2864,12 @@ msgstr "" "Sanal makinenin geri döndürülüp döndürülmediği bilinemiyor; kontrol edin, " "sonra yeniden geri döndürün ya da bu işi çözün." -#: instances/jobs.py:501 +#: instances/jobs.py:503 msgid "The VM must be running, paused or shut off to be cloned" msgstr "" "Klonlanmak için sanal makine çalışıyor, duraklatılmış ya da kapalı olmalı" -#: instances/jobs.py:502 +#: instances/jobs.py:504 #, python-format msgid "" "The guest's file systems could not be thawed (%(error)s); thaw them with: " @@ -2878,19 +2878,19 @@ msgstr "" "Konuğun dosya sistemleri çözülemedi (%(error)s); şununla çözün: virsh " "domfsthaw %(vm)s" -#: instances/jobs.py:521 +#: instances/jobs.py:523 msgid "Clone VM" msgstr "Sanal makineyi klonla" -#: instances/jobs.py:562 instances/jobs.py:569 instances/jobs.py:847 +#: instances/jobs.py:564 instances/jobs.py:571 instances/jobs.py:849 msgid "Copying disks" msgstr "Diskler kopyalanıyor" -#: instances/jobs.py:621 +#: instances/jobs.py:623 msgid "libvirt has no result of the copy" msgstr "libvirt'te kopyanın sonucu yok" -#: instances/jobs.py:632 +#: instances/jobs.py:634 #, python-format msgid "" "The copy failed: %(error)s. The guest's file systems could not be thawed " @@ -2899,11 +2899,11 @@ msgstr "" "Kopyalama başarısız oldu: %(error)s. Konuğun dosya sistemleri çözülemedi " "(%(thaw)s); şununla çözün: virsh domfsthaw %(vm)s" -#: instances/jobs.py:635 instances/jobs.py:722 +#: instances/jobs.py:637 instances/jobs.py:724 msgid "The copy failed" msgstr "Kopyalama başarısız oldu" -#: instances/jobs.py:660 +#: instances/jobs.py:662 #, python-format msgid "" "The VM is no longer on the compute the job ran on; check these volumes, then " @@ -2912,7 +2912,7 @@ msgstr "" "Sanal makine artık işin çalıştığı sunucuda değil; şu birimleri kontrol edin, " "sonra bu işi çözün: %(volumes)s" -#: instances/jobs.py:698 +#: instances/jobs.py:700 #, python-format msgid "" "A volume of the clone was being created; check these volumes, then resolve " @@ -2921,15 +2921,15 @@ msgstr "" "Klonun bir birimi oluşturuluyordu; şu birimleri kontrol edin, sonra bu işi " "çözün: %(volumes)s" -#: instances/jobs.py:702 +#: instances/jobs.py:704 msgid "The job stopped before the copy started" msgstr "İş, kopyalama başlamadan durdu" -#: instances/jobs.py:709 +#: instances/jobs.py:711 msgid "libvirt is still copying the disks" msgstr "libvirt diskleri hâlâ kopyalıyor" -#: instances/jobs.py:712 +#: instances/jobs.py:714 #, python-format msgid "" "Another backup runs on the VM; check these volumes, then resolve this job: " @@ -2938,7 +2938,7 @@ msgstr "" "Sanal makinede başka bir yedekleme çalışıyor; şu birimleri kontrol edin, " "sonra bu işi çözün: %(volumes)s" -#: instances/jobs.py:717 +#: instances/jobs.py:719 #, python-format msgid "" "libvirt has no result of the copy; check these volumes, then resolve this " @@ -2947,7 +2947,7 @@ msgstr "" "libvirt'te kopyanın sonucu yok; şu birimleri kontrol edin, sonra bu işi " "çözün: %(volumes)s" -#: instances/jobs.py:729 +#: instances/jobs.py:731 #, python-format msgid "" "The disks were copied, but the clone could not be defined: %(error)s; check " @@ -2956,74 +2956,74 @@ msgstr "" "Diskler kopyalandı, ancak klon tanımlanamadı: %(error)s; şu birimleri kontrol" " edin, sonra bu işi çözün: %(volumes)s" -#: instances/jobs.py:752 instances/templates/create_instance_w1.html:60 +#: instances/jobs.py:754 instances/templates/create_instance_w1.html:60 #: instances/templates/create_instance_w2.html:356 msgid "Create VM" msgstr "Sanal makine oluştur" -#: instances/jobs.py:776 instances/jobs.py:821 instances/views.py:2463 +#: instances/jobs.py:778 instances/jobs.py:823 instances/views.py:2463 msgid "A virtual machine with this name already exists" msgstr "Bu isimde bir sanal makine mevcut" -#: instances/jobs.py:778 instances/jobs.py:818 +#: instances/jobs.py:780 instances/jobs.py:820 msgid "There is an instance with same name. Remove it and try again!" msgstr "Aynı isimde başka bir sanal makine var. Onu silip yeniden deneyin!" -#: instances/jobs.py:781 +#: instances/jobs.py:783 msgid "First you need to create or select an image" msgstr "Öncelikle bir imaj oluşturun ya da mevcut bir imajı seçin" -#: instances/jobs.py:783 +#: instances/jobs.py:785 msgid "Choose one disk source: a new disk, existing volumes or a template" msgstr "" "Tek bir disk kaynağı seçin: yeni bir disk, mevcut birimler ya da bir şablon" -#: instances/jobs.py:785 +#: instances/jobs.py:787 msgid "Image has already exist. Please check volumes or change instance name" msgstr "" "İmaj zaten mevcut. Lütfen ya makine adını değişin ya da disk alanlarını " "kontrol edin" -#: instances/jobs.py:787 +#: instances/jobs.py:789 msgid "Invalid cache mode" msgstr "Geçersiz önbellek modu" -#: instances/jobs.py:789 +#: instances/jobs.py:791 #, python-format msgid "This host offers no CPU mode or model %(mode)s" msgstr "Bu sunucu %(mode)s CPU modunu veya modelini sunmuyor" -#: instances/jobs.py:791 +#: instances/jobs.py:793 #, python-format msgid "A CD-ROM cannot use the %(bus)s bus" msgstr "CD-ROM %(bus)s veri yolunu kullanamaz" -#: instances/jobs.py:794 +#: instances/jobs.py:796 msgid "The cloud-init seed is read from a CD-ROM: choose its bus" msgstr "cloud-init tohumu bir CD-ROM'dan okunur: veri yolunu seçin" -#: instances/jobs.py:797 +#: instances/jobs.py:799 msgid "The cloud-init seed needs a directory storage pool for the disk" msgstr "cloud-init tohumu, disk için bir dizin depolama havuzu gerektirir" -#: instances/jobs.py:803 +#: instances/jobs.py:805 #, python-format msgid "This host offers no firmware %(firmware)s" msgstr "Bu sunucu %(firmware)s firmware'ini sunmuyor" -#: instances/jobs.py:805 vrtManager/instance.py:3015 +#: instances/jobs.py:807 vrtManager/instance.py:3020 msgid "This host offers no TPM 2.0: install swtpm on it" msgstr "Bu sunucu TPM 2.0 sunmuyor: üzerine swtpm kurun" -#: instances/jobs.py:866 +#: instances/jobs.py:868 msgid "Writing the cloud-init seed" msgstr "cloud-init tohumu yazılıyor" -#: instances/jobs.py:873 +#: instances/jobs.py:875 msgid "Defining the VM" msgstr "Sanal makine tanımlanıyor" -#: instances/jobs.py:906 +#: instances/jobs.py:908 #, python-format msgid "" "The panel failed unexpectedly; its log has the details. Remove these volumes " @@ -3032,114 +3032,114 @@ msgstr "" "Panel beklenmedik bir hatayla karşılaştı; ayrıntılar panelin günlüğünde. Bu " "birimleri elle kaldırın: %(volumes)s" -#: instances/jobs.py:910 +#: instances/jobs.py:912 #, python-format msgid "%(error)s. Remove these volumes by hand: %(volumes)s" msgstr "%(error)s. Şu birimleri elle silin: %(volumes)s" -#: instances/jobs.py:935 +#: instances/jobs.py:937 #, python-format msgid "The instance is already on %(compute)s" msgstr "Sanal makine zaten %(compute)s üzerinde" -#: instances/jobs.py:937 +#: instances/jobs.py:939 #, python-format msgid "%(compute)s is not reachable" msgstr "%(compute)s sunucusuna ulaşılamıyor" -#: instances/jobs.py:939 +#: instances/jobs.py:941 #, python-format msgid "%(compute)s is the VM's own host under another name" msgstr "%(compute)s, sanal makinenin kendi sunucusunun başka bir adı" -#: instances/jobs.py:973 +#: instances/jobs.py:981 #, python-format msgid "" "The VM migrated, but autostart could not be set on the destination: %(error)s" msgstr "" "Sanal makine taşındı, ancak hedefte otomatik başlatma ayarlanamadı: %(error)s" -#: instances/jobs.py:979 +#: instances/jobs.py:988 #, python-format msgid "The VM migrated, but its NVRAM file stays on the source: %(error)s" msgstr "Sanal makine taşındı, ancak NVRAM dosyası kaynakta kaldı: %(error)s" -#: instances/jobs.py:986 +#: instances/jobs.py:996 msgid "Migrate VM" msgstr "Sanal makineyi taşı" -#: instances/jobs.py:1033 +#: instances/jobs.py:1043 msgid "Migrating the VM" msgstr "Sanal makine taşınıyor" -#: instances/jobs.py:1080 +#: instances/jobs.py:1094 msgid "libvirt is still migrating the VM" msgstr "libvirt sanal makineyi hâlâ taşıyor" -#: instances/jobs.py:1091 +#: instances/jobs.py:1105 msgid "The VM stayed on the source host" msgstr "Sanal makine kaynak sunucuda kaldı" -#: instances/jobs.py:1093 +#: instances/jobs.py:1107 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:1141 +#: instances/jobs.py:1155 msgid "Move disk" msgstr "Diski taşı" -#: instances/jobs.py:1148 +#: instances/jobs.py:1162 msgid "Choose a disk of the VM" msgstr "Sanal makinenin bir diskini seçin" -#: instances/jobs.py:1172 +#: instances/jobs.py:1186 msgid "Copying the disk" msgstr "Disk kopyalanıyor" -#: instances/jobs.py:1215 +#: instances/jobs.py:1229 #, 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:1221 +#: instances/jobs.py:1235 #, 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:1223 +#: instances/jobs.py:1237 #, 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:1230 +#: instances/jobs.py:1244 #, 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:1231 +#: instances/jobs.py:1245 #, 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:1232 +#: instances/jobs.py:1246 #, 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:1286 +#: instances/jobs.py:1300 msgid "Delete VM" msgstr "Sanal makineyi sil" -#: instances/jobs.py:1316 +#: instances/jobs.py:1330 msgid "Deleting the VM" msgstr "Sanal makine siliniyor" -#: instances/jobs.py:1328 +#: instances/jobs.py:1342 msgid "The VM was not deleted; it may have been shut off" msgstr "Sanal makine silinmedi; kapatılmış olabilir" @@ -6351,7 +6351,7 @@ msgstr "%(quota)s: '%(instance_name)s' şablon olarak kalıyor." msgid "The XML has no name" msgstr "XML'de ad yok" -#: instances/views.py:2475 webvirtcloud/middleware.py:126 +#: instances/views.py:2475 webvirtcloud/middleware.py:151 #, python-format msgid "libvirt Error - %(exception)s" msgstr "libvirt Hatası - %(exception)s" @@ -7937,7 +7937,8 @@ msgstr "" msgid "The worker stopped before the job changed anything" msgstr "Worker, iş herhangi bir şeyi değiştirmeden önce durdu" -#: storages/api/viewsets.py:203 storages/api/viewsets.py:224 +#: storages/api/viewsets.py:147 storages/api/viewsets.py:164 +#: storages/api/viewsets.py:202 storages/api/viewsets.py:223 msgid "Pool is not active" msgstr "Havuz etkin değil" @@ -8883,7 +8884,6 @@ msgstr "Bağlantı başarısız: %(host)s bağlı değil" #: vrtManager/connection.py:502 #, python-format -#| msgid "This host has no secrets." msgid "This host has no architecture %(arch)s" msgstr "Bu sunucuda %(arch)s mimarisi yok" @@ -9108,56 +9108,60 @@ 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:1842 +#: vrtManager/instance.py:1669 +msgid "The VM has no video card" +msgstr "Sanal makinede ekran kartı yok" + +#: vrtManager/instance.py:1843 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:1874 +#: vrtManager/instance.py:1875 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:1876 +#: vrtManager/instance.py:1877 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:1878 +#: vrtManager/instance.py:1879 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:1881 +#: vrtManager/instance.py:1882 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:1886 +#: vrtManager/instance.py:1887 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:1889 +#: vrtManager/instance.py:1890 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:1895 +#: vrtManager/instance.py:1896 #, python-format msgid "Eject the media from %(dev)s first" msgstr "Önce %(dev)s içindeki ortamı çıkarın" -#: vrtManager/instance.py:1897 +#: vrtManager/instance.py:1898 #, 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:1905 +#: vrtManager/instance.py:1906 #, python-format msgid "" "The storage pools could not be refreshed, so their free space is unknown: " @@ -9165,21 +9169,21 @@ msgid "" msgstr "" "Depolama havuzları yenilenemedi, bu yüzden boş alanları bilinmiyor: %(err)s" -#: vrtManager/instance.py:1926 +#: vrtManager/instance.py:1927 msgid "Memory is saved only from a running VM" msgstr "Bellek yalnızca çalışan bir sanal makineden kaydedilir" -#: vrtManager/instance.py:1928 +#: vrtManager/instance.py:1929 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:1932 +#: vrtManager/instance.py:1933 #, 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:1963 +#: vrtManager/instance.py:1964 #, python-format msgid "" "Storage pool %(pool)s has %(free).1f GiB free; the snapshot needs %(size).1f " @@ -9190,7 +9194,7 @@ msgstr "" "%(size).1f GiB gerektiriyor (sanal makinenin oradaki disklerinin " "%%%(percent)g kadarı, en az %(minimum)g GiB, ve kaydediliyorsa bellek)" -#: vrtManager/instance.py:1981 +#: vrtManager/instance.py:1982 msgid "" "This snapshot was taken by an older version on a UEFI VM and cannot be " "reverted; delete it instead" @@ -9198,7 +9202,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:2011 +#: vrtManager/instance.py:2012 #, python-format msgid "" "The revert failed twice; try again in a moment (%(error)s). The VM is " @@ -9207,7 +9211,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:2013 +#: vrtManager/instance.py:2014 #, python-format msgid "" "The revert failed twice; try again in a moment (%(error)s). The VM is shut " @@ -9216,13 +9220,13 @@ msgstr "" "Geri dönüş iki kez başarısız oldu; biraz sonra tekrar deneyin (%(error)s). " "Sanal makine kapalı." -#: vrtManager/instance.py:2176 +#: vrtManager/instance.py:2177 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:2178 +#: vrtManager/instance.py:2179 msgid "" "A disk of a VM with snapshots, a saved state or a running block job does not " "move" @@ -9230,7 +9234,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:2186 +#: vrtManager/instance.py:2187 #, python-format msgid "" "%(dev)s is not a disk file of the VM, the same in its running and next " @@ -9239,132 +9243,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:2191 +#: vrtManager/instance.py:2192 #, 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:2198 +#: vrtManager/instance.py:2199 #, 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:2200 +#: vrtManager/instance.py:2201 #, 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:2203 +#: vrtManager/instance.py:2204 #, 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:2206 +#: vrtManager/instance.py:2207 #, python-format msgid "%(dev)s is in pool %(pool_name)s already" msgstr "%(dev)s zaten %(pool_name)s havuzunda" -#: vrtManager/instance.py:2210 +#: vrtManager/instance.py:2211 #, 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:2234 +#: vrtManager/instance.py:2235 #, python-format msgid "The copy of %(dev)s ended before it was complete" msgstr "%(dev)s kopyası tamamlanmadan sona erdi" -#: vrtManager/instance.py:2279 +#: vrtManager/instance.py:2280 #, 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:2281 +#: vrtManager/instance.py:2282 #, 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:2288 +#: vrtManager/instance.py:2289 #, 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:2297 +#: vrtManager/instance.py:2298 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:2299 +#: vrtManager/instance.py:2300 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:2309 +#: vrtManager/instance.py:2310 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:2407 +#: vrtManager/instance.py:2408 msgid "Cannot clone a VM whose NVRAM is not a file" msgstr "NVRAM'i dosya olmayan bir sanal makine klonlanamaz" -#: vrtManager/instance.py:2475 +#: vrtManager/instance.py:2476 #, 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:2485 +#: vrtManager/instance.py:2486 msgid "Shut the VM down before cloning it" msgstr "Klonlamadan önce sanal makineyi kapatın" -#: vrtManager/instance.py:2539 +#: vrtManager/instance.py:2540 #, 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:2550 +#: vrtManager/instance.py:2551 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:2553 +#: vrtManager/instance.py:2554 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:2556 +#: vrtManager/instance.py:2557 #, 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:2558 +#: vrtManager/instance.py:2559 #, 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:2563 +#: vrtManager/instance.py:2564 #, 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:2565 +#: vrtManager/instance.py:2566 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:2578 +#: vrtManager/instance.py:2579 #, 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:2597 +#: vrtManager/instance.py:2598 #, python-format msgid "" "Storage pool %(pool)s has %(free).1f GiB free; the clone needs %(size).1f GiB" @@ -9374,20 +9378,20 @@ msgstr "" "gerektiriyor (kopyalanan diskler, artı bunların %%%(percent)g kadarı, en az " "%(minimum)g GiB)" -#: vrtManager/instance.py:2736 +#: vrtManager/instance.py:2737 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:2752 +#: vrtManager/instance.py:2753 #, python-format msgid "No network interface with MAC %(old_mac)s" msgstr "MAC adresi %(old_mac)s olan ağ arabirimi yok" -#: vrtManager/instance.py:2755 +#: vrtManager/instance.py:2756 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:2846 +#: vrtManager/instance.py:2847 msgid "" "A VM changes its PCI devices while it runs, or is shut off without a saved " "state" @@ -9395,14 +9399,14 @@ msgstr "" "Sanal makine PCI aygıtlarını çalışırken veya kaydedilmiş durumu olmadan " "kapalıyken değiştirir" -#: vrtManager/instance.py:2858 +#: vrtManager/instance.py:2859 #, 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:2860 +#: vrtManager/instance.py:2861 #, python-format msgid "" "%(err)s; PCI device %(address)s: the VM is not running, its next start has it" @@ -9410,7 +9414,7 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: sanal makine çalışmıyor, sonraki başlatmada " "var" -#: vrtManager/instance.py:2862 +#: vrtManager/instance.py:2863 #, python-format msgid "" "%(err)s; PCI device %(address)s: the VM is not running, its next start does " @@ -9419,7 +9423,7 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: sanal makine çalışmıyor, sonraki başlatmada " "yok" -#: vrtManager/instance.py:2863 +#: vrtManager/instance.py:2864 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM has it, its next start has it" @@ -9427,7 +9431,7 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: çalışan sanal makinede var, sonraki " "başlatmada var" -#: vrtManager/instance.py:2865 +#: vrtManager/instance.py:2866 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM has it, its next start does " @@ -9436,7 +9440,7 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: çalışan sanal makinede var, sonraki " "başlatmada yok" -#: vrtManager/instance.py:2867 +#: vrtManager/instance.py:2868 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM does not have it, its next " @@ -9445,7 +9449,7 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: çalışan sanal makinede yok, sonraki " "başlatmada var" -#: vrtManager/instance.py:2869 +#: vrtManager/instance.py:2870 #, python-format msgid "" "%(err)s; PCI device %(address)s: the running VM does not have it, its next " @@ -9454,29 +9458,34 @@ msgstr "" "%(err)s; PCI aygıtı %(address)s: çalışan sanal makinede yok, sonraki " "başlatmada yok" -#: vrtManager/instance.py:2903 +#: vrtManager/instance.py:2904 #, python-format msgid "The VM has no PCI device %(address)s" msgstr "Sanal makinede %(address)s PCI aygıtı yok" -#: vrtManager/instance.py:2921 +#: vrtManager/instance.py:2922 msgid "The VM has no USB controller" msgstr "Sanal makinede USB denetleyicisi yok" -#: vrtManager/instance.py:2940 +#: vrtManager/instance.py:2941 msgid "The VM has no such USB device" msgstr "Sanal makinede böyle bir USB aygıtı yok" -#: vrtManager/instance.py:2981 +#: vrtManager/instance.py:2955 +#, python-format +msgid "The VM has no network interface %(mac)s" +msgstr "Sanal makinede %(mac)s ağ arabirimi yok" + +#: vrtManager/instance.py:2986 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:3008 +#: vrtManager/instance.py:3013 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:3027 +#: vrtManager/instance.py:3032 #, python-format msgid "Unknown crash action %(action)s" msgstr "Bilinmeyen çökme eylemi %(action)s" @@ -9877,16 +9886,16 @@ msgstr "" "%(name)s birimi kullanımda: bir sanal makinenin diski, bir temel (backing) " "dosya ya da bir anlık görüntünün dosyası" -#: vrtManager/util.py:95 +#: vrtManager/util.py:99 #, python-format msgid "The XML is not valid: %(err)s" msgstr "XML geçerli değil: %(err)s" -#: vrtManager/util.py:97 +#: vrtManager/util.py:101 msgid "The XML may not declare a DTD" msgstr "XML bir DTD bildiremez" -#: vrtManager/util.py:143 +#: vrtManager/util.py:147 #, python-format msgid "MAC address must be of the format AA:BB:CC:DD:EE:FF, was %(mac)s" msgstr "MAC adresi AA:BB:CC:DD:EE:FF biçiminde olmalı; girilen: %(mac)s" diff --git a/locale/zh/LC_MESSAGES/django.mo b/locale/zh/LC_MESSAGES/django.mo index 91a258ebb4313bb87cfce4ebad3c5979a603f988..7faa28fb032d4a25530f30296526d8e046f2f7e2 100644 GIT binary patch delta 43005 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 Or(YOD`Nlz`FYphUU|8`0 diff --git a/locale/zh/LC_MESSAGES/django.po b/locale/zh/LC_MESSAGES/django.po index 0995a6d3..48c66a84 100644 --- a/locale/zh/LC_MESSAGES/django.po +++ b/locale/zh/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-11-06 21:10+0000\n" +"POT-Creation-Date: 2026-11-07 11:22+0000\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -18,7 +18,7 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 3.0.1\n" -#: accounts/auth.py:22 +#: accounts/auth.py:22 accounts/middleware.py:28 msgid "Change your password before using the API." msgstr "使用 API 前请先修改密码。" @@ -1128,12 +1128,12 @@ msgstr "其对虚拟机、SSH 密钥和设置的访问将被移除;虚拟机 msgid "deleted user" msgstr "已删除的用户" -#: admin/views.py:348 +#: admin/views.py:349 #, python-format msgid "Removed VM %(name)s deleted" msgstr "已删除已移除的虚拟机 %(name)s" -#: admin/views.py:355 +#: admin/views.py:356 msgid "Its owners no longer get the VM back if its UUID shows up again." msgstr "若其 UUID 再次出现,其所有者将不再恢复对该虚拟机的所有权。" @@ -2653,7 +2653,7 @@ msgstr "请从可用名称列表中选择克隆的名称" msgid "%(quota)s: cannot create '%(clone_name)s'." msgstr "%(quota)s:无法创建“%(clone_name)s”。" -#: instances/jobs.py:200 instances/jobs.py:552 +#: instances/jobs.py:200 instances/jobs.py:554 #, python-format msgid "Instance '%(clone_name)s' already exists!" msgstr "虚拟机 '%(clone_name)s' 已存在!" @@ -2678,339 +2678,339 @@ msgstr "磁盘名称 '%(disk_name)s' 包含无效字符!" msgid "The clone is made, but not as asked: %(error)s" msgstr "克隆已创建,但与要求不符:%(error)s" -#: instances/jobs.py:283 +#: instances/jobs.py:285 msgid "The VM was not defined and no volume of it was left." msgstr "虚拟机未定义,也没有留下它的卷。" -#: instances/jobs.py:285 +#: instances/jobs.py:287 #, python-format msgid "" "The VM was not defined; check these volumes, then resolve this job: " "%(volumes)s" msgstr "虚拟机未定义;请检查这些卷,然后处理此任务:%(volumes)s" -#: instances/jobs.py:306 +#: instances/jobs.py:308 msgid "Delete snapshot" msgstr "删除快照" -#: instances/jobs.py:316 vrtManager/instance.py:2287 +#: instances/jobs.py:318 vrtManager/instance.py:2288 #, python-format msgid "The VM has no external snapshot named %(name)s" msgstr "虚拟机没有名为 %(name)s 的外部快照" -#: instances/jobs.py:329 +#: instances/jobs.py:331 msgid "Merging the snapshot" msgstr "正在合并快照" -#: instances/jobs.py:348 +#: instances/jobs.py:350 msgid "The VM is no longer on its compute" msgstr "虚拟机已不在其计算节点上" -#: instances/jobs.py:351 +#: instances/jobs.py:353 msgid "libvirt is still merging the snapshot" msgstr "libvirt 仍在合并快照" -#: instances/jobs.py:359 +#: instances/jobs.py:361 msgid "" "The snapshot is still listed and no merge runs. It cannot be told whether the" " disks changed; check the VM before deleting the snapshot again or reverting " "to it." msgstr "快照仍在列表中,且没有正在运行的合并。无法判断磁盘是否已更改;再次删除该快照或恢复到它之前,请检查虚拟机。" -#: instances/jobs.py:366 +#: instances/jobs.py:368 msgid "The VM is no longer on the compute the job ran on" msgstr "虚拟机已不在运行该任务的计算节点上" -#: instances/jobs.py:372 +#: instances/jobs.py:374 msgid "Take snapshot" msgstr "创建快照" -#: instances/jobs.py:384 instances/jobs.py:393 vrtManager/instance.py:1883 +#: instances/jobs.py:386 instances/jobs.py:395 vrtManager/instance.py:1884 #, python-format msgid "A snapshot named %(name)s already exists" msgstr "名为 %(name)s 的快照已存在" -#: instances/jobs.py:399 +#: instances/jobs.py:401 msgid "Taking the snapshot" msgstr "正在创建快照" -#: instances/jobs.py:412 +#: instances/jobs.py:414 msgid "libvirt is still taking the snapshot" msgstr "libvirt 仍在创建快照" -#: instances/jobs.py:415 +#: instances/jobs.py:417 msgid "The snapshot was not taken" msgstr "未创建快照" -#: instances/jobs.py:438 +#: instances/jobs.py:440 msgid "Revert snapshot" msgstr "恢复快照" -#: instances/jobs.py:469 +#: instances/jobs.py:471 msgid "Reverting the VM" msgstr "正在恢复虚拟机" -#: instances/jobs.py:480 +#: instances/jobs.py:482 msgid "libvirt is still reverting the VM" msgstr "libvirt 仍在恢复虚拟机" -#: instances/jobs.py:484 +#: instances/jobs.py:486 msgid "" "It cannot be told whether the VM was reverted; check it, then revert again or" " resolve this job." msgstr "无法判断虚拟机是否已恢复;请检查后再次恢复,或处理此任务。" -#: instances/jobs.py:501 +#: instances/jobs.py:503 msgid "The VM must be running, paused or shut off to be cloned" msgstr "虚拟机必须处于运行、暂停或关机状态才能克隆" -#: instances/jobs.py:502 +#: instances/jobs.py:504 #, python-format msgid "" "The guest's file systems could not be thawed (%(error)s); thaw them with: " "virsh domfsthaw %(vm)s" msgstr "无法解冻客户机的文件系统(%(error)s);请用以下命令解冻:virsh domfsthaw %(vm)s" -#: instances/jobs.py:521 +#: instances/jobs.py:523 msgid "Clone VM" msgstr "克隆虚拟机" -#: instances/jobs.py:562 instances/jobs.py:569 instances/jobs.py:847 +#: instances/jobs.py:564 instances/jobs.py:571 instances/jobs.py:849 msgid "Copying disks" msgstr "正在复制磁盘" -#: instances/jobs.py:621 +#: instances/jobs.py:623 msgid "libvirt has no result of the copy" msgstr "libvirt 没有复制的结果" -#: instances/jobs.py:632 +#: instances/jobs.py:634 #, python-format msgid "" "The copy failed: %(error)s. The guest's file systems could not be thawed " "(%(thaw)s); thaw them with: virsh domfsthaw %(vm)s" msgstr "复制失败:%(error)s。无法解冻客户机的文件系统(%(thaw)s);请用以下命令解冻:virsh domfsthaw %(vm)s" -#: instances/jobs.py:635 instances/jobs.py:722 +#: instances/jobs.py:637 instances/jobs.py:724 msgid "The copy failed" msgstr "复制失败" -#: instances/jobs.py:660 +#: instances/jobs.py:662 #, python-format msgid "" "The VM is no longer on the compute the job ran on; check these volumes, then " "resolve this job: %(volumes)s" msgstr "虚拟机已不在运行该任务的计算节点上;请检查这些卷,然后处理此任务:%(volumes)s" -#: instances/jobs.py:698 +#: instances/jobs.py:700 #, python-format msgid "" "A volume of the clone was being created; check these volumes, then resolve " "this job: %(volumes)s" msgstr "克隆的一个卷正在创建中;请检查这些卷,然后处理此任务:%(volumes)s" -#: instances/jobs.py:702 +#: instances/jobs.py:704 msgid "The job stopped before the copy started" msgstr "任务在复制开始前停止" -#: instances/jobs.py:709 +#: instances/jobs.py:711 msgid "libvirt is still copying the disks" msgstr "libvirt 仍在复制磁盘" -#: instances/jobs.py:712 +#: instances/jobs.py:714 #, python-format msgid "" "Another backup runs on the VM; check these volumes, then resolve this job: " "%(volumes)s" msgstr "虚拟机上正在运行另一个备份;请检查这些卷,然后处理此任务:%(volumes)s" -#: instances/jobs.py:717 +#: instances/jobs.py:719 #, python-format msgid "" "libvirt has no result of the copy; check these volumes, then resolve this " "job: %(volumes)s" msgstr "libvirt 没有复制的结果;请检查这些卷,然后处理此任务:%(volumes)s" -#: instances/jobs.py:729 +#: instances/jobs.py:731 #, python-format msgid "" "The disks were copied, but the clone could not be defined: %(error)s; check " "these volumes, then resolve this job: %(volumes)s" msgstr "磁盘已复制,但无法定义克隆:%(error)s;请检查这些卷,然后处理此任务:%(volumes)s" -#: instances/jobs.py:752 instances/templates/create_instance_w1.html:60 +#: instances/jobs.py:754 instances/templates/create_instance_w1.html:60 #: instances/templates/create_instance_w2.html:356 msgid "Create VM" msgstr "创建虚拟机" -#: instances/jobs.py:776 instances/jobs.py:821 instances/views.py:2463 +#: instances/jobs.py:778 instances/jobs.py:823 instances/views.py:2463 msgid "A virtual machine with this name already exists" msgstr "同名虚拟机已存在" -#: instances/jobs.py:778 instances/jobs.py:818 +#: instances/jobs.py:780 instances/jobs.py:820 msgid "There is an instance with same name. Remove it and try again!" msgstr "已存在同名虚拟机。请删除后重试!" -#: instances/jobs.py:781 +#: instances/jobs.py:783 msgid "First you need to create or select an image" msgstr "请先创建或选择一个镜像" -#: instances/jobs.py:783 +#: instances/jobs.py:785 msgid "Choose one disk source: a new disk, existing volumes or a template" msgstr "请选择一种磁盘来源:新磁盘、现有卷或模板" -#: instances/jobs.py:785 +#: instances/jobs.py:787 msgid "Image has already exist. Please check volumes or change instance name" msgstr "镜像已存在。请检查卷或更改虚拟机名称" -#: instances/jobs.py:787 +#: instances/jobs.py:789 msgid "Invalid cache mode" msgstr "无效的缓存模式" -#: instances/jobs.py:789 +#: instances/jobs.py:791 #, python-format msgid "This host offers no CPU mode or model %(mode)s" msgstr "此主机不提供 CPU 模式或型号 %(mode)s" -#: instances/jobs.py:791 +#: instances/jobs.py:793 #, python-format msgid "A CD-ROM cannot use the %(bus)s bus" msgstr "CD-ROM 不能使用 %(bus)s 总线" -#: instances/jobs.py:794 +#: instances/jobs.py:796 msgid "The cloud-init seed is read from a CD-ROM: choose its bus" msgstr "cloud-init 种子从 CD-ROM 读取:请选择其总线" -#: instances/jobs.py:797 +#: instances/jobs.py:799 msgid "The cloud-init seed needs a directory storage pool for the disk" msgstr "cloud-init 种子需要为磁盘使用目录类型的存储池" -#: instances/jobs.py:803 +#: instances/jobs.py:805 #, python-format msgid "This host offers no firmware %(firmware)s" msgstr "此主机不提供固件 %(firmware)s" -#: instances/jobs.py:805 vrtManager/instance.py:3015 +#: instances/jobs.py:807 vrtManager/instance.py:3020 msgid "This host offers no TPM 2.0: install swtpm on it" msgstr "此主机不提供 TPM 2.0:请在主机上安装 swtpm" -#: instances/jobs.py:866 +#: instances/jobs.py:868 msgid "Writing the cloud-init seed" msgstr "正在写入 cloud-init 种子" -#: instances/jobs.py:873 +#: instances/jobs.py:875 msgid "Defining the VM" msgstr "正在定义虚拟机" -#: instances/jobs.py:906 +#: instances/jobs.py:908 #, python-format msgid "" "The panel failed unexpectedly; its log has the details. Remove these volumes " "by hand: %(volumes)s" msgstr "面板发生意外错误;详细信息见面板日志。请手动删除这些卷:%(volumes)s" -#: instances/jobs.py:910 +#: instances/jobs.py:912 #, python-format msgid "%(error)s. Remove these volumes by hand: %(volumes)s" msgstr "%(error)s。请手动删除这些卷:%(volumes)s" -#: instances/jobs.py:935 +#: instances/jobs.py:937 #, python-format msgid "The instance is already on %(compute)s" msgstr "虚拟机已在 %(compute)s 上" -#: instances/jobs.py:937 +#: instances/jobs.py:939 #, python-format msgid "%(compute)s is not reachable" msgstr "无法连接 %(compute)s" -#: instances/jobs.py:939 +#: instances/jobs.py:941 #, python-format msgid "%(compute)s is the VM's own host under another name" msgstr "%(compute)s 是该虚拟机所在主机的另一个名称" -#: instances/jobs.py:973 +#: instances/jobs.py:981 #, python-format msgid "" "The VM migrated, but autostart could not be set on the destination: %(error)s" msgstr "虚拟机已迁移,但无法在目标主机上设置自动启动:%(error)s" -#: instances/jobs.py:979 +#: instances/jobs.py:988 #, python-format msgid "The VM migrated, but its NVRAM file stays on the source: %(error)s" msgstr "虚拟机已迁移,但其 NVRAM 文件仍留在源主机上:%(error)s" -#: instances/jobs.py:986 +#: instances/jobs.py:996 msgid "Migrate VM" msgstr "迁移虚拟机" -#: instances/jobs.py:1033 +#: instances/jobs.py:1043 msgid "Migrating the VM" msgstr "正在迁移虚拟机" -#: instances/jobs.py:1080 +#: instances/jobs.py:1094 msgid "libvirt is still migrating the VM" msgstr "libvirt 仍在迁移虚拟机" -#: instances/jobs.py:1091 +#: instances/jobs.py:1105 msgid "The VM stayed on the source host" msgstr "虚拟机留在了源主机上" -#: instances/jobs.py:1093 +#: instances/jobs.py:1107 msgid "" "The VM is on both computes or on neither; check them, then resolve this job." msgstr "虚拟机同时位于两个计算节点上,或都不在;请检查后处理此任务。" -#: instances/jobs.py:1141 +#: instances/jobs.py:1155 msgid "Move disk" msgstr "移动磁盘" -#: instances/jobs.py:1148 +#: instances/jobs.py:1162 msgid "Choose a disk of the VM" msgstr "请选择虚拟机的一个磁盘" -#: instances/jobs.py:1172 +#: instances/jobs.py:1186 msgid "Copying the disk" msgstr "正在复制磁盘" -#: instances/jobs.py:1215 +#: instances/jobs.py:1229 #, python-format msgid "Another block job runs on %(dev)s; check the VM" msgstr "%(dev)s 上正在运行另一个块任务;请检查虚拟机" -#: instances/jobs.py:1221 +#: instances/jobs.py:1235 #, python-format msgid "The disk stayed in %(path)s; remove %(dest)s if it is there" msgstr "磁盘仍在 %(path)s;如果 %(dest)s 存在,请将其删除" -#: instances/jobs.py:1223 +#: instances/jobs.py:1237 #, python-format msgid "The definitions of %(dev)s name %(paths)s; check the VM" msgstr "%(dev)s 的定义指向 %(paths)s;请检查虚拟机" -#: instances/jobs.py:1230 +#: instances/jobs.py:1244 #, python-format msgid "Disk %(path)s was kept: a disk file that stays needs it" msgstr "磁盘 %(path)s 已保留:某个保留的磁盘文件依赖它" -#: instances/jobs.py:1231 +#: instances/jobs.py:1245 #, python-format msgid "The VM is removed, but disk %(path)s was not deleted: %(err)s" msgstr "虚拟机已删除,但磁盘 %(path)s 未被删除:%(err)s" -#: instances/jobs.py:1232 +#: instances/jobs.py:1246 #, python-format msgid "Disk %(path)s is used by another VM and was kept" msgstr "磁盘 %(path)s 正被另一台虚拟机使用,已保留" -#: instances/jobs.py:1286 +#: instances/jobs.py:1300 msgid "Delete VM" msgstr "删除虚拟机" -#: instances/jobs.py:1316 +#: instances/jobs.py:1330 msgid "Deleting the VM" msgstr "正在删除虚拟机" -#: instances/jobs.py:1328 +#: instances/jobs.py:1342 msgid "The VM was not deleted; it may have been shut off" msgstr "虚拟机未被删除;它可能已被关闭" @@ -6014,7 +6014,7 @@ msgstr "%(quota)s:“%(instance_name)s”仍为模板。" msgid "The XML has no name" msgstr "XML 中没有名称" -#: instances/views.py:2475 webvirtcloud/middleware.py:126 +#: instances/views.py:2475 webvirtcloud/middleware.py:151 #, python-format msgid "libvirt Error - %(exception)s" msgstr "libvirt 错误 - %(exception)s" @@ -7517,7 +7517,8 @@ msgstr "恢复在一小时内无法读取任务状态;请检查虚拟机,然 msgid "The worker stopped before the job changed anything" msgstr "工作进程在任务做出任何更改之前停止" -#: storages/api/viewsets.py:203 storages/api/viewsets.py:224 +#: storages/api/viewsets.py:147 storages/api/viewsets.py:164 +#: storages/api/viewsets.py:202 storages/api/viewsets.py:223 msgid "Pool is not active" msgstr "存储池未激活" @@ -8421,7 +8422,6 @@ msgstr "连接失败:%(host)s 未连接" #: vrtManager/connection.py:502 #, python-format -#| msgid "This host has no secrets." msgid "This host has no architecture %(arch)s" msgstr "此主机没有 %(arch)s 架构" @@ -8628,67 +8628,71 @@ msgstr "磁盘 %(target_dev)s 不在虚拟机的定义中" msgid "Please shutdown the instance then try to enable vCPU hotplug" msgstr "请先关闭虚拟机,再启用 vCPU 热插拔" -#: vrtManager/instance.py:1842 +#: vrtManager/instance.py:1669 +msgid "The VM has no video card" +msgstr "虚拟机没有显卡" + +#: vrtManager/instance.py:1843 msgid "" "The VM has external snapshots; internal snapshots cannot be mixed with them" msgstr "虚拟机有外部快照;内部快照不能与其混用" -#: vrtManager/instance.py:1874 +#: vrtManager/instance.py:1875 msgid "A snapshot with memory is not quiesced; it keeps the whole guest state" msgstr "含内存的快照不会静默文件系统;它保存整个客户机状态" -#: vrtManager/instance.py:1876 +#: vrtManager/instance.py:1877 msgid "Only a running VM's file systems can be frozen" msgstr "只有运行中的虚拟机的文件系统可以冻结" -#: vrtManager/instance.py:1878 +#: vrtManager/instance.py:1879 msgid "The QEMU guest agent is not connected; it freezes the file systems" msgstr "QEMU 客户机代理未连接;文件系统由它冻结" -#: vrtManager/instance.py:1881 +#: vrtManager/instance.py:1882 msgid "" "The VM has internal snapshots; external snapshots cannot be mixed with them" msgstr "虚拟机有内部快照;外部快照不能与其混用" -#: vrtManager/instance.py:1886 +#: vrtManager/instance.py:1887 msgid "Newer snapshots exist after the last revert; delete them first" msgstr "上次还原后存在更新的快照;请先删除它们" -#: vrtManager/instance.py:1889 +#: vrtManager/instance.py:1890 msgid "No snapshot is current; revert to a snapshot first" msgstr "没有当前快照;请先还原到某个快照" -#: vrtManager/instance.py:1895 +#: vrtManager/instance.py:1896 #, python-format msgid "Eject the media from %(dev)s first" msgstr "请先弹出 %(dev)s 中的介质" -#: vrtManager/instance.py:1897 +#: vrtManager/instance.py:1898 #, python-format msgid "Disk %(dev)s is not a file; external snapshots need file disks" msgstr "磁盘 %(dev)s 不是文件;外部快照需要文件磁盘" -#: vrtManager/instance.py:1905 +#: vrtManager/instance.py:1906 #, python-format msgid "" "The storage pools could not be refreshed, so their free space is unknown: " "%(err)s" msgstr "无法刷新存储池,其可用空间未知:%(err)s" -#: vrtManager/instance.py:1926 +#: vrtManager/instance.py:1927 msgid "Memory is saved only from a running VM" msgstr "只能保存运行中的虚拟机的内存" -#: vrtManager/instance.py:1928 +#: vrtManager/instance.py:1929 msgid "The VM has no disk to keep its memory next to" msgstr "虚拟机没有可存放其内存的磁盘" -#: vrtManager/instance.py:1932 +#: vrtManager/instance.py:1933 #, python-format msgid "%(disk)s is not in a storage pool; memory is saved only into one" msgstr "%(disk)s 不在存储池中;内存只能保存到存储池中" -#: vrtManager/instance.py:1963 +#: vrtManager/instance.py:1964 #, python-format msgid "" "Storage pool %(pool)s has %(free).1f GiB free; the snapshot needs %(size).1f " @@ -8698,156 +8702,156 @@ msgstr "" "存储池 %(pool)s 可用 %(free).1f GiB;快照需要 %(size).1f GiB(其中虚拟机磁盘的 %(percent)g%%,至少 " "%(minimum)g GiB,若保存内存则另加内存)" -#: vrtManager/instance.py:1981 +#: vrtManager/instance.py:1982 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:2011 +#: vrtManager/instance.py:2012 #, python-format msgid "" "The revert failed twice; try again in a moment (%(error)s). The VM is " "running." msgstr "还原两次失败;请稍后重试(%(error)s)。虚拟机正在运行。" -#: vrtManager/instance.py:2013 +#: vrtManager/instance.py:2014 #, 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:2176 +#: vrtManager/instance.py:2177 msgid "A disk moves when its VM is defined and running, paused or shut off" msgstr "仅当虚拟机已定义且处于运行、暂停或关机状态时才能移动磁盘" -#: vrtManager/instance.py:2178 +#: vrtManager/instance.py:2179 msgid "" "A disk of a VM with snapshots, a saved state or a running block job does not " "move" msgstr "有快照、保存的状态或正在运行块任务的虚拟机的磁盘不能移动" -#: vrtManager/instance.py:2186 +#: vrtManager/instance.py:2187 #, 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:2191 +#: vrtManager/instance.py:2192 #, python-format msgid "%(dev)s does not move: only writable raw and qcow2 disks do" msgstr "%(dev)s 不能移动:只能移动可写的 raw 和 qcow2 磁盘" -#: vrtManager/instance.py:2198 +#: vrtManager/instance.py:2199 #, python-format msgid "%(dev)s does not move: no storage pool has %(path)s" msgstr "%(dev)s 不能移动:没有存储池包含 %(path)s" -#: vrtManager/instance.py:2200 +#: vrtManager/instance.py:2201 #, python-format msgid "%(dev)s does not move: it has a backing file" msgstr "%(dev)s 不能移动:它有后备文件" -#: vrtManager/instance.py:2203 +#: vrtManager/instance.py:2204 #, python-format msgid "%(pool_name)s is not an active pool of disk files of this host" msgstr "%(pool_name)s 不是此主机上活动的磁盘文件存储池" -#: vrtManager/instance.py:2206 +#: vrtManager/instance.py:2207 #, python-format msgid "%(dev)s is in pool %(pool_name)s already" msgstr "%(dev)s 已在存储池 %(pool_name)s 中" -#: vrtManager/instance.py:2210 +#: vrtManager/instance.py:2211 #, python-format msgid "Pool %(pool_name)s already has a file %(name)s" msgstr "存储池 %(pool_name)s 中已有文件 %(name)s" -#: vrtManager/instance.py:2234 +#: vrtManager/instance.py:2235 #, python-format msgid "The copy of %(dev)s ended before it was complete" msgstr "%(dev)s 的复制在完成前结束" -#: vrtManager/instance.py:2279 +#: vrtManager/instance.py:2280 #, 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:2281 +#: vrtManager/instance.py:2282 #, 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:2288 +#: vrtManager/instance.py:2289 #, python-format msgid "The VM has no internal snapshot named %(name)s" msgstr "虚拟机没有名为 %(name)s 的内部快照" -#: vrtManager/instance.py:2297 +#: vrtManager/instance.py:2298 msgid "The VM has a saved state; start it or remove the saved state first" msgstr "虚拟机有保存的状态;请先启动它或删除保存的状态" -#: vrtManager/instance.py:2299 +#: vrtManager/instance.py:2300 msgid "A snapshot job is still running on this VM; try again when it ends" msgstr "此虚拟机上仍有快照任务在运行;请在其结束后重试" -#: vrtManager/instance.py:2309 +#: vrtManager/instance.py:2310 msgid "Shut the VM down to revert to an internal snapshot" msgstr "请关闭虚拟机后再还原到内部快照" -#: vrtManager/instance.py:2407 +#: vrtManager/instance.py:2408 msgid "Cannot clone a VM whose NVRAM is not a file" msgstr "NVRAM 不是文件的虚拟机无法克隆" -#: vrtManager/instance.py:2475 +#: vrtManager/instance.py:2476 #, python-format msgid "Clone failed (%(err)s); remove these copies by hand: %(path)s" msgstr "克隆失败(%(err)s);请手动删除这些副本:%(path)s" -#: vrtManager/instance.py:2485 +#: vrtManager/instance.py:2486 msgid "Shut the VM down before cloning it" msgstr "请先关闭虚拟机再克隆" -#: vrtManager/instance.py:2539 +#: vrtManager/instance.py:2540 #, python-format msgid "Clone failed (%(err)s); remove these copies by hand: %(leftovers)s" msgstr "克隆失败(%(err)s);请手动删除这些副本:%(leftovers)s" -#: vrtManager/instance.py:2550 +#: vrtManager/instance.py:2551 msgid "Live clone needs libvirt 11.10 or later; shut the VM down to clone it" msgstr "在线克隆需要 libvirt 11.10 或更高版本;请关闭虚拟机后再克隆" -#: vrtManager/instance.py:2553 +#: vrtManager/instance.py:2554 msgid "A VM with a TPM is cloned only shut down" msgstr "带 TPM 的虚拟机只能在关机时克隆" -#: vrtManager/instance.py:2556 +#: vrtManager/instance.py:2557 #, python-format msgid "Disk %(dev)s is not a local file; shut the VM down to clone it" msgstr "磁盘 %(dev)s 不是本地文件;请关闭虚拟机后再克隆" -#: vrtManager/instance.py:2558 +#: vrtManager/instance.py:2559 #, python-format msgid "Disk %(dev)s is shareable; shut the VM down to clone it" msgstr "磁盘 %(dev)s 是可共享的;请关闭虚拟机后再克隆" -#: vrtManager/instance.py:2563 +#: vrtManager/instance.py:2564 #, python-format msgid "Disk %(dev)s changes at the next start; shut the VM down to clone it" msgstr "磁盘 %(dev)s 在下次启动时会改变;请关闭虚拟机后再克隆" -#: vrtManager/instance.py:2565 +#: vrtManager/instance.py:2566 msgid "Another job is running on the VM; clone it when that ends" msgstr "虚拟机上有另一个任务正在运行;请在其结束后再克隆" -#: vrtManager/instance.py:2578 +#: vrtManager/instance.py:2579 #, python-format msgid "Volume %(name)s already exists in storage pool %(pool)s" msgstr "卷 %(name)s 已存在于存储池 %(pool)s 中" -#: vrtManager/instance.py:2597 +#: vrtManager/instance.py:2598 #, python-format msgid "" "Storage pool %(pool)s has %(free).1f GiB free; the clone needs %(size).1f GiB" @@ -8856,92 +8860,97 @@ msgstr "" "存储池 %(pool)s 可用 %(free).1f GiB;克隆需要 %(size).1f GiB(复制的磁盘,再加其 %(percent)g%%,至少" " %(minimum)g GiB)" -#: vrtManager/instance.py:2736 +#: vrtManager/instance.py:2737 msgid "A network interface that is a host device is removed in the XML editor" msgstr "作为主机设备的网络接口需在 XML 编辑器中删除" -#: vrtManager/instance.py:2752 +#: vrtManager/instance.py:2753 #, python-format msgid "No network interface with MAC %(old_mac)s" msgstr "没有 MAC 为 %(old_mac)s 的网络接口" -#: vrtManager/instance.py:2755 +#: vrtManager/instance.py:2756 msgid "A network interface that is a host device is changed in the XML editor" msgstr "作为主机设备的网络接口需在 XML 编辑器中修改" -#: vrtManager/instance.py:2846 +#: vrtManager/instance.py:2847 msgid "" "A VM changes its PCI devices while it runs, or is shut off without a saved " "state" msgstr "虚拟机只能在运行时或无保存的状态的关机时更改其 PCI 设备" -#: vrtManager/instance.py:2858 +#: vrtManager/instance.py:2859 #, 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:2860 +#: vrtManager/instance.py:2861 #, 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:2862 +#: vrtManager/instance.py:2863 #, 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:2863 +#: vrtManager/instance.py:2864 #, 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:2865 +#: vrtManager/instance.py:2866 #, 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:2867 +#: vrtManager/instance.py:2868 #, 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:2869 +#: vrtManager/instance.py:2870 #, 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:2903 +#: vrtManager/instance.py:2904 #, python-format msgid "The VM has no PCI device %(address)s" msgstr "虚拟机没有 PCI 设备 %(address)s" -#: vrtManager/instance.py:2921 +#: vrtManager/instance.py:2922 msgid "The VM has no USB controller" msgstr "虚拟机没有 USB 控制器" -#: vrtManager/instance.py:2940 +#: vrtManager/instance.py:2941 msgid "The VM has no such USB device" msgstr "虚拟机没有此 USB 设备" -#: vrtManager/instance.py:2981 +#: vrtManager/instance.py:2955 +#, python-format +msgid "The VM has no network interface %(mac)s" +msgstr "虚拟机没有网络接口 %(mac)s" + +#: vrtManager/instance.py:2986 msgid "The VM has its own RNG device: change it in the XML editor" msgstr "虚拟机有自己的 RNG 设备:请在 XML 编辑器中修改" -#: vrtManager/instance.py:3008 +#: vrtManager/instance.py:3013 msgid "The VM has its own TPM: change it in the XML editor" msgstr "虚拟机有自己的 TPM:请在 XML 编辑器中修改" -#: vrtManager/instance.py:3027 +#: vrtManager/instance.py:3032 #, python-format msgid "Unknown crash action %(action)s" msgstr "未知的崩溃操作 %(action)s" @@ -9314,16 +9323,16 @@ msgid "" "Volume %(name)s is in use: a VM's disk, a backing file or a snapshot's file" msgstr "卷 %(name)s 正在使用中:它是虚拟机的磁盘、后备文件或快照文件" -#: vrtManager/util.py:95 +#: vrtManager/util.py:99 #, python-format msgid "The XML is not valid: %(err)s" msgstr "XML 无效:%(err)s" -#: vrtManager/util.py:97 +#: vrtManager/util.py:101 msgid "The XML may not declare a DTD" msgstr "XML 不能声明 DTD" -#: vrtManager/util.py:143 +#: vrtManager/util.py:147 #, python-format msgid "MAC address must be of the format AA:BB:CC:DD:EE:FF, was %(mac)s" msgstr "MAC 地址的格式必须为 AA:BB:CC:DD:EE:FF,实际为 %(mac)s" diff --git a/vrtManager/instance.py b/vrtManager/instance.py index 49177131..7cdadf0d 100644 --- a/vrtManager/instance.py +++ b/vrtManager/instance.py @@ -1666,6 +1666,7 @@ class wvmInstance(wvmConnect): new_model.set("primary", video_model.get("primary")) self._defineXML(etree.tostring(tree).decode()) return + raise util.OperationError(gettext_noop("The VM has no video card")) def resize_cpu(self, cur_vcpu, vcpu): """ @@ -2940,14 +2941,18 @@ class wvmInstance(wvmConnect): raise util.OperationError(gettext_noop("The VM has no such USB device")) def set_link_state(self, mac_address, state): + found = False for xml_flags, affect in self._definitions(): nic = self._nic(xml_flags, mac_address) if nic is None: continue + found = True for link in nic.findall("link"): nic.remove(link) etree.SubElement(nic, "link", state=state) self.instance.updateDeviceFlags(etree.tostring(nic).decode(), affect) + if not found: + raise util.OperationError(gettext_noop("The VM has no network interface %(mac)s"), mac=mac_address) def _set_options(self, tree, options): for o in ["title", "description"]: diff --git a/vrtManager/tests/test_device_edits.py b/vrtManager/tests/test_device_edits.py index 26887f0c..3335a9a3 100644 --- a/vrtManager/tests/test_device_edits.py +++ b/vrtManager/tests/test_device_edits.py @@ -110,6 +110,18 @@ class DeviceEditsTestCase(unittest.TestCase): self.assertEqual(model.attrib, {"type": "vga' heads='9"}) p._defineXML.assert_called_once() + def test_a_device_the_vm_does_not_have_is_refused(self): + # a stale form: no change, and the audit row says it failed + p = proxy() + p._definitions = lambda: [(PERSISTENT_XML, VIR_DOMAIN_AFFECT_CONFIG)] + with self.assertRaisesRegex(util.OperationError, "no network interface 52:54:10:00:00:09"): + p.set_link_state("52:54:10:00:00:09", "down") + p._XMLDesc = lambda flags: PERSISTENT.replace("", "") + with self.assertRaisesRegex(util.OperationError, "no video card"): + p.set_video_model("virtio") + p.instance.updateDeviceFlags.assert_not_called() + p._defineXML.assert_not_called() + def test_qos_changes_go_through_define_xml(self): for change in ( lambda p: p.set_qos("52:54:10:00:00:01", "outbound", 1, 2, 3),