diff --git a/instances/api/serializers.py b/instances/api/serializers.py index e5b72a47..0ea3946b 100644 --- a/instances/api/serializers.py +++ b/instances/api/serializers.py @@ -1,4 +1,6 @@ -from instances.models import CreateInstance, Flavor, Instance, MigrateInstance +from computes.models import Compute +from django.conf import settings +from instances.models import Flavor, Instance from instances.utils import nic_macs from rest_framework import serializers @@ -76,14 +78,28 @@ class DestroySerializer(DestroyOptionsSerializer): submission_key = serializers.CharField(write_only=True) -class CreateInstanceSerializer(serializers.ModelSerializer): +class CreateInstanceSerializer(serializers.Serializer): + """The API's VM create: the new VM form's fields, as a job.""" + + name = serializers.CharField(max_length=64) # BIOS, UEFI or UEFI Secure Boot, as the host offers; left out: the machine's default firmware = serializers.CharField(required=False) - video = serializers.CharField(initial="vga") + tpm = serializers.BooleanField(required=False) + vcpu = serializers.IntegerField(min_value=1) + vcpu_mode = serializers.CharField(max_length=64) + memory = serializers.IntegerField(min_value=1) + networks = serializers.CharField(max_length=256) + mac = serializers.CharField(allow_blank=True, max_length=255, required=False) + nwfilter = serializers.CharField(allow_blank=True, max_length=256, required=False) storage = serializers.CharField(initial="default") + hdd_size = serializers.IntegerField(min_value=1, required=False) cache_mode = serializers.CharField(initial="none") + meta_prealloc = serializers.BooleanField(required=False) virtio = serializers.BooleanField(initial=True) qemu_ga = serializers.BooleanField(initial=True) + cloud_init = serializers.BooleanField(required=False) + video = serializers.CharField(initial="vga") + listener_addr = serializers.ChoiceField(choices=settings.QEMU_CONSOLE_LISTENER_ADDRESSES) submission_key = serializers.CharField(write_only=True) def validate(self, attrs): @@ -93,32 +109,10 @@ class CreateInstanceSerializer(serializers.ModelSerializer): raise serializers.ValidationError({"mac": str(err)}) return attrs - class Meta: - model = CreateInstance - fields = [ - "name", - "firmware", - "tpm", - "vcpu", - "vcpu_mode", - "memory", - "networks", - "mac", - "nwfilter", - "storage", - "hdd_size", - "cache_mode", - "meta_prealloc", - "virtio", - "qemu_ga", - "cloud_init", - "video", - "listener_addr", - "submission_key", - ] - -class MigrateSerializer(serializers.ModelSerializer): +class MigrateSerializer(serializers.Serializer): + instance = serializers.PrimaryKeyRelatedField(queryset=Instance.objects.all()) + target_compute = serializers.PrimaryKeyRelatedField(queryset=Compute.objects.all()) live = serializers.BooleanField(default=True) offline = serializers.BooleanField(default=False) # left out, also from a form-encoded request: auto converge on @@ -129,18 +123,3 @@ class MigrateSerializer(serializers.ModelSerializer): disk_pools = serializers.DictField(child=serializers.CharField(allow_blank=True), default=dict) delete_source = serializers.BooleanField(default=False) submission_key = serializers.CharField(write_only=True) - - class Meta: - model = MigrateInstance - fields = [ - "instance", - "target_compute", - "live", - "offline", - "autoconverge", - "compress", - "unsafe", - "disk_pools", - "delete_source", - "submission_key", - ] diff --git a/instances/forms.py b/instances/forms.py index a96058e9..41c9c677 100644 --- a/instances/forms.py +++ b/instances/forms.py @@ -4,7 +4,7 @@ from django import forms from django.conf import settings from django.utils.translation import gettext_lazy as _ -from .models import CreateInstance, Flavor +from .models import Flavor from .utils import nic_macs @@ -100,30 +100,36 @@ class ConsoleForm(forms.Form): return data -class NewVMForm(forms.ModelForm): - # name = forms.CharField(error_messages={'required': _('No Virtual Machine name has been entered')}, max_length=64) - # firmware = forms.CharField(max_length=50, required=False) - # vcpu = forms.IntegerField(error_messages={'required': _('No VCPU has been entered')}) - # disk = forms.IntegerField(required=False) - # memory = forms.IntegerField(error_messages={'required': _('No RAM size has been entered')}) - # networks = forms.CharField(error_messages={'required': _('No Network pool has been choosen')}) - # nwfilter = forms.CharField(required=False) - # storage = forms.CharField(max_length=20, required=False) - # template = forms.CharField(required=False) - # images = forms.CharField(required=False) - # cache_mode = forms.CharField(error_messages={'required': _('Please select HDD cache mode')}) - # hdd_size = forms.IntegerField(required=False) - # meta_prealloc = forms.BooleanField(required=False) - # virtio = forms.BooleanField(required=False) - # qemu_ga = forms.BooleanField(required=False) - # mac = forms.CharField(required=False) - # graphics = forms.CharField(error_messages={'required': _('Please select a graphics type')}) - # video = forms.CharField(error_messages={'required': _('Please select a video driver')}) - # listener_addr = forms.ChoiceField(required=True, widget=forms.RadioSelect, choices=QEMU_CONSOLE_LISTENER_ADDRESSES) - class Meta: - model = CreateInstance - fields = "__all__" - exclude = ["compute"] +class NewVMForm(forms.Form): + """The new VM form (create_instance_w2.html); the API takes CreateInstanceSerializer.""" + + name = forms.CharField(max_length=64) + firmware = forms.CharField(max_length=64) + # an emulated TPM 2.0, as Windows 11 needs + tpm = forms.BooleanField(required=False) + vcpu = forms.IntegerField(min_value=1) + # a mode of libvirt's (host-model, host-passthrough, maximum) or a CPU model's name + vcpu_mode = forms.CharField(max_length=64) + disk = forms.IntegerField(required=False) + memory = forms.IntegerField(min_value=1) + networks = forms.CharField(max_length=256) + nwfilter = forms.CharField(max_length=256, required=False) + net_model = forms.CharField(max_length=256, required=False) + storage = forms.CharField(max_length=256, required=False) + template = forms.CharField(max_length=256, required=False) + images = forms.CharField(max_length=256, required=False) + cache_mode = forms.CharField(max_length=16) + hdd_size = forms.IntegerField(min_value=1, required=False) + meta_prealloc = forms.BooleanField(required=False) + virtio = forms.BooleanField(required=False, initial=True) + qemu_ga = forms.BooleanField(required=False) + mac = forms.CharField(max_length=255, required=False) # one per NIC, comma separated + add_cdrom = forms.CharField(max_length=16) + # a NoCloud seed on a CD-ROM: the hostname and the creating user's SSH keys + cloud_init = forms.BooleanField(required=False) + add_input = forms.CharField(max_length=16) + video = forms.CharField(max_length=16) + listener_addr = forms.ChoiceField(choices=settings.QEMU_CONSOLE_LISTENER_ADDRESSES) def clean_name(self): name = self.cleaned_data["name"] diff --git a/instances/migrations/0015_remove_api_only_models.py b/instances/migrations/0015_remove_api_only_models.py new file mode 100644 index 00000000..fc04570d --- /dev/null +++ b/instances/migrations/0015_remove_api_only_models.py @@ -0,0 +1,19 @@ +# Generated by Django 5.2.18 on 2026-11-06 08:04 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('instances', '0014_instancetombstone_host'), + ] + + operations = [ + migrations.DeleteModel( + name='CreateInstance', + ), + migrations.DeleteModel( + name='MigrateInstance', + ), + ] diff --git a/instances/models.py b/instances/models.py index 4651dee2..3e2c4412 100644 --- a/instances/models.py +++ b/instances/models.py @@ -1,6 +1,4 @@ from computes.models import Compute -from django.conf import settings -from django.core.validators import MinValueValidator from django.db import models from django.utils.functional import cached_property from django.utils.translation import gettext_lazy as _ @@ -403,76 +401,6 @@ class Instance(models.Model): return self.proxy.get_image_formats() -class MigrateInstance(models.Model): - instance = models.ForeignKey( - Instance, related_name="source_host", on_delete=models.DO_NOTHING - ) - target_compute = models.ForeignKey( - Compute, related_name="target_host", on_delete=models.DO_NOTHING - ) - - live = models.BooleanField(_("Live")) - offline = models.BooleanField(_("Offline")) - autoconverge = models.BooleanField(_("Auto Converge"), default=True) - compress = models.BooleanField(_("Compress"), default=False) - unsafe = models.BooleanField(_("Unsafe"), default=False) - - class Meta: - managed = False - - -class CreateInstance(models.Model): - compute = models.ForeignKey( - Compute, related_name="host", on_delete=models.DO_NOTHING - ) - name = models.CharField( - max_length=64, - error_messages={"required": _("No Virtual Machine name has been entered")}, - ) - firmware = models.CharField(max_length=64) - # an emulated TPM 2.0, as Windows 11 needs - tpm = models.BooleanField(default=False) - vcpu = models.IntegerField( - error_messages={"required": _("No VCPU has been entered")}, validators=[MinValueValidator(1)] - ) - # a mode of libvirt's (host-model, host-passthrough, maximum) or a CPU model's name - vcpu_mode = models.CharField(max_length=64) - disk = models.IntegerField(blank=True) - memory = models.IntegerField( - error_messages={"required": _("No RAM size has been entered")}, validators=[MinValueValidator(1)] - ) - networks = models.CharField( - max_length=256, - error_messages={"required": _("No Network pool has been choosen")}, - ) - nwfilter = models.CharField(max_length=256, blank=True) - net_model = models.CharField(max_length=256, blank=True) - storage = models.CharField(max_length=256, blank=True) - template = models.CharField(max_length=256, blank=True) - images = models.CharField(max_length=256, blank=True) - cache_mode = models.CharField( - max_length=16, error_messages={"required": _("Please select HDD cache mode")} - ) - hdd_size = models.IntegerField(blank=True, validators=[MinValueValidator(1)]) - meta_prealloc = models.BooleanField(default=False, blank=True) - virtio = models.BooleanField(default=True) - qemu_ga = models.BooleanField(default=False) - mac = models.CharField(max_length=255, blank=True) # one per NIC, comma separated - add_cdrom = models.CharField(max_length=16) - # a NoCloud seed on a CD-ROM: the hostname and the creating user's SSH keys - cloud_init = models.BooleanField(default=False) - add_input = models.CharField(max_length=16) - video = models.CharField( - max_length=16, error_messages={"required": _("Please select a video driver")} - ) - listener_addr = models.CharField( - max_length=20, choices=settings.QEMU_CONSOLE_LISTENER_ADDRESSES - ) - - class Meta: - managed = False - - class InstanceTombstone(models.Model): """Ownership of a VM that disappeared from its compute. diff --git a/interfaces/api/serializers.py b/interfaces/api/serializers.py index e9a7bea5..eda04846 100644 --- a/interfaces/api/serializers.py +++ b/interfaces/api/serializers.py @@ -1,11 +1,10 @@ - from rest_framework import serializers -from interfaces.models import Interfaces -class InterfacesSerializer(serializers.ModelSerializer): - - class Meta: - model = Interfaces - fields = ['name', 'type', 'state', 'mac'] +class InterfacesSerializer(serializers.Serializer): + """A host interface as the API lists it.""" + name = serializers.CharField(max_length=20) + type = serializers.CharField(max_length=12) + state = serializers.CharField(max_length=100) + mac = serializers.CharField(max_length=24) diff --git a/interfaces/migrations/0002_remove_api_only_models.py b/interfaces/migrations/0002_remove_api_only_models.py new file mode 100644 index 00000000..6adabe13 --- /dev/null +++ b/interfaces/migrations/0002_remove_api_only_models.py @@ -0,0 +1,16 @@ +# Generated by Django 5.2.18 on 2026-11-06 08:04 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('interfaces', '0001_initial'), + ] + + operations = [ + migrations.DeleteModel( + name='Interfaces', + ), + ] diff --git a/interfaces/models.py b/interfaces/models.py deleted file mode 100644 index ff7d7eb7..00000000 --- a/interfaces/models.py +++ /dev/null @@ -1,17 +0,0 @@ -from django.db import models -from django.utils.translation import gettext_lazy as _ - - -# Create your models here. -class Interfaces(models.Model): - name = models.CharField( - _("name"), - max_length=20, - error_messages={"required": _("No interface name has been entered")}, - ) - type = models.CharField(_("status"), max_length=12) - state = models.CharField(_("device"), max_length=100) - mac = models.CharField(_("forward"), max_length=24) - - class Meta: - managed = False diff --git a/locale/tr/LC_MESSAGES/django.mo b/locale/tr/LC_MESSAGES/django.mo index 9db11eb6..26e5c400 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 3ea7bcaa..4bca13d8 100644 --- a/locale/tr/LC_MESSAGES/django.po +++ b/locale/tr/LC_MESSAGES/django.po @@ -149,8 +149,7 @@ msgid "Can change password" msgstr "Parola değiştirebilir" #: accounts/models.py:92 appsettings/models.py:9 computes/models.py:15 -#: instances/models.py:34 interfaces/models.py:8 networks/models.py:8 -#: storages/models.py:8 storages/models.py:25 +#: instances/models.py:32 msgid "name" msgstr "ad" @@ -356,7 +355,7 @@ msgstr "Kullanıcı adını girin" #: accounts/templates/accounts/otp_login.html:37 #: accounts/templates/login.html:36 admin/templates/admin/user_form.html:31 -#: console/templates/console-vnc.html:82 instances/forms.py:28 +#: console/templates/console-vnc.html:82 instances/forms.py:27 #: instances/templates/instances/access_tab.html:53 msgid "Password" msgstr "Parola" @@ -711,7 +710,7 @@ msgstr "" "NEW_USER_DEFAULT_INSTANCES: %(name)s tam olarak tek bir sanal makine değil" #: admin/forms.py:186 computes/templates/computes/list.html:58 -#: computes/templates/overview.html:58 instances/forms.py:15 +#: computes/templates/overview.html:58 instances/forms.py:14 #: instances/templates/allinstances_index_grouped.html:16 #: instances/templates/allinstances_index_nongrouped.html:14 #: instances/templates/create_instance_w2.html:63 @@ -732,7 +731,7 @@ msgstr "vCPU" msgid "Memory" msgstr "Bellek" -#: admin/forms.py:188 instances/models.py:237 +#: admin/forms.py:188 instances/models.py:235 #: instances/templates/create_instance_w2.html:118 #: instances/templates/instances/settings_tab.html:25 #: instances/templates/instances/stats_tab.html:51 @@ -915,7 +914,7 @@ msgid "IP" msgstr "IP" #: admin/templates/admin/logs.html:56 admin/views.py:286 instances/states.py:19 -#: instances/views.py:414 instances/views.py:416 logs/views.py:17 +#: instances/views.py:419 instances/views.py:421 logs/views.py:17 msgid "Unknown" msgstr "Bilinmeyen" @@ -2631,64 +2630,64 @@ msgstr "" "'%(type)s' konsol tipi desteklenmiyor. Lütfen sanal makinenin grafik tipini " "VNC olarak değiştirin." -#: instances/forms.py:14 instances/templates/create_instance_w2.html:69 +#: instances/forms.py:13 instances/templates/create_instance_w2.html:69 #: instances/templates/instances/settings_tab.html:857 msgid "Memory (MiB)" msgstr "Bellek (MiB)" -#: instances/forms.py:16 +#: instances/forms.py:15 msgid "Disk (GiB)" msgstr "Disk (GiB)" -#: instances/forms.py:25 +#: instances/forms.py:24 msgid "Console type" msgstr "Konsol tipi" -#: instances/forms.py:30 +#: instances/forms.py:29 msgid "Keep the password" msgstr "Parolayı koru" -#: instances/forms.py:31 +#: instances/forms.py:30 msgid "Generate a new one" msgstr "Yenisini oluştur" -#: instances/forms.py:32 +#: instances/forms.py:31 msgid "Set a new one" msgstr "Yenisini belirle" -#: instances/forms.py:33 +#: instances/forms.py:32 msgid "No password" msgstr "Parola yok" -#: instances/forms.py:38 +#: instances/forms.py:37 msgid "New password" msgstr "Yeni parola" -#: instances/forms.py:58 +#: instances/forms.py:57 msgid "Serial (xterm; the guest needs a getty on ttyS0)" msgstr "Seri (xterm; konuk sistemde ttyS0 üzerinde getty gerekir)" -#: instances/forms.py:65 +#: instances/forms.py:64 msgid "Auto" msgstr "Otomatik" -#: instances/forms.py:74 +#: instances/forms.py:73 msgid "Listen on" msgstr "Dinlenen" -#: instances/forms.py:81 +#: instances/forms.py:80 msgid "Keymap" msgstr "Klavye eşlemi" -#: instances/forms.py:90 +#: instances/forms.py:89 msgid "Enter the new password." msgstr "Yeni parolayı girin." -#: instances/forms.py:93 +#: instances/forms.py:92 msgid "A VNC password takes at most 8 bytes." msgstr "VNC parolası en fazla 8 bayt olabilir." -#: instances/forms.py:99 +#: instances/forms.py:98 msgid "" "The console listens beyond localhost; only an administrator can remove its " "password." @@ -2696,7 +2695,7 @@ msgstr "" "Konsol localhost dışında da dinliyor; parolasını yalnızca bir yönetici " "kaldırabilir." -#: instances/forms.py:135 +#: instances/forms.py:140 msgid "The name of the virtual machine must not contain any special characters" msgstr "Sanal makine adı özel karakterler içeremez" @@ -2932,7 +2931,7 @@ msgstr "" msgid "Create VM" msgstr "Sanal makine oluştur" -#: instances/jobs.py:773 instances/jobs.py:818 instances/views.py:2458 +#: instances/jobs.py:773 instances/jobs.py:818 instances/views.py:2463 msgid "A virtual machine with this name already exists" msgstr "Bu isimde bir sanal makine mevcut" @@ -3105,92 +3104,48 @@ msgstr "Sanal makine siliniyor" msgid "The VM was not deleted; it may have been shut off" msgstr "Sanal makine silinmedi; kapatılmış olabilir" -#: instances/models.py:18 +#: instances/models.py:16 msgid "label" msgstr "etiket" -#: instances/models.py:19 +#: instances/models.py:17 msgid "memory" msgstr "bellek" -#: instances/models.py:20 +#: instances/models.py:18 msgid "vcpu" msgstr "vcpu" -#: instances/models.py:21 +#: instances/models.py:19 msgid "disk" msgstr "disk" -#: instances/models.py:35 +#: instances/models.py:33 msgid "uuid" msgstr "uuid" -#: instances/models.py:36 +#: instances/models.py:34 msgid "is template" msgstr "şablon mu" -#: instances/models.py:37 +#: instances/models.py:35 msgid "created" msgstr "oluşturuldu" -#: instances/models.py:38 +#: instances/models.py:36 msgid "drbd" msgstr "drbd" -#: instances/models.py:239 instances/templates/create_instance_w2.html:312 +#: instances/models.py:237 instances/templates/create_instance_w2.html:312 #: instances/templates/instances/settings_tab.html:159 msgid "CD-ROM" msgstr "CD-ROM" -#: instances/models.py:241 +#: instances/models.py:239 msgid "NIC" msgstr "NIC" -#: instances/models.py:414 -msgid "Live" -msgstr "Canlı" - -#: instances/models.py:415 -msgid "Offline" -msgstr "Çevrimdışı" - -#: instances/models.py:416 -msgid "Auto Converge" -msgstr "Otomatik yavaşlat" - -#: instances/models.py:417 -msgid "Compress" -msgstr "Sıkıştır" - -#: instances/models.py:418 -msgid "Unsafe" -msgstr "Güvenli olmayan" - -#: instances/models.py:430 -msgid "No Virtual Machine name has been entered" -msgstr "Sanal makine adı girilmedi" - -#: instances/models.py:436 -msgid "No VCPU has been entered" -msgstr "VCPU belirtilmedi" - -#: instances/models.py:442 -msgid "No RAM size has been entered" -msgstr "RAM boyutu belirtilmedi" - -#: instances/models.py:446 -msgid "No Network pool has been choosen" -msgstr "Ağ havuzu seçilmedi" - -#: instances/models.py:454 -msgid "Please select HDD cache mode" -msgstr "Lütfen HDD ön bellek modunu seçin" - -#: instances/models.py:466 -msgid "Please select a video driver" -msgstr "Lütfen bir video sürücüsü seçin" - -#: instances/models.py:503 +#: instances/models.py:431 msgid "Can access console without password" msgstr "Parolasız konsol erişimi yapabilir" @@ -3332,7 +3287,7 @@ msgid "Disk source" msgstr "Disk kaynağı" #: instances/templates/add_instance_volume.html:21 -#: instances/templates/create_instance_w2.html:134 instances/views.py:2477 +#: instances/templates/create_instance_w2.html:134 instances/views.py:2482 msgid "New disk" msgstr "Yeni disk" @@ -3704,7 +3659,7 @@ msgstr "Özel CPU modelleri" msgid "Size (GiB)" msgstr "Boyut (GiB)" -#: instances/templates/create_instance_w2.html:161 instances/views.py:2478 +#: instances/templates/create_instance_w2.html:161 instances/views.py:2483 msgid "Existing volumes" msgstr "Mevcut birimler" @@ -3740,7 +3695,7 @@ msgstr "Aygıt" msgid "Remove" msgstr "Kaldır" -#: instances/templates/create_instance_w2.html:194 instances/views.py:2479 +#: instances/templates/create_instance_w2.html:194 instances/views.py:2484 msgid "Clone from template" msgstr "Şablondan klonla" @@ -5903,43 +5858,43 @@ msgstr "Geçersiz MAC adresi" msgid "More MAC addresses than networks" msgstr "Ağlardan daha fazla MAC adresi" -#: instances/views.py:168 +#: instances/views.py:173 msgid "Enter an IP address, a network such as 192.0.2.0/24, or a MAC address." msgstr "Bir IP adresi, 192.0.2.0/24 gibi bir ağ ya da bir MAC adresi girin." -#: instances/views.py:174 instances/views.py:208 +#: instances/views.py:179 instances/views.py:213 msgid "Too many searches are still running; try again shortly." msgstr "Çok fazla arama hâlâ çalışıyor; birazdan yeniden deneyin." -#: instances/views.py:256 +#: instances/views.py:261 #, python-format msgid "The host %(host)s of '%(name)s' cannot be reached: %(error)s" msgstr "'%(name)s' sanal makinesinin sunucusu %(host)s erişilemiyor: %(error)s" -#: instances/views.py:262 +#: instances/views.py:267 #, python-format msgid "The host of '%(name)s' cannot be reached right now." msgstr "'%(name)s' sanal makinesinin sunucusuna şu anda erişilemiyor." -#: instances/views.py:263 +#: instances/views.py:268 msgid " Jobs on it can be followed under Jobs in the menu." msgstr " Üzerindeki işler menüdeki İşler bölümünden izlenebilir." -#: instances/views.py:271 +#: instances/views.py:276 #, python-format msgid "'%(name)s' is no longer on its host." msgstr "'%(name)s' artık sunucusunda yok." -#: instances/views.py:369 +#: instances/views.py:374 msgid "There is no other host to migrate to." msgstr "Taşınacak başka bir sunucu yok." -#: instances/views.py:371 +#: instances/views.py:376 msgid "A VM migrates when it is running, paused or shut off." msgstr "" "Sanal makine çalışırken, duraklatılmışken ya da kapalıyken taşınabilir." -#: instances/views.py:373 +#: instances/views.py:378 msgid "" "A VM with snapshots cannot be migrated: its snapshots stay on this host. " "Delete them first." @@ -5947,7 +5902,7 @@ msgstr "" "Anlık görüntüsü olan bir sanal makine taşınamaz: anlık görüntüleri bu " "sunucuda kalır. Önce onları silin." -#: instances/views.py:375 +#: instances/views.py:380 msgid "" "A VM with host devices cannot be migrated: the destination may not have them." " Remove them first." @@ -5955,11 +5910,11 @@ msgstr "" "Sunucu aygıtları olan bir sanal makine taşınamaz: hedefte bu aygıtlar " "olmayabilir. Önce onları kaldırın." -#: instances/views.py:639 +#: instances/views.py:644 msgid "The VM was moved meanwhile; try again." msgstr "Sanal makine bu arada taşındı; yeniden deneyin." -#: instances/views.py:755 +#: instances/views.py:760 msgid "" "The running VM has no free PCI slot for another disk on this bus: choose the " "scsi bus if the VM has a SCSI controller, or shut the VM down and add the " @@ -5972,7 +5927,7 @@ msgstr "" "yuvaları ekle, sonraki başlatmadan itibaren ona boş yuvalar verir. Yeni bir " "birim havuzunda kalır, mevcut birim olarak eklenebilir." -#: instances/views.py:759 +#: instances/views.py:764 msgid "" "The running VM has no free PCI slot for the SCSI controller the disk needs: " "shut the VM down and add the disk then; Add PCIe slots on the Disks tab gives" @@ -5984,175 +5939,175 @@ msgstr "" "PCIe yuvaları ekle, sonraki başlatmadan itibaren ona boş yuvalar verir. Yeni " "bir birim havuzunda kalır, mevcut birim olarak eklenebilir." -#: instances/views.py:777 +#: instances/views.py:782 #, python-format msgid "Invalid disk options: %(options)s" msgstr "Geçersiz disk seçenekleri: %(options)s" -#: instances/views.py:787 instances/views.py:802 +#: instances/views.py:792 instances/views.py:807 msgid "Templates cannot be started." msgstr "Şablon makineler başlatılamaz." -#: instances/views.py:994 +#: instances/views.py:999 #, python-format msgid "Set the gstfsd key of %(compute)s first (Computes, edit the host)" msgstr "" "Önce %(compute)s sunucusunun gstfsd anahtarını ayarlayın (Sunucular, sunucuyu" " düzenle)" -#: instances/views.py:1001 instances/views.py:1019 instances/views.py:1028 +#: instances/views.py:1006 instances/views.py:1024 instances/views.py:1033 #, python-format msgid "gstfsd error: %(err)s" msgstr "gstfsd hatası: %(err)s" -#: instances/views.py:1029 +#: instances/views.py:1034 msgid "the reply is not signed with the key" msgstr "yanıt anahtarla imzalanmamış" -#: instances/views.py:1037 +#: instances/views.py:1042 msgid "Shut the VM down, or start its QEMU guest agent, and try again" msgstr "" "Sanal makineyi kapatın ya da QEMU konuk ajanını başlatın ve yeniden deneyin" -#: instances/views.py:1050 +#: instances/views.py:1055 msgid "The change may still be made when the agent answers again." msgstr "Ajan yeniden yanıt verdiğinde değişiklik yine de yapılabilir." -#: instances/views.py:1078 +#: instances/views.py:1083 msgid "Reset root password" msgstr "Root parolasını sıfırla" -#: instances/views.py:1082 +#: instances/views.py:1087 msgid "Enter a password" msgstr "Bir parola girin" -#: instances/views.py:1096 +#: instances/views.py:1101 msgid "Select an SSH public key" msgstr "Bir SSH açık anahtarı seçin" -#: instances/views.py:1118 +#: instances/views.py:1123 #, python-format msgid "Installed new SSH public key %(keyname)s" msgstr "Yeni %(keyname)s SSH açık anahtarı yüklendi" -#: instances/views.py:1138 +#: instances/views.py:1143 msgid "Enter a whole number of vCPUs" msgstr "vCPU sayısı için bir tam sayı girin" -#: instances/views.py:1142 +#: instances/views.py:1147 msgid "Shut off the VM to change its vCPUs" msgstr "vCPU'larını değiştirmek için sanal makineyi kapatın" -#: instances/views.py:1145 +#: instances/views.py:1150 msgid "The current vCPUs cannot be more than the maximum" msgstr "Geçerli vCPU sayısı en fazla değerden büyük olamaz" -#: instances/views.py:1152 +#: instances/views.py:1157 #, python-format msgid "%(quota)s: cannot resize the CPU of '%(instance_name)s'." msgstr "%(quota)s: '%(instance_name)s' CPU'su yeniden boyutlandırılamıyor." -#: instances/views.py:1160 +#: instances/views.py:1165 #, python-format msgid "vCPUs set to %(cur)s (maximum %(max)s)" msgstr "vCPU sayısı %(cur)s olarak ayarlandı (en fazla %(max)s)" -#: instances/views.py:1179 +#: instances/views.py:1184 msgid "Enter a whole number for memory" msgstr "Bellek için bir tam sayı girin" -#: instances/views.py:1182 +#: instances/views.py:1187 msgid "The current memory cannot be more than the maximum" msgstr "Geçerli bellek en fazla değerden büyük olamaz" -#: instances/views.py:1186 +#: instances/views.py:1191 #, python-format msgid "%(quota)s: cannot resize the memory of '%(instance_name)s'." msgstr "%(quota)s: '%(instance_name)s' belleği yeniden boyutlandırılamıyor." -#: instances/views.py:1192 +#: instances/views.py:1197 #, python-format msgid "Memory set to %(cur)s MiB (maximum %(max)s MiB)" msgstr "Bellek %(cur)s MiB olarak ayarlandı (en fazla %(max)s MiB)" -#: instances/views.py:1212 +#: instances/views.py:1217 msgid "Enter disk sizes as whole GiB" msgstr "Disk boyutlarını tam GiB olarak girin" -#: instances/views.py:1216 +#: instances/views.py:1221 #, python-format msgid "%(dev)s is %(size)s: a disk cannot shrink" msgstr "%(dev)s boyutu %(size)s: disk küçültülemez" -#: instances/views.py:1224 +#: instances/views.py:1229 msgid "No disks were selected or valid for resizing." msgstr "Boyutlandırma için seçilmiş ya da geçerli disk yok." -#: instances/views.py:1233 +#: instances/views.py:1238 #, python-format msgid "%(quota)s: cannot resize the disks of '%(instance_name)s'." msgstr "%(quota)s: '%(instance_name)s' diskleri yeniden boyutlandırılamıyor." -#: instances/views.py:1245 +#: instances/views.py:1250 #, python-format msgid "The storage pool of %(dev)s cannot resize its volumes" msgstr "%(dev)s diskinin depolama havuzu birimlerini boyutlandıramaz" -#: instances/views.py:1247 +#: instances/views.py:1252 #, python-format msgid "Disk is resized: %(dev)s" msgstr "Disk boyutu değiştirildi: %(dev)s" -#: instances/views.py:1341 +#: instances/views.py:1346 msgid "The VM's machine has no PCIe slots to add" msgstr "Sanal makinenin makine tipinde eklenecek PCIe yuvası yok" -#: instances/views.py:1346 +#: instances/views.py:1351 #, python-format msgid "%(count)s PCIe slots added" msgstr "%(count)s PCIe yuvası eklendi" -#: instances/views.py:1348 +#: instances/views.py:1353 #, python-format msgid "%(count)s PCIe slots added: the VM gets them at its next start" msgstr "" "%(count)s PCIe yuvası eklendi: sanal makine bunları sonraki başlatmasında " "alır" -#: instances/views.py:1394 +#: instances/views.py:1399 #, python-format msgid "%(volume)s is already a disk of this VM" msgstr "%(volume)s zaten bu sanal makinenin bir diski" -#: instances/views.py:1484 +#: instances/views.py:1489 msgid "Volume changes are applied. But it will be activated after shutdown" msgstr "" "Birim değişiklikleri uygulandı. Ama yeniden başlatıldıktan sonra uygulanacak" -#: instances/views.py:1489 +#: instances/views.py:1494 msgid "Volume is changed successfully." msgstr "Birim başarıyla değiştirildi." -#: instances/views.py:1507 +#: instances/views.py:1512 #, python-format msgid "Disk %(dev)s is not a storage volume of this instance" msgstr "%(dev)s diski bu sanal makinenin bir depolama birimi değil" -#: instances/views.py:1514 +#: instances/views.py:1519 #, python-format msgid "Disk %(dev)s has a pending change; delete it once the VM is shut down" msgstr "" "%(dev)s diskinin bekleyen bir değişikliği var; sanal makine kapatıldığında " "silin" -#: instances/views.py:1529 +#: instances/views.py:1534 #, python-format msgid "Volume %(vol)s is used by another VM; detach it instead" msgstr "" "%(vol)s birimi başka bir sanal makine tarafından kullanılıyor; onun yerine " "ayırın" -#: instances/views.py:1541 +#: instances/views.py:1546 #, python-format msgid "" "The guest has not released disk %(dev)s yet; volume %(vol)s was kept. Delete " @@ -6161,62 +6116,62 @@ msgstr "" "Konuk sistem %(dev)s diskini henüz bırakmadı; %(vol)s birimi korundu. Sanal " "makine kapatıldığında depolama havuzundan silin." -#: instances/views.py:1552 +#: instances/views.py:1557 #, python-format msgid "Disk %(dev)s was detached, but its volume was kept: %(err)s" msgstr "%(dev)s diski ayrıldı, ancak birimi korundu: %(err)s" -#: instances/views.py:1578 +#: instances/views.py:1583 #, python-format msgid "This VM cannot take a CD-ROM on the %(bus)s bus now" msgstr "Bu sanal makineye şu anda %(bus)s veri yolunda CD-ROM eklenemez" -#: instances/views.py:1581 +#: instances/views.py:1586 msgid "A USB CD-ROM needs an ISO image: libvirt has no empty USB drive" msgstr "USB CD-ROM bir ISO imajı ister: libvirt boş USB sürücü desteklemiyor" -#: instances/views.py:1586 +#: instances/views.py:1591 #, python-format msgid "%(image)s is already in a CD-ROM of this VM" msgstr "%(image)s bu sanal makinenin bir CD-ROM'unda zaten takılı" -#: instances/views.py:1667 +#: instances/views.py:1672 #, python-format msgid "Pool %(pool)s was not read again: %(err)s" msgstr "%(pool)s havuzu yeniden okunamadı: %(err)s" -#: instances/views.py:1688 +#: instances/views.py:1693 #, python-format msgid "Snapshot was not deleted: %(err)s" msgstr "Anlık görüntü silinmedi: %(err)s" -#: instances/views.py:1803 +#: instances/views.py:1808 msgid "Add at least one device to the boot order." msgstr "Ön yükleme sırasına en az bir aygıt ekleyin." -#: instances/views.py:1817 +#: instances/views.py:1822 msgid "Boot order changed. It applies at the next start." msgstr "Ön yükleme sırası değiştirildi. Sonraki başlatmada uygulanır." -#: instances/views.py:1819 +#: instances/views.py:1824 msgid "Boot order changed successfully." msgstr "Ön yükleme sırası başarıyla değiştirildi." -#: instances/views.py:1839 +#: instances/views.py:1844 msgid "The XML is empty" msgstr "XML boş" -#: instances/views.py:1843 instances/views.py:2468 +#: instances/views.py:1848 instances/views.py:2473 #, python-format msgid "The XML is not well-formed: %(error)s" msgstr "XML düzgün biçimlendirilmemiş: %(error)s" -#: instances/views.py:1845 +#: instances/views.py:1850 #, python-format msgid "The XML must keep the VM's UUID %(uuid)s." msgstr "XML, sanal makinenin %(uuid)s UUID'sini korumalıdır." -#: instances/views.py:1849 +#: instances/views.py:1854 msgid "" "The definition has changed since the editor was opened. Reload the page to " "edit the current one." @@ -6224,40 +6179,40 @@ msgstr "" "Düzenleyici açıldığından beri tanım değişti. Geçerli tanımı düzenlemek için " "sayfayı yeniden yükleyin." -#: instances/views.py:1861 +#: instances/views.py:1866 msgid "The XML definition was saved." msgstr "XML tanımı kaydedildi." -#: instances/views.py:1863 +#: instances/views.py:1868 msgid "The XML definition was saved; the VM uses it from its next start." msgstr "" "XML tanımı kaydedildi; sanal makine onu sonraki başlatmasından itibaren " "kullanır." -#: instances/views.py:1944 +#: instances/views.py:1949 msgid "Select one network interface to change" msgstr "Değiştirilecek bir ağ arabirimi seçin" -#: instances/views.py:1982 +#: instances/views.py:1987 msgid "Network Device Config is changed. Please shutdown instance to activate." msgstr "" "Ağ aygıtı yapılandırması değiştirildi. Aktifleştirmek için lütfen sanal " "makineyi kapatın." -#: instances/views.py:1984 +#: instances/views.py:1989 msgid "Network device changed" msgstr "Ağ aygıtı değiştirildi" -#: instances/views.py:1996 +#: instances/views.py:2001 msgid "No network selected" msgstr "Ağ seçilmedi" -#: instances/views.py:2001 +#: instances/views.py:2006 #, python-format msgid "The VM already has a network device with MAC %(mac)s" msgstr "Sanal makinede %(mac)s MAC adresli bir ağ aygıtı zaten var" -#: instances/views.py:2020 +#: instances/views.py:2025 msgid "" "The running VM has no free PCI slot for another network device: shut it down " "and add the device then; Add PCIe slots on the Disks tab gives it free ones " @@ -6267,21 +6222,21 @@ msgstr "" "aygıtı sonra ekleyin; Diskler sekmesindeki PCIe yuvaları ekle, sonraki " "başlatmadan itibaren ona boş yuvalar verir." -#: instances/views.py:2061 instances/views.py:2067 +#: instances/views.py:2066 instances/views.py:2072 msgid "The VM has it" msgstr "Sanal makinede var" -#: instances/views.py:2098 +#: instances/views.py:2103 #, python-format msgid "The host has no USB device %(device)s" msgstr "Sunucuda %(device)s USB aygıtı yok" -#: instances/views.py:2119 +#: instances/views.py:2124 #, python-format msgid "The host has no PCI device %(device)s" msgstr "Sunucuda %(device)s PCI aygıtı yok" -#: instances/views.py:2137 +#: instances/views.py:2142 #, python-format msgid "" "Removal of PCI device %(address)s requested: the guest has not let it go yet;" @@ -6291,20 +6246,20 @@ msgstr "" "bırakmadı; bırakana ya da sanal makine durana kadar çalışan sanal makinede " "kalır." -#: instances/views.py:2182 instances/views.py:2212 +#: instances/views.py:2187 instances/views.py:2217 msgid "Select a network interface and a QoS direction" msgstr "Bir ağ arabirimi ve bir QoS yönü seçin" -#: instances/views.py:2185 vrtManager/network.py:454 +#: instances/views.py:2190 vrtManager/network.py:454 msgid "QoS rates must be whole numbers" msgstr "QoS hızları tam sayı olmalıdır" -#: instances/views.py:2192 networks/views.py:229 +#: instances/views.py:2197 networks/views.py:229 #, python-format msgid "%(qos_dir)s QoS is set" msgstr "%(qos_dir)s QoS ayarlandı" -#: instances/views.py:2197 +#: instances/views.py:2202 #, python-format msgid "" "%(qos_dir)s QoS is set. A running VM gets it after it is powered off and on." @@ -6312,12 +6267,12 @@ msgstr "" "%(qos_dir)s QoS ayarlandı. Çalışan bir sanal makine, kapatılıp açıldıktan " "sonra bunu alır." -#: instances/views.py:2219 networks/views.py:255 +#: instances/views.py:2224 networks/views.py:255 #, python-format msgid "%(qos_dir)s QoS is deleted" msgstr "%(qos_dir)s QoS silindi" -#: instances/views.py:2224 +#: instances/views.py:2229 #, python-format msgid "" "%(qos_dir)s QoS is deleted. A running VM keeps the old limit until it is " @@ -6326,21 +6281,21 @@ msgstr "" "%(qos_dir)s QoS silindi. Çalışan bir sanal makine, kapatılıp açılana kadar " "eski sınırı korur." -#: instances/views.py:2252 +#: instances/views.py:2257 msgid "Only one owner is allowed and the one already added" msgstr "Sadece bir sahibe izin verilmiştir ve bir sahip zaten eklenmiş" -#: instances/views.py:2254 +#: instances/views.py:2259 #, python-format msgid "%(user)s is already an owner" msgstr "%(user)s zaten bir sahip" -#: instances/views.py:2299 +#: instances/views.py:2304 #, python-format msgid "Console settings were not saved: %(errors)s" msgstr "Konsol ayarları kaydedilmedi: %(errors)s" -#: instances/views.py:2321 +#: instances/views.py:2326 msgid "" "Error setting console password. You should check that your instance have an " "graphic device." @@ -6348,57 +6303,57 @@ msgstr "" "Konsol parolası ayarlanırken hata oluştu. Sanal makinenin bir grafik aygıtına" " sahip olduğundan emin olunuz." -#: instances/views.py:2368 +#: instances/views.py:2373 msgid "Shut the VM down to change whether it is a template." msgstr "Şablon olup olmadığını değiştirmek için sanal makineyi kapatın." -#: instances/views.py:2374 +#: instances/views.py:2379 #, python-format msgid "%(quota)s: '%(instance_name)s' stays a template." msgstr "%(quota)s: '%(instance_name)s' şablon olarak kalıyor." -#: instances/views.py:2456 +#: instances/views.py:2461 msgid "The XML has no name" msgstr "XML'de ad yok" -#: instances/views.py:2470 webvirtcloud/middleware.py:126 +#: instances/views.py:2475 webvirtcloud/middleware.py:126 #, python-format msgid "libvirt Error - %(exception)s" msgstr "libvirt Hatası - %(exception)s" -#: instances/views.py:2477 +#: instances/views.py:2482 msgid "An empty disk of the size you set" msgstr "Belirlediğiniz boyutta boş bir disk" -#: instances/views.py:2478 +#: instances/views.py:2483 msgid "Volumes already in a pool" msgstr "Bir havuzda zaten bulunan birimler" -#: instances/views.py:2479 +#: instances/views.py:2484 msgid "A copy of a template volume" msgstr "Bir şablon biriminin kopyası" -#: instances/views.py:2568 +#: instances/views.py:2573 msgid "You haven't defined any storage pools" msgstr "Hiç bir depolama havuzu tanımlamadınız" -#: instances/views.py:2570 +#: instances/views.py:2575 msgid "You haven't defined any network pools" msgstr "Hiç bir ağ havuzu tanımlamadınız" -#: instances/views.py:2633 +#: instances/views.py:2638 msgid "Flavor Created" msgstr "Flavor Oluşturuldu" -#: instances/views.py:2641 +#: instances/views.py:2646 msgid "Create Flavor" msgstr "Kullanıcı Oluştur" -#: instances/views.py:2653 +#: instances/views.py:2658 msgid "Flavor Deleted" msgstr "Flavor Silindi" -#: instances/views.py:2659 +#: instances/views.py:2664 msgid "Only the size template goes; VMs made from it keep their size." msgstr "" "Yalnızca boyut şablonu silinir; ondan oluşturulan sanal makineler boyutlarını" @@ -6471,23 +6426,6 @@ msgstr "" "Ethernet arabirimi, bu sunucunun hiçbir köprü, bond ya da VLAN içinde olmayan" " bir aygıtını yapılandırır" -#: interfaces/models.py:10 -msgid "No interface name has been entered" -msgstr "Arabirim adı girilmedi" - -#: interfaces/models.py:12 networks/models.py:12 storages/models.py:12 -#: storages/models.py:46 -msgid "status" -msgstr "durum" - -#: interfaces/models.py:13 networks/models.py:13 -msgid "device" -msgstr "aygıt" - -#: interfaces/models.py:14 networks/models.py:14 -msgid "forward" -msgstr "yönlendirme" - #: interfaces/templates/create_iface_block.html:7 #: interfaces/templates/create_iface_block.html:17 msgid "New interface" @@ -6814,7 +6752,7 @@ msgstr "IPv4 ağ öneki /30 veya daha kısa olmalıdır" msgid "For libvirt, the IPv6 network prefix must be /64" msgstr "Libvirt için IPv6 ağ prefixi /64 olmak zorundadır" -#: networks/forms.py:36 storages/forms.py:27 storages/models.py:10 +#: networks/forms.py:36 storages/forms.py:27 msgid "No pool name has been entered" msgstr "Havuz adı girilmedi" @@ -6852,10 +6790,6 @@ msgstr "Bu alan gerekli." msgid "Network %(net)s has %(subnet)s" msgstr "%(net)s ağı %(subnet)s alt ağını kullanıyor" -#: networks/models.py:10 -msgid "No network name has been entered" -msgstr "Ağ adı girilmedi" - #: networks/templates/add_network_qos.html:7 #, python-format msgid "Bandwidth limit of eth%(nic)s" @@ -8056,42 +7990,6 @@ msgstr "Kopya oluşturulmadı" msgid "Upload ISO image" msgstr "ISO imajı yükle" -#: storages/models.py:13 storages/models.py:48 -msgid "type" -msgstr "tip" - -#: storages/models.py:14 storages/models.py:32 storages/models.py:44 -msgid "size" -msgstr "boyut" - -#: storages/models.py:15 -msgid "volumes" -msgstr "birimler" - -#: storages/models.py:27 -msgid "format" -msgstr "biçem" - -#: storages/models.py:31 -msgid "allocation" -msgstr "ayrılan" - -#: storages/models.py:43 -msgid "state" -msgstr "durum" - -#: storages/models.py:45 -msgid "free" -msgstr "boş" - -#: storages/models.py:47 -msgid "path" -msgstr "yol" - -#: storages/models.py:49 -msgid "autostart" -msgstr "otomatik başlat" - #: storages/templates/create_stg_block.html:7 msgid "New pool" msgstr "Yeni havuz" @@ -9938,10 +9836,10 @@ msgid "Secret %(uuid)s is used by %(named)s; remove it from them first" msgstr "" "%(uuid)s parolası %(named)s tarafından kullanılıyor; önce onlardan kaldırın" -#: webvirtcloud/settings.py:334 +#: webvirtcloud/settings.py:319 msgid "Localhost" msgstr "Yerel sunucu" -#: webvirtcloud/settings.py:335 +#: webvirtcloud/settings.py:320 msgid "All interfaces" msgstr "Tüm arabirimler" diff --git a/locale/zh/LC_MESSAGES/django.mo b/locale/zh/LC_MESSAGES/django.mo index 38965e94..434c0b9b 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 da98c7b6..105a24e9 100644 --- a/locale/zh/LC_MESSAGES/django.po +++ b/locale/zh/LC_MESSAGES/django.po @@ -146,8 +146,7 @@ msgid "Can change password" msgstr "可修改密码" #: accounts/models.py:92 appsettings/models.py:9 computes/models.py:15 -#: instances/models.py:34 interfaces/models.py:8 networks/models.py:8 -#: storages/models.py:8 storages/models.py:25 +#: instances/models.py:32 msgid "name" msgstr "名称" @@ -353,7 +352,7 @@ msgstr "输入用户名" #: accounts/templates/accounts/otp_login.html:37 #: accounts/templates/login.html:36 admin/templates/admin/user_form.html:31 -#: console/templates/console-vnc.html:82 instances/forms.py:28 +#: console/templates/console-vnc.html:82 instances/forms.py:27 #: instances/templates/instances/access_tab.html:53 msgid "Password" msgstr "密码" @@ -693,7 +692,7 @@ msgid "NEW_USER_DEFAULT_INSTANCES: %(name)s is not exactly one VM" msgstr "NEW_USER_DEFAULT_INSTANCES:%(name)s 不是唯一的一台虚拟机" #: admin/forms.py:186 computes/templates/computes/list.html:58 -#: computes/templates/overview.html:58 instances/forms.py:15 +#: computes/templates/overview.html:58 instances/forms.py:14 #: instances/templates/allinstances_index_grouped.html:16 #: instances/templates/allinstances_index_nongrouped.html:14 #: instances/templates/create_instance_w2.html:63 @@ -714,7 +713,7 @@ msgstr "vCPU" msgid "Memory" msgstr "内存" -#: admin/forms.py:188 instances/models.py:237 +#: admin/forms.py:188 instances/models.py:235 #: instances/templates/create_instance_w2.html:118 #: instances/templates/instances/settings_tab.html:25 #: instances/templates/instances/stats_tab.html:51 @@ -895,7 +894,7 @@ msgid "IP" msgstr "IP" #: admin/templates/admin/logs.html:56 admin/views.py:286 instances/states.py:19 -#: instances/views.py:414 instances/views.py:416 logs/views.py:17 +#: instances/views.py:419 instances/views.py:421 logs/views.py:17 msgid "Unknown" msgstr "未知" @@ -2538,70 +2537,70 @@ msgid "" "VNC." msgstr "不支持控制台类型 '%(type)s'。请将虚拟机图形切换为 VNC。" -#: instances/forms.py:14 instances/templates/create_instance_w2.html:69 +#: instances/forms.py:13 instances/templates/create_instance_w2.html:69 #: instances/templates/instances/settings_tab.html:857 msgid "Memory (MiB)" msgstr "内存(MiB)" -#: instances/forms.py:16 +#: instances/forms.py:15 msgid "Disk (GiB)" msgstr "磁盘(GiB)" -#: instances/forms.py:25 +#: instances/forms.py:24 msgid "Console type" msgstr "控制台类型" -#: instances/forms.py:30 +#: instances/forms.py:29 msgid "Keep the password" msgstr "保留密码" -#: instances/forms.py:31 +#: instances/forms.py:30 msgid "Generate a new one" msgstr "生成新密码" -#: instances/forms.py:32 +#: instances/forms.py:31 msgid "Set a new one" msgstr "设置新密码" -#: instances/forms.py:33 +#: instances/forms.py:32 msgid "No password" msgstr "无密码" -#: instances/forms.py:38 +#: instances/forms.py:37 msgid "New password" msgstr "新密码" -#: instances/forms.py:58 +#: instances/forms.py:57 msgid "Serial (xterm; the guest needs a getty on ttyS0)" msgstr "串行(xterm;客户机需要在 ttyS0 上运行 getty)" -#: instances/forms.py:65 +#: instances/forms.py:64 msgid "Auto" msgstr "自动" -#: instances/forms.py:74 +#: instances/forms.py:73 msgid "Listen on" msgstr "监听地址" -#: instances/forms.py:81 +#: instances/forms.py:80 msgid "Keymap" msgstr "键盘映射" -#: instances/forms.py:90 +#: instances/forms.py:89 msgid "Enter the new password." msgstr "请输入新密码。" -#: instances/forms.py:93 +#: instances/forms.py:92 msgid "A VNC password takes at most 8 bytes." msgstr "VNC 密码最多 8 个字节。" -#: instances/forms.py:99 +#: instances/forms.py:98 msgid "" "The console listens beyond localhost; only an administrator can remove its " "password." msgstr "控制台监听的不只是 localhost;只有管理员可以移除其密码。" -#: instances/forms.py:135 +#: instances/forms.py:140 msgid "The name of the virtual machine must not contain any special characters" msgstr "虚拟机名称不能包含任何特殊字符" @@ -2815,7 +2814,7 @@ msgstr "磁盘已复制,但无法定义克隆:%(error)s;请检查这些卷 msgid "Create VM" msgstr "创建虚拟机" -#: instances/jobs.py:773 instances/jobs.py:818 instances/views.py:2458 +#: instances/jobs.py:773 instances/jobs.py:818 instances/views.py:2463 msgid "A virtual machine with this name already exists" msgstr "同名虚拟机已存在" @@ -2980,92 +2979,48 @@ msgstr "正在删除虚拟机" msgid "The VM was not deleted; it may have been shut off" msgstr "虚拟机未被删除;它可能已被关闭" -#: instances/models.py:18 +#: instances/models.py:16 msgid "label" msgstr "标签" -#: instances/models.py:19 +#: instances/models.py:17 msgid "memory" msgstr "内存" -#: instances/models.py:20 +#: instances/models.py:18 msgid "vcpu" msgstr "vCPU" -#: instances/models.py:21 +#: instances/models.py:19 msgid "disk" msgstr "磁盘" -#: instances/models.py:35 +#: instances/models.py:33 msgid "uuid" msgstr "UUID" -#: instances/models.py:36 +#: instances/models.py:34 msgid "is template" msgstr "是否为模板" -#: instances/models.py:37 +#: instances/models.py:35 msgid "created" msgstr "创建时间" -#: instances/models.py:38 +#: instances/models.py:36 msgid "drbd" msgstr "drbd" -#: instances/models.py:239 instances/templates/create_instance_w2.html:312 +#: instances/models.py:237 instances/templates/create_instance_w2.html:312 #: instances/templates/instances/settings_tab.html:159 msgid "CD-ROM" msgstr "CD-ROM" -#: instances/models.py:241 +#: instances/models.py:239 msgid "NIC" msgstr "网卡" -#: instances/models.py:414 -msgid "Live" -msgstr "在线" - -#: instances/models.py:415 -msgid "Offline" -msgstr "离线" - -#: instances/models.py:416 -msgid "Auto Converge" -msgstr "自动收敛" - -#: instances/models.py:417 -msgid "Compress" -msgstr "压缩" - -#: instances/models.py:418 -msgid "Unsafe" -msgstr "不安全" - -#: instances/models.py:430 -msgid "No Virtual Machine name has been entered" -msgstr "未输入虚拟机名称" - -#: instances/models.py:436 -msgid "No VCPU has been entered" -msgstr "未输入 vCPU" - -#: instances/models.py:442 -msgid "No RAM size has been entered" -msgstr "未输入内存大小" - -#: instances/models.py:446 -msgid "No Network pool has been choosen" -msgstr "未选择网络池" - -#: instances/models.py:454 -msgid "Please select HDD cache mode" -msgstr "请选择硬盘缓存模式" - -#: instances/models.py:466 -msgid "Please select a video driver" -msgstr "请选择显卡驱动" - -#: instances/models.py:503 +#: instances/models.py:431 msgid "Can access console without password" msgstr "可无密码访问控制台" @@ -3203,7 +3158,7 @@ msgid "Disk source" msgstr "磁盘来源" #: instances/templates/add_instance_volume.html:21 -#: instances/templates/create_instance_w2.html:134 instances/views.py:2477 +#: instances/templates/create_instance_w2.html:134 instances/views.py:2482 msgid "New disk" msgstr "新磁盘" @@ -3567,7 +3522,7 @@ msgstr "自定义 CPU 型号" msgid "Size (GiB)" msgstr "大小(GiB)" -#: instances/templates/create_instance_w2.html:161 instances/views.py:2478 +#: instances/templates/create_instance_w2.html:161 instances/views.py:2483 msgid "Existing volumes" msgstr "已有卷" @@ -3603,7 +3558,7 @@ msgstr "设备" msgid "Remove" msgstr "移除" -#: instances/templates/create_instance_w2.html:194 instances/views.py:2479 +#: instances/templates/create_instance_w2.html:194 instances/views.py:2484 msgid "Clone from template" msgstr "从模板克隆" @@ -5609,58 +5564,58 @@ msgstr "无效的 MAC 地址" msgid "More MAC addresses than networks" msgstr "MAC 地址数量多于网络数量" -#: instances/views.py:168 +#: instances/views.py:173 msgid "Enter an IP address, a network such as 192.0.2.0/24, or a MAC address." msgstr "请输入 IP 地址、网络(如 192.0.2.0/24)或 MAC 地址。" -#: instances/views.py:174 instances/views.py:208 +#: instances/views.py:179 instances/views.py:213 msgid "Too many searches are still running; try again shortly." msgstr "仍在运行的搜索过多;请稍后再试。" -#: instances/views.py:256 +#: instances/views.py:261 #, python-format msgid "The host %(host)s of '%(name)s' cannot be reached: %(error)s" msgstr "无法连接“%(name)s”所在的主机 %(host)s:%(error)s" -#: instances/views.py:262 +#: instances/views.py:267 #, python-format msgid "The host of '%(name)s' cannot be reached right now." msgstr "目前无法连接“%(name)s”所在的主机。" -#: instances/views.py:263 +#: instances/views.py:268 msgid " Jobs on it can be followed under Jobs in the menu." msgstr " 其上的任务可在菜单的“任务”中跟踪。" -#: instances/views.py:271 +#: instances/views.py:276 #, python-format msgid "'%(name)s' is no longer on its host." msgstr "“%(name)s”已不在其主机上。" -#: instances/views.py:369 +#: instances/views.py:374 msgid "There is no other host to migrate to." msgstr "没有其他可迁移到的主机。" -#: instances/views.py:371 +#: instances/views.py:376 msgid "A VM migrates when it is running, paused or shut off." msgstr "虚拟机在运行、暂停或关机状态下均可迁移。" -#: instances/views.py:373 +#: instances/views.py:378 msgid "" "A VM with snapshots cannot be migrated: its snapshots stay on this host. " "Delete them first." msgstr "有快照的虚拟机无法迁移:其快照保留在本主机上。请先删除快照。" -#: instances/views.py:375 +#: instances/views.py:380 msgid "" "A VM with host devices cannot be migrated: the destination may not have them." " Remove them first." msgstr "有主机设备的虚拟机无法迁移:目标主机可能没有这些设备。请先移除它们。" -#: instances/views.py:639 +#: instances/views.py:644 msgid "The VM was moved meanwhile; try again." msgstr "该虚拟机在此期间已被移动;请重试。" -#: instances/views.py:755 +#: instances/views.py:760 msgid "" "The running VM has no free PCI slot for another disk on this bus: choose the " "scsi bus if the VM has a SCSI controller, or shut the VM down and add the " @@ -5670,7 +5625,7 @@ msgstr "" "运行中的虚拟机在此总线上没有可用 PCI 插槽来添加磁盘:如果虚拟机有 SCSI 控制器,请选择 scsi " "总线;或关闭虚拟机后再添加磁盘。“磁盘”选项卡上的“添加 PCIe 插槽”可使其从下次启动起获得可用插槽。新卷会保留在其存储池中,可作为现有卷挂载。" -#: instances/views.py:759 +#: instances/views.py:764 msgid "" "The running VM has no free PCI slot for the SCSI controller the disk needs: " "shut the VM down and add the disk then; Add PCIe slots on the Disks tab gives" @@ -5680,262 +5635,262 @@ msgstr "" "运行中的虚拟机没有可用 PCI 插槽来添加磁盘所需的 SCSI 控制器:请关闭虚拟机后再添加磁盘。“磁盘”选项卡上的“添加 PCIe " "插槽”可使其从下次启动起获得可用插槽。新卷会保留在其存储池中,可作为现有卷挂载。" -#: instances/views.py:777 +#: instances/views.py:782 #, python-format msgid "Invalid disk options: %(options)s" msgstr "无效的磁盘选项:%(options)s" -#: instances/views.py:787 instances/views.py:802 +#: instances/views.py:792 instances/views.py:807 msgid "Templates cannot be started." msgstr "模板无法启动。" -#: instances/views.py:994 +#: instances/views.py:999 #, python-format msgid "Set the gstfsd key of %(compute)s first (Computes, edit the host)" msgstr "请先设置 %(compute)s 的 gstfsd 密钥(计算节点,编辑该主机)" -#: instances/views.py:1001 instances/views.py:1019 instances/views.py:1028 +#: instances/views.py:1006 instances/views.py:1024 instances/views.py:1033 #, python-format msgid "gstfsd error: %(err)s" msgstr "gstfsd 错误:%(err)s" -#: instances/views.py:1029 +#: instances/views.py:1034 msgid "the reply is not signed with the key" msgstr "回复未使用该密钥签名" -#: instances/views.py:1037 +#: instances/views.py:1042 msgid "Shut the VM down, or start its QEMU guest agent, and try again" msgstr "请关闭虚拟机,或启动其 QEMU 客户机代理,然后重试" -#: instances/views.py:1050 +#: instances/views.py:1055 msgid "The change may still be made when the agent answers again." msgstr "当代理再次响应时,此更改仍可能生效。" -#: instances/views.py:1078 +#: instances/views.py:1083 msgid "Reset root password" msgstr "重置 root 密码" -#: instances/views.py:1082 +#: instances/views.py:1087 msgid "Enter a password" msgstr "请输入密码" -#: instances/views.py:1096 +#: instances/views.py:1101 msgid "Select an SSH public key" msgstr "请选择 SSH 公钥" -#: instances/views.py:1118 +#: instances/views.py:1123 #, python-format msgid "Installed new SSH public key %(keyname)s" msgstr "已安装新的 SSH 公钥 %(keyname)s" -#: instances/views.py:1138 +#: instances/views.py:1143 msgid "Enter a whole number of vCPUs" msgstr "请输入整数个 vCPU" -#: instances/views.py:1142 +#: instances/views.py:1147 msgid "Shut off the VM to change its vCPUs" msgstr "请关闭虚拟机以更改其 vCPU" -#: instances/views.py:1145 +#: instances/views.py:1150 msgid "The current vCPUs cannot be more than the maximum" msgstr "当前 vCPU 数不能超过最大值" -#: instances/views.py:1152 +#: instances/views.py:1157 #, python-format msgid "%(quota)s: cannot resize the CPU of '%(instance_name)s'." msgstr "%(quota)s:无法调整“%(instance_name)s”的 CPU。" -#: instances/views.py:1160 +#: instances/views.py:1165 #, python-format msgid "vCPUs set to %(cur)s (maximum %(max)s)" msgstr "vCPU 已设为 %(cur)s(最大 %(max)s)" -#: instances/views.py:1179 +#: instances/views.py:1184 msgid "Enter a whole number for memory" msgstr "请输入整数内存值" -#: instances/views.py:1182 +#: instances/views.py:1187 msgid "The current memory cannot be more than the maximum" msgstr "当前内存不能超过最大值" -#: instances/views.py:1186 +#: instances/views.py:1191 #, python-format msgid "%(quota)s: cannot resize the memory of '%(instance_name)s'." msgstr "%(quota)s:无法调整“%(instance_name)s”的内存。" -#: instances/views.py:1192 +#: instances/views.py:1197 #, python-format msgid "Memory set to %(cur)s MiB (maximum %(max)s MiB)" msgstr "内存已设为 %(cur)s MiB(最大 %(max)s MiB)" -#: instances/views.py:1212 +#: instances/views.py:1217 msgid "Enter disk sizes as whole GiB" msgstr "请以整数 GiB 输入磁盘大小" -#: instances/views.py:1216 +#: instances/views.py:1221 #, python-format msgid "%(dev)s is %(size)s: a disk cannot shrink" msgstr "%(dev)s 为 %(size)s:磁盘不能缩小" -#: instances/views.py:1224 +#: instances/views.py:1229 msgid "No disks were selected or valid for resizing." msgstr "未选择磁盘或没有可调整大小的有效磁盘。" -#: instances/views.py:1233 +#: instances/views.py:1238 #, python-format msgid "%(quota)s: cannot resize the disks of '%(instance_name)s'." msgstr "%(quota)s:无法调整“%(instance_name)s”的磁盘。" -#: instances/views.py:1245 +#: instances/views.py:1250 #, python-format msgid "The storage pool of %(dev)s cannot resize its volumes" msgstr "%(dev)s 所在的存储池无法调整其卷的大小" -#: instances/views.py:1247 +#: instances/views.py:1252 #, python-format msgid "Disk is resized: %(dev)s" msgstr "磁盘已调整大小:%(dev)s" -#: instances/views.py:1341 +#: instances/views.py:1346 msgid "The VM's machine has no PCIe slots to add" msgstr "该虚拟机的机器类型没有可添加的 PCIe 插槽" -#: instances/views.py:1346 +#: instances/views.py:1351 #, python-format msgid "%(count)s PCIe slots added" msgstr "已添加 %(count)s 个 PCIe 插槽" -#: instances/views.py:1348 +#: instances/views.py:1353 #, python-format msgid "%(count)s PCIe slots added: the VM gets them at its next start" msgstr "已添加 %(count)s 个 PCIe 插槽:虚拟机在下次启动时获得它们" -#: instances/views.py:1394 +#: instances/views.py:1399 #, python-format msgid "%(volume)s is already a disk of this VM" msgstr "%(volume)s 已是此虚拟机的磁盘" -#: instances/views.py:1484 +#: instances/views.py:1489 msgid "Volume changes are applied. But it will be activated after shutdown" msgstr "卷更改已应用,但将在关机后生效" -#: instances/views.py:1489 +#: instances/views.py:1494 msgid "Volume is changed successfully." msgstr "卷已成功更改。" -#: instances/views.py:1507 +#: instances/views.py:1512 #, python-format msgid "Disk %(dev)s is not a storage volume of this instance" msgstr "磁盘 %(dev)s 不是此虚拟机的存储卷" -#: instances/views.py:1514 +#: instances/views.py:1519 #, python-format msgid "Disk %(dev)s has a pending change; delete it once the VM is shut down" msgstr "磁盘 %(dev)s 有待生效的更改;请在虚拟机关机后删除它" -#: instances/views.py:1529 +#: instances/views.py:1534 #, python-format msgid "Volume %(vol)s is used by another VM; detach it instead" msgstr "卷 %(vol)s 正被另一台虚拟机使用;请改为分离它" -#: instances/views.py:1541 +#: instances/views.py:1546 #, python-format msgid "" "The guest has not released disk %(dev)s yet; volume %(vol)s was kept. Delete " "it from the storage pool once the VM is shut down." msgstr "客户机尚未释放磁盘 %(dev)s;卷 %(vol)s 已保留。请在虚拟机关机后从存储池中删除它。" -#: instances/views.py:1552 +#: instances/views.py:1557 #, python-format msgid "Disk %(dev)s was detached, but its volume was kept: %(err)s" msgstr "磁盘 %(dev)s 已分离,但其卷已保留:%(err)s" -#: instances/views.py:1578 +#: instances/views.py:1583 #, python-format msgid "This VM cannot take a CD-ROM on the %(bus)s bus now" msgstr "该虚拟机现在无法在 %(bus)s 总线上添加 CD-ROM" -#: instances/views.py:1581 +#: instances/views.py:1586 msgid "A USB CD-ROM needs an ISO image: libvirt has no empty USB drive" msgstr "USB CD-ROM 需要 ISO 镜像:libvirt 不支持空的 USB 驱动器" -#: instances/views.py:1586 +#: instances/views.py:1591 #, python-format msgid "%(image)s is already in a CD-ROM of this VM" msgstr "%(image)s 已在此虚拟机的某个光驱中" -#: instances/views.py:1667 +#: instances/views.py:1672 #, python-format msgid "Pool %(pool)s was not read again: %(err)s" msgstr "未重新读取存储池 %(pool)s:%(err)s" -#: instances/views.py:1688 +#: instances/views.py:1693 #, python-format msgid "Snapshot was not deleted: %(err)s" msgstr "快照未删除:%(err)s" -#: instances/views.py:1803 +#: instances/views.py:1808 msgid "Add at least one device to the boot order." msgstr "请至少向启动顺序中添加一个设备。" -#: instances/views.py:1817 +#: instances/views.py:1822 msgid "Boot order changed. It applies at the next start." msgstr "启动顺序已更改,将在下次启动时生效。" -#: instances/views.py:1819 +#: instances/views.py:1824 msgid "Boot order changed successfully." msgstr "启动顺序已成功更改。" -#: instances/views.py:1839 +#: instances/views.py:1844 msgid "The XML is empty" msgstr "XML 为空" -#: instances/views.py:1843 instances/views.py:2468 +#: instances/views.py:1848 instances/views.py:2473 #, python-format msgid "The XML is not well-formed: %(error)s" msgstr "XML 格式不正确:%(error)s" -#: instances/views.py:1845 +#: instances/views.py:1850 #, python-format msgid "The XML must keep the VM's UUID %(uuid)s." msgstr "XML 必须保留虚拟机的 UUID %(uuid)s。" -#: instances/views.py:1849 +#: instances/views.py:1854 msgid "" "The definition has changed since the editor was opened. Reload the page to " "edit the current one." msgstr "自打开编辑器以来定义已被更改。请重新加载页面以编辑当前定义。" -#: instances/views.py:1861 +#: instances/views.py:1866 msgid "The XML definition was saved." msgstr "XML 定义已保存。" -#: instances/views.py:1863 +#: instances/views.py:1868 msgid "The XML definition was saved; the VM uses it from its next start." msgstr "XML 定义已保存;虚拟机从下次启动起使用它。" -#: instances/views.py:1944 +#: instances/views.py:1949 msgid "Select one network interface to change" msgstr "请选择一个要更改的网络接口" -#: instances/views.py:1982 +#: instances/views.py:1987 msgid "Network Device Config is changed. Please shutdown instance to activate." msgstr "网络设备配置已更改。请关闭虚拟机以使其生效。" -#: instances/views.py:1984 +#: instances/views.py:1989 msgid "Network device changed" msgstr "网络设备已更改" -#: instances/views.py:1996 +#: instances/views.py:2001 msgid "No network selected" msgstr "未选择网络" -#: instances/views.py:2001 +#: instances/views.py:2006 #, python-format msgid "The VM already has a network device with MAC %(mac)s" msgstr "虚拟机已有 MAC 地址为 %(mac)s 的网络设备" -#: instances/views.py:2020 +#: instances/views.py:2025 msgid "" "The running VM has no free PCI slot for another network device: shut it down " "and add the device then; Add PCIe slots on the Disks tab gives it free ones " @@ -5943,129 +5898,129 @@ msgid "" msgstr "" "运行中的虚拟机没有可用 PCI 插槽来添加网络设备:请关机后再添加设备。“磁盘”选项卡上的“添加 PCIe 插槽”可使其从下次启动起获得可用插槽。" -#: instances/views.py:2061 instances/views.py:2067 +#: instances/views.py:2066 instances/views.py:2072 msgid "The VM has it" msgstr "虚拟机已有此设备" -#: instances/views.py:2098 +#: instances/views.py:2103 #, python-format msgid "The host has no USB device %(device)s" msgstr "主机上没有 USB 设备 %(device)s" -#: instances/views.py:2119 +#: instances/views.py:2124 #, python-format msgid "The host has no PCI device %(device)s" msgstr "主机上没有 PCI 设备 %(device)s" -#: instances/views.py:2137 +#: instances/views.py:2142 #, python-format msgid "" "Removal of PCI device %(address)s requested: the guest has not let it go yet;" " it stays in the running VM until it does or the VM stops." msgstr "已请求移除 PCI 设备 %(address)s:客户机尚未释放它;在客户机释放或虚拟机停止之前,它仍保留在运行中的虚拟机中。" -#: instances/views.py:2182 instances/views.py:2212 +#: instances/views.py:2187 instances/views.py:2217 msgid "Select a network interface and a QoS direction" msgstr "请选择网络接口和 QoS 方向" -#: instances/views.py:2185 vrtManager/network.py:454 +#: instances/views.py:2190 vrtManager/network.py:454 msgid "QoS rates must be whole numbers" msgstr "QoS 速率必须为整数" -#: instances/views.py:2192 networks/views.py:229 +#: instances/views.py:2197 networks/views.py:229 #, python-format msgid "%(qos_dir)s QoS is set" msgstr "%(qos_dir)s QoS 已设置" -#: instances/views.py:2197 +#: instances/views.py:2202 #, python-format msgid "" "%(qos_dir)s QoS is set. A running VM gets it after it is powered off and on." msgstr "%(qos_dir)s QoS 已设置。运行中的虚拟机需关机再开机后才能生效。" -#: instances/views.py:2219 networks/views.py:255 +#: instances/views.py:2224 networks/views.py:255 #, python-format msgid "%(qos_dir)s QoS is deleted" msgstr "%(qos_dir)s QoS 已删除" -#: instances/views.py:2224 +#: instances/views.py:2229 #, python-format msgid "" "%(qos_dir)s QoS is deleted. A running VM keeps the old limit until it is " "powered off and on." msgstr "%(qos_dir)s QoS 已删除。运行中的虚拟机在关机再开机之前保留旧的限制。" -#: instances/views.py:2252 +#: instances/views.py:2257 msgid "Only one owner is allowed and the one already added" msgstr "只允许一个所有者,且已添加" -#: instances/views.py:2254 +#: instances/views.py:2259 #, python-format msgid "%(user)s is already an owner" msgstr "%(user)s 已是所有者" -#: instances/views.py:2299 +#: instances/views.py:2304 #, python-format msgid "Console settings were not saved: %(errors)s" msgstr "控制台设置未保存:%(errors)s" -#: instances/views.py:2321 +#: instances/views.py:2326 msgid "" "Error setting console password. You should check that your instance have an " "graphic device." msgstr "设置控制台密码出错。请检查虚拟机是否有图形设备。" -#: instances/views.py:2368 +#: instances/views.py:2373 msgid "Shut the VM down to change whether it is a template." msgstr "请关闭虚拟机以更改其是否为模板。" -#: instances/views.py:2374 +#: instances/views.py:2379 #, python-format msgid "%(quota)s: '%(instance_name)s' stays a template." msgstr "%(quota)s:“%(instance_name)s”仍为模板。" -#: instances/views.py:2456 +#: instances/views.py:2461 msgid "The XML has no name" msgstr "XML 中没有名称" -#: instances/views.py:2470 webvirtcloud/middleware.py:126 +#: instances/views.py:2475 webvirtcloud/middleware.py:126 #, python-format msgid "libvirt Error - %(exception)s" msgstr "libvirt 错误 - %(exception)s" -#: instances/views.py:2477 +#: instances/views.py:2482 msgid "An empty disk of the size you set" msgstr "按设定大小创建的空磁盘" -#: instances/views.py:2478 +#: instances/views.py:2483 msgid "Volumes already in a pool" msgstr "存储池中已有的卷" -#: instances/views.py:2479 +#: instances/views.py:2484 msgid "A copy of a template volume" msgstr "模板卷的副本" -#: instances/views.py:2568 +#: instances/views.py:2573 msgid "You haven't defined any storage pools" msgstr "您尚未定义任何存储池" -#: instances/views.py:2570 +#: instances/views.py:2575 msgid "You haven't defined any network pools" msgstr "您尚未定义任何网络池" -#: instances/views.py:2633 +#: instances/views.py:2638 msgid "Flavor Created" msgstr "规格已创建" -#: instances/views.py:2641 +#: instances/views.py:2646 msgid "Create Flavor" msgstr "创建规格" -#: instances/views.py:2653 +#: instances/views.py:2658 msgid "Flavor Deleted" msgstr "规格已删除" -#: instances/views.py:2659 +#: instances/views.py:2664 msgid "Only the size template goes; VMs made from it keep their size." msgstr "仅删除此规格;由它创建的虚拟机保持其大小。" @@ -6132,23 +6087,6 @@ msgid "" "VLAN" msgstr "以太网接口用于配置本主机上不属于任何网桥、绑定或 VLAN 的设备" -#: interfaces/models.py:10 -msgid "No interface name has been entered" -msgstr "未输入接口名称" - -#: interfaces/models.py:12 networks/models.py:12 storages/models.py:12 -#: storages/models.py:46 -msgid "status" -msgstr "状态" - -#: interfaces/models.py:13 networks/models.py:13 -msgid "device" -msgstr "设备" - -#: interfaces/models.py:14 networks/models.py:14 -msgid "forward" -msgstr "转发" - #: interfaces/templates/create_iface_block.html:7 #: interfaces/templates/create_iface_block.html:17 msgid "New interface" @@ -6463,7 +6401,7 @@ msgstr "IPv4 网络前缀必须为 /30 或更短" msgid "For libvirt, the IPv6 network prefix must be /64" msgstr "libvirt 要求 IPv6 网络前缀为 /64" -#: networks/forms.py:36 storages/forms.py:27 storages/models.py:10 +#: networks/forms.py:36 storages/forms.py:27 msgid "No pool name has been entered" msgstr "未输入地址池名称" @@ -6501,10 +6439,6 @@ msgstr "此字段为必填项。" msgid "Network %(net)s has %(subnet)s" msgstr "网络 %(net)s 已使用 %(subnet)s" -#: networks/models.py:10 -msgid "No network name has been entered" -msgstr "未输入网络名称" - #: networks/templates/add_network_qos.html:7 #, python-format msgid "Bandwidth limit of eth%(nic)s" @@ -7641,42 +7575,6 @@ msgstr "未创建副本" msgid "Upload ISO image" msgstr "上传 ISO 镜像" -#: storages/models.py:13 storages/models.py:48 -msgid "type" -msgstr "类型" - -#: storages/models.py:14 storages/models.py:32 storages/models.py:44 -msgid "size" -msgstr "大小" - -#: storages/models.py:15 -msgid "volumes" -msgstr "卷" - -#: storages/models.py:27 -msgid "format" -msgstr "格式" - -#: storages/models.py:31 -msgid "allocation" -msgstr "分配" - -#: storages/models.py:43 -msgid "state" -msgstr "状态" - -#: storages/models.py:45 -msgid "free" -msgstr "可用" - -#: storages/models.py:47 -msgid "path" -msgstr "路径" - -#: storages/models.py:49 -msgid "autostart" -msgstr "自动启动" - #: storages/templates/create_stg_block.html:7 msgid "New pool" msgstr "新建存储池" @@ -9379,10 +9277,10 @@ msgstr "存储池 %(names)s" msgid "Secret %(uuid)s is used by %(named)s; remove it from them first" msgstr "机密 %(uuid)s 正被 %(named)s 使用;请先从中移除它" -#: webvirtcloud/settings.py:334 +#: webvirtcloud/settings.py:319 msgid "Localhost" msgstr "本机" -#: webvirtcloud/settings.py:335 +#: webvirtcloud/settings.py:320 msgid "All interfaces" msgstr "所有接口" diff --git a/networks/api/serializers.py b/networks/api/serializers.py index eb2588ba..4b06a4c3 100644 --- a/networks/api/serializers.py +++ b/networks/api/serializers.py @@ -1,8 +1,10 @@ -from networks.models import Networks from rest_framework import serializers -class NetworksSerializer(serializers.ModelSerializer): - class Meta: - model = Networks - fields = ["name", "status", "device", "forward"] +class NetworksSerializer(serializers.Serializer): + """A host network as the API lists it.""" + + name = serializers.CharField(max_length=20) + status = serializers.CharField(max_length=12) + device = serializers.CharField(max_length=100) + forward = serializers.CharField(max_length=24) diff --git a/networks/migrations/0002_remove_api_only_models.py b/networks/migrations/0002_remove_api_only_models.py new file mode 100644 index 00000000..60535918 --- /dev/null +++ b/networks/migrations/0002_remove_api_only_models.py @@ -0,0 +1,16 @@ +# Generated by Django 5.2.18 on 2026-11-06 08:04 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('networks', '0001_initial'), + ] + + operations = [ + migrations.DeleteModel( + name='Networks', + ), + ] diff --git a/networks/models.py b/networks/models.py deleted file mode 100644 index 0f272bfb..00000000 --- a/networks/models.py +++ /dev/null @@ -1,17 +0,0 @@ -from django.db import models -from django.utils.translation import gettext_lazy as _ - - -# Create your models here. -class Networks(models.Model): - name = models.CharField( - _("name"), - max_length=20, - error_messages={"required": _("No network name has been entered")}, - ) - status = models.CharField(_("status"), max_length=12) - device = models.CharField(_("device"), max_length=100) - forward = models.CharField(_("forward"), max_length=24) - - class Meta: - managed = False diff --git a/storages/api/serializers.py b/storages/api/serializers.py index fdb52295..e8e9f243 100644 --- a/storages/api/serializers.py +++ b/storages/api/serializers.py @@ -1,28 +1,35 @@ - from rest_framework import serializers -from storages.models import Storages, Storage, Volume -class StoragesSerializer(serializers.ModelSerializer): +class StoragesSerializer(serializers.Serializer): + """A storage pool as the API lists it.""" - class Meta: - model = Storages - fields = ['name', 'status', 'type', 'size', 'volumes'] + name = serializers.CharField(max_length=20) + status = serializers.IntegerField() + type = serializers.CharField(max_length=100) + size = serializers.IntegerField() + volumes = serializers.IntegerField() -class StorageSerializer(serializers.ModelSerializer): - volumes = serializers.ReadOnlyField() - class Meta: - model = Storage - fields = ['state', 'size', 'free', 'status', 'path', 'type', 'autostart', 'volumes'] +class StorageSerializer(serializers.Serializer): + """A storage pool's details.""" + + state = serializers.IntegerField() + size = serializers.IntegerField() + free = serializers.IntegerField() + status = serializers.CharField(max_length=128) + path = serializers.CharField(max_length=128) + type = serializers.CharField(max_length=128) + autostart = serializers.BooleanField() + # the pool's volumes (wvmStorage.update_volumes); none while it is stopped + volumes = serializers.ListField(child=serializers.DictField(), read_only=True, allow_null=True) -class VolumeSerializer(serializers.ModelSerializer): +class VolumeSerializer(serializers.Serializer): # what the web form (storages.forms.CreateVolumeForm) takes name = serializers.RegexField(r"^[a-zA-Z0-9._-]+$", max_length=120) + type = serializers.ChoiceField(choices=[("qcow2", "qcow2 (recommended)"), ("qcow", "qcow"), ("raw", "raw")], + label="Format") + allocation = serializers.IntegerField(read_only=True) size = serializers.IntegerField(min_value=1) # GiB - allocation = serializers.ReadOnlyField() meta_prealloc = serializers.BooleanField(write_only=True, default=False) - class Meta: - model = Volume - fields = ['name', 'type', 'allocation', 'size', 'meta_prealloc'] diff --git a/storages/migrations/0002_remove_api_only_models.py b/storages/migrations/0002_remove_api_only_models.py new file mode 100644 index 00000000..850f28ea --- /dev/null +++ b/storages/migrations/0002_remove_api_only_models.py @@ -0,0 +1,22 @@ +# Generated by Django 5.2.18 on 2026-11-06 08:04 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('storages', '0001_initial'), + ] + + operations = [ + migrations.DeleteModel( + name='Storage', + ), + migrations.DeleteModel( + name='Storages', + ), + migrations.DeleteModel( + name='Volume', + ), + ] diff --git a/storages/models.py b/storages/models.py deleted file mode 100644 index 55183376..00000000 --- a/storages/models.py +++ /dev/null @@ -1,58 +0,0 @@ -from django.db import models -from django.utils.translation import gettext_lazy as _ - - -# Create your models here. -class Storages(models.Model): - name = models.CharField( - _("name"), - max_length=20, - error_messages={"required": _("No pool name has been entered")}, - ) - status = models.IntegerField(_("status")) - type = models.CharField(_("type"), max_length=100) - size = models.IntegerField(_("size")) - volumes = models.IntegerField(_("volumes")) - - class Meta: - managed = False - - def __str__(self): - return f"{self.name}" - - -class Volume(models.Model): - name = models.CharField(_("name"), max_length=128) - type = models.CharField( - _("format"), - max_length=12, - choices=(("qcow2", "qcow2 (recommended)"), ("qcow", "qcow"), ("raw", "raw")), - ) - allocation = models.IntegerField(_("allocation")) - size = models.IntegerField(_("size")) - - class Meta: - managed = False - verbose_name_plural = "Volumes" - - def __str__(self): - return f"{self.name}" - - -class Storage(models.Model): - state = models.IntegerField(_("state")) - size = models.IntegerField(_("size")) - free = models.IntegerField(_("free")) - status = models.CharField(_("status"), max_length=128) - path = models.CharField(_("path"), max_length=128) - type = models.CharField(_("type"), max_length=128) - autostart = models.BooleanField(_("autostart")) - volumes = models.ForeignKey( - Volume, related_name="storage_volumes", on_delete=models.DO_NOTHING - ) - - class Meta: - managed = False - - def __str__(self): - return f"{self.path}"