diff --git a/instances/jobs.py b/instances/jobs.py index bbbe9fd6..8734cceb 100644 --- a/instances/jobs.py +++ b/instances/jobs.py @@ -205,6 +205,14 @@ def clone_data(user, instance, fields): clone_name=data["name"]) if invalid_macs: raise util.OperationError(_("Instance MAC '%(clone_mac)s' invalid format!"), clone_mac=", ".join(invalid_macs)) + # two NICs of one address on a network take each other's traffic + taken = {net["mac"].lower() for net in instance.config_networks} + for key, value in data.items(): + if key.startswith("clone-net-mac-"): + mac = value.lower() if ":" in value else ":".join(value[i:i + 2] for i in range(0, 12, 2)).lower() + if mac in taken: + raise util.OperationError(_("MAC address %(mac)s is the VM's or another NIC's of the clone"), mac=mac) + taken.add(mac) if invalid_disks: raise util.OperationError(_("Disk name '%(disk_name)s' contains invalid characters!"), disk_name=", ".join(str(v) for v in invalid_disks)) diff --git a/instances/tests/test_clone_job.py b/instances/tests/test_clone_job.py index 9f003e11..ed69ec46 100644 --- a/instances/tests/test_clone_job.py +++ b/instances/tests/test_clone_job.py @@ -340,6 +340,15 @@ class LiveCloneJobTestCase(TransactionTestCase): CloneInstance().plan(self.admin, {"instance": self.source.pk, "fields": { "name": name, "disk-vda": "copy.qcow2", "clone-net-mac-0": "52:54:00:00:00:01"}}) + def test_a_mac_of_the_vm_or_of_another_nic_of_the_clone_is_refused(self): + for macs in (["52:54:00:AA:BB:CC"], ["52:54:00:00:00:01", "525400000001"]): + with self.subTest(macs=macs): + self.proxy.get_net_devices.return_value = [{"mac": "52:54:00:aa:bb:cc"}, {"mac": "52:54:00:aa:bb:cd"}] + fields = {"name": "copy", "disk-vda": "copy.qcow2", "clone-net-mac-1": "52:54:00:00:00:09", + **{f"clone-net-mac-{n}": mac for n, mac in enumerate(macs)}} + with self.assertRaisesMessage(OperationError, "is the VM's or another NIC's of the clone"): + CloneInstance().plan(self.admin, {"instance": self.source.pk, "fields": fields}) + def test_another_state_is_refused(self): self.proxy.get_status.return_value = 4 # shutting down with self.assertRaisesMessage(OperationError, "The VM must be running, paused or shut off to be cloned"): diff --git a/locale/tr/LC_MESSAGES/django.mo b/locale/tr/LC_MESSAGES/django.mo index 21ab6572..15e00568 100644 Binary files a/locale/tr/LC_MESSAGES/django.mo and b/locale/tr/LC_MESSAGES/django.mo differ diff --git a/locale/tr/LC_MESSAGES/django.po b/locale/tr/LC_MESSAGES/django.po index 1b8cca83..e187d624 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 20:43+0000\n" +"POT-Creation-Date: 2026-11-07 20:44+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" @@ -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:199 instances/jobs.py:591 +#: instances/jobs.py:199 instances/jobs.py:599 #, python-format msgid "Instance '%(clone_name)s' already exists!" msgstr "'%(clone_name)s' sanal makinesi zaten mevcut!" @@ -2770,21 +2770,27 @@ msgstr "Sanal makine adı '%(clone_name)s' geçersiz karakterler içermektedir!" msgid "Instance MAC '%(clone_mac)s' invalid format!" msgstr "Sanal makine MAC adresi '%(clone_mac)s' geçersiz biçemde belirtilmiş!" -#: instances/jobs.py:209 +#: instances/jobs.py:214 +#, python-format +msgid "MAC address %(mac)s is the VM's or another NIC's of the clone" +msgstr "" +"%(mac)s MAC adresi sanal makinenin ya da klonun başka bir ağ kartının adresi" + +#: instances/jobs.py:217 #, python-format msgid "Disk name '%(disk_name)s' contains invalid characters!" msgstr "Disk adı '%(disk_name)s' geçersiz karakterler içeriyor!" -#: instances/jobs.py:229 +#: instances/jobs.py:237 #, python-format 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:287 +#: instances/jobs.py:295 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:289 +#: instances/jobs.py:297 #, python-format msgid "" "The VM was not defined; check these volumes, then resolve this job: " @@ -2793,28 +2799,28 @@ msgstr "" "Sanal makine tanımlanmadı; şu birimleri kontrol edin, sonra bu işi çözün: " "%(volumes)s" -#: instances/jobs.py:310 +#: instances/jobs.py:318 msgid "Delete snapshot" msgstr "Anlık görüntüyü sil" -#: instances/jobs.py:320 vrtManager/instance.py:2300 +#: instances/jobs.py:328 vrtManager/instance.py:2300 #, 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:333 +#: instances/jobs.py:341 msgid "Merging the snapshot" msgstr "Anlık görüntü birleştiriliyor" -#: instances/jobs.py:352 +#: instances/jobs.py:360 msgid "The VM is no longer on its compute" msgstr "Sanal makine artık kendi sunucusunda değil" -#: instances/jobs.py:355 +#: instances/jobs.py:363 msgid "libvirt is still merging the snapshot" msgstr "libvirt anlık görüntüyü hâlâ birleştiriyor" -#: instances/jobs.py:363 +#: instances/jobs.py:371 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 " @@ -2824,32 +2830,32 @@ 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:370 +#: instances/jobs.py:378 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:376 +#: instances/jobs.py:384 msgid "Take snapshot" msgstr "Anlık görüntü al" -#: instances/jobs.py:388 instances/jobs.py:397 vrtManager/instance.py:1896 +#: instances/jobs.py:396 instances/jobs.py:405 vrtManager/instance.py:1896 #, 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:403 +#: instances/jobs.py:411 msgid "Taking the snapshot" msgstr "Anlık görüntü alınıyor" -#: instances/jobs.py:416 +#: instances/jobs.py:424 msgid "libvirt is still taking the snapshot" msgstr "libvirt anlık görüntüyü hâlâ alıyor" -#: instances/jobs.py:419 +#: instances/jobs.py:427 msgid "The snapshot was not taken" msgstr "Anlık görüntü alınmadı" -#: instances/jobs.py:447 +#: instances/jobs.py:455 #, python-format msgid "" "Snapshot %(name)s does not record the VM's vCPUs and memory: the quota cannot" @@ -2858,24 +2864,24 @@ msgstr "" "%(name)s anlık görüntüsü sanal makinenin vCPU ve bellek değerlerini " "içermiyor: kota denetlenemiyor." -#: instances/jobs.py:457 +#: instances/jobs.py:465 #, python-format msgid "%(quota)s: cannot revert to snapshot %(name)s." msgstr "%(quota)s: %(name)s anlık görüntüsüne dönülemiyor." -#: instances/jobs.py:464 +#: instances/jobs.py:472 msgid "Revert snapshot" msgstr "Snapshota dön" -#: instances/jobs.py:505 +#: instances/jobs.py:513 msgid "Reverting the VM" msgstr "Sanal makine geri döndürülüyor" -#: instances/jobs.py:516 +#: instances/jobs.py:524 msgid "libvirt is still reverting the VM" msgstr "libvirt sanal makineyi hâlâ geri döndürüyor" -#: instances/jobs.py:520 +#: instances/jobs.py:528 msgid "" "It cannot be told whether the VM was reverted; check it, then revert again or" " resolve this job." @@ -2883,12 +2889,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:537 +#: instances/jobs.py:545 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:538 +#: instances/jobs.py:546 #, python-format msgid "" "The guest's file systems could not be thawed (%(error)s); thaw them with: " @@ -2897,19 +2903,19 @@ msgstr "" "Konuğun dosya sistemleri çözülemedi (%(error)s); şununla çözün: virsh " "domfsthaw %(vm)s" -#: instances/jobs.py:560 +#: instances/jobs.py:568 msgid "Clone VM" msgstr "Sanal makineyi klonla" -#: instances/jobs.py:601 instances/jobs.py:608 instances/jobs.py:886 +#: instances/jobs.py:609 instances/jobs.py:616 instances/jobs.py:894 msgid "Copying disks" msgstr "Diskler kopyalanıyor" -#: instances/jobs.py:660 +#: instances/jobs.py:668 msgid "libvirt has no result of the copy" msgstr "libvirt'te kopyanın sonucu yok" -#: instances/jobs.py:671 +#: instances/jobs.py:679 #, python-format msgid "" "The copy failed: %(error)s. The guest's file systems could not be thawed " @@ -2918,11 +2924,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:674 instances/jobs.py:761 +#: instances/jobs.py:682 instances/jobs.py:769 msgid "The copy failed" msgstr "Kopyalama başarısız oldu" -#: instances/jobs.py:699 +#: instances/jobs.py:707 #, python-format msgid "" "The VM is no longer on the compute the job ran on; check these volumes, then " @@ -2931,7 +2937,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:737 +#: instances/jobs.py:745 #, python-format msgid "" "A volume of the clone was being created; check these volumes, then resolve " @@ -2940,15 +2946,15 @@ msgstr "" "Klonun bir birimi oluşturuluyordu; şu birimleri kontrol edin, sonra bu işi " "çözün: %(volumes)s" -#: instances/jobs.py:741 +#: instances/jobs.py:749 msgid "The job stopped before the copy started" msgstr "İş, kopyalama başlamadan durdu" -#: instances/jobs.py:748 +#: instances/jobs.py:756 msgid "libvirt is still copying the disks" msgstr "libvirt diskleri hâlâ kopyalıyor" -#: instances/jobs.py:751 +#: instances/jobs.py:759 #, python-format msgid "" "Another backup runs on the VM; check these volumes, then resolve this job: " @@ -2957,7 +2963,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:756 +#: instances/jobs.py:764 #, python-format msgid "" "libvirt has no result of the copy; check these volumes, then resolve this " @@ -2966,7 +2972,7 @@ msgstr "" "libvirt'te kopyanın sonucu yok; şu birimleri kontrol edin, sonra bu işi " "çözün: %(volumes)s" -#: instances/jobs.py:768 +#: instances/jobs.py:776 #, python-format msgid "" "The disks were copied, but the clone could not be defined: %(error)s; check " @@ -2975,74 +2981,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:791 instances/templates/create_instance_w1.html:60 +#: instances/jobs.py:799 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:815 instances/jobs.py:860 instances/views.py:2468 +#: instances/jobs.py:823 instances/jobs.py:868 instances/views.py:2468 msgid "A virtual machine with this name already exists" msgstr "Bu isimde bir sanal makine mevcut" -#: instances/jobs.py:817 instances/jobs.py:857 +#: instances/jobs.py:825 instances/jobs.py:865 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:820 +#: instances/jobs.py:828 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:822 +#: instances/jobs.py:830 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:824 +#: instances/jobs.py:832 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:826 +#: instances/jobs.py:834 msgid "Invalid cache mode" msgstr "Geçersiz önbellek modu" -#: instances/jobs.py:828 +#: instances/jobs.py:836 #, 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:830 +#: instances/jobs.py:838 #, python-format msgid "A CD-ROM cannot use the %(bus)s bus" msgstr "CD-ROM %(bus)s veri yolunu kullanamaz" -#: instances/jobs.py:833 +#: instances/jobs.py:841 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:836 +#: instances/jobs.py:844 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:842 +#: instances/jobs.py:850 #, python-format msgid "This host offers no firmware %(firmware)s" msgstr "Bu sunucu %(firmware)s firmware'ini sunmuyor" -#: instances/jobs.py:844 vrtManager/instance.py:3049 +#: instances/jobs.py:852 vrtManager/instance.py:3049 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:905 +#: instances/jobs.py:913 msgid "Writing the cloud-init seed" msgstr "cloud-init tohumu yazılıyor" -#: instances/jobs.py:912 +#: instances/jobs.py:920 msgid "Defining the VM" msgstr "Sanal makine tanımlanıyor" -#: instances/jobs.py:945 +#: instances/jobs.py:953 #, python-format msgid "" "The panel failed unexpectedly; its log has the details. Remove these volumes " @@ -3051,114 +3057,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:949 +#: instances/jobs.py:957 #, python-format msgid "%(error)s. Remove these volumes by hand: %(volumes)s" msgstr "%(error)s. Şu birimleri elle silin: %(volumes)s" -#: instances/jobs.py:974 +#: instances/jobs.py:982 #, python-format msgid "The instance is already on %(compute)s" msgstr "Sanal makine zaten %(compute)s üzerinde" -#: instances/jobs.py:976 +#: instances/jobs.py:984 #, python-format msgid "%(compute)s is not reachable" msgstr "%(compute)s sunucusuna ulaşılamıyor" -#: instances/jobs.py:978 +#: instances/jobs.py:986 #, 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:1037 +#: instances/jobs.py:1045 #, 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:1044 +#: instances/jobs.py:1052 #, 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:1052 +#: instances/jobs.py:1060 msgid "Migrate VM" msgstr "Sanal makineyi taşı" -#: instances/jobs.py:1099 +#: instances/jobs.py:1107 msgid "Migrating the VM" msgstr "Sanal makine taşınıyor" -#: instances/jobs.py:1148 +#: instances/jobs.py:1156 msgid "libvirt is still migrating the VM" msgstr "libvirt sanal makineyi hâlâ taşıyor" -#: instances/jobs.py:1160 +#: instances/jobs.py:1168 msgid "The VM stayed on the source host" msgstr "Sanal makine kaynak sunucuda kaldı" -#: instances/jobs.py:1162 +#: instances/jobs.py:1170 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:1181 +#: instances/jobs.py:1189 msgid "Move disk" msgstr "Diski taşı" -#: instances/jobs.py:1188 +#: instances/jobs.py:1196 msgid "Choose a disk of the VM" msgstr "Sanal makinenin bir diskini seçin" -#: instances/jobs.py:1212 +#: instances/jobs.py:1220 msgid "Copying the disk" msgstr "Disk kopyalanıyor" -#: instances/jobs.py:1255 +#: instances/jobs.py:1263 #, 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:1261 +#: instances/jobs.py:1269 #, 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:1263 +#: instances/jobs.py:1271 #, 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:1270 +#: instances/jobs.py:1278 #, 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:1271 +#: instances/jobs.py:1279 #, 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:1272 +#: instances/jobs.py:1280 #, 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:1326 +#: instances/jobs.py:1334 msgid "Delete VM" msgstr "Sanal makineyi sil" -#: instances/jobs.py:1356 +#: instances/jobs.py:1364 msgid "Deleting the VM" msgstr "Sanal makine siliniyor" -#: instances/jobs.py:1368 +#: instances/jobs.py:1376 msgid "The VM was not deleted; it may have been shut off" msgstr "Sanal makine silinmedi; kapatılmış olabilir" diff --git a/locale/zh/LC_MESSAGES/django.mo b/locale/zh/LC_MESSAGES/django.mo index 7a442aa5..b9d0eb22 100644 Binary files a/locale/zh/LC_MESSAGES/django.mo and b/locale/zh/LC_MESSAGES/django.mo differ diff --git a/locale/zh/LC_MESSAGES/django.po b/locale/zh/LC_MESSAGES/django.po index 47f96c1a..23597c53 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-07 20:43+0000\n" +"POT-Creation-Date: 2026-11-07 20:44+0000\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -2653,7 +2653,7 @@ msgstr "请从可用名称列表中选择克隆的名称" msgid "%(quota)s: cannot create '%(clone_name)s'." msgstr "%(quota)s:无法创建“%(clone_name)s”。" -#: instances/jobs.py:199 instances/jobs.py:591 +#: instances/jobs.py:199 instances/jobs.py:599 #, python-format msgid "Instance '%(clone_name)s' already exists!" msgstr "虚拟机 '%(clone_name)s' 已存在!" @@ -2673,361 +2673,366 @@ msgstr "虚拟机名称 '%(clone_name)s' 包含无效字符!" msgid "Instance MAC '%(clone_mac)s' invalid format!" msgstr "虚拟机 MAC '%(clone_mac)s' 格式无效!" -#: instances/jobs.py:209 +#: instances/jobs.py:214 +#, python-format +msgid "MAC address %(mac)s is the VM's or another NIC's of the clone" +msgstr "MAC 地址 %(mac)s 已属于该虚拟机或克隆的另一个网卡" + +#: instances/jobs.py:217 #, python-format msgid "Disk name '%(disk_name)s' contains invalid characters!" msgstr "磁盘名称 '%(disk_name)s' 包含无效字符!" -#: instances/jobs.py:229 +#: instances/jobs.py:237 #, python-format msgid "The clone is made, but not as asked: %(error)s" msgstr "克隆已创建,但与要求不符:%(error)s" -#: instances/jobs.py:287 +#: instances/jobs.py:295 msgid "The VM was not defined and no volume of it was left." msgstr "虚拟机未定义,也没有留下它的卷。" -#: instances/jobs.py:289 +#: instances/jobs.py:297 #, python-format msgid "" "The VM was not defined; check these volumes, then resolve this job: " "%(volumes)s" msgstr "虚拟机未定义;请检查这些卷,然后处理此任务:%(volumes)s" -#: instances/jobs.py:310 +#: instances/jobs.py:318 msgid "Delete snapshot" msgstr "删除快照" -#: instances/jobs.py:320 vrtManager/instance.py:2300 +#: instances/jobs.py:328 vrtManager/instance.py:2300 #, python-format msgid "The VM has no external snapshot named %(name)s" msgstr "虚拟机没有名为 %(name)s 的外部快照" -#: instances/jobs.py:333 +#: instances/jobs.py:341 msgid "Merging the snapshot" msgstr "正在合并快照" -#: instances/jobs.py:352 +#: instances/jobs.py:360 msgid "The VM is no longer on its compute" msgstr "虚拟机已不在其计算节点上" -#: instances/jobs.py:355 +#: instances/jobs.py:363 msgid "libvirt is still merging the snapshot" msgstr "libvirt 仍在合并快照" -#: instances/jobs.py:363 +#: instances/jobs.py:371 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:370 +#: instances/jobs.py:378 msgid "The VM is no longer on the compute the job ran on" msgstr "虚拟机已不在运行该任务的计算节点上" -#: instances/jobs.py:376 +#: instances/jobs.py:384 msgid "Take snapshot" msgstr "创建快照" -#: instances/jobs.py:388 instances/jobs.py:397 vrtManager/instance.py:1896 +#: instances/jobs.py:396 instances/jobs.py:405 vrtManager/instance.py:1896 #, python-format msgid "A snapshot named %(name)s already exists" msgstr "名为 %(name)s 的快照已存在" -#: instances/jobs.py:403 +#: instances/jobs.py:411 msgid "Taking the snapshot" msgstr "正在创建快照" -#: instances/jobs.py:416 +#: instances/jobs.py:424 msgid "libvirt is still taking the snapshot" msgstr "libvirt 仍在创建快照" -#: instances/jobs.py:419 +#: instances/jobs.py:427 msgid "The snapshot was not taken" msgstr "未创建快照" -#: instances/jobs.py:447 +#: instances/jobs.py:455 #, python-format msgid "" "Snapshot %(name)s does not record the VM's vCPUs and memory: the quota cannot" " be checked." msgstr "快照“%(name)s”未记录虚拟机的 vCPU 和内存:无法检查配额。" -#: instances/jobs.py:457 +#: instances/jobs.py:465 #, python-format msgid "%(quota)s: cannot revert to snapshot %(name)s." msgstr "%(quota)s:无法恢复到快照“%(name)s”。" -#: instances/jobs.py:464 +#: instances/jobs.py:472 msgid "Revert snapshot" msgstr "恢复快照" -#: instances/jobs.py:505 +#: instances/jobs.py:513 msgid "Reverting the VM" msgstr "正在恢复虚拟机" -#: instances/jobs.py:516 +#: instances/jobs.py:524 msgid "libvirt is still reverting the VM" msgstr "libvirt 仍在恢复虚拟机" -#: instances/jobs.py:520 +#: instances/jobs.py:528 msgid "" "It cannot be told whether the VM was reverted; check it, then revert again or" " resolve this job." msgstr "无法判断虚拟机是否已恢复;请检查后再次恢复,或处理此任务。" -#: instances/jobs.py:537 +#: instances/jobs.py:545 msgid "The VM must be running, paused or shut off to be cloned" msgstr "虚拟机必须处于运行、暂停或关机状态才能克隆" -#: instances/jobs.py:538 +#: instances/jobs.py:546 #, 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:560 +#: instances/jobs.py:568 msgid "Clone VM" msgstr "克隆虚拟机" -#: instances/jobs.py:601 instances/jobs.py:608 instances/jobs.py:886 +#: instances/jobs.py:609 instances/jobs.py:616 instances/jobs.py:894 msgid "Copying disks" msgstr "正在复制磁盘" -#: instances/jobs.py:660 +#: instances/jobs.py:668 msgid "libvirt has no result of the copy" msgstr "libvirt 没有复制的结果" -#: instances/jobs.py:671 +#: instances/jobs.py:679 #, 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:674 instances/jobs.py:761 +#: instances/jobs.py:682 instances/jobs.py:769 msgid "The copy failed" msgstr "复制失败" -#: instances/jobs.py:699 +#: instances/jobs.py:707 #, 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:737 +#: instances/jobs.py:745 #, 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:741 +#: instances/jobs.py:749 msgid "The job stopped before the copy started" msgstr "任务在复制开始前停止" -#: instances/jobs.py:748 +#: instances/jobs.py:756 msgid "libvirt is still copying the disks" msgstr "libvirt 仍在复制磁盘" -#: instances/jobs.py:751 +#: instances/jobs.py:759 #, python-format msgid "" "Another backup runs on the VM; check these volumes, then resolve this job: " "%(volumes)s" msgstr "虚拟机上正在运行另一个备份;请检查这些卷,然后处理此任务:%(volumes)s" -#: instances/jobs.py:756 +#: instances/jobs.py:764 #, 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:768 +#: instances/jobs.py:776 #, 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:791 instances/templates/create_instance_w1.html:60 +#: instances/jobs.py:799 instances/templates/create_instance_w1.html:60 #: instances/templates/create_instance_w2.html:356 msgid "Create VM" msgstr "创建虚拟机" -#: instances/jobs.py:815 instances/jobs.py:860 instances/views.py:2468 +#: instances/jobs.py:823 instances/jobs.py:868 instances/views.py:2468 msgid "A virtual machine with this name already exists" msgstr "同名虚拟机已存在" -#: instances/jobs.py:817 instances/jobs.py:857 +#: instances/jobs.py:825 instances/jobs.py:865 msgid "There is an instance with same name. Remove it and try again!" msgstr "已存在同名虚拟机。请删除后重试!" -#: instances/jobs.py:820 +#: instances/jobs.py:828 msgid "First you need to create or select an image" msgstr "请先创建或选择一个镜像" -#: instances/jobs.py:822 +#: instances/jobs.py:830 msgid "Choose one disk source: a new disk, existing volumes or a template" msgstr "请选择一种磁盘来源:新磁盘、现有卷或模板" -#: instances/jobs.py:824 +#: instances/jobs.py:832 msgid "Image has already exist. Please check volumes or change instance name" msgstr "镜像已存在。请检查卷或更改虚拟机名称" -#: instances/jobs.py:826 +#: instances/jobs.py:834 msgid "Invalid cache mode" msgstr "无效的缓存模式" -#: instances/jobs.py:828 +#: instances/jobs.py:836 #, python-format msgid "This host offers no CPU mode or model %(mode)s" msgstr "此主机不提供 CPU 模式或型号 %(mode)s" -#: instances/jobs.py:830 +#: instances/jobs.py:838 #, python-format msgid "A CD-ROM cannot use the %(bus)s bus" msgstr "CD-ROM 不能使用 %(bus)s 总线" -#: instances/jobs.py:833 +#: instances/jobs.py:841 msgid "The cloud-init seed is read from a CD-ROM: choose its bus" msgstr "cloud-init 种子从 CD-ROM 读取:请选择其总线" -#: instances/jobs.py:836 +#: instances/jobs.py:844 msgid "The cloud-init seed needs a directory storage pool for the disk" msgstr "cloud-init 种子需要为磁盘使用目录类型的存储池" -#: instances/jobs.py:842 +#: instances/jobs.py:850 #, python-format msgid "This host offers no firmware %(firmware)s" msgstr "此主机不提供固件 %(firmware)s" -#: instances/jobs.py:844 vrtManager/instance.py:3049 +#: instances/jobs.py:852 vrtManager/instance.py:3049 msgid "This host offers no TPM 2.0: install swtpm on it" msgstr "此主机不提供 TPM 2.0:请在主机上安装 swtpm" -#: instances/jobs.py:905 +#: instances/jobs.py:913 msgid "Writing the cloud-init seed" msgstr "正在写入 cloud-init 种子" -#: instances/jobs.py:912 +#: instances/jobs.py:920 msgid "Defining the VM" msgstr "正在定义虚拟机" -#: instances/jobs.py:945 +#: instances/jobs.py:953 #, 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:949 +#: instances/jobs.py:957 #, python-format msgid "%(error)s. Remove these volumes by hand: %(volumes)s" msgstr "%(error)s。请手动删除这些卷:%(volumes)s" -#: instances/jobs.py:974 +#: instances/jobs.py:982 #, python-format msgid "The instance is already on %(compute)s" msgstr "虚拟机已在 %(compute)s 上" -#: instances/jobs.py:976 +#: instances/jobs.py:984 #, python-format msgid "%(compute)s is not reachable" msgstr "无法连接 %(compute)s" -#: instances/jobs.py:978 +#: instances/jobs.py:986 #, python-format msgid "%(compute)s is the VM's own host under another name" msgstr "%(compute)s 是该虚拟机所在主机的另一个名称" -#: instances/jobs.py:1037 +#: instances/jobs.py:1045 #, python-format msgid "" "The VM migrated, but autostart could not be set on the destination: %(error)s" msgstr "虚拟机已迁移,但无法在目标主机上设置自动启动:%(error)s" -#: instances/jobs.py:1044 +#: instances/jobs.py:1052 #, python-format msgid "The VM migrated, but its NVRAM file stays on the source: %(error)s" msgstr "虚拟机已迁移,但其 NVRAM 文件仍留在源主机上:%(error)s" -#: instances/jobs.py:1052 +#: instances/jobs.py:1060 msgid "Migrate VM" msgstr "迁移虚拟机" -#: instances/jobs.py:1099 +#: instances/jobs.py:1107 msgid "Migrating the VM" msgstr "正在迁移虚拟机" -#: instances/jobs.py:1148 +#: instances/jobs.py:1156 msgid "libvirt is still migrating the VM" msgstr "libvirt 仍在迁移虚拟机" -#: instances/jobs.py:1160 +#: instances/jobs.py:1168 msgid "The VM stayed on the source host" msgstr "虚拟机留在了源主机上" -#: instances/jobs.py:1162 +#: instances/jobs.py:1170 msgid "" "The VM is on both computes or on neither; check them, then resolve this job." msgstr "虚拟机同时位于两个计算节点上,或都不在;请检查后处理此任务。" -#: instances/jobs.py:1181 +#: instances/jobs.py:1189 msgid "Move disk" msgstr "移动磁盘" -#: instances/jobs.py:1188 +#: instances/jobs.py:1196 msgid "Choose a disk of the VM" msgstr "请选择虚拟机的一个磁盘" -#: instances/jobs.py:1212 +#: instances/jobs.py:1220 msgid "Copying the disk" msgstr "正在复制磁盘" -#: instances/jobs.py:1255 +#: instances/jobs.py:1263 #, python-format msgid "Another block job runs on %(dev)s; check the VM" msgstr "%(dev)s 上正在运行另一个块任务;请检查虚拟机" -#: instances/jobs.py:1261 +#: instances/jobs.py:1269 #, python-format msgid "The disk stayed in %(path)s; remove %(dest)s if it is there" msgstr "磁盘仍在 %(path)s;如果 %(dest)s 存在,请将其删除" -#: instances/jobs.py:1263 +#: instances/jobs.py:1271 #, python-format msgid "The definitions of %(dev)s name %(paths)s; check the VM" msgstr "%(dev)s 的定义指向 %(paths)s;请检查虚拟机" -#: instances/jobs.py:1270 +#: instances/jobs.py:1278 #, python-format msgid "Disk %(path)s was kept: a disk file that stays needs it" msgstr "磁盘 %(path)s 已保留:某个保留的磁盘文件依赖它" -#: instances/jobs.py:1271 +#: instances/jobs.py:1279 #, python-format msgid "The VM is removed, but disk %(path)s was not deleted: %(err)s" msgstr "虚拟机已删除,但磁盘 %(path)s 未被删除:%(err)s" -#: instances/jobs.py:1272 +#: instances/jobs.py:1280 #, python-format msgid "Disk %(path)s is used by another VM and was kept" msgstr "磁盘 %(path)s 正被另一台虚拟机使用,已保留" -#: instances/jobs.py:1326 +#: instances/jobs.py:1334 msgid "Delete VM" msgstr "删除虚拟机" -#: instances/jobs.py:1356 +#: instances/jobs.py:1364 msgid "Deleting the VM" msgstr "正在删除虚拟机" -#: instances/jobs.py:1368 +#: instances/jobs.py:1376 msgid "The VM was not deleted; it may have been shut off" msgstr "虚拟机未被删除;它可能已被关闭"