diff --git a/instances/templatetags/tags_active.py b/instances/templatetags/tags_active.py
index 5af5248..2745147 100644
--- a/instances/templatetags/tags_active.py
+++ b/instances/templatetags/tags_active.py
@@ -1,6 +1,7 @@
-from django import template
import re
+from django import template
+
register = template.Library()
diff --git a/instances/tests.py b/instances/tests.py
index 5c70322..20e1bfc 100644
--- a/instances/tests.py
+++ b/instances/tests.py
@@ -8,12 +8,11 @@ from django.contrib.auth.models import Permission
from django.http.response import Http404
from django.shortcuts import reverse
from django.test import TestCase
+from instances.views import instance
from libvirt import VIR_DOMAIN_UNDEFINE_NVRAM
from vrtManager.create import wvmCreate
from vrtManager.util import randomUUID
-from instances.views import instance
-
from .models import Flavor, Instance
from .utils import refr
diff --git a/instances/views.py b/instances/views.py
index f1a2221..ae2e82e 100644
--- a/instances/views.py
+++ b/instances/views.py
@@ -19,7 +19,8 @@ from django.http import Http404, HttpResponse, JsonResponse
from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
-from libvirt import (VIR_DOMAIN_UNDEFINE_KEEP_NVRAM, VIR_DOMAIN_UNDEFINE_NVRAM, libvirtError)
+from instances.models import Instance
+from libvirt import VIR_DOMAIN_UNDEFINE_KEEP_NVRAM, VIR_DOMAIN_UNDEFINE_NVRAM, libvirtError
from logs.views import addlogmsg
from vrtManager import util
from vrtManager.create import wvmCreate
@@ -27,8 +28,6 @@ from vrtManager.instance import wvmInstances
from vrtManager.storage import wvmStorage
from vrtManager.util import randomPasswd
-from instances.models import Instance
-
from . import utils
from .forms import ConsoleForm, FlavorForm, NewVMForm
from .models import Flavor
@@ -37,42 +36,47 @@ from .models import Flavor
def index(request):
instances = None
- computes = Compute.objects.all().order_by("name").prefetch_related('instance_set').prefetch_related(
- 'instance_set__userinstance_set')
+ computes = (
+ Compute.objects.all()
+ .order_by("name")
+ .prefetch_related("instance_set")
+ .prefetch_related("instance_set__userinstance_set")
+ )
for compute in computes:
utils.refr(compute)
if request.user.is_superuser:
- instances = Instance.objects.all().prefetch_related('userinstance_set')
+ instances = Instance.objects.all().prefetch_related("userinstance_set")
else:
- instances = Instance.objects.filter(userinstance__user=request.user).prefetch_related('userinstance_set')
+ instances = Instance.objects.filter(userinstance__user=request.user).prefetch_related("userinstance_set")
- return render(request, 'allinstances.html', {'computes': computes, 'instances': instances})
+ return render(request, "allinstances.html", {"computes": computes, "instances": instances})
def instance(request, pk):
instance: Instance = get_instance(request.user, pk)
compute: Compute = instance.compute
- computes = Compute.objects.all().order_by('name')
+ computes = Compute.objects.all().order_by("name")
computes_count = computes.count()
- users = User.objects.all().order_by('username')
+ users = User.objects.all().order_by("username")
publickeys = UserSSHKey.objects.filter(user_id=request.user.id)
keymaps = settings.QEMU_KEYMAPS
console_types = AppSettings.objects.get(key="QEMU_CONSOLE_DEFAULT_TYPE").choices_as_list()
console_form = ConsoleForm(
initial={
- 'type': instance.console_type,
- 'listen_on': instance.console_listen_address,
- 'password': instance.console_passwd,
- 'keymap': instance.console_keymap,
- })
+ "type": instance.console_type,
+ "listen_on": instance.console_listen_address,
+ "password": instance.console_passwd,
+ "keymap": instance.console_keymap,
+ }
+ )
console_listen_addresses = settings.QEMU_CONSOLE_LISTEN_ADDRESSES
bottom_bar = app_settings.VIEW_INSTANCE_DETAIL_BOTTOM_BAR
allow_admin_or_not_template = request.user.is_superuser or request.user.is_staff or not instance.is_template
try:
- userinstance = UserInstance.objects.get(instance__compute_id=compute.id,
- instance__name=instance.name,
- user__id=request.user.id)
+ userinstance = UserInstance.objects.get(
+ instance__compute_id=compute.id, instance__name=instance.name, user__id=request.user.id
+ )
except UserInstance.DoesNotExist:
userinstance = None
@@ -109,7 +113,7 @@ def instance(request, pk):
# addlogmsg(request.user.username, instance.name, msg)
# userinstances = UserInstance.objects.filter(instance=instance).order_by('user__username')
- userinstances = instance.userinstance_set.order_by('user__username')
+ userinstances = instance.userinstance_set.order_by("user__username")
allow_admin_or_not_template = request.user.is_superuser or request.user.is_staff or not instance.is_template
# Host resources
@@ -121,12 +125,12 @@ def instance(request, pk):
storages_host = sorted(instance.proxy.get_storages(True))
net_models_host = instance.proxy.get_network_models()
- return render(request, 'instance.html', locals())
+ return render(request, "instance.html", locals())
def status(request, pk):
instance = get_instance(request.user, pk)
- return JsonResponse({'status': instance.proxy.get_status()})
+ return JsonResponse({"status": instance.proxy.get_status()})
def stats(request, pk):
@@ -142,56 +146,58 @@ def stats(request, pk):
current_time = time.strftime("%H:%M:%S")
for blk in blk_usage:
- json_blk.append({'dev': blk['dev'], 'data': [int(blk['rd']) / 1048576, int(blk['wr']) / 1048576]})
+ json_blk.append({"dev": blk["dev"], "data": [int(blk["rd"]) / 1048576, int(blk["wr"]) / 1048576]})
for net in net_usage:
- json_net.append({'dev': net['dev'], 'data': [int(net['rx']) / 1048576, int(net['tx']) / 1048576]})
+ json_net.append({"dev": net["dev"], "data": [int(net["rx"]) / 1048576, int(net["tx"]) / 1048576]})
- return JsonResponse({
- 'cpudata': int(cpu_usage['cpu']),
- 'memdata': mem_usage,
- 'blkdata': json_blk,
- 'netdata': json_net,
- 'timeline': current_time,
- })
+ return JsonResponse(
+ {
+ "cpudata": int(cpu_usage["cpu"]),
+ "memdata": mem_usage,
+ "blkdata": json_blk,
+ "netdata": json_net,
+ "timeline": current_time,
+ }
+ )
def guess_mac_address(request, vname):
- data = {'vname': vname}
+ data = {"vname": vname}
mac = utils.get_dhcp_mac_address(vname)
if not mac:
mac = utils.get_random_mac_address()
- data['mac'] = mac
+ data["mac"] = mac
return HttpResponse(json.dumps(data))
def random_mac_address(request):
data = dict()
- data['mac'] = utils.get_random_mac_address()
+ data["mac"] = utils.get_random_mac_address()
return HttpResponse(json.dumps(data))
def guess_clone_name(request):
- dhcp_file = '/srv/webvirtcloud/dhcpd.conf'
+ dhcp_file = "/srv/webvirtcloud/dhcpd.conf"
prefix = app_settings.CLONE_INSTANCE_DEFAULT_PREFIX
if os.path.isfile(dhcp_file):
instance_names = [i.name for i in Instance.objects.filter(name__startswith=prefix)]
- with open(dhcp_file, 'r') as f:
+ with open(dhcp_file, "r") as f:
for line in f:
line = line.strip()
if f"host {prefix}" in line:
- fqdn = line.split(' ')[1]
- hostname = fqdn.split('.')[0]
+ fqdn = line.split(" ")[1]
+ hostname = fqdn.split(".")[0]
if hostname.startswith(prefix) and hostname not in instance_names:
- return HttpResponse(json.dumps({'name': hostname}))
+ return HttpResponse(json.dumps({"name": hostname}))
return HttpResponse(json.dumps({}))
def check_instance(request, vname):
instance = Instance.objects.filter(name=vname)
- data = {'vname': vname, 'exists': False}
+ data = {"vname": vname, "exists": False}
if instance:
- data['exists'] = True
+ data["exists"] = True
return JsonResponse(data)
@@ -209,20 +215,20 @@ def sshkeys(request, pk):
keys = UserSSHKey.objects.filter(user=ui.user)
for k in keys:
instance_keys.append(k.keypublic)
- if request.GET.get('plain', ''):
- response = '\n'.join(instance_keys)
- response += '\n'
+ if request.GET.get("plain", ""):
+ response = "\n".join(instance_keys)
+ response += "\n"
else:
response = json.dumps(instance_keys)
return HttpResponse(response)
def get_instance(user, pk):
- '''
+ """
Check that instance is available for user, if not raise 404
- '''
+ """
instance = get_object_or_404(Instance, pk=pk)
- user_instances = user.userinstance_set.all().values_list('instance', flat=True)
+ user_instances = user.userinstance_set.all().values_list("instance", flat=True)
if user.is_superuser or instance.id in user_instances:
return instance
@@ -238,7 +244,7 @@ def poweron(request, pk):
instance.proxy.start()
addlogmsg(request.user.username, instance.name, _("Power On"))
- return redirect(request.META.get('HTTP_REFERER'))
+ return redirect(request.META.get("HTTP_REFERER"))
def powercycle(request, pk):
@@ -246,7 +252,7 @@ def powercycle(request, pk):
instance.proxy.force_shutdown()
instance.proxy.start()
addlogmsg(request.user.username, instance.name, _("Power Cycle"))
- return redirect(request.META.get('HTTP_REFERER'))
+ return redirect(request.META.get("HTTP_REFERER"))
def poweroff(request, pk):
@@ -254,7 +260,7 @@ def poweroff(request, pk):
instance.proxy.shutdown()
addlogmsg(request.user.username, instance.name, _("Power Off"))
- return redirect(request.META.get('HTTP_REFERER'))
+ return redirect(request.META.get("HTTP_REFERER"))
@superuser_only
@@ -262,7 +268,7 @@ def suspend(request, pk):
instance = get_instance(request.user, pk)
instance.proxy.suspend()
addlogmsg(request.user.username, instance.name, _("Suspend"))
- return redirect(request.META.get('HTTP_REFERER'))
+ return redirect(request.META.get("HTTP_REFERER"))
@superuser_only
@@ -270,48 +276,48 @@ def resume(request, pk):
instance = get_instance(request.user, pk)
instance.proxy.resume()
addlogmsg(request.user.username, instance.name, _("Resume"))
- return redirect(request.META.get('HTTP_REFERER'))
+ return redirect(request.META.get("HTTP_REFERER"))
def force_off(request, pk):
instance = get_instance(request.user, pk)
instance.proxy.force_shutdown()
addlogmsg(request.user.username, instance.name, _("Force Off"))
- return redirect(request.META.get('HTTP_REFERER'))
+ return redirect(request.META.get("HTTP_REFERER"))
def destroy(request, pk):
instance = get_instance(request.user, pk)
try:
userinstance = instance.userinstance_set.get(user=request.user)
- except:
+ except Exception:
userinstance = UserInstance(is_delete=request.user.is_superuser)
- if request.method == 'POST' and userinstance.is_delete:
+ if request.method == "POST" and userinstance.is_delete:
if instance.proxy.get_status() == 1:
instance.proxy.force_shutdown()
- if request.POST.get('delete_disk', ''):
- snapshots = sorted(instance.proxy.get_snapshot(), reverse=True, key=lambda k: k['date'])
+ if request.POST.get("delete_disk", ""):
+ snapshots = sorted(instance.proxy.get_snapshot(), reverse=True, key=lambda k: k["date"])
for snapshot in snapshots:
- instance.proxy.snapshot_delete(snapshot['name'])
+ instance.proxy.snapshot_delete(snapshot["name"])
instance.proxy.delete_all_disks()
- if request.POST.get('delete_nvram', ''):
+ if request.POST.get("delete_nvram", ""):
instance.proxy.delete(VIR_DOMAIN_UNDEFINE_NVRAM)
else:
instance.proxy.delete(VIR_DOMAIN_UNDEFINE_KEEP_NVRAM)
instance.delete()
addlogmsg(request.user, instance.name, _("Destroy"))
- return redirect(reverse('instances:index'))
+ return redirect(reverse("instances:index"))
return render(
request,
- 'instances/destroy_instance_form.html',
+ "instances/destroy_instance_form.html",
{
- 'instance': instance,
- 'userinstance': userinstance,
+ "instance": instance,
+ "userinstance": userinstance,
},
)
@@ -320,14 +326,14 @@ def destroy(request, pk):
def migrate(request, pk):
instance = get_instance(request.user, pk)
- compute_id = request.POST.get('compute_id', '')
- live = request.POST.get('live_migrate', False)
- unsafe = request.POST.get('unsafe_migrate', False)
- xml_del = request.POST.get('xml_delete', False)
- offline = request.POST.get('offline_migrate', False)
- autoconverge = request.POST.get('autoconverge', False)
- compress = request.POST.get('compress', False)
- postcopy = request.POST.get('postcopy', False)
+ compute_id = request.POST.get("compute_id", "")
+ live = request.POST.get("live_migrate", False)
+ unsafe = request.POST.get("unsafe_migrate", False)
+ xml_del = request.POST.get("xml_delete", False)
+ offline = request.POST.get("offline_migrate", False)
+ autoconverge = request.POST.get("autoconverge", False)
+ compress = request.POST.get("compress", False)
+ postcopy = request.POST.get("postcopy", False)
new_compute = Compute.objects.get(id=compute_id)
@@ -336,20 +342,20 @@ def migrate(request, pk):
except libvirtError as err:
messages.error(request, err)
- msg = _("Migrate to %(hostname)%") % {'hostname': new_compute.hostname}
+ msg = _("Instance is migrated to %(hostname)s") % {"hostname": new_compute.hostname}
addlogmsg(request.user, instance.name, msg)
- return redirect(request.META.get('HTTP_REFERER'))
+ return redirect(request.META.get("HTTP_REFERER"))
def set_root_pass(request, pk):
instance = get_instance(request.user, pk)
- if request.method == 'POST':
- passwd = request.POST.get('passwd', None)
+ if request.method == "POST":
+ passwd = request.POST.get("passwd", None)
if passwd:
- passwd_hash = crypt.crypt(passwd, '$6$kgPoiREy')
- data = {'action': 'password', 'passwd': passwd_hash, 'vname': instance.name}
+ passwd_hash = crypt.crypt(passwd, "$6$kgPoiREy")
+ data = {"action": "password", "passwd": passwd_hash, "vname": instance.name}
if instance.proxy.get_status() == 5:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
@@ -358,24 +364,24 @@ def set_root_pass(request, pk):
d = s.recv(1024).strip()
result = json.loads(d)
s.close()
- if result['return'] == 'success':
+ if result["return"] == "success":
msg = _("Reset root password")
addlogmsg(request.user.username, instance.name, msg)
messages.success(request, msg)
else:
- messages.error(request, result['message'])
+ messages.error(request, result["message"])
else:
msg = _("Please shutdown down your instance and then try again")
messages.error(request, msg)
- return redirect(reverse('instances:instance', args=[instance.id]) + '#access')
+ return redirect(reverse("instances:instance", args=[instance.id]) + "#access")
def add_public_key(request, pk):
instance = get_instance(request.user, pk)
- if request.method == 'POST':
- sshkeyid = request.POST.get('sshkeyid', '')
+ if request.method == "POST":
+ sshkeyid = request.POST.get("sshkeyid", "")
publickey = UserSSHKey.objects.get(id=sshkeyid)
- data = {'action': 'publickey', 'key': publickey.keypublic, 'vname': instance.name}
+ data = {"action": "publickey", "key": publickey.keypublic, "vname": instance.name}
if instance.proxy.get_status() == 5:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
@@ -383,87 +389,90 @@ def add_public_key(request, pk):
s.send(json.dumps(data).encode())
result = json.loads(s.recv(1024))
s.close()
- if result['return'] == 'error':
- msg = result['message']
+ if result["return"] == "error":
+ msg = result["message"]
else:
- msg = _("Installed new SSH public key %(keyname)s") % {'keyname': publickey.keyname}
+ msg = _("Installed new SSH public key %(keyname)s") % {"keyname": publickey.keyname}
addlogmsg(request.user.username, instance.name, msg)
- if result['return'] == 'success':
+ if result["return"] == "success":
messages.success(request, msg)
else:
messages.error(request, msg)
else:
msg = _("Please shutdown down your instance and then try again")
messages.error(request, msg)
- return redirect(reverse('instances:instance', args=[instance.id]) + '#access')
+ return redirect(reverse("instances:instance", args=[instance.id]) + "#access")
def resizevm_cpu(request, pk):
instance = get_instance(request.user, pk)
try:
userinstance = instance.userinstance_set.get(user=request.user)
- except:
+ except Exception:
userinstance = UserInstance(is_change=False)
vcpu = instance.proxy.get_vcpu()
- if request.method == 'POST':
+ if request.method == "POST":
if request.user.is_superuser or request.user.is_staff or userinstance.is_change:
- new_vcpu = request.POST.get('vcpu', '')
- new_cur_vcpu = request.POST.get('cur_vcpu', '')
+ new_vcpu = request.POST.get("vcpu", "")
+ new_cur_vcpu = request.POST.get("cur_vcpu", "")
quota_msg = utils.check_user_quota(request.user, 0, int(new_vcpu) - vcpu, 0, 0)
if not request.user.is_superuser and quota_msg:
msg = _("User %(quota_msg)s quota reached, cannot resize CPU of '%(instance_name)s'!") % {
- 'quota_msg': quota_msg,
- 'instance_name': instance.name
+ "quota_msg": quota_msg,
+ "instance_name": instance.name,
}
messages.error(request, msg)
else:
cur_vcpu = new_cur_vcpu
vcpu = new_vcpu
instance.proxy.resize_cpu(cur_vcpu, vcpu)
- msg = _("Resize CPU")
+ msg = _("CPU is resized: %(old)s to %(new)s") % {"old": cur_vcpu, "new": vcpu}
addlogmsg(request.user.username, instance.name, msg)
messages.success(request, msg)
- return redirect(reverse('instances:instance', args=[instance.id]) + '#resize')
+ return redirect(reverse("instances:instance", args=[instance.id]) + "#resize")
def resize_memory(request, pk):
instance = get_instance(request.user, pk)
try:
userinstance = instance.userinstance_set.get(user=request.user)
- except:
+ except Exception:
userinstance = UserInstance(is_change=False)
memory = instance.proxy.get_memory()
cur_memory = instance.proxy.get_cur_memory()
- if request.method == 'POST':
+ if request.method == "POST":
if request.user.is_superuser or request.user.is_staff or userinstance.is_change:
- new_memory = request.POST.get('memory', '')
- new_memory_custom = request.POST.get('memory_custom', '')
+ new_memory = request.POST.get("memory", "")
+ new_memory_custom = request.POST.get("memory_custom", "")
if new_memory_custom:
new_memory = new_memory_custom
- new_cur_memory = request.POST.get('cur_memory', '')
- new_cur_memory_custom = request.POST.get('cur_memory_custom', '')
+ new_cur_memory = request.POST.get("cur_memory", "")
+ new_cur_memory_custom = request.POST.get("cur_memory_custom", "")
if new_cur_memory_custom:
new_cur_memory = new_cur_memory_custom
quota_msg = utils.check_user_quota(request.user, 0, 0, int(new_memory) - memory, 0)
if not request.user.is_superuser and quota_msg:
msg = _("User %(quota_msg)s quota reached, cannot resize memory of '%(instance_name)s'!") % {
- 'quota_msg': quota_msg,
- 'instance_name': instance.name
+ "quota_msg": quota_msg,
+ "instance_name": instance.name,
}
messages.error(request, msg)
else:
- cur_memory = new_cur_memory
- memory = new_memory
- instance.proxy.resize_mem(cur_memory, memory)
- msg = _("Resize Memory")
+ instance.proxy.resize_mem(new_cur_memory, new_memory)
+ msg = _("Memory is resized: current/max: %(old_cur)s/%(old_max)s to %(new_cur)s/%(new_max)s") % {
+ "old_cur": cur_memory,
+ "old_max": memory,
+ "new_cur": new_cur_memory,
+ "new_max": new_memory,
+ }
addlogmsg(request.user.username, instance.name, msg)
messages.success(request, msg)
- return redirect(reverse('instances:instance', args=[instance.id]) + '#resize')
+ return redirect(reverse("instances:instance", args=[instance.id]) + "#resize")
def resize_disk(request, pk):
@@ -471,35 +480,35 @@ def resize_disk(request, pk):
try:
userinstance = instance.userinstance_set.get(user=request.user)
- except:
+ except Exception:
userinstance = UserInstance(is_change=False)
disks = instance.proxy.get_disk_devices()
- if request.method == 'POST':
+ if request.method == "POST":
if request.user.is_superuser or request.user.is_staff or userinstance.is_change:
disks_new = list()
for disk in disks:
- input_disk_size = int(request.POST.get('disk_size_' + disk['dev'], '0')) * 1073741824
- if input_disk_size > disk['size'] + (64 << 20):
- disk['size_new'] = input_disk_size
+ input_disk_size = int(request.POST.get("disk_size_" + disk["dev"], "0")) * 1073741824
+ if input_disk_size > disk["size"] + (64 << 20):
+ disk["size_new"] = input_disk_size
disks_new.append(disk)
- disk_sum = sum([disk['size'] >> 30 for disk in disks_new])
- disk_new_sum = sum([disk['size_new'] >> 30 for disk in disks_new])
+ disk_sum = sum([disk["size"] >> 30 for disk in disks_new])
+ disk_new_sum = sum([disk["size_new"] >> 30 for disk in disks_new])
quota_msg = utils.check_user_quota(request.user, 0, 0, 0, disk_new_sum - disk_sum)
if not request.user.is_superuser and quota_msg:
msg = _("User %(quota_msg)s quota reached, cannot resize disks of '%(instance_name)s'!") % {
- 'quota_msg': quota_msg,
- 'instance_name': instance.name
+ "quota_msg": quota_msg,
+ "instance_name": instance.name,
}
messages.error(request, msg)
else:
instance.proxy.resize_disk(disks_new)
- msg = _("Disk resize")
+ msg = _("Disk is resized: %(dev)s") % {"dev": disk["dev"]}
addlogmsg(request.user.username, instance.name, msg)
messages.success(request, msg)
- return redirect(reverse('instances:instance', args=[instance.id]) + '#resize')
+ return redirect(reverse("instances:instance", args=[instance.id]) + "#resize")
def add_new_vol(request, pk):
@@ -515,13 +524,13 @@ def add_new_vol(request, pk):
instance.compute.password,
instance.compute.type,
)
- storage = request.POST.get('storage', '')
- name = request.POST.get('name', '')
- format = request.POST.get('format', app_settings.INSTANCE_VOLUME_DEFAULT_FORMAT)
- size = request.POST.get('size', 0)
- meta_prealloc = True if request.POST.get('meta_prealloc', False) else False
- bus = request.POST.get('bus', app_settings.INSTANCE_VOLUME_DEFAULT_BUS)
- cache = request.POST.get('cache', app_settings.INSTANCE_VOLUME_DEFAULT_CACHE)
+ storage = request.POST.get("storage", "")
+ name = request.POST.get("name", "")
+ format = request.POST.get("format", app_settings.INSTANCE_VOLUME_DEFAULT_FORMAT)
+ size = request.POST.get("size", 0)
+ meta_prealloc = True if request.POST.get("meta_prealloc", False) else False
+ bus = request.POST.get("bus", app_settings.INSTANCE_VOLUME_DEFAULT_BUS)
+ cache = request.POST.get("cache", app_settings.INSTANCE_VOLUME_DEFAULT_CACHE)
target_dev = utils.get_new_disk_dev(media, disks, bus)
source = conn_create.create_volume(
@@ -534,19 +543,19 @@ def add_new_vol(request, pk):
int(app_settings.INSTANCE_VOLUME_DEFAULT_OWNER_GID),
)
instance.proxy.attach_disk(target_dev, source, target_bus=bus, driver_type=format, cache_mode=cache)
- msg = _("Attach new disk %(name)s (%(format)s)") % {'name': name, 'format': format}
+ msg = _("Attach new disk: %(name)s (%(format)s)") % {"name": name, "format": format}
addlogmsg(request.user.username, instance.name, msg)
- return redirect(request.META.get('HTTP_REFERER') + '#disks')
+ return redirect(request.META.get("HTTP_REFERER") + "#disks")
def add_existing_vol(request, pk):
instance = get_instance(request.user, pk)
allow_admin_or_not_template = request.user.is_superuser or request.user.is_staff or not instance.is_template
if allow_admin_or_not_template:
- storage = request.POST.get('selected_storage', '')
- name = request.POST.get('vols', '')
- bus = request.POST.get('bus', app_settings.INSTANCE_VOLUME_DEFAULT_BUS)
- cache = request.POST.get('cache', app_settings.INSTANCE_VOLUME_DEFAULT_CACHE)
+ storage = request.POST.get("selected_storage", "")
+ name = request.POST.get("vols", "")
+ bus = request.POST.get("bus", app_settings.INSTANCE_VOLUME_DEFAULT_BUS)
+ cache = request.POST.get("cache", app_settings.INSTANCE_VOLUME_DEFAULT_CACHE)
media = instance.proxy.get_media_devices()
disks = instance.proxy.get_disk_devices()
@@ -565,29 +574,29 @@ def add_existing_vol(request, pk):
source = f"{path}/{name}"
instance.proxy.attach_disk(target_dev, source, target_bus=bus, driver_type=driver_type, cache_mode=cache)
- msg = _("Attach Existing disk: %(target_dev)s") % {'target_dev': target_dev}
+ msg = _("Attach Existing disk: %(target_dev)s") % {"target_dev": target_dev}
addlogmsg(request.user.username, instance.name, msg)
- return redirect(request.META.get('HTTP_REFERER') + '#disks')
+ return redirect(request.META.get("HTTP_REFERER") + "#disks")
def edit_volume(request, pk):
instance = get_instance(request.user, pk)
allow_admin_or_not_template = request.user.is_superuser or request.user.is_staff or not instance.is_template
- if 'edit_volume' in request.POST and allow_admin_or_not_template:
- target_dev = request.POST.get('dev', '')
+ if "edit_volume" in request.POST and allow_admin_or_not_template:
+ target_dev = request.POST.get("dev", "")
- new_path = request.POST.get('vol_path', '')
- shareable = bool(request.POST.get('vol_shareable', False))
- readonly = bool(request.POST.get('vol_readonly', False))
- disk_type = request.POST.get('vol_type', '')
- new_bus = request.POST.get('vol_bus', '')
- bus = request.POST.get('vol_bus_old', '')
- serial = request.POST.get('vol_serial', '')
- format = request.POST.get('vol_format', '')
- cache = request.POST.get('vol_cache', app_settings.INSTANCE_VOLUME_DEFAULT_CACHE)
- io = request.POST.get('vol_io_mode', app_settings.INSTANCE_VOLUME_DEFAULT_IO)
- discard = request.POST.get('vol_discard_mode', app_settings.INSTANCE_VOLUME_DEFAULT_DISCARD)
- zeroes = request.POST.get('vol_detect_zeroes', app_settings.INSTANCE_VOLUME_DEFAULT_DETECT_ZEROES)
+ new_path = request.POST.get("vol_path", "")
+ shareable = bool(request.POST.get("vol_shareable", False))
+ readonly = bool(request.POST.get("vol_readonly", False))
+ disk_type = request.POST.get("vol_type", "")
+ new_bus = request.POST.get("vol_bus", "")
+ bus = request.POST.get("vol_bus_old", "")
+ serial = request.POST.get("vol_serial", "")
+ format = request.POST.get("vol_format", "")
+ cache = request.POST.get("vol_cache", app_settings.INSTANCE_VOLUME_DEFAULT_CACHE)
+ io = request.POST.get("vol_io_mode", app_settings.INSTANCE_VOLUME_DEFAULT_IO)
+ discard = request.POST.get("vol_discard_mode", app_settings.INSTANCE_VOLUME_DEFAULT_DISCARD)
+ zeroes = request.POST.get("vol_detect_zeroes", app_settings.INSTANCE_VOLUME_DEFAULT_DETECT_ZEROES)
new_target_dev = utils.get_new_disk_dev(instance.media, instance.disks, new_bus)
if new_bus != bus:
@@ -621,20 +630,23 @@ def edit_volume(request, pk):
)
if not instance.proxy.get_status() == 5:
- messages.success(request, _("Volume changes are applied. " + "But it will be activated after shutdown"))
+ messages.success(
+ request,
+ _("Volume changes are applied. " + "But it will be activated after shutdown"),
+ )
else:
messages.success(request, _("Volume is changed successfully."))
- msg = _("Edit disk: %(target_dev)s") % {'target_dev': target_dev}
+ msg = _("Edit disk: %(target_dev)s") % {"target_dev": target_dev}
addlogmsg(request.user.username, instance.name, msg)
- return redirect(request.META.get('HTTP_REFERER') + '#disks')
+ return redirect(request.META.get("HTTP_REFERER") + "#disks")
def delete_vol(request, pk):
instance = get_instance(request.user, pk)
allow_admin_or_not_template = request.user.is_superuser or request.user.is_staff or not instance.is_template
if allow_admin_or_not_template:
- storage = request.POST.get('storage', '')
+ storage = request.POST.get("storage", "")
conn_delete = wvmStorage(
instance.compute.hostname,
instance.compute.login,
@@ -642,16 +654,16 @@ def delete_vol(request, pk):
instance.compute.type,
storage,
)
- dev = request.POST.get('dev', '')
- path = request.POST.get('path', '')
- name = request.POST.get('name', '')
+ dev = request.POST.get("dev", "")
+ path = request.POST.get("path", "")
+ name = request.POST.get("name", "")
- msg = _("Delete disk: %(dev)s") % {'dev': dev}
+ msg = _("Delete disk: %(dev)s") % {"dev": dev}
instance.proxy.detach_disk(dev)
conn_delete.del_volume(name)
addlogmsg(request.user.username, instance.name, msg)
- return redirect(request.META.get('HTTP_REFERER') + '#disks')
+ return redirect(request.META.get("HTTP_REFERER") + "#disks")
def detach_vol(request, pk):
@@ -659,26 +671,26 @@ def detach_vol(request, pk):
allow_admin_or_not_template = request.user.is_superuser or request.user.is_staff or not instance.is_template
if allow_admin_or_not_template:
- dev = request.POST.get('dev', '')
- path = request.POST.get('path', '')
+ dev = request.POST.get("dev", "")
+ path = request.POST.get("path", "")
instance.proxy.detach_disk(dev)
- msg = _("Detach disk: %(dev)s") % {'dev': dev}
+ msg = _("Detach disk: %(dev)s") % {"dev": dev}
addlogmsg(request.user.username, instance.name, msg)
- return redirect(request.META.get('HTTP_REFERER') + '#disks')
+ return redirect(request.META.get("HTTP_REFERER") + "#disks")
def add_cdrom(request, pk):
instance = get_instance(request.user, pk)
allow_admin_or_not_template = request.user.is_superuser or request.user.is_staff or not instance.is_template
if allow_admin_or_not_template:
- bus = request.POST.get('bus', 'ide' if instance.machine == 'pc' else 'sata')
+ bus = request.POST.get("bus", "ide" if instance.machine == "pc" else "sata")
target = utils.get_new_disk_dev(instance.media, instance.disks, bus)
- instance.proxy.attach_disk(target, "", disk_device='cdrom', cache_mode='none', target_bus=bus, readonly=True)
- msg = _("Add CD-ROM: %(target)s") % {'target': target}
+ instance.proxy.attach_disk(target, "", disk_device="cdrom", cache_mode="none", target_bus=bus, readonly=True)
+ msg = _("Add CD-ROM: %(target)s") % {"target": target}
addlogmsg(request.user.username, instance.name, msg)
- return redirect(request.META.get('HTTP_REFERER') + '#disks')
+ return redirect(request.META.get("HTTP_REFERER") + "#disks")
def detach_cdrom(request, pk, dev):
@@ -688,36 +700,36 @@ def detach_cdrom(request, pk, dev):
if allow_admin_or_not_template:
# dev = request.POST.get('detach_cdrom', '')
instance.proxy.detach_disk(dev)
- msg = _('Detach CD-ROM: %(dev)s') % {'dev': dev}
+ msg = _("Detach CD-ROM: %(dev)s") % {"dev": dev}
addlogmsg(request.user.username, instance.name, msg)
- return redirect(request.META.get('HTTP_REFERER') + '#disks')
+ return redirect(request.META.get("HTTP_REFERER") + "#disks")
def unmount_iso(request, pk):
instance = get_instance(request.user, pk)
allow_admin_or_not_template = request.user.is_superuser or request.user.is_staff or not instance.is_template
if allow_admin_or_not_template:
- image = request.POST.get('path', '')
- dev = request.POST.get('umount_iso', '')
+ image = request.POST.get("path", "")
+ dev = request.POST.get("umount_iso", "")
instance.proxy.umount_iso(dev, image)
- msg = _("Mount media: %(dev)s") % {'dev': dev}
+ msg = _("Mount media: %(dev)s") % {"dev": dev}
addlogmsg(request.user.username, instance.name, msg)
- return redirect(request.META.get('HTTP_REFERER') + '#disks')
+ return redirect(request.META.get("HTTP_REFERER") + "#disks")
def mount_iso(request, pk):
instance = get_instance(request.user, pk)
allow_admin_or_not_template = request.user.is_superuser or request.user.is_staff or not instance.is_template
if allow_admin_or_not_template:
- image = request.POST.get('media', '')
- dev = request.POST.get('mount_iso', '')
+ image = request.POST.get("media", "")
+ dev = request.POST.get("mount_iso", "")
instance.proxy.mount_iso(dev, image)
- msg = _("Unmount media: %(dev)s") % {'dev': dev}
+ msg = _("Unmount media: %(dev)s") % {"dev": dev}
addlogmsg(request.user.username, instance.name, msg)
- return redirect(request.META.get('HTTP_REFERER') + '#disks')
+ return redirect(request.META.get("HTTP_REFERER") + "#disks")
def snapshot(request, pk):
@@ -725,63 +737,60 @@ def snapshot(request, pk):
allow_admin_or_not_template = request.user.is_superuser or request.user.is_staff or not instance.is_template
if allow_admin_or_not_template:
- name = request.POST.get('name', '')
+ name = request.POST.get("name", "")
instance.proxy.create_snapshot(name)
- msg = _("New snapshot: %(name)s") % {'name': name}
+ msg = _("Create snapshot: %(snap)s") % {"snap": name}
addlogmsg(request.user.username, instance.name, msg)
- return redirect(request.META.get('HTTP_REFERER') + '#managesnapshot')
+ return redirect(request.META.get("HTTP_REFERER") + "#managesnapshot")
def delete_snapshot(request, pk):
instance = get_instance(request.user, pk)
allow_admin_or_not_template = request.user.is_superuser or request.user.is_staff or not instance.is_template
if allow_admin_or_not_template:
- snap_name = request.POST.get('name', '')
+ snap_name = request.POST.get("name", "")
instance.proxy.snapshot_delete(snap_name)
- msg = _("Delete snapshot: %(snap_name)s") % {'snap_name': snap_name}
+ msg = _("Delete snapshot: %(snap)s") % {"snap": snap_name}
addlogmsg(request.user.username, instance.name, msg)
- return redirect(request.META.get('HTTP_REFERER') + '#managesnapshot')
+ return redirect(request.META.get("HTTP_REFERER") + "#managesnapshot")
def revert_snapshot(request, pk):
instance = get_instance(request.user, pk)
allow_admin_or_not_template = request.user.is_superuser or request.user.is_staff or not instance.is_template
if allow_admin_or_not_template:
- snap_name = request.POST.get('name', '')
+ snap_name = request.POST.get("name", "")
instance.proxy.snapshot_revert(snap_name)
msg = _("Successful revert snapshot: ")
msg += snap_name
messages.success(request, msg)
- msg = _("Revert snapshot")
+ msg = _("Revert snapshot: %(snap)") % {"snap": snap_name}
addlogmsg(request.user.username, instance.name, msg)
- return redirect(request.META.get('HTTP_REFERER') + '#managesnapshot')
+ return redirect(request.META.get("HTTP_REFERER") + "#managesnapshot")
@superuser_only
def set_vcpu(request, pk):
instance = get_instance(request.user, pk)
- id = request.POST.get('id', '')
- enabled = request.POST.get('set_vcpu', '')
- if enabled == 'True':
+ id = request.POST.get("id", "")
+ enabled = request.POST.get("set_vcpu", "")
+ if enabled == "True":
instance.proxy.set_vcpu(id, 1)
else:
instance.proxy.set_vcpu(id, 0)
- msg = _("VCPU %(id)s is enabled=%(enabled)s") % {'id': id, 'enabled': enabled}
- messages.success(request, msg)
+ msg = _("VCPU %(id)s is enabled=%(enabled)s") % {"id": id, "enabled": enabled}
addlogmsg(request.user.username, instance.name, msg)
- return redirect(request.META.get('HTTP_REFERER') + '#resize')
+ return redirect(request.META.get("HTTP_REFERER") + "#resize")
@superuser_only
def set_vcpu_hotplug(request, pk):
instance = get_instance(request.user, pk)
- status = request.POST.get('vcpu_hotplug', '')
- # TODO: f strings are not translatable https://code.djangoproject.com/ticket/29174
- msg = _("VCPU Hot-plug is enabled=%(status)s") % {'status': status}
+ status = request.POST.get("vcpu_hotplug", "")
+ msg = _("VCPU Hot-plug is enabled=%(status)s") % {"status": status}
instance.proxy.set_vcpu_hotplug(eval(status))
- messages.success(request, msg)
addlogmsg(request.user.username, instance.name, msg)
- return redirect(request.META.get('HTTP_REFERER') + '#resize')
+ return redirect(request.META.get("HTTP_REFERER") + "#resize")
@superuser_only
@@ -790,7 +799,7 @@ def set_autostart(request, pk):
instance.proxy.set_autostart(1)
msg = _("Set autostart")
addlogmsg(request.user.username, instance.name, msg)
- return redirect(request.META.get('HTTP_REFERER') + '#boot_opt')
+ return redirect(request.META.get("HTTP_REFERER") + "#boot_opt")
@superuser_only
@@ -799,7 +808,7 @@ def unset_autostart(request, pk):
instance.proxy.set_autostart(0)
msg = _("Unset autostart")
addlogmsg(request.user.username, instance.name, msg)
- return redirect(request.META.get('HTTP_REFERER') + '#boot_opt')
+ return redirect(request.META.get("HTTP_REFERER") + "#boot_opt")
@superuser_only
@@ -808,7 +817,7 @@ def set_bootmenu(request, pk):
instance.proxy.set_bootmenu(1)
msg = _("Enable boot menu")
addlogmsg(request.user.username, instance.name, msg)
- return redirect(request.META.get('HTTP_REFERER') + '#boot_opt')
+ return redirect(request.META.get("HTTP_REFERER") + "#boot_opt")
@superuser_only
@@ -817,62 +826,65 @@ def unset_bootmenu(request, pk):
instance.proxy.set_bootmenu(0)
msg = _("Disable boot menu")
addlogmsg(request.user.username, instance.name, msg)
- return redirect(request.META.get('HTTP_REFERER') + '#boot_opt')
+ return redirect(request.META.get("HTTP_REFERER") + "#boot_opt")
@superuser_only
def set_bootorder(request, pk):
instance = get_instance(request.user, pk)
- bootorder = request.POST.get('bootorder', '')
+ bootorder = request.POST.get("bootorder", "")
if bootorder:
order_list = {}
- for idx, val in enumerate(bootorder.split(',')):
- dev_type, dev = val.split(':', 1)
+ for idx, val in enumerate(bootorder.split(",")):
+ dev_type, dev = val.split(":", 1)
order_list[idx] = {"type": dev_type, "dev": dev}
instance.proxy.set_bootorder(order_list)
msg = _("Set boot order")
if not instance.proxy.get_status() == 5:
- messages.success(request, _("Boot menu changes applied. " + "But it will be activated after shutdown"))
+ messages.success(
+ request,
+ _("Boot menu changes applied. " + "But it will be activated after shutdown"),
+ )
else:
messages.success(request, _("Boot order changed successfully."))
addlogmsg(request.user.username, instance.name, msg)
- return redirect(request.META.get('HTTP_REFERER') + '#boot_opt')
+ return redirect(request.META.get("HTTP_REFERER") + "#boot_opt")
@superuser_only
def change_xml(request, pk):
instance = get_instance(request.user, pk)
- exit_xml = request.POST.get('inst_xml', '')
- if exit_xml:
- instance.proxy._defineXML(exit_xml)
- msg = _("Edit XML")
+ new_xml = request.POST.get("inst_xml", "")
+ if new_xml:
+ instance.proxy._defineXML(new_xml)
+ msg = _("Change instance XML")
addlogmsg(request.user.username, instance.name, msg)
- return redirect(request.META.get('HTTP_REFERER') + '#xmledit')
+ return redirect(request.META.get("HTTP_REFERER") + "#xmledit")
@superuser_only
def set_guest_agent(request, pk):
instance = get_instance(request.user, pk)
- status = request.POST.get('guest_agent')
- if status == 'True':
+ status = request.POST.get("guest_agent")
+ if status == "True":
instance.proxy.add_guest_agent()
- if status == 'False':
+ if status == "False":
instance.proxy.remove_guest_agent()
- msg = _("Set Guest Agent %(status)s") % {'status': status}
+ msg = _("Set Guest Agent: %(status)s") % {"status": status}
addlogmsg(request.user.username, instance.name, msg)
- return redirect(request.META.get('HTTP_REFERER') + '#options')
+ return redirect(request.META.get("HTTP_REFERER") + "#options")
@superuser_only
def set_video_model(request, pk):
instance = get_instance(request.user, pk)
- video_model = request.POST.get('video_model', 'vga')
+ video_model = request.POST.get("video_model", "vga")
instance.proxy.set_video_model(video_model)
- msg = _("Set Video Model")
+ msg = _("Set Video Model: %(model)") % {"model": video_model}
addlogmsg(request.user.username, instance.name, msg)
- return redirect(request.META.get('HTTP_REFERER') + '#options')
+ return redirect(request.META.get("HTTP_REFERER") + "#options")
@superuser_only
@@ -883,107 +895,117 @@ def change_network(request, pk):
network_data = {}
for post in request.POST:
- if post.startswith('net-source-'):
+ if post.startswith("net-source-"):
(source, source_type) = utils.get_network_tuple(request.POST.get(post))
network_data[post] = source
- network_data[post + '-type'] = source_type
- elif post.startswith('net-'):
- network_data[post] = request.POST.get(post, '')
+ network_data[post + "-type"] = source_type
+ elif post.startswith("net-"):
+ network_data[post] = request.POST.get(post, "")
instance.proxy.change_network(network_data)
addlogmsg(request.user.username, instance.name, msg)
msg = _("Network Device Config is changed. Please shutdown instance to activate.")
- if instance.proxy.get_status() != 5: messages.success(request, msg)
- return redirect(request.META.get('HTTP_REFERER') + '#network')
+ if instance.proxy.get_status() != 5:
+ messages.success(request, msg)
+ return redirect(request.META.get("HTTP_REFERER") + "#network")
@superuser_only
def add_network(request, pk):
instance = get_instance(request.user, pk)
- msg = _("Add network")
- mac = request.POST.get('add-net-mac')
- nwfilter = request.POST.get('add-net-nwfilter')
- (source, source_type) = utils.get_network_tuple(request.POST.get('add-net-network'))
+
+ mac = request.POST.get("add-net-mac")
+ nwfilter = request.POST.get("add-net-nwfilter")
+ (source, source_type) = utils.get_network_tuple(request.POST.get("add-net-network"))
instance.proxy.add_network(mac, source, source_type, nwfilter=nwfilter)
+ msg = _("Add network: %(mac)s") % {"mac": mac}
addlogmsg(request.user.username, instance.name, msg)
- return redirect(request.META.get('HTTP_REFERER') + '#network')
+ return redirect(request.META.get("HTTP_REFERER") + "#network")
@superuser_only
def delete_network(request, pk):
instance = get_instance(request.user, pk)
-
- msg = _("Delete network")
- mac_address = request.POST.get('delete_network', '')
+ mac_address = request.POST.get("delete_network", "")
instance.proxy.delete_network(mac_address)
+ msg = _("Delete Network: %(mac)s") % {"mac": mac_address}
addlogmsg(request.user.username, instance.name, msg)
- return redirect(request.META.get('HTTP_REFERER') + '#network')
+ return redirect(request.META.get("HTTP_REFERER") + "#network")
@superuser_only
def set_link_state(request, pk):
instance = get_instance(request.user, pk)
- mac_address = request.POST.get('mac', '')
- state = request.POST.get('set_link_state')
- state = 'down' if state == 'up' else 'up'
+ mac_address = request.POST.get("mac", "")
+ state = request.POST.get("set_link_state")
+ state = "down" if state == "up" else "up"
instance.proxy.set_link_state(mac_address, state)
- msg = _("Set Link State: %(state)s") % {'state': state}
+ msg = _("Set Link State: %(state)s") % {"state": state}
addlogmsg(request.user.username, instance.name, msg)
- return redirect(request.META.get('HTTP_REFERER') + '#network')
+ return redirect(request.META.get("HTTP_REFERER") + "#network")
@superuser_only
def set_qos(request, pk):
instance = get_instance(request.user, pk)
- qos_dir = request.POST.get('qos_direction', '')
- average = request.POST.get('qos_average') or 0
- peak = request.POST.get('qos_peak') or 0
- burst = request.POST.get('qos_burst') or 0
+ qos_dir = request.POST.get("qos_direction", "")
+ average = request.POST.get("qos_average") or 0
+ peak = request.POST.get("qos_peak") or 0
+ burst = request.POST.get("qos_burst") or 0
keys = request.POST.keys()
- mac_key = [key for key in keys if 'mac' in key]
- if mac_key: mac = request.POST.get(mac_key[0])
+ mac_key = [key for key in keys if "mac" in key]
+ if mac_key:
+ mac = request.POST.get(mac_key[0])
instance.proxy.set_qos(mac, qos_dir, average, peak, burst)
if instance.proxy.get_status() == 5:
- messages.success(request, _("%(qos_dir)s QoS is set") % {'qos_dir': qos_dir.capitalize()})
+ messages.success(request, _("%(qos_dir)s QoS is set") % {"qos_dir": qos_dir.capitalize()})
else:
messages.success(
request,
- _("%(qos_dir)s QoS is set. Network XML is changed. \
- Stop and start network to activate new config.") % {'qos_dir': qos_dir.capitalize()})
+ _(
+ "%(qos_dir)s QoS is set. Network XML is changed. \
+ Stop and start network to activate new config."
+ )
+ % {"qos_dir": qos_dir.capitalize()},
+ )
- return redirect(request.META.get('HTTP_REFERER') + '#network')
+ return redirect(request.META.get("HTTP_REFERER") + "#network")
@superuser_only
def unset_qos(request, pk):
instance = get_instance(request.user, pk)
- qos_dir = request.POST.get('qos_direction', '')
- mac = request.POST.get('net-mac')
+ qos_dir = request.POST.get("qos_direction", "")
+ mac = request.POST.get("net-mac")
instance.proxy.unset_qos(mac, qos_dir)
if instance.proxy.get_status() == 5:
- messages.success(request, _("%(qos_dir)s QoS is deleted") % {'qos_dir': qos_dir.capitalize()})
+ messages.success(request, _("%(qos_dir)s QoS is deleted") % {"qos_dir": qos_dir.capitalize()})
else:
messages.success(
request,
- _("%(qos_dir)s QoS is deleted. Network XML is changed. \
- Stop and start network to activate new config.") % {'qos_dir': qos_dir.capitalize()})
- return redirect(request.META.get('HTTP_REFERER') + '#network')
+ _(
+ "%(qos_dir)s QoS is deleted. Network XML is changed. \
+ Stop and start network to activate new config."
+ )
+ % {"qos_dir": qos_dir.capitalize()},
+ )
+ return redirect(request.META.get("HTTP_REFERER") + "#network")
@superuser_only
def add_owner(request, pk):
instance = get_instance(request.user, pk)
- user_id = request.POST.get('user_id')
+ user_id = request.POST.get("user_id")
check_inst = 0
- if app_settings.ALLOW_INSTANCE_MULTIPLE_OWNER == 'False':
+ if app_settings.ALLOW_INSTANCE_MULTIPLE_OWNER == "False":
check_inst = UserInstance.objects.filter(instance=instance).count()
if check_inst > 0:
@@ -992,43 +1014,43 @@ def add_owner(request, pk):
add_user_inst = UserInstance(instance=instance, user_id=user_id)
add_user_inst.save()
user = User.objects.get(id=user_id)
- msg = _("Added owner %(user)s") % {'user': user}
+ msg = _("Add owner: %(user)s") % {"user": user}
addlogmsg(request.user.username, instance.name, msg)
- return redirect(request.META.get('HTTP_REFERER') + '#users')
+ return redirect(request.META.get("HTTP_REFERER") + "#users")
@superuser_only
def del_owner(request, pk):
instance = get_instance(request.user, pk)
- userinstance_id = int(request.POST.get('userinstance', ''))
+ userinstance_id = int(request.POST.get("userinstance", ""))
userinstance = UserInstance.objects.get(pk=userinstance_id)
userinstance.delete()
- msg = _("Deleted owner %(userinstance_id)s") % {'userinstance_id': userinstance_id}
+ msg = _("Delete owner: %(userinstance_id)s ") % {"userinstance_id": userinstance_id}
addlogmsg(request.user.username, instance.name, msg)
- return redirect(request.META.get('HTTP_REFERER') + '#users')
+ return redirect(request.META.get("HTTP_REFERER") + "#users")
-@permission_required('instances.clone_instances', raise_exception=True)
+@permission_required("instances.clone_instances", raise_exception=True)
def clone(request, pk):
instance = get_instance(request.user, pk)
clone_data = dict()
- clone_data['name'] = request.POST.get('name', '')
+ clone_data["name"] = request.POST.get("name", "")
- disk_sum = sum([disk['size'] >> 30 for disk in instance.disks])
+ disk_sum = sum([disk["size"] >> 30 for disk in instance.disks])
quota_msg = utils.check_user_quota(request.user, 1, instance.vcpu, instance.memory, disk_sum)
- check_instance = Instance.objects.filter(name=clone_data['name'])
+ check_instance = Instance.objects.filter(name=clone_data["name"])
- clone_data['disk_owner_uid'] = int(app_settings.INSTANCE_VOLUME_DEFAULT_OWNER_UID)
- clone_data['disk_owner_gid'] = int(app_settings.INSTANCE_VOLUME_DEFAULT_OWNER_GID)
+ clone_data["disk_owner_uid"] = int(app_settings.INSTANCE_VOLUME_DEFAULT_OWNER_UID)
+ clone_data["disk_owner_gid"] = int(app_settings.INSTANCE_VOLUME_DEFAULT_OWNER_GID)
for post in request.POST:
- clone_data[post] = request.POST.get(post, '').strip()
+ clone_data[post] = request.POST.get(post, "").strip()
- if app_settings.CLONE_INSTANCE_AUTO_NAME == 'True' and not clone_data['name']:
+ if app_settings.CLONE_INSTANCE_AUTO_NAME == "True" and not clone_data["name"]:
auto_vname = utils.get_clone_free_names()[0]
- clone_data['name'] = auto_vname
- clone_data['clone-net-mac-0'] = utils.get_dhcp_mac_address(auto_vname)
+ clone_data["name"] = auto_vname
+ clone_data["clone-net-mac-0"] = utils.get_dhcp_mac_address(auto_vname)
for disk in instance.disks:
disk_dev = f"disk-{disk['dev']}"
disk_name = utils.get_clone_disk_name(disk, instance.name, auto_vname)
@@ -1036,107 +1058,120 @@ def clone(request, pk):
if not request.user.is_superuser and quota_msg:
msg = _("User '%(quota_msg)s' quota reached, cannot create '%(clone_name)s'!") % {
- 'quota_msg': quota_msg,
- 'clone_name': clone_data['name'],
+ "quota_msg": quota_msg,
+ "clone_name": clone_data["name"],
}
messages.error(request, msg)
elif check_instance:
+<<<<<<< HEAD
+ msg = _("Instance '%(clone_name)s' already exists!") % {"clone_name": clone_data["name"]}
+=======
msg = _("Instance '%(clone_name)s' already exists!") % {'clone_name': clone_data['name']}
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
messages.error(request, msg)
- elif not re.match(r'^[a-zA-Z0-9-]+$', clone_data['name']):
- msg = _("Instance name '%(clone_name)s' contains invalid characters!") % {'clone_name': clone_data['name']}
+ elif not re.match(r"^[a-zA-Z0-9-]+$", clone_data["name"]):
+ msg = _("Instance name '%(clone_name)s' contains invalid characters!") % {"clone_name": clone_data["name"]}
messages.error(request, msg)
- elif not re.match(r'^([0-9A-F]{2})(:?[0-9A-F]{2}){5}$', clone_data['clone-net-mac-0'], re.IGNORECASE):
- msg = _("Instance MAC '%(clone_mac)s' invalid format!") % {'clone_mac': clone_data['clone-net-mac-0']}
+ elif not re.match(r"^([0-9A-F]{2})(:?[0-9A-F]{2}){5}$", clone_data["clone-net-mac-0"], re.IGNORECASE):
+ msg = _("Instance MAC '%(clone_mac)s' invalid format!") % {"clone_mac": clone_data["clone-net-mac-0"]}
messages.error(request, msg)
else:
- new_instance = Instance(compute=instance.compute, name=clone_data['name'])
+ new_instance = Instance(compute=instance.compute, name=clone_data["name"])
try:
new_uuid = instance.proxy.clone_instance(clone_data)
new_instance.uuid = new_uuid
new_instance.save()
user_instance = UserInstance(instance_id=new_instance.id, user_id=request.user.id, is_delete=True)
user_instance.save()
- msg = _("Clone of '%(instance_name)s'") % {'instance_name': instance.name}
+ msg = _("Create a clone of '%(instance_name)s'") % {"instance_name": instance.name}
+ messages.success(request, msg)
addlogmsg(request.user.username, new_instance.name, msg)
- if app_settings.CLONE_INSTANCE_AUTO_MIGRATE == 'True':
- new_compute = Compute.objects.order_by('?').first()
+ if app_settings.CLONE_INSTANCE_AUTO_MIGRATE == "True":
+ new_compute = Compute.objects.order_by("?").first()
utils.migrate_instance(new_compute, new_instance, request.user, xml_del=True, offline=True)
- return redirect(reverse('instances:instance', args=[new_instance.id]))
+ return redirect(reverse("instances:instance", args=[new_instance.id]))
except Exception as e:
messages.error(request, e)
- return redirect(request.META.get('HTTP_REFERER') + '#clone')
+ return redirect(request.META.get("HTTP_REFERER") + "#clone")
def update_console(request, pk):
instance = get_instance(request.user, pk)
try:
userinstance = instance.userinstance_set.get(user=request.user)
- except:
+ except Exception:
userinstance = UserInstance(is_vnc=False)
if request.user.is_superuser or request.user.is_staff or userinstance.is_vnc:
form = ConsoleForm(request.POST or None)
if form.is_valid():
- if 'generate_password' in form.changed_data or 'clear_password' in form.changed_data or 'password' in form.changed_data:
- if form.cleaned_data['generate_password']:
+ if (
+ "generate_password" in form.changed_data
+ or "clear_password" in form.changed_data
+ or "password" in form.changed_data
+ ):
+ if form.cleaned_data["generate_password"]:
password = randomPasswd()
- elif form.cleaned_data['clear_password']:
- password = ''
+ elif form.cleaned_data["clear_password"]:
+ password = ""
else:
- password = form.cleaned_data['password']
+ password = form.cleaned_data["password"]
if not instance.proxy.set_console_passwd(password):
- msg = _("Error setting console password. " + "You should check that your instance have an graphic device.")
+ msg = _(
+ "Error setting console password. "
+ + "You should check that your instance have an graphic device."
+ )
messages.error(request, msg)
else:
msg = _("Set VNC password")
addlogmsg(request.user.username, instance.name, msg)
- if 'keymap' in form.changed_data or 'clear_keymap' in form.changed_data:
- if form.cleaned_data['clear_keymap']:
- instance.proxy.set_console_keymap('')
+ if "keymap" in form.changed_data or "clear_keymap" in form.changed_data:
+ if form.cleaned_data["clear_keymap"]:
+ instance.proxy.set_console_keymap("")
else:
- instance.proxy.set_console_keymap(form.cleaned_data['keymap'])
+ instance.proxy.set_console_keymap(form.cleaned_data["keymap"])
+
msg = _("Set VNC keymap")
addlogmsg(request.user.username, instance.name, msg)
- if 'type' in form.changed_data:
- instance.proxy.set_console_type(form.cleaned_data['type'])
+ if "type" in form.changed_data:
+ instance.proxy.set_console_type(form.cleaned_data["type"])
msg = _("Set VNC type")
addlogmsg(request.user.username, instance.name, msg)
- if 'listen_on' in form.changed_data:
- instance.proxy.set_console_listen_addr(form.cleaned_data['listen_on'])
+ if "listen_on" in form.changed_data:
+ instance.proxy.set_console_listen_addr(form.cleaned_data["listen_on"])
msg = _("Set VNC listen address")
addlogmsg(request.user.username, instance.name, msg)
- return redirect(request.META.get('HTTP_REFERER') + '#vncsettings')
+ return redirect(request.META.get("HTTP_REFERER") + "#vncsettings")
def change_options(request, pk):
instance = get_instance(request.user, pk)
try:
userinstance = instance.userinstance_set.get(user=request.user)
- except:
+ except Exception:
userinstance = UserInstance(is_change=False)
if request.user.is_superuser or request.user.is_staff or userinstance.is_change:
- instance.is_template = request.POST.get('is_template', False)
+ instance.is_template = request.POST.get("is_template", False)
instance.save()
options = {}
for post in request.POST:
- if post in ['title', 'description']:
- options[post] = request.POST.get(post, '')
+ if post in ["title", "description"]:
+ options[post] = request.POST.get(post, "")
instance.proxy.set_options(options)
msg = _("Edit options")
addlogmsg(request.user.username, instance.name, msg)
- return redirect(request.META.get('HTTP_REFERER') + '#options')
+ return redirect(request.META.get("HTTP_REFERER") + "#options")
def getvvfile(request, pk):
@@ -1150,23 +1185,29 @@ def getvvfile(request, pk):
msg = _("Send console.vv file")
addlogmsg(request.user.username, instance.name, msg)
- response = HttpResponse(content='', content_type='application/x-virt-viewer', status=200, reason=None, charset='utf-8')
- response.writelines('[virt-viewer]\n')
- response.writelines('type=' + conn.graphics_type(instance.name) + '\n')
- if conn.graphics_listen(instance.name) == '0.0.0.0':
- response.writelines('host=' + conn.host + '\n')
+ response = HttpResponse(
+ content="",
+ content_type="application/x-virt-viewer",
+ status=200,
+ reason=None,
+ charset="utf-8",
+ )
+ response.writelines("[virt-viewer]\n")
+ response.writelines("type=" + conn.graphics_type(instance.name) + "\n")
+ if conn.graphics_listen(instance.name) == "0.0.0.0":
+ response.writelines("host=" + conn.host + "\n")
else:
- response.writelines('host=' + conn.graphics_listen(instance.name) + '\n')
- response.writelines('port=' + conn.graphics_port(instance.name) + '\n')
- response.writelines('title=' + conn.domain_name(instance.name) + '\n')
- response.writelines('password=' + conn.graphics_passwd(instance.name) + '\n')
- response.writelines('enable-usbredir=1\n')
- response.writelines('disable-effects=all\n')
- response.writelines('secure-attention=ctrl+alt+ins\n')
- response.writelines('release-cursor=ctrl+alt\n')
- response.writelines('fullscreen=1\n')
- response.writelines('delete-this-file=1\n')
- response['Content-Disposition'] = 'attachment; filename="console.vv"'
+ response.writelines("host=" + conn.graphics_listen(instance.name) + "\n")
+ response.writelines("port=" + conn.graphics_port(instance.name) + "\n")
+ response.writelines("title=" + conn.domain_name(instance.name) + "\n")
+ response.writelines("password=" + conn.graphics_passwd(instance.name) + "\n")
+ response.writelines("enable-usbredir=1\n")
+ response.writelines("disable-effects=all\n")
+ response.writelines("secure-attention=ctrl+alt+ins\n")
+ response.writelines("release-cursor=ctrl+alt\n")
+ response.writelines("fullscreen=1\n")
+ response.writelines("delete-this-file=1\n")
+ response["Content-Disposition"] = 'attachment; filename="console.vv"'
return response
@@ -1195,12 +1236,12 @@ def create_instance_select_type(request, compute_id):
default_machine = app_settings.INSTANCE_MACHINE_DEFAULT_TYPE
default_arch = app_settings.INSTANCE_ARCH_DEFAULT_TYPE
- if request.method == 'POST':
- if 'create_xml' in request.POST:
- xml = request.POST.get('dom_xml', '')
+ if request.method == "POST":
+ if "create_xml" in request.POST:
+ xml = request.POST.get("dom_xml", "")
try:
- name = util.get_xml_path(xml, '/domain/name')
- except util.etree.Error as err:
+ name = util.get_xml_path(xml, "/domain/name")
+ except util.etree.Error:
name = None
if name in instances:
error_msg = _("A virtual machine with this name already exists")
@@ -1209,9 +1250,9 @@ def create_instance_select_type(request, compute_id):
conn._defineXML(xml)
utils.refr(compute)
instance = compute.instance_set.get(name=name)
- return redirect(reverse('instances:instance', args=[instance.id]))
+ return redirect(reverse("instances:instance", args=[instance.id]))
- return render(request, 'create_instance_w1.html', locals())
+ return render(request, "create_instance_w1.html", locals())
@superuser_only
@@ -1231,7 +1272,7 @@ def create_instance(request, compute_id, arch, machine):
firmwares = list()
meta_prealloc = False
compute = get_object_or_404(Compute, pk=compute_id)
- flavors = Flavor.objects.filter().order_by('id')
+ flavors = Flavor.objects.filter().order_by("id")
appsettings = AppSettings.objects.all()
try:
@@ -1267,11 +1308,13 @@ def create_instance(request, compute_id, arch, machine):
hv_supports_uefi = conn.supports_uefi_xml(dom_caps["loader_enums"])
# Add BIOS
label = conn.label_for_firmware_path(arch, None)
- if label: firmwares.append(label)
+ if label:
+ firmwares.append(label)
# Add UEFI
loader_path = conn.find_uefi_path_for_arch(arch, dom_caps["loaders"])
label = conn.label_for_firmware_path(arch, loader_path)
- if label: firmwares.append(label)
+ if label:
+ firmwares.append(label)
firmwares = list(set(firmwares))
flavor_form = FlavorForm()
@@ -1282,8 +1325,8 @@ def create_instance(request, compute_id, arch, machine):
if not networks:
raise libvirtError(_("You haven't defined any network pools"))
- if request.method == 'POST':
- if 'create' in request.POST:
+ if request.method == "POST":
+ if "create" in request.POST:
firmware = dict()
volume_list = list()
is_disk_created = False
@@ -1291,128 +1334,147 @@ def create_instance(request, compute_id, arch, machine):
form = NewVMForm(request.POST)
if form.is_valid():
data = form.cleaned_data
- if data['meta_prealloc']:
+ if data["meta_prealloc"]:
meta_prealloc = True
if instances:
- if data['name'] in instances:
+ if data["name"] in instances:
raise libvirtError(_("A virtual machine with this name already exists"))
- if Instance.objects.filter(name__exact=data['name']):
+ if Instance.objects.filter(name__exact=data["name"]):
raise libvirtError(_("There is an instance with same name. Remove it and try again!"))
- if data['hdd_size']:
- if not data['mac']:
+ if data["hdd_size"]:
+ if not data["mac"]:
raise libvirtError(_("No Virtual Machine MAC has been entered"))
else:
- path = conn.create_volume(data['storage'], data['name'], data['hdd_size'], default_disk_format,
- meta_prealloc, default_disk_owner_uid, default_disk_owner_gid)
+ path = conn.create_volume(
+ data["storage"],
+ data["name"],
+ data["hdd_size"],
+ default_disk_format,
+ meta_prealloc,
+ default_disk_owner_uid,
+ default_disk_owner_gid,
+ )
volume = dict()
- volume['device'] = 'disk'
- volume['path'] = path
- volume['type'] = conn.get_volume_type(path)
- volume['cache_mode'] = data['cache_mode']
- volume['bus'] = default_bus
- if volume['bus'] == 'scsi':
- volume['scsi_model'] = default_scsi_disk_model
- volume['discard_mode'] = default_discard
- volume['detect_zeroes_mode'] = default_zeroes
- volume['io_mode'] = default_io
+ volume["device"] = "disk"
+ volume["path"] = path
+ volume["type"] = conn.get_volume_type(path)
+ volume["cache_mode"] = data["cache_mode"]
+ volume["bus"] = default_bus
+ if volume["bus"] == "scsi":
+ volume["scsi_model"] = default_scsi_disk_model
+ volume["discard_mode"] = default_discard
+ volume["detect_zeroes_mode"] = default_zeroes
+ volume["io_mode"] = default_io
volume_list.append(volume)
is_disk_created = True
- elif data['template']:
- templ_path = conn.get_volume_path(data['template'])
- dest_vol = conn.get_volume_path(data["name"] + ".img", data['storage'])
+ elif data["template"]:
+ templ_path = conn.get_volume_path(data["template"])
+ dest_vol = conn.get_volume_path(data["name"] + ".img", data["storage"])
if dest_vol:
- raise libvirtError(_("Image has already exist. Please check volumes or change instance name"))
+ raise libvirtError(
+ _("Image has already exist. Please check volumes or change instance name")
+ )
else:
- clone_path = conn.clone_from_template(data['name'], templ_path, data['storage'], meta_prealloc,
- default_disk_owner_uid, default_disk_owner_gid)
+ clone_path = conn.clone_from_template(
+ data["name"],
+ templ_path,
+ data["storage"],
+ meta_prealloc,
+ default_disk_owner_uid,
+ default_disk_owner_gid,
+ )
volume = dict()
- volume['path'] = clone_path
- volume['type'] = conn.get_volume_type(clone_path)
- volume['device'] = 'disk'
- volume['cache_mode'] = data['cache_mode']
- volume['bus'] = default_bus
- if volume['bus'] == 'scsi':
- volume['scsi_model'] = default_scsi_disk_model
- volume['discard_mode'] = default_discard
- volume['detect_zeroes_mode'] = default_zeroes
- volume['io_mode'] = default_io
+ volume["path"] = clone_path
+ volume["type"] = conn.get_volume_type(clone_path)
+ volume["device"] = "disk"
+ volume["cache_mode"] = data["cache_mode"]
+ volume["bus"] = default_bus
+ if volume["bus"] == "scsi":
+ volume["scsi_model"] = default_scsi_disk_model
+ volume["discard_mode"] = default_discard
+ volume["detect_zeroes_mode"] = default_zeroes
+ volume["io_mode"] = default_io
volume_list.append(volume)
is_disk_created = True
else:
- if not data['images']:
+ if not data["images"]:
raise libvirtError(_("First you need to create or select an image"))
else:
- for idx, vol in enumerate(data['images'].split(',')):
+ for idx, vol in enumerate(data["images"].split(",")):
path = conn.get_volume_path(vol)
volume = dict()
- volume['path'] = path
- volume['type'] = conn.get_volume_type(path)
- volume['device'] = request.POST.get('device' + str(idx), '')
- volume['bus'] = request.POST.get('bus' + str(idx), '')
- if volume['bus'] == 'scsi':
- volume['scsi_model'] = default_scsi_disk_model
- volume['cache_mode'] = data['cache_mode']
- volume['discard_mode'] = default_discard
- volume['detect_zeroes_mode'] = default_zeroes
- volume['io_mode'] = default_io
+ volume["path"] = path
+ volume["type"] = conn.get_volume_type(path)
+ volume["device"] = request.POST.get("device" + str(idx), "")
+ volume["bus"] = request.POST.get("bus" + str(idx), "")
+ if volume["bus"] == "scsi":
+ volume["scsi_model"] = default_scsi_disk_model
+ volume["cache_mode"] = data["cache_mode"]
+ volume["discard_mode"] = default_discard
+ volume["detect_zeroes_mode"] = default_zeroes
+ volume["io_mode"] = default_io
volume_list.append(volume)
- if data['cache_mode'] not in conn.get_cache_modes():
+ if data["cache_mode"] not in conn.get_cache_modes():
error_msg = _("Invalid cache mode")
raise libvirtError
- if 'UEFI' in data["firmware"]:
+ if "UEFI" in data["firmware"]:
firmware["loader"] = data["firmware"].split(":")[1].strip()
- firmware["secure"] = 'no'
- firmware["readonly"] = 'yes'
- firmware["type"] = 'pflash'
- if 'secboot' in firmware["loader"] and machine != 'q35':
+ firmware["secure"] = "no"
+ firmware["readonly"] = "yes"
+ firmware["type"] = "pflash"
+ if "secboot" in firmware["loader"] and machine != "q35":
messages.warning(
- request, "Changing machine type from '%s' to 'q35' "
- "which is required for UEFI secure boot." % machine)
- machine = 'q35'
- firmware["secure"] = 'yes'
+ request,
+ "Changing machine type from '%s' to 'q35' "
+ "which is required for UEFI secure boot." % machine,
+ )
+ machine = "q35"
+ firmware["secure"] = "yes"
uuid = util.randomUUID()
try:
- conn.create_instance(name=data['name'],
- memory=data['memory'],
- vcpu=data['vcpu'],
- vcpu_mode=data['vcpu_mode'],
- uuid=uuid,
- arch=arch,
- machine=machine,
- firmware=firmware,
- volumes=volume_list,
- networks=data['networks'],
- virtio=data['virtio'],
- listen_addr=data["listener_addr"],
- nwfilter=data["nwfilter"],
- graphics=data["graphics"],
- video=data["video"],
- console_pass=data["console_pass"],
- mac=data['mac'],
- qemu_ga=data['qemu_ga'])
- create_instance = Instance(compute_id=compute_id, name=data['name'], uuid=uuid)
+ conn.create_instance(
+ name=data["name"],
+ memory=data["memory"],
+ vcpu=data["vcpu"],
+ vcpu_mode=data["vcpu_mode"],
+ uuid=uuid,
+ arch=arch,
+ machine=machine,
+ firmware=firmware,
+ volumes=volume_list,
+ networks=data["networks"],
+ virtio=data["virtio"],
+ listen_addr=data["listener_addr"],
+ nwfilter=data["nwfilter"],
+ graphics=data["graphics"],
+ video=data["video"],
+ console_pass=data["console_pass"],
+ mac=data["mac"],
+ qemu_ga=data["qemu_ga"],
+ )
+ create_instance = Instance(compute_id=compute_id, name=data["name"], uuid=uuid)
create_instance.save()
msg = _("Instance is created")
messages.success(request, msg)
addlogmsg(request.user.username, create_instance.name, msg)
- return redirect(reverse('instances:instance', args=[create_instance.id]))
+ return redirect(reverse("instances:instance", args=[create_instance.id]))
except libvirtError as lib_err:
- if data['hdd_size'] or len(volume_list) > 0:
+ if data["hdd_size"] or len(volume_list) > 0:
if is_disk_created:
for vol in volume_list:
- conn.delete_volume(vol['path'])
+ conn.delete_volume(vol["path"])
messages.error(request, lib_err)
conn.close()
except libvirtError as lib_err:
messages.error(request, lib_err)
- return render(request, 'create_instance_w2.html', locals())
+ return render(request, "create_instance_w2.html", locals())
@superuser_only
@@ -1420,16 +1482,13 @@ def flavor_create(request):
form = FlavorForm(request.POST or None)
if form.is_valid():
form.save()
- messages.success(request, _('Flavor Created'))
- return redirect(request.META.get('HTTP_REFERER'))
+ messages.success(request, _("Flavor Created"))
+ return redirect(request.META.get("HTTP_REFERER"))
return render(
request,
- 'common/form.html',
- {
- 'form': form,
- 'title': _('Create Flavor')
- },
+ "common/form.html",
+ {"form": form, "title": _("Create Flavor")},
)
@@ -1439,29 +1498,26 @@ def flavor_update(request, pk):
form = FlavorForm(request.POST or None, instance=flavor)
if form.is_valid():
form.save()
- messages.success(request, _('Flavor Updated'))
- return redirect(request.META.get('HTTP_REFERER'))
+ messages.success(request, _("Flavor Updated"))
+ return redirect(request.META.get("HTTP_REFERER"))
return render(
request,
- 'common/form.html',
- {
- 'form': form,
- 'title': _('Update Flavor')
- },
+ "common/form.html",
+ {"form": form, "title": _("Update Flavor")},
)
@superuser_only
def flavor_delete(request, pk):
flavor = get_object_or_404(Flavor, pk=pk)
- if request.method == 'POST':
+ if request.method == "POST":
flavor.delete()
- messages.success(request, _('Flavor Deleted'))
- return redirect(request.META.get('HTTP_REFERER'))
+ messages.success(request, _("Flavor Deleted"))
+ return redirect(request.META.get("HTTP_REFERER"))
return render(
request,
- 'common/confirm_delete.html',
- {'object': flavor},
+ "common/confirm_delete.html",
+ {"object": flavor},
)
diff --git a/interfaces/forms.py b/interfaces/forms.py
index 4490d0b..c19ffda 100644
--- a/interfaces/forms.py
+++ b/interfaces/forms.py
@@ -1,4 +1,5 @@
import re
+
from django import forms
from django.utils.translation import gettext_lazy as _
diff --git a/interfaces/views.py b/interfaces/views.py
index 7a12a38..a6f8c0b 100644
--- a/interfaces/views.py
+++ b/interfaces/views.py
@@ -26,19 +26,30 @@ def interfaces(request, compute_id):
try:
netdevs = conn.get_net_devices()
except:
- netdevs = ['eth0', 'eth1']
+ netdevs = ["eth0", "eth1"]
for iface in ifaces:
ifaces_all.append(conn.get_iface_info(iface))
- if request.method == 'POST':
- if 'create' in request.POST:
+ if request.method == "POST":
+ if "create" in request.POST:
form = AddInterface(request.POST)
if form.is_valid():
data = form.cleaned_data
- conn.create_iface(data['name'], data['itype'], data['start_mode'], data['netdev'], data['ipv4_type'],
- data['ipv4_addr'], data['ipv4_gw'], data['ipv6_type'], data['ipv6_addr'],
- data['ipv6_gw'], data['stp'], data['delay'])
+ conn.create_iface(
+ data["name"],
+ data["itype"],
+ data["start_mode"],
+ data["netdev"],
+ data["ipv4_type"],
+ data["ipv4_addr"],
+ data["ipv4_gw"],
+ data["ipv6_type"],
+ data["ipv6_addr"],
+ data["ipv6_gw"],
+ data["stp"],
+ data["delay"],
+ )
return HttpResponseRedirect(request.get_full_path())
else:
for msg_err in form.errors.values():
@@ -47,7 +58,7 @@ def interfaces(request, compute_id):
except libvirtError as lib_err:
messages.error(request, lib_err)
- return render(request, 'interfaces.html', locals())
+ return render(request, "interfaces.html", locals())
@superuser_only
@@ -75,18 +86,18 @@ def interface(request, compute_id, iface):
bridge = conn.get_bridge()
slave_ifaces = conn.get_bridge_slave_ifaces()
- if request.method == 'POST':
- if 'stop' in request.POST:
+ if request.method == "POST":
+ if "stop" in request.POST:
conn.stop_iface()
return HttpResponseRedirect(request.get_full_path())
- if 'start' in request.POST:
+ if "start" in request.POST:
conn.start_iface()
return HttpResponseRedirect(request.get_full_path())
- if 'delete' in request.POST:
+ if "delete" in request.POST:
conn.delete_iface()
- return HttpResponseRedirect(reverse('interfaces', args=[compute_id]))
+ return HttpResponseRedirect(reverse("interfaces", args=[compute_id]))
conn.close()
except libvirtError as lib_err:
messages.error(request, lib_err)
- return render(request, 'interface.html', locals())
+ return render(request, "interface.html", locals())
diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po
index d393cd9..60c21a0 100644
--- a/locale/de/LC_MESSAGES/django.po
+++ b/locale/de/LC_MESSAGES/django.po
@@ -8,7 +8,11 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
+<<<<<<< HEAD
+"POT-Creation-Date: 2020-11-05 09:36+0000\n"
+=======
"POT-Creation-Date: 2020-10-23 07:53+0000\n"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME
\n"
"Language-Team: LANGUAGE \n"
@@ -293,6 +297,57 @@ msgstr ""
#: accounts/utils.py:51
msgid "Please view HTML version of this message."
+<<<<<<< HEAD
+msgstr ""
+
+#: accounts/views.py:26
+msgid "Profile updated"
+msgstr ""
+
+#: accounts/views.py:44
+msgid "SSH key added"
+msgstr ""
+
+#: accounts/views.py:52
+msgid "Add SSH key"
+msgstr ""
+
+#: accounts/views.py:61
+msgid "SSH key deleted"
+msgstr ""
+
+#: accounts/views.py:69
+msgid "Delete SSH key"
+msgstr ""
+
+#: accounts/views.py:101
+msgid "Password Changed"
+msgstr ""
+
+#: accounts/views.py:121
+msgid "Create User Instance"
+msgstr ""
+
+#: accounts/views.py:139
+msgid "Update User Instance"
+msgstr ""
+
+#: accounts/views.py:175
+#, python-format
+msgid "OTP Sent to %(email)s"
+msgstr ""
+
+#: accounts/views.py:183
+msgid "Email OTP"
+msgstr ""
+
+#: accounts/views.py:194
+#, python-format
+msgid "OTP QR code was emailed to user %(user)s"
+msgstr ""
+
+#: accounts/views.py:196
+=======
msgstr ""
#: accounts/views.py:26
@@ -342,6 +397,7 @@ msgid "OTP QR code was emailed to user %s"
msgstr ""
#: accounts/views.py:177
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "User email not set, failed to send QR code"
msgstr ""
@@ -354,11 +410,20 @@ msgstr ""
msgid "Groups"
msgstr ""
+<<<<<<< HEAD
+#: admin/forms.py:81
+msgid ""
+"Raw passwords are not stored, so there is no way to see this user's "
+"password, \n"
+" but you can change the password using this "
+"form."
+=======
#: admin/forms.py:79
msgid ""
"Raw passwords are not stored, so there is no way to see\n"
" this user's password, but you can change the password using "
"this form."
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: admin/templates/admin/group_list.html:5 admin/views.py:87
@@ -505,6 +570,18 @@ msgstr ""
msgid "Create User"
msgstr ""
+<<<<<<< HEAD
+#: admin/views.py:129
+msgid "Update User"
+msgstr ""
+
+#: admin/views.py:141
+#, python-format
+msgid "Password changed for %(user)s"
+msgstr ""
+
+#: admin/views.py:144
+=======
#: admin/views.py:136
msgid "Update User"
msgstr ""
@@ -514,6 +591,7 @@ msgid "User password changed: {}"
msgstr ""
#: admin/views.py:152
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Wrong Data Provided"
msgstr ""
@@ -799,6 +877,20 @@ msgid "Other Settings"
msgstr ""
#: appsettings/views.py:38
+<<<<<<< HEAD
+#, python-format
+msgid "SASS directory path is changed. Now: %(dir)s"
+msgstr ""
+
+#: appsettings/views.py:67
+#, python-format
+msgid "Theme is changed. Now: %(theme)s"
+msgstr ""
+
+#: appsettings/views.py:82
+#, python-format
+msgid "%(setting)s is changed. Now: %(value)s"
+=======
#, python-brace-format
msgid "SASS directory path is changed. Now: {sass_dir.value}"
msgstr ""
@@ -811,6 +903,7 @@ msgstr ""
#: appsettings/views.py:80
#, python-brace-format
msgid "{setting.name} is changed. Now: {setting.value}"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: computes/forms.py:21
@@ -1698,7 +1791,11 @@ msgstr ""
#: instances/templates/instance_actions.html:25
#: instances/templates/instance_actions.html:37
#: instances/templates/instances/power_tab.html:25
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:82 instances/views.py:270
+=======
#: instances/templates/instances/power_tab.html:82 instances/views.py:264
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Suspend"
msgstr ""
@@ -1752,7 +1849,11 @@ msgstr ""
#: instances/templates/instances/destroy_instance_form.html:40
#: instances/templates/instances/destroy_tab.html:18
#: instances/templates/instances/destroy_tab.html:20
+<<<<<<< HEAD
+#: instances/templates/instances/destroy_tab.html:23 instances/views.py:312
+=======
#: instances/templates/instances/destroy_tab.html:23 instances/views.py:306
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Destroy"
msgstr ""
@@ -1770,20 +1871,32 @@ msgstr ""
#: instances/templates/instance_actions.html:35
#: instances/templates/instances/power_tab.html:47
#: instances/templates/instances/power_tab.html:121
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:123 instances/views.py:245
+=======
#: instances/templates/instances/power_tab.html:123 instances/views.py:239
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Power On"
msgstr ""
#: instances/templates/instance_actions.html:15
#: instances/templates/instances/power_tab.html:9
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:59 instances/views.py:261
+=======
#: instances/templates/instances/power_tab.html:59 instances/views.py:255
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Power Off"
msgstr ""
#: instances/templates/instance_actions.html:16
#: instances/templates/instance_actions.html:29
#: instances/templates/instances/power_tab.html:14
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:66 instances/views.py:254
+=======
#: instances/templates/instances/power_tab.html:66 instances/views.py:248
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Power Cycle"
msgstr ""
@@ -1795,7 +1908,11 @@ msgstr ""
#: instances/templates/instance_actions.html:22
#: instances/templates/instances/power_tab.html:34
#: instances/templates/instances/power_tab.html:93
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:108 instances/views.py:278
+=======
#: instances/templates/instances/power_tab.html:108 instances/views.py:272
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Resume"
msgstr ""
@@ -1803,7 +1920,11 @@ msgstr ""
#: instances/templates/instances/power_tab.html:19
#: instances/templates/instances/power_tab.html:39
#: instances/templates/instances/power_tab.html:74
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:100 instances/views.py:285
+=======
#: instances/templates/instances/power_tab.html:100 instances/views.py:279
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Force Off"
msgstr ""
@@ -2450,7 +2571,7 @@ msgstr ""
#: instances/templates/instances/snapshots_tab.html:22
msgid ""
"This may take more than an hour, depending on how much content is on your "
-"droplet and how large the disk is."
+"instance and how large the disk is."
msgstr ""
#: instances/templates/instances/snapshots_tab.html:27
@@ -2505,6 +2626,26 @@ msgstr ""
msgid "None available device name"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:242
+msgid "Templates cannot be started."
+msgstr ""
+
+#: instances/views.py:345
+#, python-format
+msgid "Instance is migrated to %(hostname)s"
+msgstr ""
+
+#: instances/views.py:368
+msgid "Reset root password"
+msgstr ""
+
+#: instances/views.py:374 instances/views.py:403
+msgid "Please shutdown down your instance and then try again"
+msgstr ""
+
+#: instances/views.py:395
+=======
#: instances/views.py:236
msgid "Templates cannot be started."
msgstr ""
@@ -2523,37 +2664,75 @@ msgid "Please shutdown down your instance and then try again"
msgstr ""
#: instances/views.py:389
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Installed new SSH public key %(keyname)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:422
+=======
#: instances/views.py:416
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"User %(quota_msg)s quota reached, cannot resize CPU of '%(instance_name)s'!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:431
+#, python-format
+msgid "CPU is resized: %(old)s to %(new)s"
+msgstr ""
+
+#: instances/views.py:459
+=======
#: instances/views.py:425
msgid "Resize CPU"
msgstr ""
#: instances/views.py:453
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"User %(quota_msg)s quota reached, cannot resize memory of "
"'%(instance_name)s'!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:466
+#, python-format
+msgid ""
+"Memory is resized: current/max: %(old_cur)s/%(old_max)s to %(new_cur)s/"
+"%(new_max)s"
+msgstr ""
+
+#: instances/views.py:500
+=======
#: instances/views.py:462
msgid "Resize Memory"
msgstr ""
#: instances/views.py:491
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"User %(quota_msg)s quota reached, cannot resize disks of '%(instance_name)s'!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:507
+#, python-format
+msgid "Disk is resized: %(dev)s"
+msgstr ""
+
+#: instances/views.py:546
+#, python-format
+msgid "Attach new disk: %(name)s (%(format)s)"
+msgstr ""
+
+#: instances/views.py:577
+=======
#: instances/views.py:498
msgid "Disk resize"
msgstr ""
@@ -2564,11 +2743,16 @@ msgid "Attach new disk %(name)s (%(format)s)"
msgstr ""
#: instances/views.py:568
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Attach Existing disk: %(target_dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:635
+=======
#: instances/views.py:624
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Volume changes are applied. But it will be activated after shutdown"
msgstr ""
@@ -2576,41 +2760,79 @@ msgstr ""
msgid "Volume is changed successfully."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:639
+=======
#: instances/views.py:627
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Edit disk: %(target_dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:661
+=======
#: instances/views.py:649
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Delete disk: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:677
+=======
#: instances/views.py:665
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Detach disk: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:690
+=======
#: instances/views.py:678
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Add CD-ROM: %(target)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:703
+=======
#: instances/views.py:691
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Detach CD-ROM: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:716
+=======
#: instances/views.py:704
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Mount media: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:729
+=======
#: instances/views.py:717
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Unmount media: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:742
+#, python-format
+msgid "Create snapshot: %(snap)s"
+msgstr ""
+
+#: instances/views.py:753
+#, python-format
+msgid "Delete snapshot: %(snap)s"
+=======
#: instances/views.py:730
#, python-format
msgid "New snapshot: %(name)s"
@@ -2619,26 +2841,62 @@ msgstr ""
#: instances/views.py:741
#, python-format
msgid "Delete snapshot: %(snap_name)s"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: instances/views.py:752
msgid "Successful revert snapshot: "
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:767
+msgid "Revert snapshot: %(snap)"
+msgstr ""
+
+#: instances/views.py:781
+=======
#: instances/views.py:755
msgid "Revert snapshot"
msgstr ""
#: instances/views.py:769
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "VCPU %(id)s is enabled=%(enabled)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:790
+=======
#: instances/views.py:780
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "VCPU Hot-plug is enabled=%(status)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:800
+msgid "Set autostart"
+msgstr ""
+
+#: instances/views.py:809
+msgid "Unset autostart"
+msgstr ""
+
+#: instances/views.py:818
+msgid "Enable boot menu"
+msgstr ""
+
+#: instances/views.py:827
+msgid "Disable boot menu"
+msgstr ""
+
+#: instances/views.py:842
+msgid "Set boot order"
+msgstr ""
+
+#: instances/views.py:847
+=======
#: instances/views.py:791
msgid "Set autostart"
msgstr ""
@@ -2660,6 +2918,7 @@ msgid "Set boot order"
msgstr ""
#: instances/views.py:836
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Boot menu changes applied. But it will be activated after shutdown"
msgstr ""
@@ -2667,6 +2926,19 @@ msgstr ""
msgid "Boot order changed successfully."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:861
+msgid "Change instance XML"
+msgstr ""
+
+#: instances/views.py:875
+#, python-format
+msgid "Set Guest Agent: %(status)s"
+msgstr ""
+
+#: instances/views.py:885
+msgid "Set Video Model: %(model)"
+=======
#: instances/views.py:849
msgid "Edit XML"
msgstr ""
@@ -2678,6 +2950,7 @@ msgstr ""
#: instances/views.py:873
msgid "Set Video Model"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: instances/views.py:882
@@ -2688,6 +2961,19 @@ msgstr ""
msgid "Network Device Config is changed. Please shutdown instance to activate."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:922
+#, python-format
+msgid "Add network: %(mac)s"
+msgstr ""
+
+#: instances/views.py:933
+#, python-format
+msgid "Delete Network: %(mac)s"
+msgstr ""
+
+#: instances/views.py:946
+=======
#: instances/views.py:903
msgid "Add network"
msgstr ""
@@ -2697,78 +2983,213 @@ msgid "Delete network"
msgstr ""
#: instances/views.py:933
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Set Link State: %(state)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:966 networks/views.py:231
+=======
#: instances/views.py:952
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "%(qos_dir)s QoS is set"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:971
+=======
#: instances/views.py:956
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"%(qos_dir)s QoS is set. Network XML is changed. Stop and "
"start network to activate new config."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:988 networks/views.py:246
+=======
#: instances/views.py:970
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "%(qos_dir)s QoS is deleted"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:993
+=======
#: instances/views.py:974
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"%(qos_dir)s QoS is deleted. Network XML is changed. Stop and "
"start network to activate new config."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1012
+msgid "Only one owner is allowed and the one already added"
+msgstr ""
+
+#: instances/views.py:1017
+=======
#: instances/views.py:990
msgid "Only one owner is allowed and the one already added"
msgstr ""
#: instances/views.py:995
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
-msgid "Added owner %(user)s"
+msgid "Add owner: %(user)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1028
+#, python-format
+msgid "Delete owner: %(userinstance_id)s "
+msgstr ""
+
+#: instances/views.py:1060
+=======
#: instances/views.py:1006
#, python-format
msgid "Deleted owner %(userinstance_id)s"
msgstr ""
#: instances/views.py:1038
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "User '%(quota_msg)s' quota reached, cannot create '%(clone_name)s'!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1066
+#, python-format
+msgid "Instance '%(clone_name)s' already exists!"
+msgstr ""
+
+#: instances/views.py:1069
+=======
#: instances/views.py:1044
msgid "Instance 'clone_name' already exists!"
msgstr ""
#: instances/views.py:1047
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Instance name '%(clone_name)s' contains invalid characters!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1072
+=======
#: instances/views.py:1050
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Instance MAC '%(clone_mac)s' invalid format!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1082
+#, python-format
+msgid "Create a clone of '%(instance_name)s'"
+msgstr ""
+
+#: instances/views.py:1121
+=======
#: instances/views.py:1060
#, python-format
msgid "Clone of '%(instance_name)s'"
msgstr ""
#: instances/views.py:1093
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid ""
"Error setting console password. You should check that your instance have an "
"graphic device."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1126
+msgid "Set VNC password"
+msgstr ""
+
+#: instances/views.py:1135
+msgid "Set VNC keymap"
+msgstr ""
+
+#: instances/views.py:1140
+msgid "Set VNC type"
+msgstr ""
+
+#: instances/views.py:1145
+msgid "Set VNC listen address"
+msgstr ""
+
+#: instances/views.py:1168
+msgid "Edit options"
+msgstr ""
+
+#: instances/views.py:1182
+msgid "Send console.vv file"
+msgstr ""
+
+#: instances/views.py:1243 instances/views.py:1337
+msgid "A virtual machine with this name already exists"
+msgstr ""
+
+#: instances/views.py:1320
+msgid "You haven't defined any storage pools"
+msgstr ""
+
+#: instances/views.py:1322
+msgid "You haven't defined any network pools"
+msgstr ""
+
+#: instances/views.py:1339
+msgid "There is an instance with same name. Remove it and try again!"
+msgstr ""
+
+#: instances/views.py:1343
+msgid "No Virtual Machine MAC has been entered"
+msgstr ""
+
+#: instances/views.py:1374
+msgid "Image has already exist. Please check volumes or change instance name"
+msgstr ""
+
+#: instances/views.py:1401
+msgid "First you need to create or select an image"
+msgstr ""
+
+#: instances/views.py:1419
+msgid "Invalid cache mode"
+msgstr ""
+
+#: instances/views.py:1460
+msgid "Instance is created"
+msgstr ""
+
+#: instances/views.py:1481
+msgid "Flavor Created"
+msgstr ""
+
+#: instances/views.py:1487
+msgid "Create Flavor"
+msgstr ""
+
+#: instances/views.py:1497
+msgid "Flavor Updated"
+msgstr ""
+
+#: instances/views.py:1503
+msgid "Update Flavor"
+msgstr ""
+
+#: instances/views.py:1512
+=======
#: instances/views.py:1096
msgid "Set VNC password"
msgstr ""
@@ -2846,46 +3267,47 @@ msgid "Update Flavor"
msgstr ""
#: instances/views.py:1460
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Flavor Deleted"
msgstr ""
-#: interfaces/forms.py:25
+#: interfaces/forms.py:26
msgid "The IPv4 address must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:27
+#: interfaces/forms.py:28
msgid "The IPv4 address must not exceed 20 characters"
msgstr ""
-#: interfaces/forms.py:34
+#: interfaces/forms.py:35
msgid "The IPv4 gateway must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:36
+#: interfaces/forms.py:37
msgid "The IPv4 gateway must not exceed 20 characters"
msgstr ""
-#: interfaces/forms.py:43
+#: interfaces/forms.py:44
msgid "The IPv6 address must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:45
+#: interfaces/forms.py:46
msgid "The IPv6 address must not exceed 100 characters"
msgstr ""
-#: interfaces/forms.py:52
+#: interfaces/forms.py:53
msgid "The IPv6 gateway must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:54
+#: interfaces/forms.py:55
msgid "The IPv6 gateway must not exceed 100 characters"
msgstr ""
-#: interfaces/forms.py:61 interfaces/forms.py:70
+#: interfaces/forms.py:62 interfaces/forms.py:71
msgid "The interface must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:63 interfaces/forms.py:72
+#: interfaces/forms.py:64 interfaces/forms.py:73
msgid "The interface must not exceed 10 characters"
msgstr ""
@@ -3019,63 +3441,63 @@ msgstr ""
msgid "Hypervisor doesn't have any Interfaces"
msgstr ""
-#: logs/models.py:6
+#: logs/models.py:5
msgid "user"
msgstr ""
-#: logs/models.py:7
+#: logs/models.py:6
msgid "instance"
msgstr ""
-#: logs/models.py:8
+#: logs/models.py:7
msgid "message"
msgstr ""
-#: logs/models.py:9
+#: logs/models.py:8
msgid "date"
msgstr ""
-#: networks/forms.py:7 storages/forms.py:7
+#: networks/forms.py:8 storages/forms.py:8
msgid "No pool name has been entered"
msgstr ""
-#: networks/forms.py:9
+#: networks/forms.py:10
msgid "No IPv4 subnet has been entered"
msgstr ""
-#: networks/forms.py:11
+#: networks/forms.py:15
msgid "No IPv6 subnet has been entered"
msgstr ""
-#: networks/forms.py:24 storages/forms.py:22
+#: networks/forms.py:30 storages/forms.py:23
msgid "The pool name must not contain any special characters"
msgstr ""
-#: networks/forms.py:26 storages/forms.py:24
+#: networks/forms.py:32 storages/forms.py:25
msgid "The pool name must not exceed 20 characters"
msgstr ""
-#: networks/forms.py:33
+#: networks/forms.py:39
msgid "The IPv4 subnet must not contain any special characters"
msgstr ""
-#: networks/forms.py:35
+#: networks/forms.py:41
msgid "The IPv4 subnet must not exceed 20 characters"
msgstr ""
-#: networks/forms.py:42
+#: networks/forms.py:48
msgid "The IPv6 subnet must not contain any special characters"
msgstr ""
-#: networks/forms.py:44
+#: networks/forms.py:50
msgid "The IPv6 subnet must not exceed 42 characters"
msgstr ""
-#: networks/forms.py:52
+#: networks/forms.py:58
msgid "The pool bridge name must not contain any special characters"
msgstr ""
-#: networks/forms.py:54
+#: networks/forms.py:60
msgid "The pool bridge name must not exceed 20 characters"
msgstr ""
@@ -3271,6 +3693,32 @@ msgstr ""
msgid "Please enter bridge/dev name"
msgstr ""
+<<<<<<< HEAD
+#: networks/views.py:57
+msgid "For libvirt, the IPv6 network prefix must be /64"
+msgstr ""
+
+#: networks/views.py:130
+msgid "Unknown Network Family"
+msgstr ""
+
+#: networks/views.py:180
+#, python-format
+msgid "Fixed address operation completed for %(family)s"
+msgstr ""
+
+#: networks/views.py:190
+#, python-format
+msgid "%(family)s Fixed Address is Deleted."
+msgstr ""
+
+#: networks/views.py:198
+#, python-format
+msgid "%(family)s DHCP Range is Changed."
+msgstr ""
+
+#: networks/views.py:210
+=======
#: networks/views.py:56
msgid "For libvirt, the IPv6 network prefix must be /64"
msgstr ""
@@ -3292,10 +3740,29 @@ msgid "{family.upper()} DHCP Range is Changed."
msgstr ""
#: networks/views.py:203
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid ""
"Network XML is changed. \\Stop and start network to activate new config."
msgstr ""
+<<<<<<< HEAD
+#: networks/views.py:215
+msgid "Network XML is changed."
+msgstr ""
+
+#: networks/views.py:228
+#, python-format
+msgid ""
+"%(qos_dir)s QoS is updated. Network XML is changed. Stop and start network "
+"to activate new config"
+msgstr ""
+
+#: networks/views.py:242
+#, python-format
+msgid ""
+"%(qos_dir)s QoS is deleted. Network XML is changed. "
+"Stop and start network to activate new config"
+=======
#: networks/views.py:205
msgid "Network XML is changed."
msgstr ""
@@ -3310,6 +3777,7 @@ msgstr ""
#: networks/views.py:221
msgid "{} QoS is set"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: networks/views.py:232
@@ -3385,6 +3853,17 @@ msgstr ""
msgid "Hypervisor doesn't have any NWFilters"
msgstr ""
+<<<<<<< HEAD
+#: nwfilters/views.py:44
+msgid "A network filter with this name already exists"
+msgstr ""
+
+#: nwfilters/views.py:47
+msgid "A network filter with this UUID already exists"
+msgstr ""
+
+#: nwfilters/views.py:51
+=======
#: nwfilters/views.py:41
msgid "A network filter with this name already exists"
msgstr ""
@@ -3394,10 +3873,26 @@ msgid "A network filter with this UUID already exists"
msgstr ""
#: nwfilters/views.py:48
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
-msgid "Creating NWFilter: %s"
+msgid "%(filter)s network filter is created"
msgstr ""
+<<<<<<< HEAD
+#: nwfilters/views.py:60
+#, python-format
+msgid "%(filter)s network filter is deleted"
+msgstr ""
+
+#: nwfilters/views.py:76
+#, python-format
+msgid "NWFilter is in use by %(instance)s. Cannot be deleted."
+msgstr ""
+
+#: nwfilters/views.py:93
+#, python-format
+msgid "Cloning NWFilter %(name)s as %(clone)s"
+=======
#: nwfilters/views.py:57
#, python-brace-format
msgid "Deleting NWFilter: {name}"
@@ -3411,6 +3906,7 @@ msgstr ""
#: nwfilters/views.py:86
#, python-brace-format
msgid "Cloning NWFilter {name} as {cln_name}"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: secrets/templates/create_secret_block.html:12
@@ -3461,27 +3957,27 @@ msgstr ""
msgid "Value"
msgstr ""
-#: storages/forms.py:9 storages/forms.py:36
+#: storages/forms.py:10 storages/forms.py:37
msgid "No path has been entered"
msgstr ""
-#: storages/forms.py:33
+#: storages/forms.py:34
msgid "The target must not contain any special characters"
msgstr ""
-#: storages/forms.py:45
+#: storages/forms.py:46
msgid "No device or path has been entered"
msgstr ""
-#: storages/forms.py:47
+#: storages/forms.py:48
msgid "The disk source must not contain any special characters"
msgstr ""
-#: storages/forms.py:61 storages/forms.py:76
+#: storages/forms.py:62 storages/forms.py:77
msgid "The image name must not contain any special characters"
msgstr ""
-#: storages/forms.py:78
+#: storages/forms.py:79
msgid "The image name must not exceed 120 characters"
msgstr ""
@@ -3614,7 +4110,7 @@ msgstr ""
msgid "Hypervisor doesn't have any Storages"
msgstr ""
-#: storages/views.py:40
+#: storages/views.py:39
msgid "Pool name already use"
msgstr ""
@@ -3622,6 +4118,38 @@ msgstr ""
msgid "You need create secret for pool"
msgstr ""
+<<<<<<< HEAD
+#: storages/views.py:48
+msgid "You need input all fields for creating ceph pool"
+msgstr ""
+
+#: storages/views.py:144
+#, python-format
+msgid "Volume: %(volume)s is deleted."
+msgstr ""
+
+#: storages/views.py:149
+msgid "ISO image already exist"
+msgstr ""
+
+#: storages/views.py:153
+#, python-format
+msgid "ISO: %(file)s is uploaded."
+msgstr ""
+
+#: storages/views.py:162
+msgid "Name of volume already in use"
+msgstr ""
+
+#: storages/views.py:174
+#, python-format
+msgid "%(image)s image cloned as %(clone)s successfully"
+msgstr ""
+
+#: storages/views.py:220
+#, python-format
+msgid "Image file %(name)s is created successfully"
+=======
#: storages/views.py:49
msgid "You need input all fields for creating ceph pool"
msgstr ""
@@ -3650,6 +4178,7 @@ msgstr ""
#: storages/views.py:199
#, python-brace-format
msgid "Image file {name} is created successfully"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: templates/403.html:3
diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po
index d393cd9..60c21a0 100644
--- a/locale/en/LC_MESSAGES/django.po
+++ b/locale/en/LC_MESSAGES/django.po
@@ -8,7 +8,11 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
+<<<<<<< HEAD
+"POT-Creation-Date: 2020-11-05 09:36+0000\n"
+=======
"POT-Creation-Date: 2020-10-23 07:53+0000\n"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -293,6 +297,57 @@ msgstr ""
#: accounts/utils.py:51
msgid "Please view HTML version of this message."
+<<<<<<< HEAD
+msgstr ""
+
+#: accounts/views.py:26
+msgid "Profile updated"
+msgstr ""
+
+#: accounts/views.py:44
+msgid "SSH key added"
+msgstr ""
+
+#: accounts/views.py:52
+msgid "Add SSH key"
+msgstr ""
+
+#: accounts/views.py:61
+msgid "SSH key deleted"
+msgstr ""
+
+#: accounts/views.py:69
+msgid "Delete SSH key"
+msgstr ""
+
+#: accounts/views.py:101
+msgid "Password Changed"
+msgstr ""
+
+#: accounts/views.py:121
+msgid "Create User Instance"
+msgstr ""
+
+#: accounts/views.py:139
+msgid "Update User Instance"
+msgstr ""
+
+#: accounts/views.py:175
+#, python-format
+msgid "OTP Sent to %(email)s"
+msgstr ""
+
+#: accounts/views.py:183
+msgid "Email OTP"
+msgstr ""
+
+#: accounts/views.py:194
+#, python-format
+msgid "OTP QR code was emailed to user %(user)s"
+msgstr ""
+
+#: accounts/views.py:196
+=======
msgstr ""
#: accounts/views.py:26
@@ -342,6 +397,7 @@ msgid "OTP QR code was emailed to user %s"
msgstr ""
#: accounts/views.py:177
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "User email not set, failed to send QR code"
msgstr ""
@@ -354,11 +410,20 @@ msgstr ""
msgid "Groups"
msgstr ""
+<<<<<<< HEAD
+#: admin/forms.py:81
+msgid ""
+"Raw passwords are not stored, so there is no way to see this user's "
+"password, \n"
+" but you can change the password using this "
+"form."
+=======
#: admin/forms.py:79
msgid ""
"Raw passwords are not stored, so there is no way to see\n"
" this user's password, but you can change the password using "
"this form."
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: admin/templates/admin/group_list.html:5 admin/views.py:87
@@ -505,6 +570,18 @@ msgstr ""
msgid "Create User"
msgstr ""
+<<<<<<< HEAD
+#: admin/views.py:129
+msgid "Update User"
+msgstr ""
+
+#: admin/views.py:141
+#, python-format
+msgid "Password changed for %(user)s"
+msgstr ""
+
+#: admin/views.py:144
+=======
#: admin/views.py:136
msgid "Update User"
msgstr ""
@@ -514,6 +591,7 @@ msgid "User password changed: {}"
msgstr ""
#: admin/views.py:152
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Wrong Data Provided"
msgstr ""
@@ -799,6 +877,20 @@ msgid "Other Settings"
msgstr ""
#: appsettings/views.py:38
+<<<<<<< HEAD
+#, python-format
+msgid "SASS directory path is changed. Now: %(dir)s"
+msgstr ""
+
+#: appsettings/views.py:67
+#, python-format
+msgid "Theme is changed. Now: %(theme)s"
+msgstr ""
+
+#: appsettings/views.py:82
+#, python-format
+msgid "%(setting)s is changed. Now: %(value)s"
+=======
#, python-brace-format
msgid "SASS directory path is changed. Now: {sass_dir.value}"
msgstr ""
@@ -811,6 +903,7 @@ msgstr ""
#: appsettings/views.py:80
#, python-brace-format
msgid "{setting.name} is changed. Now: {setting.value}"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: computes/forms.py:21
@@ -1698,7 +1791,11 @@ msgstr ""
#: instances/templates/instance_actions.html:25
#: instances/templates/instance_actions.html:37
#: instances/templates/instances/power_tab.html:25
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:82 instances/views.py:270
+=======
#: instances/templates/instances/power_tab.html:82 instances/views.py:264
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Suspend"
msgstr ""
@@ -1752,7 +1849,11 @@ msgstr ""
#: instances/templates/instances/destroy_instance_form.html:40
#: instances/templates/instances/destroy_tab.html:18
#: instances/templates/instances/destroy_tab.html:20
+<<<<<<< HEAD
+#: instances/templates/instances/destroy_tab.html:23 instances/views.py:312
+=======
#: instances/templates/instances/destroy_tab.html:23 instances/views.py:306
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Destroy"
msgstr ""
@@ -1770,20 +1871,32 @@ msgstr ""
#: instances/templates/instance_actions.html:35
#: instances/templates/instances/power_tab.html:47
#: instances/templates/instances/power_tab.html:121
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:123 instances/views.py:245
+=======
#: instances/templates/instances/power_tab.html:123 instances/views.py:239
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Power On"
msgstr ""
#: instances/templates/instance_actions.html:15
#: instances/templates/instances/power_tab.html:9
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:59 instances/views.py:261
+=======
#: instances/templates/instances/power_tab.html:59 instances/views.py:255
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Power Off"
msgstr ""
#: instances/templates/instance_actions.html:16
#: instances/templates/instance_actions.html:29
#: instances/templates/instances/power_tab.html:14
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:66 instances/views.py:254
+=======
#: instances/templates/instances/power_tab.html:66 instances/views.py:248
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Power Cycle"
msgstr ""
@@ -1795,7 +1908,11 @@ msgstr ""
#: instances/templates/instance_actions.html:22
#: instances/templates/instances/power_tab.html:34
#: instances/templates/instances/power_tab.html:93
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:108 instances/views.py:278
+=======
#: instances/templates/instances/power_tab.html:108 instances/views.py:272
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Resume"
msgstr ""
@@ -1803,7 +1920,11 @@ msgstr ""
#: instances/templates/instances/power_tab.html:19
#: instances/templates/instances/power_tab.html:39
#: instances/templates/instances/power_tab.html:74
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:100 instances/views.py:285
+=======
#: instances/templates/instances/power_tab.html:100 instances/views.py:279
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Force Off"
msgstr ""
@@ -2450,7 +2571,7 @@ msgstr ""
#: instances/templates/instances/snapshots_tab.html:22
msgid ""
"This may take more than an hour, depending on how much content is on your "
-"droplet and how large the disk is."
+"instance and how large the disk is."
msgstr ""
#: instances/templates/instances/snapshots_tab.html:27
@@ -2505,6 +2626,26 @@ msgstr ""
msgid "None available device name"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:242
+msgid "Templates cannot be started."
+msgstr ""
+
+#: instances/views.py:345
+#, python-format
+msgid "Instance is migrated to %(hostname)s"
+msgstr ""
+
+#: instances/views.py:368
+msgid "Reset root password"
+msgstr ""
+
+#: instances/views.py:374 instances/views.py:403
+msgid "Please shutdown down your instance and then try again"
+msgstr ""
+
+#: instances/views.py:395
+=======
#: instances/views.py:236
msgid "Templates cannot be started."
msgstr ""
@@ -2523,37 +2664,75 @@ msgid "Please shutdown down your instance and then try again"
msgstr ""
#: instances/views.py:389
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Installed new SSH public key %(keyname)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:422
+=======
#: instances/views.py:416
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"User %(quota_msg)s quota reached, cannot resize CPU of '%(instance_name)s'!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:431
+#, python-format
+msgid "CPU is resized: %(old)s to %(new)s"
+msgstr ""
+
+#: instances/views.py:459
+=======
#: instances/views.py:425
msgid "Resize CPU"
msgstr ""
#: instances/views.py:453
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"User %(quota_msg)s quota reached, cannot resize memory of "
"'%(instance_name)s'!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:466
+#, python-format
+msgid ""
+"Memory is resized: current/max: %(old_cur)s/%(old_max)s to %(new_cur)s/"
+"%(new_max)s"
+msgstr ""
+
+#: instances/views.py:500
+=======
#: instances/views.py:462
msgid "Resize Memory"
msgstr ""
#: instances/views.py:491
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"User %(quota_msg)s quota reached, cannot resize disks of '%(instance_name)s'!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:507
+#, python-format
+msgid "Disk is resized: %(dev)s"
+msgstr ""
+
+#: instances/views.py:546
+#, python-format
+msgid "Attach new disk: %(name)s (%(format)s)"
+msgstr ""
+
+#: instances/views.py:577
+=======
#: instances/views.py:498
msgid "Disk resize"
msgstr ""
@@ -2564,11 +2743,16 @@ msgid "Attach new disk %(name)s (%(format)s)"
msgstr ""
#: instances/views.py:568
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Attach Existing disk: %(target_dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:635
+=======
#: instances/views.py:624
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Volume changes are applied. But it will be activated after shutdown"
msgstr ""
@@ -2576,41 +2760,79 @@ msgstr ""
msgid "Volume is changed successfully."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:639
+=======
#: instances/views.py:627
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Edit disk: %(target_dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:661
+=======
#: instances/views.py:649
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Delete disk: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:677
+=======
#: instances/views.py:665
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Detach disk: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:690
+=======
#: instances/views.py:678
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Add CD-ROM: %(target)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:703
+=======
#: instances/views.py:691
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Detach CD-ROM: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:716
+=======
#: instances/views.py:704
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Mount media: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:729
+=======
#: instances/views.py:717
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Unmount media: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:742
+#, python-format
+msgid "Create snapshot: %(snap)s"
+msgstr ""
+
+#: instances/views.py:753
+#, python-format
+msgid "Delete snapshot: %(snap)s"
+=======
#: instances/views.py:730
#, python-format
msgid "New snapshot: %(name)s"
@@ -2619,26 +2841,62 @@ msgstr ""
#: instances/views.py:741
#, python-format
msgid "Delete snapshot: %(snap_name)s"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: instances/views.py:752
msgid "Successful revert snapshot: "
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:767
+msgid "Revert snapshot: %(snap)"
+msgstr ""
+
+#: instances/views.py:781
+=======
#: instances/views.py:755
msgid "Revert snapshot"
msgstr ""
#: instances/views.py:769
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "VCPU %(id)s is enabled=%(enabled)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:790
+=======
#: instances/views.py:780
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "VCPU Hot-plug is enabled=%(status)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:800
+msgid "Set autostart"
+msgstr ""
+
+#: instances/views.py:809
+msgid "Unset autostart"
+msgstr ""
+
+#: instances/views.py:818
+msgid "Enable boot menu"
+msgstr ""
+
+#: instances/views.py:827
+msgid "Disable boot menu"
+msgstr ""
+
+#: instances/views.py:842
+msgid "Set boot order"
+msgstr ""
+
+#: instances/views.py:847
+=======
#: instances/views.py:791
msgid "Set autostart"
msgstr ""
@@ -2660,6 +2918,7 @@ msgid "Set boot order"
msgstr ""
#: instances/views.py:836
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Boot menu changes applied. But it will be activated after shutdown"
msgstr ""
@@ -2667,6 +2926,19 @@ msgstr ""
msgid "Boot order changed successfully."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:861
+msgid "Change instance XML"
+msgstr ""
+
+#: instances/views.py:875
+#, python-format
+msgid "Set Guest Agent: %(status)s"
+msgstr ""
+
+#: instances/views.py:885
+msgid "Set Video Model: %(model)"
+=======
#: instances/views.py:849
msgid "Edit XML"
msgstr ""
@@ -2678,6 +2950,7 @@ msgstr ""
#: instances/views.py:873
msgid "Set Video Model"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: instances/views.py:882
@@ -2688,6 +2961,19 @@ msgstr ""
msgid "Network Device Config is changed. Please shutdown instance to activate."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:922
+#, python-format
+msgid "Add network: %(mac)s"
+msgstr ""
+
+#: instances/views.py:933
+#, python-format
+msgid "Delete Network: %(mac)s"
+msgstr ""
+
+#: instances/views.py:946
+=======
#: instances/views.py:903
msgid "Add network"
msgstr ""
@@ -2697,78 +2983,213 @@ msgid "Delete network"
msgstr ""
#: instances/views.py:933
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Set Link State: %(state)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:966 networks/views.py:231
+=======
#: instances/views.py:952
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "%(qos_dir)s QoS is set"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:971
+=======
#: instances/views.py:956
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"%(qos_dir)s QoS is set. Network XML is changed. Stop and "
"start network to activate new config."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:988 networks/views.py:246
+=======
#: instances/views.py:970
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "%(qos_dir)s QoS is deleted"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:993
+=======
#: instances/views.py:974
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"%(qos_dir)s QoS is deleted. Network XML is changed. Stop and "
"start network to activate new config."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1012
+msgid "Only one owner is allowed and the one already added"
+msgstr ""
+
+#: instances/views.py:1017
+=======
#: instances/views.py:990
msgid "Only one owner is allowed and the one already added"
msgstr ""
#: instances/views.py:995
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
-msgid "Added owner %(user)s"
+msgid "Add owner: %(user)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1028
+#, python-format
+msgid "Delete owner: %(userinstance_id)s "
+msgstr ""
+
+#: instances/views.py:1060
+=======
#: instances/views.py:1006
#, python-format
msgid "Deleted owner %(userinstance_id)s"
msgstr ""
#: instances/views.py:1038
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "User '%(quota_msg)s' quota reached, cannot create '%(clone_name)s'!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1066
+#, python-format
+msgid "Instance '%(clone_name)s' already exists!"
+msgstr ""
+
+#: instances/views.py:1069
+=======
#: instances/views.py:1044
msgid "Instance 'clone_name' already exists!"
msgstr ""
#: instances/views.py:1047
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Instance name '%(clone_name)s' contains invalid characters!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1072
+=======
#: instances/views.py:1050
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Instance MAC '%(clone_mac)s' invalid format!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1082
+#, python-format
+msgid "Create a clone of '%(instance_name)s'"
+msgstr ""
+
+#: instances/views.py:1121
+=======
#: instances/views.py:1060
#, python-format
msgid "Clone of '%(instance_name)s'"
msgstr ""
#: instances/views.py:1093
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid ""
"Error setting console password. You should check that your instance have an "
"graphic device."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1126
+msgid "Set VNC password"
+msgstr ""
+
+#: instances/views.py:1135
+msgid "Set VNC keymap"
+msgstr ""
+
+#: instances/views.py:1140
+msgid "Set VNC type"
+msgstr ""
+
+#: instances/views.py:1145
+msgid "Set VNC listen address"
+msgstr ""
+
+#: instances/views.py:1168
+msgid "Edit options"
+msgstr ""
+
+#: instances/views.py:1182
+msgid "Send console.vv file"
+msgstr ""
+
+#: instances/views.py:1243 instances/views.py:1337
+msgid "A virtual machine with this name already exists"
+msgstr ""
+
+#: instances/views.py:1320
+msgid "You haven't defined any storage pools"
+msgstr ""
+
+#: instances/views.py:1322
+msgid "You haven't defined any network pools"
+msgstr ""
+
+#: instances/views.py:1339
+msgid "There is an instance with same name. Remove it and try again!"
+msgstr ""
+
+#: instances/views.py:1343
+msgid "No Virtual Machine MAC has been entered"
+msgstr ""
+
+#: instances/views.py:1374
+msgid "Image has already exist. Please check volumes or change instance name"
+msgstr ""
+
+#: instances/views.py:1401
+msgid "First you need to create or select an image"
+msgstr ""
+
+#: instances/views.py:1419
+msgid "Invalid cache mode"
+msgstr ""
+
+#: instances/views.py:1460
+msgid "Instance is created"
+msgstr ""
+
+#: instances/views.py:1481
+msgid "Flavor Created"
+msgstr ""
+
+#: instances/views.py:1487
+msgid "Create Flavor"
+msgstr ""
+
+#: instances/views.py:1497
+msgid "Flavor Updated"
+msgstr ""
+
+#: instances/views.py:1503
+msgid "Update Flavor"
+msgstr ""
+
+#: instances/views.py:1512
+=======
#: instances/views.py:1096
msgid "Set VNC password"
msgstr ""
@@ -2846,46 +3267,47 @@ msgid "Update Flavor"
msgstr ""
#: instances/views.py:1460
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Flavor Deleted"
msgstr ""
-#: interfaces/forms.py:25
+#: interfaces/forms.py:26
msgid "The IPv4 address must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:27
+#: interfaces/forms.py:28
msgid "The IPv4 address must not exceed 20 characters"
msgstr ""
-#: interfaces/forms.py:34
+#: interfaces/forms.py:35
msgid "The IPv4 gateway must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:36
+#: interfaces/forms.py:37
msgid "The IPv4 gateway must not exceed 20 characters"
msgstr ""
-#: interfaces/forms.py:43
+#: interfaces/forms.py:44
msgid "The IPv6 address must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:45
+#: interfaces/forms.py:46
msgid "The IPv6 address must not exceed 100 characters"
msgstr ""
-#: interfaces/forms.py:52
+#: interfaces/forms.py:53
msgid "The IPv6 gateway must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:54
+#: interfaces/forms.py:55
msgid "The IPv6 gateway must not exceed 100 characters"
msgstr ""
-#: interfaces/forms.py:61 interfaces/forms.py:70
+#: interfaces/forms.py:62 interfaces/forms.py:71
msgid "The interface must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:63 interfaces/forms.py:72
+#: interfaces/forms.py:64 interfaces/forms.py:73
msgid "The interface must not exceed 10 characters"
msgstr ""
@@ -3019,63 +3441,63 @@ msgstr ""
msgid "Hypervisor doesn't have any Interfaces"
msgstr ""
-#: logs/models.py:6
+#: logs/models.py:5
msgid "user"
msgstr ""
-#: logs/models.py:7
+#: logs/models.py:6
msgid "instance"
msgstr ""
-#: logs/models.py:8
+#: logs/models.py:7
msgid "message"
msgstr ""
-#: logs/models.py:9
+#: logs/models.py:8
msgid "date"
msgstr ""
-#: networks/forms.py:7 storages/forms.py:7
+#: networks/forms.py:8 storages/forms.py:8
msgid "No pool name has been entered"
msgstr ""
-#: networks/forms.py:9
+#: networks/forms.py:10
msgid "No IPv4 subnet has been entered"
msgstr ""
-#: networks/forms.py:11
+#: networks/forms.py:15
msgid "No IPv6 subnet has been entered"
msgstr ""
-#: networks/forms.py:24 storages/forms.py:22
+#: networks/forms.py:30 storages/forms.py:23
msgid "The pool name must not contain any special characters"
msgstr ""
-#: networks/forms.py:26 storages/forms.py:24
+#: networks/forms.py:32 storages/forms.py:25
msgid "The pool name must not exceed 20 characters"
msgstr ""
-#: networks/forms.py:33
+#: networks/forms.py:39
msgid "The IPv4 subnet must not contain any special characters"
msgstr ""
-#: networks/forms.py:35
+#: networks/forms.py:41
msgid "The IPv4 subnet must not exceed 20 characters"
msgstr ""
-#: networks/forms.py:42
+#: networks/forms.py:48
msgid "The IPv6 subnet must not contain any special characters"
msgstr ""
-#: networks/forms.py:44
+#: networks/forms.py:50
msgid "The IPv6 subnet must not exceed 42 characters"
msgstr ""
-#: networks/forms.py:52
+#: networks/forms.py:58
msgid "The pool bridge name must not contain any special characters"
msgstr ""
-#: networks/forms.py:54
+#: networks/forms.py:60
msgid "The pool bridge name must not exceed 20 characters"
msgstr ""
@@ -3271,6 +3693,32 @@ msgstr ""
msgid "Please enter bridge/dev name"
msgstr ""
+<<<<<<< HEAD
+#: networks/views.py:57
+msgid "For libvirt, the IPv6 network prefix must be /64"
+msgstr ""
+
+#: networks/views.py:130
+msgid "Unknown Network Family"
+msgstr ""
+
+#: networks/views.py:180
+#, python-format
+msgid "Fixed address operation completed for %(family)s"
+msgstr ""
+
+#: networks/views.py:190
+#, python-format
+msgid "%(family)s Fixed Address is Deleted."
+msgstr ""
+
+#: networks/views.py:198
+#, python-format
+msgid "%(family)s DHCP Range is Changed."
+msgstr ""
+
+#: networks/views.py:210
+=======
#: networks/views.py:56
msgid "For libvirt, the IPv6 network prefix must be /64"
msgstr ""
@@ -3292,10 +3740,29 @@ msgid "{family.upper()} DHCP Range is Changed."
msgstr ""
#: networks/views.py:203
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid ""
"Network XML is changed. \\Stop and start network to activate new config."
msgstr ""
+<<<<<<< HEAD
+#: networks/views.py:215
+msgid "Network XML is changed."
+msgstr ""
+
+#: networks/views.py:228
+#, python-format
+msgid ""
+"%(qos_dir)s QoS is updated. Network XML is changed. Stop and start network "
+"to activate new config"
+msgstr ""
+
+#: networks/views.py:242
+#, python-format
+msgid ""
+"%(qos_dir)s QoS is deleted. Network XML is changed. "
+"Stop and start network to activate new config"
+=======
#: networks/views.py:205
msgid "Network XML is changed."
msgstr ""
@@ -3310,6 +3777,7 @@ msgstr ""
#: networks/views.py:221
msgid "{} QoS is set"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: networks/views.py:232
@@ -3385,6 +3853,17 @@ msgstr ""
msgid "Hypervisor doesn't have any NWFilters"
msgstr ""
+<<<<<<< HEAD
+#: nwfilters/views.py:44
+msgid "A network filter with this name already exists"
+msgstr ""
+
+#: nwfilters/views.py:47
+msgid "A network filter with this UUID already exists"
+msgstr ""
+
+#: nwfilters/views.py:51
+=======
#: nwfilters/views.py:41
msgid "A network filter with this name already exists"
msgstr ""
@@ -3394,10 +3873,26 @@ msgid "A network filter with this UUID already exists"
msgstr ""
#: nwfilters/views.py:48
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
-msgid "Creating NWFilter: %s"
+msgid "%(filter)s network filter is created"
msgstr ""
+<<<<<<< HEAD
+#: nwfilters/views.py:60
+#, python-format
+msgid "%(filter)s network filter is deleted"
+msgstr ""
+
+#: nwfilters/views.py:76
+#, python-format
+msgid "NWFilter is in use by %(instance)s. Cannot be deleted."
+msgstr ""
+
+#: nwfilters/views.py:93
+#, python-format
+msgid "Cloning NWFilter %(name)s as %(clone)s"
+=======
#: nwfilters/views.py:57
#, python-brace-format
msgid "Deleting NWFilter: {name}"
@@ -3411,6 +3906,7 @@ msgstr ""
#: nwfilters/views.py:86
#, python-brace-format
msgid "Cloning NWFilter {name} as {cln_name}"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: secrets/templates/create_secret_block.html:12
@@ -3461,27 +3957,27 @@ msgstr ""
msgid "Value"
msgstr ""
-#: storages/forms.py:9 storages/forms.py:36
+#: storages/forms.py:10 storages/forms.py:37
msgid "No path has been entered"
msgstr ""
-#: storages/forms.py:33
+#: storages/forms.py:34
msgid "The target must not contain any special characters"
msgstr ""
-#: storages/forms.py:45
+#: storages/forms.py:46
msgid "No device or path has been entered"
msgstr ""
-#: storages/forms.py:47
+#: storages/forms.py:48
msgid "The disk source must not contain any special characters"
msgstr ""
-#: storages/forms.py:61 storages/forms.py:76
+#: storages/forms.py:62 storages/forms.py:77
msgid "The image name must not contain any special characters"
msgstr ""
-#: storages/forms.py:78
+#: storages/forms.py:79
msgid "The image name must not exceed 120 characters"
msgstr ""
@@ -3614,7 +4110,7 @@ msgstr ""
msgid "Hypervisor doesn't have any Storages"
msgstr ""
-#: storages/views.py:40
+#: storages/views.py:39
msgid "Pool name already use"
msgstr ""
@@ -3622,6 +4118,38 @@ msgstr ""
msgid "You need create secret for pool"
msgstr ""
+<<<<<<< HEAD
+#: storages/views.py:48
+msgid "You need input all fields for creating ceph pool"
+msgstr ""
+
+#: storages/views.py:144
+#, python-format
+msgid "Volume: %(volume)s is deleted."
+msgstr ""
+
+#: storages/views.py:149
+msgid "ISO image already exist"
+msgstr ""
+
+#: storages/views.py:153
+#, python-format
+msgid "ISO: %(file)s is uploaded."
+msgstr ""
+
+#: storages/views.py:162
+msgid "Name of volume already in use"
+msgstr ""
+
+#: storages/views.py:174
+#, python-format
+msgid "%(image)s image cloned as %(clone)s successfully"
+msgstr ""
+
+#: storages/views.py:220
+#, python-format
+msgid "Image file %(name)s is created successfully"
+=======
#: storages/views.py:49
msgid "You need input all fields for creating ceph pool"
msgstr ""
@@ -3650,6 +4178,7 @@ msgstr ""
#: storages/views.py:199
#, python-brace-format
msgid "Image file {name} is created successfully"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: templates/403.html:3
diff --git a/locale/es/LC_MESSAGES/django.po b/locale/es/LC_MESSAGES/django.po
index d393cd9..60c21a0 100644
--- a/locale/es/LC_MESSAGES/django.po
+++ b/locale/es/LC_MESSAGES/django.po
@@ -8,7 +8,11 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
+<<<<<<< HEAD
+"POT-Creation-Date: 2020-11-05 09:36+0000\n"
+=======
"POT-Creation-Date: 2020-10-23 07:53+0000\n"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -293,6 +297,57 @@ msgstr ""
#: accounts/utils.py:51
msgid "Please view HTML version of this message."
+<<<<<<< HEAD
+msgstr ""
+
+#: accounts/views.py:26
+msgid "Profile updated"
+msgstr ""
+
+#: accounts/views.py:44
+msgid "SSH key added"
+msgstr ""
+
+#: accounts/views.py:52
+msgid "Add SSH key"
+msgstr ""
+
+#: accounts/views.py:61
+msgid "SSH key deleted"
+msgstr ""
+
+#: accounts/views.py:69
+msgid "Delete SSH key"
+msgstr ""
+
+#: accounts/views.py:101
+msgid "Password Changed"
+msgstr ""
+
+#: accounts/views.py:121
+msgid "Create User Instance"
+msgstr ""
+
+#: accounts/views.py:139
+msgid "Update User Instance"
+msgstr ""
+
+#: accounts/views.py:175
+#, python-format
+msgid "OTP Sent to %(email)s"
+msgstr ""
+
+#: accounts/views.py:183
+msgid "Email OTP"
+msgstr ""
+
+#: accounts/views.py:194
+#, python-format
+msgid "OTP QR code was emailed to user %(user)s"
+msgstr ""
+
+#: accounts/views.py:196
+=======
msgstr ""
#: accounts/views.py:26
@@ -342,6 +397,7 @@ msgid "OTP QR code was emailed to user %s"
msgstr ""
#: accounts/views.py:177
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "User email not set, failed to send QR code"
msgstr ""
@@ -354,11 +410,20 @@ msgstr ""
msgid "Groups"
msgstr ""
+<<<<<<< HEAD
+#: admin/forms.py:81
+msgid ""
+"Raw passwords are not stored, so there is no way to see this user's "
+"password, \n"
+" but you can change the password using this "
+"form."
+=======
#: admin/forms.py:79
msgid ""
"Raw passwords are not stored, so there is no way to see\n"
" this user's password, but you can change the password using "
"this form."
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: admin/templates/admin/group_list.html:5 admin/views.py:87
@@ -505,6 +570,18 @@ msgstr ""
msgid "Create User"
msgstr ""
+<<<<<<< HEAD
+#: admin/views.py:129
+msgid "Update User"
+msgstr ""
+
+#: admin/views.py:141
+#, python-format
+msgid "Password changed for %(user)s"
+msgstr ""
+
+#: admin/views.py:144
+=======
#: admin/views.py:136
msgid "Update User"
msgstr ""
@@ -514,6 +591,7 @@ msgid "User password changed: {}"
msgstr ""
#: admin/views.py:152
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Wrong Data Provided"
msgstr ""
@@ -799,6 +877,20 @@ msgid "Other Settings"
msgstr ""
#: appsettings/views.py:38
+<<<<<<< HEAD
+#, python-format
+msgid "SASS directory path is changed. Now: %(dir)s"
+msgstr ""
+
+#: appsettings/views.py:67
+#, python-format
+msgid "Theme is changed. Now: %(theme)s"
+msgstr ""
+
+#: appsettings/views.py:82
+#, python-format
+msgid "%(setting)s is changed. Now: %(value)s"
+=======
#, python-brace-format
msgid "SASS directory path is changed. Now: {sass_dir.value}"
msgstr ""
@@ -811,6 +903,7 @@ msgstr ""
#: appsettings/views.py:80
#, python-brace-format
msgid "{setting.name} is changed. Now: {setting.value}"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: computes/forms.py:21
@@ -1698,7 +1791,11 @@ msgstr ""
#: instances/templates/instance_actions.html:25
#: instances/templates/instance_actions.html:37
#: instances/templates/instances/power_tab.html:25
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:82 instances/views.py:270
+=======
#: instances/templates/instances/power_tab.html:82 instances/views.py:264
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Suspend"
msgstr ""
@@ -1752,7 +1849,11 @@ msgstr ""
#: instances/templates/instances/destroy_instance_form.html:40
#: instances/templates/instances/destroy_tab.html:18
#: instances/templates/instances/destroy_tab.html:20
+<<<<<<< HEAD
+#: instances/templates/instances/destroy_tab.html:23 instances/views.py:312
+=======
#: instances/templates/instances/destroy_tab.html:23 instances/views.py:306
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Destroy"
msgstr ""
@@ -1770,20 +1871,32 @@ msgstr ""
#: instances/templates/instance_actions.html:35
#: instances/templates/instances/power_tab.html:47
#: instances/templates/instances/power_tab.html:121
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:123 instances/views.py:245
+=======
#: instances/templates/instances/power_tab.html:123 instances/views.py:239
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Power On"
msgstr ""
#: instances/templates/instance_actions.html:15
#: instances/templates/instances/power_tab.html:9
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:59 instances/views.py:261
+=======
#: instances/templates/instances/power_tab.html:59 instances/views.py:255
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Power Off"
msgstr ""
#: instances/templates/instance_actions.html:16
#: instances/templates/instance_actions.html:29
#: instances/templates/instances/power_tab.html:14
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:66 instances/views.py:254
+=======
#: instances/templates/instances/power_tab.html:66 instances/views.py:248
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Power Cycle"
msgstr ""
@@ -1795,7 +1908,11 @@ msgstr ""
#: instances/templates/instance_actions.html:22
#: instances/templates/instances/power_tab.html:34
#: instances/templates/instances/power_tab.html:93
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:108 instances/views.py:278
+=======
#: instances/templates/instances/power_tab.html:108 instances/views.py:272
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Resume"
msgstr ""
@@ -1803,7 +1920,11 @@ msgstr ""
#: instances/templates/instances/power_tab.html:19
#: instances/templates/instances/power_tab.html:39
#: instances/templates/instances/power_tab.html:74
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:100 instances/views.py:285
+=======
#: instances/templates/instances/power_tab.html:100 instances/views.py:279
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Force Off"
msgstr ""
@@ -2450,7 +2571,7 @@ msgstr ""
#: instances/templates/instances/snapshots_tab.html:22
msgid ""
"This may take more than an hour, depending on how much content is on your "
-"droplet and how large the disk is."
+"instance and how large the disk is."
msgstr ""
#: instances/templates/instances/snapshots_tab.html:27
@@ -2505,6 +2626,26 @@ msgstr ""
msgid "None available device name"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:242
+msgid "Templates cannot be started."
+msgstr ""
+
+#: instances/views.py:345
+#, python-format
+msgid "Instance is migrated to %(hostname)s"
+msgstr ""
+
+#: instances/views.py:368
+msgid "Reset root password"
+msgstr ""
+
+#: instances/views.py:374 instances/views.py:403
+msgid "Please shutdown down your instance and then try again"
+msgstr ""
+
+#: instances/views.py:395
+=======
#: instances/views.py:236
msgid "Templates cannot be started."
msgstr ""
@@ -2523,37 +2664,75 @@ msgid "Please shutdown down your instance and then try again"
msgstr ""
#: instances/views.py:389
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Installed new SSH public key %(keyname)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:422
+=======
#: instances/views.py:416
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"User %(quota_msg)s quota reached, cannot resize CPU of '%(instance_name)s'!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:431
+#, python-format
+msgid "CPU is resized: %(old)s to %(new)s"
+msgstr ""
+
+#: instances/views.py:459
+=======
#: instances/views.py:425
msgid "Resize CPU"
msgstr ""
#: instances/views.py:453
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"User %(quota_msg)s quota reached, cannot resize memory of "
"'%(instance_name)s'!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:466
+#, python-format
+msgid ""
+"Memory is resized: current/max: %(old_cur)s/%(old_max)s to %(new_cur)s/"
+"%(new_max)s"
+msgstr ""
+
+#: instances/views.py:500
+=======
#: instances/views.py:462
msgid "Resize Memory"
msgstr ""
#: instances/views.py:491
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"User %(quota_msg)s quota reached, cannot resize disks of '%(instance_name)s'!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:507
+#, python-format
+msgid "Disk is resized: %(dev)s"
+msgstr ""
+
+#: instances/views.py:546
+#, python-format
+msgid "Attach new disk: %(name)s (%(format)s)"
+msgstr ""
+
+#: instances/views.py:577
+=======
#: instances/views.py:498
msgid "Disk resize"
msgstr ""
@@ -2564,11 +2743,16 @@ msgid "Attach new disk %(name)s (%(format)s)"
msgstr ""
#: instances/views.py:568
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Attach Existing disk: %(target_dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:635
+=======
#: instances/views.py:624
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Volume changes are applied. But it will be activated after shutdown"
msgstr ""
@@ -2576,41 +2760,79 @@ msgstr ""
msgid "Volume is changed successfully."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:639
+=======
#: instances/views.py:627
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Edit disk: %(target_dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:661
+=======
#: instances/views.py:649
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Delete disk: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:677
+=======
#: instances/views.py:665
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Detach disk: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:690
+=======
#: instances/views.py:678
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Add CD-ROM: %(target)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:703
+=======
#: instances/views.py:691
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Detach CD-ROM: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:716
+=======
#: instances/views.py:704
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Mount media: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:729
+=======
#: instances/views.py:717
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Unmount media: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:742
+#, python-format
+msgid "Create snapshot: %(snap)s"
+msgstr ""
+
+#: instances/views.py:753
+#, python-format
+msgid "Delete snapshot: %(snap)s"
+=======
#: instances/views.py:730
#, python-format
msgid "New snapshot: %(name)s"
@@ -2619,26 +2841,62 @@ msgstr ""
#: instances/views.py:741
#, python-format
msgid "Delete snapshot: %(snap_name)s"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: instances/views.py:752
msgid "Successful revert snapshot: "
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:767
+msgid "Revert snapshot: %(snap)"
+msgstr ""
+
+#: instances/views.py:781
+=======
#: instances/views.py:755
msgid "Revert snapshot"
msgstr ""
#: instances/views.py:769
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "VCPU %(id)s is enabled=%(enabled)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:790
+=======
#: instances/views.py:780
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "VCPU Hot-plug is enabled=%(status)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:800
+msgid "Set autostart"
+msgstr ""
+
+#: instances/views.py:809
+msgid "Unset autostart"
+msgstr ""
+
+#: instances/views.py:818
+msgid "Enable boot menu"
+msgstr ""
+
+#: instances/views.py:827
+msgid "Disable boot menu"
+msgstr ""
+
+#: instances/views.py:842
+msgid "Set boot order"
+msgstr ""
+
+#: instances/views.py:847
+=======
#: instances/views.py:791
msgid "Set autostart"
msgstr ""
@@ -2660,6 +2918,7 @@ msgid "Set boot order"
msgstr ""
#: instances/views.py:836
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Boot menu changes applied. But it will be activated after shutdown"
msgstr ""
@@ -2667,6 +2926,19 @@ msgstr ""
msgid "Boot order changed successfully."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:861
+msgid "Change instance XML"
+msgstr ""
+
+#: instances/views.py:875
+#, python-format
+msgid "Set Guest Agent: %(status)s"
+msgstr ""
+
+#: instances/views.py:885
+msgid "Set Video Model: %(model)"
+=======
#: instances/views.py:849
msgid "Edit XML"
msgstr ""
@@ -2678,6 +2950,7 @@ msgstr ""
#: instances/views.py:873
msgid "Set Video Model"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: instances/views.py:882
@@ -2688,6 +2961,19 @@ msgstr ""
msgid "Network Device Config is changed. Please shutdown instance to activate."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:922
+#, python-format
+msgid "Add network: %(mac)s"
+msgstr ""
+
+#: instances/views.py:933
+#, python-format
+msgid "Delete Network: %(mac)s"
+msgstr ""
+
+#: instances/views.py:946
+=======
#: instances/views.py:903
msgid "Add network"
msgstr ""
@@ -2697,78 +2983,213 @@ msgid "Delete network"
msgstr ""
#: instances/views.py:933
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Set Link State: %(state)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:966 networks/views.py:231
+=======
#: instances/views.py:952
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "%(qos_dir)s QoS is set"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:971
+=======
#: instances/views.py:956
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"%(qos_dir)s QoS is set. Network XML is changed. Stop and "
"start network to activate new config."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:988 networks/views.py:246
+=======
#: instances/views.py:970
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "%(qos_dir)s QoS is deleted"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:993
+=======
#: instances/views.py:974
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"%(qos_dir)s QoS is deleted. Network XML is changed. Stop and "
"start network to activate new config."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1012
+msgid "Only one owner is allowed and the one already added"
+msgstr ""
+
+#: instances/views.py:1017
+=======
#: instances/views.py:990
msgid "Only one owner is allowed and the one already added"
msgstr ""
#: instances/views.py:995
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
-msgid "Added owner %(user)s"
+msgid "Add owner: %(user)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1028
+#, python-format
+msgid "Delete owner: %(userinstance_id)s "
+msgstr ""
+
+#: instances/views.py:1060
+=======
#: instances/views.py:1006
#, python-format
msgid "Deleted owner %(userinstance_id)s"
msgstr ""
#: instances/views.py:1038
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "User '%(quota_msg)s' quota reached, cannot create '%(clone_name)s'!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1066
+#, python-format
+msgid "Instance '%(clone_name)s' already exists!"
+msgstr ""
+
+#: instances/views.py:1069
+=======
#: instances/views.py:1044
msgid "Instance 'clone_name' already exists!"
msgstr ""
#: instances/views.py:1047
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Instance name '%(clone_name)s' contains invalid characters!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1072
+=======
#: instances/views.py:1050
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Instance MAC '%(clone_mac)s' invalid format!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1082
+#, python-format
+msgid "Create a clone of '%(instance_name)s'"
+msgstr ""
+
+#: instances/views.py:1121
+=======
#: instances/views.py:1060
#, python-format
msgid "Clone of '%(instance_name)s'"
msgstr ""
#: instances/views.py:1093
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid ""
"Error setting console password. You should check that your instance have an "
"graphic device."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1126
+msgid "Set VNC password"
+msgstr ""
+
+#: instances/views.py:1135
+msgid "Set VNC keymap"
+msgstr ""
+
+#: instances/views.py:1140
+msgid "Set VNC type"
+msgstr ""
+
+#: instances/views.py:1145
+msgid "Set VNC listen address"
+msgstr ""
+
+#: instances/views.py:1168
+msgid "Edit options"
+msgstr ""
+
+#: instances/views.py:1182
+msgid "Send console.vv file"
+msgstr ""
+
+#: instances/views.py:1243 instances/views.py:1337
+msgid "A virtual machine with this name already exists"
+msgstr ""
+
+#: instances/views.py:1320
+msgid "You haven't defined any storage pools"
+msgstr ""
+
+#: instances/views.py:1322
+msgid "You haven't defined any network pools"
+msgstr ""
+
+#: instances/views.py:1339
+msgid "There is an instance with same name. Remove it and try again!"
+msgstr ""
+
+#: instances/views.py:1343
+msgid "No Virtual Machine MAC has been entered"
+msgstr ""
+
+#: instances/views.py:1374
+msgid "Image has already exist. Please check volumes or change instance name"
+msgstr ""
+
+#: instances/views.py:1401
+msgid "First you need to create or select an image"
+msgstr ""
+
+#: instances/views.py:1419
+msgid "Invalid cache mode"
+msgstr ""
+
+#: instances/views.py:1460
+msgid "Instance is created"
+msgstr ""
+
+#: instances/views.py:1481
+msgid "Flavor Created"
+msgstr ""
+
+#: instances/views.py:1487
+msgid "Create Flavor"
+msgstr ""
+
+#: instances/views.py:1497
+msgid "Flavor Updated"
+msgstr ""
+
+#: instances/views.py:1503
+msgid "Update Flavor"
+msgstr ""
+
+#: instances/views.py:1512
+=======
#: instances/views.py:1096
msgid "Set VNC password"
msgstr ""
@@ -2846,46 +3267,47 @@ msgid "Update Flavor"
msgstr ""
#: instances/views.py:1460
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Flavor Deleted"
msgstr ""
-#: interfaces/forms.py:25
+#: interfaces/forms.py:26
msgid "The IPv4 address must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:27
+#: interfaces/forms.py:28
msgid "The IPv4 address must not exceed 20 characters"
msgstr ""
-#: interfaces/forms.py:34
+#: interfaces/forms.py:35
msgid "The IPv4 gateway must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:36
+#: interfaces/forms.py:37
msgid "The IPv4 gateway must not exceed 20 characters"
msgstr ""
-#: interfaces/forms.py:43
+#: interfaces/forms.py:44
msgid "The IPv6 address must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:45
+#: interfaces/forms.py:46
msgid "The IPv6 address must not exceed 100 characters"
msgstr ""
-#: interfaces/forms.py:52
+#: interfaces/forms.py:53
msgid "The IPv6 gateway must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:54
+#: interfaces/forms.py:55
msgid "The IPv6 gateway must not exceed 100 characters"
msgstr ""
-#: interfaces/forms.py:61 interfaces/forms.py:70
+#: interfaces/forms.py:62 interfaces/forms.py:71
msgid "The interface must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:63 interfaces/forms.py:72
+#: interfaces/forms.py:64 interfaces/forms.py:73
msgid "The interface must not exceed 10 characters"
msgstr ""
@@ -3019,63 +3441,63 @@ msgstr ""
msgid "Hypervisor doesn't have any Interfaces"
msgstr ""
-#: logs/models.py:6
+#: logs/models.py:5
msgid "user"
msgstr ""
-#: logs/models.py:7
+#: logs/models.py:6
msgid "instance"
msgstr ""
-#: logs/models.py:8
+#: logs/models.py:7
msgid "message"
msgstr ""
-#: logs/models.py:9
+#: logs/models.py:8
msgid "date"
msgstr ""
-#: networks/forms.py:7 storages/forms.py:7
+#: networks/forms.py:8 storages/forms.py:8
msgid "No pool name has been entered"
msgstr ""
-#: networks/forms.py:9
+#: networks/forms.py:10
msgid "No IPv4 subnet has been entered"
msgstr ""
-#: networks/forms.py:11
+#: networks/forms.py:15
msgid "No IPv6 subnet has been entered"
msgstr ""
-#: networks/forms.py:24 storages/forms.py:22
+#: networks/forms.py:30 storages/forms.py:23
msgid "The pool name must not contain any special characters"
msgstr ""
-#: networks/forms.py:26 storages/forms.py:24
+#: networks/forms.py:32 storages/forms.py:25
msgid "The pool name must not exceed 20 characters"
msgstr ""
-#: networks/forms.py:33
+#: networks/forms.py:39
msgid "The IPv4 subnet must not contain any special characters"
msgstr ""
-#: networks/forms.py:35
+#: networks/forms.py:41
msgid "The IPv4 subnet must not exceed 20 characters"
msgstr ""
-#: networks/forms.py:42
+#: networks/forms.py:48
msgid "The IPv6 subnet must not contain any special characters"
msgstr ""
-#: networks/forms.py:44
+#: networks/forms.py:50
msgid "The IPv6 subnet must not exceed 42 characters"
msgstr ""
-#: networks/forms.py:52
+#: networks/forms.py:58
msgid "The pool bridge name must not contain any special characters"
msgstr ""
-#: networks/forms.py:54
+#: networks/forms.py:60
msgid "The pool bridge name must not exceed 20 characters"
msgstr ""
@@ -3271,6 +3693,32 @@ msgstr ""
msgid "Please enter bridge/dev name"
msgstr ""
+<<<<<<< HEAD
+#: networks/views.py:57
+msgid "For libvirt, the IPv6 network prefix must be /64"
+msgstr ""
+
+#: networks/views.py:130
+msgid "Unknown Network Family"
+msgstr ""
+
+#: networks/views.py:180
+#, python-format
+msgid "Fixed address operation completed for %(family)s"
+msgstr ""
+
+#: networks/views.py:190
+#, python-format
+msgid "%(family)s Fixed Address is Deleted."
+msgstr ""
+
+#: networks/views.py:198
+#, python-format
+msgid "%(family)s DHCP Range is Changed."
+msgstr ""
+
+#: networks/views.py:210
+=======
#: networks/views.py:56
msgid "For libvirt, the IPv6 network prefix must be /64"
msgstr ""
@@ -3292,10 +3740,29 @@ msgid "{family.upper()} DHCP Range is Changed."
msgstr ""
#: networks/views.py:203
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid ""
"Network XML is changed. \\Stop and start network to activate new config."
msgstr ""
+<<<<<<< HEAD
+#: networks/views.py:215
+msgid "Network XML is changed."
+msgstr ""
+
+#: networks/views.py:228
+#, python-format
+msgid ""
+"%(qos_dir)s QoS is updated. Network XML is changed. Stop and start network "
+"to activate new config"
+msgstr ""
+
+#: networks/views.py:242
+#, python-format
+msgid ""
+"%(qos_dir)s QoS is deleted. Network XML is changed. "
+"Stop and start network to activate new config"
+=======
#: networks/views.py:205
msgid "Network XML is changed."
msgstr ""
@@ -3310,6 +3777,7 @@ msgstr ""
#: networks/views.py:221
msgid "{} QoS is set"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: networks/views.py:232
@@ -3385,6 +3853,17 @@ msgstr ""
msgid "Hypervisor doesn't have any NWFilters"
msgstr ""
+<<<<<<< HEAD
+#: nwfilters/views.py:44
+msgid "A network filter with this name already exists"
+msgstr ""
+
+#: nwfilters/views.py:47
+msgid "A network filter with this UUID already exists"
+msgstr ""
+
+#: nwfilters/views.py:51
+=======
#: nwfilters/views.py:41
msgid "A network filter with this name already exists"
msgstr ""
@@ -3394,10 +3873,26 @@ msgid "A network filter with this UUID already exists"
msgstr ""
#: nwfilters/views.py:48
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
-msgid "Creating NWFilter: %s"
+msgid "%(filter)s network filter is created"
msgstr ""
+<<<<<<< HEAD
+#: nwfilters/views.py:60
+#, python-format
+msgid "%(filter)s network filter is deleted"
+msgstr ""
+
+#: nwfilters/views.py:76
+#, python-format
+msgid "NWFilter is in use by %(instance)s. Cannot be deleted."
+msgstr ""
+
+#: nwfilters/views.py:93
+#, python-format
+msgid "Cloning NWFilter %(name)s as %(clone)s"
+=======
#: nwfilters/views.py:57
#, python-brace-format
msgid "Deleting NWFilter: {name}"
@@ -3411,6 +3906,7 @@ msgstr ""
#: nwfilters/views.py:86
#, python-brace-format
msgid "Cloning NWFilter {name} as {cln_name}"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: secrets/templates/create_secret_block.html:12
@@ -3461,27 +3957,27 @@ msgstr ""
msgid "Value"
msgstr ""
-#: storages/forms.py:9 storages/forms.py:36
+#: storages/forms.py:10 storages/forms.py:37
msgid "No path has been entered"
msgstr ""
-#: storages/forms.py:33
+#: storages/forms.py:34
msgid "The target must not contain any special characters"
msgstr ""
-#: storages/forms.py:45
+#: storages/forms.py:46
msgid "No device or path has been entered"
msgstr ""
-#: storages/forms.py:47
+#: storages/forms.py:48
msgid "The disk source must not contain any special characters"
msgstr ""
-#: storages/forms.py:61 storages/forms.py:76
+#: storages/forms.py:62 storages/forms.py:77
msgid "The image name must not contain any special characters"
msgstr ""
-#: storages/forms.py:78
+#: storages/forms.py:79
msgid "The image name must not exceed 120 characters"
msgstr ""
@@ -3614,7 +4110,7 @@ msgstr ""
msgid "Hypervisor doesn't have any Storages"
msgstr ""
-#: storages/views.py:40
+#: storages/views.py:39
msgid "Pool name already use"
msgstr ""
@@ -3622,6 +4118,38 @@ msgstr ""
msgid "You need create secret for pool"
msgstr ""
+<<<<<<< HEAD
+#: storages/views.py:48
+msgid "You need input all fields for creating ceph pool"
+msgstr ""
+
+#: storages/views.py:144
+#, python-format
+msgid "Volume: %(volume)s is deleted."
+msgstr ""
+
+#: storages/views.py:149
+msgid "ISO image already exist"
+msgstr ""
+
+#: storages/views.py:153
+#, python-format
+msgid "ISO: %(file)s is uploaded."
+msgstr ""
+
+#: storages/views.py:162
+msgid "Name of volume already in use"
+msgstr ""
+
+#: storages/views.py:174
+#, python-format
+msgid "%(image)s image cloned as %(clone)s successfully"
+msgstr ""
+
+#: storages/views.py:220
+#, python-format
+msgid "Image file %(name)s is created successfully"
+=======
#: storages/views.py:49
msgid "You need input all fields for creating ceph pool"
msgstr ""
@@ -3650,6 +4178,7 @@ msgstr ""
#: storages/views.py:199
#, python-brace-format
msgid "Image file {name} is created successfully"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: templates/403.html:3
diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po
index fddef4a..cc1bde9 100644
--- a/locale/fr/LC_MESSAGES/django.po
+++ b/locale/fr/LC_MESSAGES/django.po
@@ -8,7 +8,11 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
+<<<<<<< HEAD
+"POT-Creation-Date: 2020-11-05 09:36+0000\n"
+=======
"POT-Creation-Date: 2020-10-23 07:53+0000\n"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -293,6 +297,57 @@ msgstr ""
#: accounts/utils.py:51
msgid "Please view HTML version of this message."
+<<<<<<< HEAD
+msgstr ""
+
+#: accounts/views.py:26
+msgid "Profile updated"
+msgstr ""
+
+#: accounts/views.py:44
+msgid "SSH key added"
+msgstr ""
+
+#: accounts/views.py:52
+msgid "Add SSH key"
+msgstr ""
+
+#: accounts/views.py:61
+msgid "SSH key deleted"
+msgstr ""
+
+#: accounts/views.py:69
+msgid "Delete SSH key"
+msgstr ""
+
+#: accounts/views.py:101
+msgid "Password Changed"
+msgstr ""
+
+#: accounts/views.py:121
+msgid "Create User Instance"
+msgstr ""
+
+#: accounts/views.py:139
+msgid "Update User Instance"
+msgstr ""
+
+#: accounts/views.py:175
+#, python-format
+msgid "OTP Sent to %(email)s"
+msgstr ""
+
+#: accounts/views.py:183
+msgid "Email OTP"
+msgstr ""
+
+#: accounts/views.py:194
+#, python-format
+msgid "OTP QR code was emailed to user %(user)s"
+msgstr ""
+
+#: accounts/views.py:196
+=======
msgstr ""
#: accounts/views.py:26
@@ -342,6 +397,7 @@ msgid "OTP QR code was emailed to user %s"
msgstr ""
#: accounts/views.py:177
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "User email not set, failed to send QR code"
msgstr ""
@@ -354,11 +410,20 @@ msgstr ""
msgid "Groups"
msgstr ""
+<<<<<<< HEAD
+#: admin/forms.py:81
+msgid ""
+"Raw passwords are not stored, so there is no way to see this user's "
+"password, \n"
+" but you can change the password using this "
+"form."
+=======
#: admin/forms.py:79
msgid ""
"Raw passwords are not stored, so there is no way to see\n"
" this user's password, but you can change the password using "
"this form."
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: admin/templates/admin/group_list.html:5 admin/views.py:87
@@ -505,6 +570,18 @@ msgstr ""
msgid "Create User"
msgstr ""
+<<<<<<< HEAD
+#: admin/views.py:129
+msgid "Update User"
+msgstr ""
+
+#: admin/views.py:141
+#, python-format
+msgid "Password changed for %(user)s"
+msgstr ""
+
+#: admin/views.py:144
+=======
#: admin/views.py:136
msgid "Update User"
msgstr ""
@@ -514,6 +591,7 @@ msgid "User password changed: {}"
msgstr ""
#: admin/views.py:152
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Wrong Data Provided"
msgstr ""
@@ -799,6 +877,20 @@ msgid "Other Settings"
msgstr ""
#: appsettings/views.py:38
+<<<<<<< HEAD
+#, python-format
+msgid "SASS directory path is changed. Now: %(dir)s"
+msgstr ""
+
+#: appsettings/views.py:67
+#, python-format
+msgid "Theme is changed. Now: %(theme)s"
+msgstr ""
+
+#: appsettings/views.py:82
+#, python-format
+msgid "%(setting)s is changed. Now: %(value)s"
+=======
#, python-brace-format
msgid "SASS directory path is changed. Now: {sass_dir.value}"
msgstr ""
@@ -811,6 +903,7 @@ msgstr ""
#: appsettings/views.py:80
#, python-brace-format
msgid "{setting.name} is changed. Now: {setting.value}"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: computes/forms.py:21
@@ -1698,7 +1791,11 @@ msgstr ""
#: instances/templates/instance_actions.html:25
#: instances/templates/instance_actions.html:37
#: instances/templates/instances/power_tab.html:25
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:82 instances/views.py:270
+=======
#: instances/templates/instances/power_tab.html:82 instances/views.py:264
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Suspend"
msgstr ""
@@ -1752,7 +1849,11 @@ msgstr ""
#: instances/templates/instances/destroy_instance_form.html:40
#: instances/templates/instances/destroy_tab.html:18
#: instances/templates/instances/destroy_tab.html:20
+<<<<<<< HEAD
+#: instances/templates/instances/destroy_tab.html:23 instances/views.py:312
+=======
#: instances/templates/instances/destroy_tab.html:23 instances/views.py:306
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Destroy"
msgstr ""
@@ -1770,20 +1871,32 @@ msgstr ""
#: instances/templates/instance_actions.html:35
#: instances/templates/instances/power_tab.html:47
#: instances/templates/instances/power_tab.html:121
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:123 instances/views.py:245
+=======
#: instances/templates/instances/power_tab.html:123 instances/views.py:239
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Power On"
msgstr ""
#: instances/templates/instance_actions.html:15
#: instances/templates/instances/power_tab.html:9
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:59 instances/views.py:261
+=======
#: instances/templates/instances/power_tab.html:59 instances/views.py:255
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Power Off"
msgstr ""
#: instances/templates/instance_actions.html:16
#: instances/templates/instance_actions.html:29
#: instances/templates/instances/power_tab.html:14
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:66 instances/views.py:254
+=======
#: instances/templates/instances/power_tab.html:66 instances/views.py:248
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Power Cycle"
msgstr ""
@@ -1795,7 +1908,11 @@ msgstr ""
#: instances/templates/instance_actions.html:22
#: instances/templates/instances/power_tab.html:34
#: instances/templates/instances/power_tab.html:93
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:108 instances/views.py:278
+=======
#: instances/templates/instances/power_tab.html:108 instances/views.py:272
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Resume"
msgstr ""
@@ -1803,7 +1920,11 @@ msgstr ""
#: instances/templates/instances/power_tab.html:19
#: instances/templates/instances/power_tab.html:39
#: instances/templates/instances/power_tab.html:74
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:100 instances/views.py:285
+=======
#: instances/templates/instances/power_tab.html:100 instances/views.py:279
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Force Off"
msgstr ""
@@ -2450,7 +2571,7 @@ msgstr ""
#: instances/templates/instances/snapshots_tab.html:22
msgid ""
"This may take more than an hour, depending on how much content is on your "
-"droplet and how large the disk is."
+"instance and how large the disk is."
msgstr ""
#: instances/templates/instances/snapshots_tab.html:27
@@ -2505,6 +2626,26 @@ msgstr ""
msgid "None available device name"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:242
+msgid "Templates cannot be started."
+msgstr ""
+
+#: instances/views.py:345
+#, python-format
+msgid "Instance is migrated to %(hostname)s"
+msgstr ""
+
+#: instances/views.py:368
+msgid "Reset root password"
+msgstr ""
+
+#: instances/views.py:374 instances/views.py:403
+msgid "Please shutdown down your instance and then try again"
+msgstr ""
+
+#: instances/views.py:395
+=======
#: instances/views.py:236
msgid "Templates cannot be started."
msgstr ""
@@ -2523,37 +2664,75 @@ msgid "Please shutdown down your instance and then try again"
msgstr ""
#: instances/views.py:389
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Installed new SSH public key %(keyname)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:422
+=======
#: instances/views.py:416
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"User %(quota_msg)s quota reached, cannot resize CPU of '%(instance_name)s'!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:431
+#, python-format
+msgid "CPU is resized: %(old)s to %(new)s"
+msgstr ""
+
+#: instances/views.py:459
+=======
#: instances/views.py:425
msgid "Resize CPU"
msgstr ""
#: instances/views.py:453
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"User %(quota_msg)s quota reached, cannot resize memory of "
"'%(instance_name)s'!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:466
+#, python-format
+msgid ""
+"Memory is resized: current/max: %(old_cur)s/%(old_max)s to %(new_cur)s/"
+"%(new_max)s"
+msgstr ""
+
+#: instances/views.py:500
+=======
#: instances/views.py:462
msgid "Resize Memory"
msgstr ""
#: instances/views.py:491
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"User %(quota_msg)s quota reached, cannot resize disks of '%(instance_name)s'!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:507
+#, python-format
+msgid "Disk is resized: %(dev)s"
+msgstr ""
+
+#: instances/views.py:546
+#, python-format
+msgid "Attach new disk: %(name)s (%(format)s)"
+msgstr ""
+
+#: instances/views.py:577
+=======
#: instances/views.py:498
msgid "Disk resize"
msgstr ""
@@ -2564,11 +2743,16 @@ msgid "Attach new disk %(name)s (%(format)s)"
msgstr ""
#: instances/views.py:568
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Attach Existing disk: %(target_dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:635
+=======
#: instances/views.py:624
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Volume changes are applied. But it will be activated after shutdown"
msgstr ""
@@ -2576,41 +2760,79 @@ msgstr ""
msgid "Volume is changed successfully."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:639
+=======
#: instances/views.py:627
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Edit disk: %(target_dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:661
+=======
#: instances/views.py:649
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Delete disk: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:677
+=======
#: instances/views.py:665
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Detach disk: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:690
+=======
#: instances/views.py:678
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Add CD-ROM: %(target)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:703
+=======
#: instances/views.py:691
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Detach CD-ROM: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:716
+=======
#: instances/views.py:704
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Mount media: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:729
+=======
#: instances/views.py:717
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Unmount media: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:742
+#, python-format
+msgid "Create snapshot: %(snap)s"
+msgstr ""
+
+#: instances/views.py:753
+#, python-format
+msgid "Delete snapshot: %(snap)s"
+=======
#: instances/views.py:730
#, python-format
msgid "New snapshot: %(name)s"
@@ -2619,26 +2841,62 @@ msgstr ""
#: instances/views.py:741
#, python-format
msgid "Delete snapshot: %(snap_name)s"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: instances/views.py:752
msgid "Successful revert snapshot: "
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:767
+msgid "Revert snapshot: %(snap)"
+msgstr ""
+
+#: instances/views.py:781
+=======
#: instances/views.py:755
msgid "Revert snapshot"
msgstr ""
#: instances/views.py:769
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "VCPU %(id)s is enabled=%(enabled)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:790
+=======
#: instances/views.py:780
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "VCPU Hot-plug is enabled=%(status)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:800
+msgid "Set autostart"
+msgstr ""
+
+#: instances/views.py:809
+msgid "Unset autostart"
+msgstr ""
+
+#: instances/views.py:818
+msgid "Enable boot menu"
+msgstr ""
+
+#: instances/views.py:827
+msgid "Disable boot menu"
+msgstr ""
+
+#: instances/views.py:842
+msgid "Set boot order"
+msgstr ""
+
+#: instances/views.py:847
+=======
#: instances/views.py:791
msgid "Set autostart"
msgstr ""
@@ -2660,6 +2918,7 @@ msgid "Set boot order"
msgstr ""
#: instances/views.py:836
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Boot menu changes applied. But it will be activated after shutdown"
msgstr ""
@@ -2667,6 +2926,19 @@ msgstr ""
msgid "Boot order changed successfully."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:861
+msgid "Change instance XML"
+msgstr ""
+
+#: instances/views.py:875
+#, python-format
+msgid "Set Guest Agent: %(status)s"
+msgstr ""
+
+#: instances/views.py:885
+msgid "Set Video Model: %(model)"
+=======
#: instances/views.py:849
msgid "Edit XML"
msgstr ""
@@ -2678,6 +2950,7 @@ msgstr ""
#: instances/views.py:873
msgid "Set Video Model"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: instances/views.py:882
@@ -2688,6 +2961,19 @@ msgstr ""
msgid "Network Device Config is changed. Please shutdown instance to activate."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:922
+#, python-format
+msgid "Add network: %(mac)s"
+msgstr ""
+
+#: instances/views.py:933
+#, python-format
+msgid "Delete Network: %(mac)s"
+msgstr ""
+
+#: instances/views.py:946
+=======
#: instances/views.py:903
msgid "Add network"
msgstr ""
@@ -2697,78 +2983,213 @@ msgid "Delete network"
msgstr ""
#: instances/views.py:933
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Set Link State: %(state)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:966 networks/views.py:231
+=======
#: instances/views.py:952
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "%(qos_dir)s QoS is set"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:971
+=======
#: instances/views.py:956
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"%(qos_dir)s QoS is set. Network XML is changed. Stop and "
"start network to activate new config."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:988 networks/views.py:246
+=======
#: instances/views.py:970
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "%(qos_dir)s QoS is deleted"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:993
+=======
#: instances/views.py:974
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"%(qos_dir)s QoS is deleted. Network XML is changed. Stop and "
"start network to activate new config."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1012
+msgid "Only one owner is allowed and the one already added"
+msgstr ""
+
+#: instances/views.py:1017
+=======
#: instances/views.py:990
msgid "Only one owner is allowed and the one already added"
msgstr ""
#: instances/views.py:995
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
-msgid "Added owner %(user)s"
+msgid "Add owner: %(user)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1028
+#, python-format
+msgid "Delete owner: %(userinstance_id)s "
+msgstr ""
+
+#: instances/views.py:1060
+=======
#: instances/views.py:1006
#, python-format
msgid "Deleted owner %(userinstance_id)s"
msgstr ""
#: instances/views.py:1038
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "User '%(quota_msg)s' quota reached, cannot create '%(clone_name)s'!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1066
+#, python-format
+msgid "Instance '%(clone_name)s' already exists!"
+msgstr ""
+
+#: instances/views.py:1069
+=======
#: instances/views.py:1044
msgid "Instance 'clone_name' already exists!"
msgstr ""
#: instances/views.py:1047
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Instance name '%(clone_name)s' contains invalid characters!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1072
+=======
#: instances/views.py:1050
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Instance MAC '%(clone_mac)s' invalid format!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1082
+#, python-format
+msgid "Create a clone of '%(instance_name)s'"
+msgstr ""
+
+#: instances/views.py:1121
+=======
#: instances/views.py:1060
#, python-format
msgid "Clone of '%(instance_name)s'"
msgstr ""
#: instances/views.py:1093
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid ""
"Error setting console password. You should check that your instance have an "
"graphic device."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1126
+msgid "Set VNC password"
+msgstr ""
+
+#: instances/views.py:1135
+msgid "Set VNC keymap"
+msgstr ""
+
+#: instances/views.py:1140
+msgid "Set VNC type"
+msgstr ""
+
+#: instances/views.py:1145
+msgid "Set VNC listen address"
+msgstr ""
+
+#: instances/views.py:1168
+msgid "Edit options"
+msgstr ""
+
+#: instances/views.py:1182
+msgid "Send console.vv file"
+msgstr ""
+
+#: instances/views.py:1243 instances/views.py:1337
+msgid "A virtual machine with this name already exists"
+msgstr ""
+
+#: instances/views.py:1320
+msgid "You haven't defined any storage pools"
+msgstr ""
+
+#: instances/views.py:1322
+msgid "You haven't defined any network pools"
+msgstr ""
+
+#: instances/views.py:1339
+msgid "There is an instance with same name. Remove it and try again!"
+msgstr ""
+
+#: instances/views.py:1343
+msgid "No Virtual Machine MAC has been entered"
+msgstr ""
+
+#: instances/views.py:1374
+msgid "Image has already exist. Please check volumes or change instance name"
+msgstr ""
+
+#: instances/views.py:1401
+msgid "First you need to create or select an image"
+msgstr ""
+
+#: instances/views.py:1419
+msgid "Invalid cache mode"
+msgstr ""
+
+#: instances/views.py:1460
+msgid "Instance is created"
+msgstr ""
+
+#: instances/views.py:1481
+msgid "Flavor Created"
+msgstr ""
+
+#: instances/views.py:1487
+msgid "Create Flavor"
+msgstr ""
+
+#: instances/views.py:1497
+msgid "Flavor Updated"
+msgstr ""
+
+#: instances/views.py:1503
+msgid "Update Flavor"
+msgstr ""
+
+#: instances/views.py:1512
+=======
#: instances/views.py:1096
msgid "Set VNC password"
msgstr ""
@@ -2846,46 +3267,47 @@ msgid "Update Flavor"
msgstr ""
#: instances/views.py:1460
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Flavor Deleted"
msgstr ""
-#: interfaces/forms.py:25
+#: interfaces/forms.py:26
msgid "The IPv4 address must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:27
+#: interfaces/forms.py:28
msgid "The IPv4 address must not exceed 20 characters"
msgstr ""
-#: interfaces/forms.py:34
+#: interfaces/forms.py:35
msgid "The IPv4 gateway must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:36
+#: interfaces/forms.py:37
msgid "The IPv4 gateway must not exceed 20 characters"
msgstr ""
-#: interfaces/forms.py:43
+#: interfaces/forms.py:44
msgid "The IPv6 address must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:45
+#: interfaces/forms.py:46
msgid "The IPv6 address must not exceed 100 characters"
msgstr ""
-#: interfaces/forms.py:52
+#: interfaces/forms.py:53
msgid "The IPv6 gateway must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:54
+#: interfaces/forms.py:55
msgid "The IPv6 gateway must not exceed 100 characters"
msgstr ""
-#: interfaces/forms.py:61 interfaces/forms.py:70
+#: interfaces/forms.py:62 interfaces/forms.py:71
msgid "The interface must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:63 interfaces/forms.py:72
+#: interfaces/forms.py:64 interfaces/forms.py:73
msgid "The interface must not exceed 10 characters"
msgstr ""
@@ -3019,63 +3441,63 @@ msgstr ""
msgid "Hypervisor doesn't have any Interfaces"
msgstr ""
-#: logs/models.py:6
+#: logs/models.py:5
msgid "user"
msgstr ""
-#: logs/models.py:7
+#: logs/models.py:6
msgid "instance"
msgstr ""
-#: logs/models.py:8
+#: logs/models.py:7
msgid "message"
msgstr ""
-#: logs/models.py:9
+#: logs/models.py:8
msgid "date"
msgstr ""
-#: networks/forms.py:7 storages/forms.py:7
+#: networks/forms.py:8 storages/forms.py:8
msgid "No pool name has been entered"
msgstr ""
-#: networks/forms.py:9
+#: networks/forms.py:10
msgid "No IPv4 subnet has been entered"
msgstr ""
-#: networks/forms.py:11
+#: networks/forms.py:15
msgid "No IPv6 subnet has been entered"
msgstr ""
-#: networks/forms.py:24 storages/forms.py:22
+#: networks/forms.py:30 storages/forms.py:23
msgid "The pool name must not contain any special characters"
msgstr ""
-#: networks/forms.py:26 storages/forms.py:24
+#: networks/forms.py:32 storages/forms.py:25
msgid "The pool name must not exceed 20 characters"
msgstr ""
-#: networks/forms.py:33
+#: networks/forms.py:39
msgid "The IPv4 subnet must not contain any special characters"
msgstr ""
-#: networks/forms.py:35
+#: networks/forms.py:41
msgid "The IPv4 subnet must not exceed 20 characters"
msgstr ""
-#: networks/forms.py:42
+#: networks/forms.py:48
msgid "The IPv6 subnet must not contain any special characters"
msgstr ""
-#: networks/forms.py:44
+#: networks/forms.py:50
msgid "The IPv6 subnet must not exceed 42 characters"
msgstr ""
-#: networks/forms.py:52
+#: networks/forms.py:58
msgid "The pool bridge name must not contain any special characters"
msgstr ""
-#: networks/forms.py:54
+#: networks/forms.py:60
msgid "The pool bridge name must not exceed 20 characters"
msgstr ""
@@ -3271,6 +3693,32 @@ msgstr ""
msgid "Please enter bridge/dev name"
msgstr ""
+<<<<<<< HEAD
+#: networks/views.py:57
+msgid "For libvirt, the IPv6 network prefix must be /64"
+msgstr ""
+
+#: networks/views.py:130
+msgid "Unknown Network Family"
+msgstr ""
+
+#: networks/views.py:180
+#, python-format
+msgid "Fixed address operation completed for %(family)s"
+msgstr ""
+
+#: networks/views.py:190
+#, python-format
+msgid "%(family)s Fixed Address is Deleted."
+msgstr ""
+
+#: networks/views.py:198
+#, python-format
+msgid "%(family)s DHCP Range is Changed."
+msgstr ""
+
+#: networks/views.py:210
+=======
#: networks/views.py:56
msgid "For libvirt, the IPv6 network prefix must be /64"
msgstr ""
@@ -3292,10 +3740,29 @@ msgid "{family.upper()} DHCP Range is Changed."
msgstr ""
#: networks/views.py:203
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid ""
"Network XML is changed. \\Stop and start network to activate new config."
msgstr ""
+<<<<<<< HEAD
+#: networks/views.py:215
+msgid "Network XML is changed."
+msgstr ""
+
+#: networks/views.py:228
+#, python-format
+msgid ""
+"%(qos_dir)s QoS is updated. Network XML is changed. Stop and start network "
+"to activate new config"
+msgstr ""
+
+#: networks/views.py:242
+#, python-format
+msgid ""
+"%(qos_dir)s QoS is deleted. Network XML is changed. "
+"Stop and start network to activate new config"
+=======
#: networks/views.py:205
msgid "Network XML is changed."
msgstr ""
@@ -3310,6 +3777,7 @@ msgstr ""
#: networks/views.py:221
msgid "{} QoS is set"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: networks/views.py:232
@@ -3385,6 +3853,17 @@ msgstr ""
msgid "Hypervisor doesn't have any NWFilters"
msgstr ""
+<<<<<<< HEAD
+#: nwfilters/views.py:44
+msgid "A network filter with this name already exists"
+msgstr ""
+
+#: nwfilters/views.py:47
+msgid "A network filter with this UUID already exists"
+msgstr ""
+
+#: nwfilters/views.py:51
+=======
#: nwfilters/views.py:41
msgid "A network filter with this name already exists"
msgstr ""
@@ -3394,10 +3873,26 @@ msgid "A network filter with this UUID already exists"
msgstr ""
#: nwfilters/views.py:48
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
-msgid "Creating NWFilter: %s"
+msgid "%(filter)s network filter is created"
msgstr ""
+<<<<<<< HEAD
+#: nwfilters/views.py:60
+#, python-format
+msgid "%(filter)s network filter is deleted"
+msgstr ""
+
+#: nwfilters/views.py:76
+#, python-format
+msgid "NWFilter is in use by %(instance)s. Cannot be deleted."
+msgstr ""
+
+#: nwfilters/views.py:93
+#, python-format
+msgid "Cloning NWFilter %(name)s as %(clone)s"
+=======
#: nwfilters/views.py:57
#, python-brace-format
msgid "Deleting NWFilter: {name}"
@@ -3411,6 +3906,7 @@ msgstr ""
#: nwfilters/views.py:86
#, python-brace-format
msgid "Cloning NWFilter {name} as {cln_name}"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: secrets/templates/create_secret_block.html:12
@@ -3461,27 +3957,27 @@ msgstr ""
msgid "Value"
msgstr ""
-#: storages/forms.py:9 storages/forms.py:36
+#: storages/forms.py:10 storages/forms.py:37
msgid "No path has been entered"
msgstr ""
-#: storages/forms.py:33
+#: storages/forms.py:34
msgid "The target must not contain any special characters"
msgstr ""
-#: storages/forms.py:45
+#: storages/forms.py:46
msgid "No device or path has been entered"
msgstr ""
-#: storages/forms.py:47
+#: storages/forms.py:48
msgid "The disk source must not contain any special characters"
msgstr ""
-#: storages/forms.py:61 storages/forms.py:76
+#: storages/forms.py:62 storages/forms.py:77
msgid "The image name must not contain any special characters"
msgstr ""
-#: storages/forms.py:78
+#: storages/forms.py:79
msgid "The image name must not exceed 120 characters"
msgstr ""
@@ -3614,7 +4110,7 @@ msgstr ""
msgid "Hypervisor doesn't have any Storages"
msgstr ""
-#: storages/views.py:40
+#: storages/views.py:39
msgid "Pool name already use"
msgstr ""
@@ -3622,6 +4118,38 @@ msgstr ""
msgid "You need create secret for pool"
msgstr ""
+<<<<<<< HEAD
+#: storages/views.py:48
+msgid "You need input all fields for creating ceph pool"
+msgstr ""
+
+#: storages/views.py:144
+#, python-format
+msgid "Volume: %(volume)s is deleted."
+msgstr ""
+
+#: storages/views.py:149
+msgid "ISO image already exist"
+msgstr ""
+
+#: storages/views.py:153
+#, python-format
+msgid "ISO: %(file)s is uploaded."
+msgstr ""
+
+#: storages/views.py:162
+msgid "Name of volume already in use"
+msgstr ""
+
+#: storages/views.py:174
+#, python-format
+msgid "%(image)s image cloned as %(clone)s successfully"
+msgstr ""
+
+#: storages/views.py:220
+#, python-format
+msgid "Image file %(name)s is created successfully"
+=======
#: storages/views.py:49
msgid "You need input all fields for creating ceph pool"
msgstr ""
@@ -3650,6 +4178,7 @@ msgstr ""
#: storages/views.py:199
#, python-brace-format
msgid "Image file {name} is created successfully"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: templates/403.html:3
diff --git a/locale/nl/LC_MESSAGES/django.po b/locale/nl/LC_MESSAGES/django.po
index d393cd9..60c21a0 100644
--- a/locale/nl/LC_MESSAGES/django.po
+++ b/locale/nl/LC_MESSAGES/django.po
@@ -8,7 +8,11 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
+<<<<<<< HEAD
+"POT-Creation-Date: 2020-11-05 09:36+0000\n"
+=======
"POT-Creation-Date: 2020-10-23 07:53+0000\n"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -293,6 +297,57 @@ msgstr ""
#: accounts/utils.py:51
msgid "Please view HTML version of this message."
+<<<<<<< HEAD
+msgstr ""
+
+#: accounts/views.py:26
+msgid "Profile updated"
+msgstr ""
+
+#: accounts/views.py:44
+msgid "SSH key added"
+msgstr ""
+
+#: accounts/views.py:52
+msgid "Add SSH key"
+msgstr ""
+
+#: accounts/views.py:61
+msgid "SSH key deleted"
+msgstr ""
+
+#: accounts/views.py:69
+msgid "Delete SSH key"
+msgstr ""
+
+#: accounts/views.py:101
+msgid "Password Changed"
+msgstr ""
+
+#: accounts/views.py:121
+msgid "Create User Instance"
+msgstr ""
+
+#: accounts/views.py:139
+msgid "Update User Instance"
+msgstr ""
+
+#: accounts/views.py:175
+#, python-format
+msgid "OTP Sent to %(email)s"
+msgstr ""
+
+#: accounts/views.py:183
+msgid "Email OTP"
+msgstr ""
+
+#: accounts/views.py:194
+#, python-format
+msgid "OTP QR code was emailed to user %(user)s"
+msgstr ""
+
+#: accounts/views.py:196
+=======
msgstr ""
#: accounts/views.py:26
@@ -342,6 +397,7 @@ msgid "OTP QR code was emailed to user %s"
msgstr ""
#: accounts/views.py:177
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "User email not set, failed to send QR code"
msgstr ""
@@ -354,11 +410,20 @@ msgstr ""
msgid "Groups"
msgstr ""
+<<<<<<< HEAD
+#: admin/forms.py:81
+msgid ""
+"Raw passwords are not stored, so there is no way to see this user's "
+"password, \n"
+" but you can change the password using this "
+"form."
+=======
#: admin/forms.py:79
msgid ""
"Raw passwords are not stored, so there is no way to see\n"
" this user's password, but you can change the password using "
"this form."
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: admin/templates/admin/group_list.html:5 admin/views.py:87
@@ -505,6 +570,18 @@ msgstr ""
msgid "Create User"
msgstr ""
+<<<<<<< HEAD
+#: admin/views.py:129
+msgid "Update User"
+msgstr ""
+
+#: admin/views.py:141
+#, python-format
+msgid "Password changed for %(user)s"
+msgstr ""
+
+#: admin/views.py:144
+=======
#: admin/views.py:136
msgid "Update User"
msgstr ""
@@ -514,6 +591,7 @@ msgid "User password changed: {}"
msgstr ""
#: admin/views.py:152
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Wrong Data Provided"
msgstr ""
@@ -799,6 +877,20 @@ msgid "Other Settings"
msgstr ""
#: appsettings/views.py:38
+<<<<<<< HEAD
+#, python-format
+msgid "SASS directory path is changed. Now: %(dir)s"
+msgstr ""
+
+#: appsettings/views.py:67
+#, python-format
+msgid "Theme is changed. Now: %(theme)s"
+msgstr ""
+
+#: appsettings/views.py:82
+#, python-format
+msgid "%(setting)s is changed. Now: %(value)s"
+=======
#, python-brace-format
msgid "SASS directory path is changed. Now: {sass_dir.value}"
msgstr ""
@@ -811,6 +903,7 @@ msgstr ""
#: appsettings/views.py:80
#, python-brace-format
msgid "{setting.name} is changed. Now: {setting.value}"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: computes/forms.py:21
@@ -1698,7 +1791,11 @@ msgstr ""
#: instances/templates/instance_actions.html:25
#: instances/templates/instance_actions.html:37
#: instances/templates/instances/power_tab.html:25
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:82 instances/views.py:270
+=======
#: instances/templates/instances/power_tab.html:82 instances/views.py:264
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Suspend"
msgstr ""
@@ -1752,7 +1849,11 @@ msgstr ""
#: instances/templates/instances/destroy_instance_form.html:40
#: instances/templates/instances/destroy_tab.html:18
#: instances/templates/instances/destroy_tab.html:20
+<<<<<<< HEAD
+#: instances/templates/instances/destroy_tab.html:23 instances/views.py:312
+=======
#: instances/templates/instances/destroy_tab.html:23 instances/views.py:306
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Destroy"
msgstr ""
@@ -1770,20 +1871,32 @@ msgstr ""
#: instances/templates/instance_actions.html:35
#: instances/templates/instances/power_tab.html:47
#: instances/templates/instances/power_tab.html:121
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:123 instances/views.py:245
+=======
#: instances/templates/instances/power_tab.html:123 instances/views.py:239
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Power On"
msgstr ""
#: instances/templates/instance_actions.html:15
#: instances/templates/instances/power_tab.html:9
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:59 instances/views.py:261
+=======
#: instances/templates/instances/power_tab.html:59 instances/views.py:255
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Power Off"
msgstr ""
#: instances/templates/instance_actions.html:16
#: instances/templates/instance_actions.html:29
#: instances/templates/instances/power_tab.html:14
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:66 instances/views.py:254
+=======
#: instances/templates/instances/power_tab.html:66 instances/views.py:248
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Power Cycle"
msgstr ""
@@ -1795,7 +1908,11 @@ msgstr ""
#: instances/templates/instance_actions.html:22
#: instances/templates/instances/power_tab.html:34
#: instances/templates/instances/power_tab.html:93
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:108 instances/views.py:278
+=======
#: instances/templates/instances/power_tab.html:108 instances/views.py:272
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Resume"
msgstr ""
@@ -1803,7 +1920,11 @@ msgstr ""
#: instances/templates/instances/power_tab.html:19
#: instances/templates/instances/power_tab.html:39
#: instances/templates/instances/power_tab.html:74
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:100 instances/views.py:285
+=======
#: instances/templates/instances/power_tab.html:100 instances/views.py:279
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Force Off"
msgstr ""
@@ -2450,7 +2571,7 @@ msgstr ""
#: instances/templates/instances/snapshots_tab.html:22
msgid ""
"This may take more than an hour, depending on how much content is on your "
-"droplet and how large the disk is."
+"instance and how large the disk is."
msgstr ""
#: instances/templates/instances/snapshots_tab.html:27
@@ -2505,6 +2626,26 @@ msgstr ""
msgid "None available device name"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:242
+msgid "Templates cannot be started."
+msgstr ""
+
+#: instances/views.py:345
+#, python-format
+msgid "Instance is migrated to %(hostname)s"
+msgstr ""
+
+#: instances/views.py:368
+msgid "Reset root password"
+msgstr ""
+
+#: instances/views.py:374 instances/views.py:403
+msgid "Please shutdown down your instance and then try again"
+msgstr ""
+
+#: instances/views.py:395
+=======
#: instances/views.py:236
msgid "Templates cannot be started."
msgstr ""
@@ -2523,37 +2664,75 @@ msgid "Please shutdown down your instance and then try again"
msgstr ""
#: instances/views.py:389
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Installed new SSH public key %(keyname)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:422
+=======
#: instances/views.py:416
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"User %(quota_msg)s quota reached, cannot resize CPU of '%(instance_name)s'!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:431
+#, python-format
+msgid "CPU is resized: %(old)s to %(new)s"
+msgstr ""
+
+#: instances/views.py:459
+=======
#: instances/views.py:425
msgid "Resize CPU"
msgstr ""
#: instances/views.py:453
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"User %(quota_msg)s quota reached, cannot resize memory of "
"'%(instance_name)s'!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:466
+#, python-format
+msgid ""
+"Memory is resized: current/max: %(old_cur)s/%(old_max)s to %(new_cur)s/"
+"%(new_max)s"
+msgstr ""
+
+#: instances/views.py:500
+=======
#: instances/views.py:462
msgid "Resize Memory"
msgstr ""
#: instances/views.py:491
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"User %(quota_msg)s quota reached, cannot resize disks of '%(instance_name)s'!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:507
+#, python-format
+msgid "Disk is resized: %(dev)s"
+msgstr ""
+
+#: instances/views.py:546
+#, python-format
+msgid "Attach new disk: %(name)s (%(format)s)"
+msgstr ""
+
+#: instances/views.py:577
+=======
#: instances/views.py:498
msgid "Disk resize"
msgstr ""
@@ -2564,11 +2743,16 @@ msgid "Attach new disk %(name)s (%(format)s)"
msgstr ""
#: instances/views.py:568
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Attach Existing disk: %(target_dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:635
+=======
#: instances/views.py:624
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Volume changes are applied. But it will be activated after shutdown"
msgstr ""
@@ -2576,41 +2760,79 @@ msgstr ""
msgid "Volume is changed successfully."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:639
+=======
#: instances/views.py:627
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Edit disk: %(target_dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:661
+=======
#: instances/views.py:649
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Delete disk: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:677
+=======
#: instances/views.py:665
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Detach disk: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:690
+=======
#: instances/views.py:678
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Add CD-ROM: %(target)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:703
+=======
#: instances/views.py:691
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Detach CD-ROM: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:716
+=======
#: instances/views.py:704
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Mount media: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:729
+=======
#: instances/views.py:717
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Unmount media: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:742
+#, python-format
+msgid "Create snapshot: %(snap)s"
+msgstr ""
+
+#: instances/views.py:753
+#, python-format
+msgid "Delete snapshot: %(snap)s"
+=======
#: instances/views.py:730
#, python-format
msgid "New snapshot: %(name)s"
@@ -2619,26 +2841,62 @@ msgstr ""
#: instances/views.py:741
#, python-format
msgid "Delete snapshot: %(snap_name)s"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: instances/views.py:752
msgid "Successful revert snapshot: "
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:767
+msgid "Revert snapshot: %(snap)"
+msgstr ""
+
+#: instances/views.py:781
+=======
#: instances/views.py:755
msgid "Revert snapshot"
msgstr ""
#: instances/views.py:769
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "VCPU %(id)s is enabled=%(enabled)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:790
+=======
#: instances/views.py:780
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "VCPU Hot-plug is enabled=%(status)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:800
+msgid "Set autostart"
+msgstr ""
+
+#: instances/views.py:809
+msgid "Unset autostart"
+msgstr ""
+
+#: instances/views.py:818
+msgid "Enable boot menu"
+msgstr ""
+
+#: instances/views.py:827
+msgid "Disable boot menu"
+msgstr ""
+
+#: instances/views.py:842
+msgid "Set boot order"
+msgstr ""
+
+#: instances/views.py:847
+=======
#: instances/views.py:791
msgid "Set autostart"
msgstr ""
@@ -2660,6 +2918,7 @@ msgid "Set boot order"
msgstr ""
#: instances/views.py:836
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Boot menu changes applied. But it will be activated after shutdown"
msgstr ""
@@ -2667,6 +2926,19 @@ msgstr ""
msgid "Boot order changed successfully."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:861
+msgid "Change instance XML"
+msgstr ""
+
+#: instances/views.py:875
+#, python-format
+msgid "Set Guest Agent: %(status)s"
+msgstr ""
+
+#: instances/views.py:885
+msgid "Set Video Model: %(model)"
+=======
#: instances/views.py:849
msgid "Edit XML"
msgstr ""
@@ -2678,6 +2950,7 @@ msgstr ""
#: instances/views.py:873
msgid "Set Video Model"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: instances/views.py:882
@@ -2688,6 +2961,19 @@ msgstr ""
msgid "Network Device Config is changed. Please shutdown instance to activate."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:922
+#, python-format
+msgid "Add network: %(mac)s"
+msgstr ""
+
+#: instances/views.py:933
+#, python-format
+msgid "Delete Network: %(mac)s"
+msgstr ""
+
+#: instances/views.py:946
+=======
#: instances/views.py:903
msgid "Add network"
msgstr ""
@@ -2697,78 +2983,213 @@ msgid "Delete network"
msgstr ""
#: instances/views.py:933
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Set Link State: %(state)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:966 networks/views.py:231
+=======
#: instances/views.py:952
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "%(qos_dir)s QoS is set"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:971
+=======
#: instances/views.py:956
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"%(qos_dir)s QoS is set. Network XML is changed. Stop and "
"start network to activate new config."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:988 networks/views.py:246
+=======
#: instances/views.py:970
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "%(qos_dir)s QoS is deleted"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:993
+=======
#: instances/views.py:974
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"%(qos_dir)s QoS is deleted. Network XML is changed. Stop and "
"start network to activate new config."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1012
+msgid "Only one owner is allowed and the one already added"
+msgstr ""
+
+#: instances/views.py:1017
+=======
#: instances/views.py:990
msgid "Only one owner is allowed and the one already added"
msgstr ""
#: instances/views.py:995
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
-msgid "Added owner %(user)s"
+msgid "Add owner: %(user)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1028
+#, python-format
+msgid "Delete owner: %(userinstance_id)s "
+msgstr ""
+
+#: instances/views.py:1060
+=======
#: instances/views.py:1006
#, python-format
msgid "Deleted owner %(userinstance_id)s"
msgstr ""
#: instances/views.py:1038
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "User '%(quota_msg)s' quota reached, cannot create '%(clone_name)s'!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1066
+#, python-format
+msgid "Instance '%(clone_name)s' already exists!"
+msgstr ""
+
+#: instances/views.py:1069
+=======
#: instances/views.py:1044
msgid "Instance 'clone_name' already exists!"
msgstr ""
#: instances/views.py:1047
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Instance name '%(clone_name)s' contains invalid characters!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1072
+=======
#: instances/views.py:1050
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Instance MAC '%(clone_mac)s' invalid format!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1082
+#, python-format
+msgid "Create a clone of '%(instance_name)s'"
+msgstr ""
+
+#: instances/views.py:1121
+=======
#: instances/views.py:1060
#, python-format
msgid "Clone of '%(instance_name)s'"
msgstr ""
#: instances/views.py:1093
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid ""
"Error setting console password. You should check that your instance have an "
"graphic device."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1126
+msgid "Set VNC password"
+msgstr ""
+
+#: instances/views.py:1135
+msgid "Set VNC keymap"
+msgstr ""
+
+#: instances/views.py:1140
+msgid "Set VNC type"
+msgstr ""
+
+#: instances/views.py:1145
+msgid "Set VNC listen address"
+msgstr ""
+
+#: instances/views.py:1168
+msgid "Edit options"
+msgstr ""
+
+#: instances/views.py:1182
+msgid "Send console.vv file"
+msgstr ""
+
+#: instances/views.py:1243 instances/views.py:1337
+msgid "A virtual machine with this name already exists"
+msgstr ""
+
+#: instances/views.py:1320
+msgid "You haven't defined any storage pools"
+msgstr ""
+
+#: instances/views.py:1322
+msgid "You haven't defined any network pools"
+msgstr ""
+
+#: instances/views.py:1339
+msgid "There is an instance with same name. Remove it and try again!"
+msgstr ""
+
+#: instances/views.py:1343
+msgid "No Virtual Machine MAC has been entered"
+msgstr ""
+
+#: instances/views.py:1374
+msgid "Image has already exist. Please check volumes or change instance name"
+msgstr ""
+
+#: instances/views.py:1401
+msgid "First you need to create or select an image"
+msgstr ""
+
+#: instances/views.py:1419
+msgid "Invalid cache mode"
+msgstr ""
+
+#: instances/views.py:1460
+msgid "Instance is created"
+msgstr ""
+
+#: instances/views.py:1481
+msgid "Flavor Created"
+msgstr ""
+
+#: instances/views.py:1487
+msgid "Create Flavor"
+msgstr ""
+
+#: instances/views.py:1497
+msgid "Flavor Updated"
+msgstr ""
+
+#: instances/views.py:1503
+msgid "Update Flavor"
+msgstr ""
+
+#: instances/views.py:1512
+=======
#: instances/views.py:1096
msgid "Set VNC password"
msgstr ""
@@ -2846,46 +3267,47 @@ msgid "Update Flavor"
msgstr ""
#: instances/views.py:1460
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Flavor Deleted"
msgstr ""
-#: interfaces/forms.py:25
+#: interfaces/forms.py:26
msgid "The IPv4 address must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:27
+#: interfaces/forms.py:28
msgid "The IPv4 address must not exceed 20 characters"
msgstr ""
-#: interfaces/forms.py:34
+#: interfaces/forms.py:35
msgid "The IPv4 gateway must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:36
+#: interfaces/forms.py:37
msgid "The IPv4 gateway must not exceed 20 characters"
msgstr ""
-#: interfaces/forms.py:43
+#: interfaces/forms.py:44
msgid "The IPv6 address must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:45
+#: interfaces/forms.py:46
msgid "The IPv6 address must not exceed 100 characters"
msgstr ""
-#: interfaces/forms.py:52
+#: interfaces/forms.py:53
msgid "The IPv6 gateway must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:54
+#: interfaces/forms.py:55
msgid "The IPv6 gateway must not exceed 100 characters"
msgstr ""
-#: interfaces/forms.py:61 interfaces/forms.py:70
+#: interfaces/forms.py:62 interfaces/forms.py:71
msgid "The interface must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:63 interfaces/forms.py:72
+#: interfaces/forms.py:64 interfaces/forms.py:73
msgid "The interface must not exceed 10 characters"
msgstr ""
@@ -3019,63 +3441,63 @@ msgstr ""
msgid "Hypervisor doesn't have any Interfaces"
msgstr ""
-#: logs/models.py:6
+#: logs/models.py:5
msgid "user"
msgstr ""
-#: logs/models.py:7
+#: logs/models.py:6
msgid "instance"
msgstr ""
-#: logs/models.py:8
+#: logs/models.py:7
msgid "message"
msgstr ""
-#: logs/models.py:9
+#: logs/models.py:8
msgid "date"
msgstr ""
-#: networks/forms.py:7 storages/forms.py:7
+#: networks/forms.py:8 storages/forms.py:8
msgid "No pool name has been entered"
msgstr ""
-#: networks/forms.py:9
+#: networks/forms.py:10
msgid "No IPv4 subnet has been entered"
msgstr ""
-#: networks/forms.py:11
+#: networks/forms.py:15
msgid "No IPv6 subnet has been entered"
msgstr ""
-#: networks/forms.py:24 storages/forms.py:22
+#: networks/forms.py:30 storages/forms.py:23
msgid "The pool name must not contain any special characters"
msgstr ""
-#: networks/forms.py:26 storages/forms.py:24
+#: networks/forms.py:32 storages/forms.py:25
msgid "The pool name must not exceed 20 characters"
msgstr ""
-#: networks/forms.py:33
+#: networks/forms.py:39
msgid "The IPv4 subnet must not contain any special characters"
msgstr ""
-#: networks/forms.py:35
+#: networks/forms.py:41
msgid "The IPv4 subnet must not exceed 20 characters"
msgstr ""
-#: networks/forms.py:42
+#: networks/forms.py:48
msgid "The IPv6 subnet must not contain any special characters"
msgstr ""
-#: networks/forms.py:44
+#: networks/forms.py:50
msgid "The IPv6 subnet must not exceed 42 characters"
msgstr ""
-#: networks/forms.py:52
+#: networks/forms.py:58
msgid "The pool bridge name must not contain any special characters"
msgstr ""
-#: networks/forms.py:54
+#: networks/forms.py:60
msgid "The pool bridge name must not exceed 20 characters"
msgstr ""
@@ -3271,6 +3693,32 @@ msgstr ""
msgid "Please enter bridge/dev name"
msgstr ""
+<<<<<<< HEAD
+#: networks/views.py:57
+msgid "For libvirt, the IPv6 network prefix must be /64"
+msgstr ""
+
+#: networks/views.py:130
+msgid "Unknown Network Family"
+msgstr ""
+
+#: networks/views.py:180
+#, python-format
+msgid "Fixed address operation completed for %(family)s"
+msgstr ""
+
+#: networks/views.py:190
+#, python-format
+msgid "%(family)s Fixed Address is Deleted."
+msgstr ""
+
+#: networks/views.py:198
+#, python-format
+msgid "%(family)s DHCP Range is Changed."
+msgstr ""
+
+#: networks/views.py:210
+=======
#: networks/views.py:56
msgid "For libvirt, the IPv6 network prefix must be /64"
msgstr ""
@@ -3292,10 +3740,29 @@ msgid "{family.upper()} DHCP Range is Changed."
msgstr ""
#: networks/views.py:203
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid ""
"Network XML is changed. \\Stop and start network to activate new config."
msgstr ""
+<<<<<<< HEAD
+#: networks/views.py:215
+msgid "Network XML is changed."
+msgstr ""
+
+#: networks/views.py:228
+#, python-format
+msgid ""
+"%(qos_dir)s QoS is updated. Network XML is changed. Stop and start network "
+"to activate new config"
+msgstr ""
+
+#: networks/views.py:242
+#, python-format
+msgid ""
+"%(qos_dir)s QoS is deleted. Network XML is changed. "
+"Stop and start network to activate new config"
+=======
#: networks/views.py:205
msgid "Network XML is changed."
msgstr ""
@@ -3310,6 +3777,7 @@ msgstr ""
#: networks/views.py:221
msgid "{} QoS is set"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: networks/views.py:232
@@ -3385,6 +3853,17 @@ msgstr ""
msgid "Hypervisor doesn't have any NWFilters"
msgstr ""
+<<<<<<< HEAD
+#: nwfilters/views.py:44
+msgid "A network filter with this name already exists"
+msgstr ""
+
+#: nwfilters/views.py:47
+msgid "A network filter with this UUID already exists"
+msgstr ""
+
+#: nwfilters/views.py:51
+=======
#: nwfilters/views.py:41
msgid "A network filter with this name already exists"
msgstr ""
@@ -3394,10 +3873,26 @@ msgid "A network filter with this UUID already exists"
msgstr ""
#: nwfilters/views.py:48
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
-msgid "Creating NWFilter: %s"
+msgid "%(filter)s network filter is created"
msgstr ""
+<<<<<<< HEAD
+#: nwfilters/views.py:60
+#, python-format
+msgid "%(filter)s network filter is deleted"
+msgstr ""
+
+#: nwfilters/views.py:76
+#, python-format
+msgid "NWFilter is in use by %(instance)s. Cannot be deleted."
+msgstr ""
+
+#: nwfilters/views.py:93
+#, python-format
+msgid "Cloning NWFilter %(name)s as %(clone)s"
+=======
#: nwfilters/views.py:57
#, python-brace-format
msgid "Deleting NWFilter: {name}"
@@ -3411,6 +3906,7 @@ msgstr ""
#: nwfilters/views.py:86
#, python-brace-format
msgid "Cloning NWFilter {name} as {cln_name}"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: secrets/templates/create_secret_block.html:12
@@ -3461,27 +3957,27 @@ msgstr ""
msgid "Value"
msgstr ""
-#: storages/forms.py:9 storages/forms.py:36
+#: storages/forms.py:10 storages/forms.py:37
msgid "No path has been entered"
msgstr ""
-#: storages/forms.py:33
+#: storages/forms.py:34
msgid "The target must not contain any special characters"
msgstr ""
-#: storages/forms.py:45
+#: storages/forms.py:46
msgid "No device or path has been entered"
msgstr ""
-#: storages/forms.py:47
+#: storages/forms.py:48
msgid "The disk source must not contain any special characters"
msgstr ""
-#: storages/forms.py:61 storages/forms.py:76
+#: storages/forms.py:62 storages/forms.py:77
msgid "The image name must not contain any special characters"
msgstr ""
-#: storages/forms.py:78
+#: storages/forms.py:79
msgid "The image name must not exceed 120 characters"
msgstr ""
@@ -3614,7 +4110,7 @@ msgstr ""
msgid "Hypervisor doesn't have any Storages"
msgstr ""
-#: storages/views.py:40
+#: storages/views.py:39
msgid "Pool name already use"
msgstr ""
@@ -3622,6 +4118,38 @@ msgstr ""
msgid "You need create secret for pool"
msgstr ""
+<<<<<<< HEAD
+#: storages/views.py:48
+msgid "You need input all fields for creating ceph pool"
+msgstr ""
+
+#: storages/views.py:144
+#, python-format
+msgid "Volume: %(volume)s is deleted."
+msgstr ""
+
+#: storages/views.py:149
+msgid "ISO image already exist"
+msgstr ""
+
+#: storages/views.py:153
+#, python-format
+msgid "ISO: %(file)s is uploaded."
+msgstr ""
+
+#: storages/views.py:162
+msgid "Name of volume already in use"
+msgstr ""
+
+#: storages/views.py:174
+#, python-format
+msgid "%(image)s image cloned as %(clone)s successfully"
+msgstr ""
+
+#: storages/views.py:220
+#, python-format
+msgid "Image file %(name)s is created successfully"
+=======
#: storages/views.py:49
msgid "You need input all fields for creating ceph pool"
msgstr ""
@@ -3650,6 +4178,7 @@ msgstr ""
#: storages/views.py:199
#, python-brace-format
msgid "Image file {name} is created successfully"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: templates/403.html:3
diff --git a/locale/ru/LC_MESSAGES/django.po b/locale/ru/LC_MESSAGES/django.po
index 59dc57b..65b869b 100644
--- a/locale/ru/LC_MESSAGES/django.po
+++ b/locale/ru/LC_MESSAGES/django.po
@@ -8,7 +8,11 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
+<<<<<<< HEAD
+"POT-Creation-Date: 2020-11-05 09:36+0000\n"
+=======
"POT-Creation-Date: 2020-10-23 07:53+0000\n"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -295,6 +299,57 @@ msgstr ""
#: accounts/utils.py:51
msgid "Please view HTML version of this message."
+<<<<<<< HEAD
+msgstr ""
+
+#: accounts/views.py:26
+msgid "Profile updated"
+msgstr ""
+
+#: accounts/views.py:44
+msgid "SSH key added"
+msgstr ""
+
+#: accounts/views.py:52
+msgid "Add SSH key"
+msgstr ""
+
+#: accounts/views.py:61
+msgid "SSH key deleted"
+msgstr ""
+
+#: accounts/views.py:69
+msgid "Delete SSH key"
+msgstr ""
+
+#: accounts/views.py:101
+msgid "Password Changed"
+msgstr ""
+
+#: accounts/views.py:121
+msgid "Create User Instance"
+msgstr ""
+
+#: accounts/views.py:139
+msgid "Update User Instance"
+msgstr ""
+
+#: accounts/views.py:175
+#, python-format
+msgid "OTP Sent to %(email)s"
+msgstr ""
+
+#: accounts/views.py:183
+msgid "Email OTP"
+msgstr ""
+
+#: accounts/views.py:194
+#, python-format
+msgid "OTP QR code was emailed to user %(user)s"
+msgstr ""
+
+#: accounts/views.py:196
+=======
msgstr ""
#: accounts/views.py:26
@@ -344,6 +399,7 @@ msgid "OTP QR code was emailed to user %s"
msgstr ""
#: accounts/views.py:177
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "User email not set, failed to send QR code"
msgstr ""
@@ -356,11 +412,20 @@ msgstr ""
msgid "Groups"
msgstr ""
+<<<<<<< HEAD
+#: admin/forms.py:81
+msgid ""
+"Raw passwords are not stored, so there is no way to see this user's "
+"password, \n"
+" but you can change the password using this "
+"form."
+=======
#: admin/forms.py:79
msgid ""
"Raw passwords are not stored, so there is no way to see\n"
" this user's password, but you can change the password using "
"this form."
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: admin/templates/admin/group_list.html:5 admin/views.py:87
@@ -507,6 +572,18 @@ msgstr ""
msgid "Create User"
msgstr ""
+<<<<<<< HEAD
+#: admin/views.py:129
+msgid "Update User"
+msgstr ""
+
+#: admin/views.py:141
+#, python-format
+msgid "Password changed for %(user)s"
+msgstr ""
+
+#: admin/views.py:144
+=======
#: admin/views.py:136
msgid "Update User"
msgstr ""
@@ -516,6 +593,7 @@ msgid "User password changed: {}"
msgstr ""
#: admin/views.py:152
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Wrong Data Provided"
msgstr ""
@@ -801,6 +879,20 @@ msgid "Other Settings"
msgstr ""
#: appsettings/views.py:38
+<<<<<<< HEAD
+#, python-format
+msgid "SASS directory path is changed. Now: %(dir)s"
+msgstr ""
+
+#: appsettings/views.py:67
+#, python-format
+msgid "Theme is changed. Now: %(theme)s"
+msgstr ""
+
+#: appsettings/views.py:82
+#, python-format
+msgid "%(setting)s is changed. Now: %(value)s"
+=======
#, python-brace-format
msgid "SASS directory path is changed. Now: {sass_dir.value}"
msgstr ""
@@ -813,6 +905,7 @@ msgstr ""
#: appsettings/views.py:80
#, python-brace-format
msgid "{setting.name} is changed. Now: {setting.value}"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: computes/forms.py:21
@@ -1700,7 +1793,11 @@ msgstr ""
#: instances/templates/instance_actions.html:25
#: instances/templates/instance_actions.html:37
#: instances/templates/instances/power_tab.html:25
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:82 instances/views.py:270
+=======
#: instances/templates/instances/power_tab.html:82 instances/views.py:264
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Suspend"
msgstr ""
@@ -1754,7 +1851,11 @@ msgstr ""
#: instances/templates/instances/destroy_instance_form.html:40
#: instances/templates/instances/destroy_tab.html:18
#: instances/templates/instances/destroy_tab.html:20
+<<<<<<< HEAD
+#: instances/templates/instances/destroy_tab.html:23 instances/views.py:312
+=======
#: instances/templates/instances/destroy_tab.html:23 instances/views.py:306
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Destroy"
msgstr ""
@@ -1772,20 +1873,32 @@ msgstr ""
#: instances/templates/instance_actions.html:35
#: instances/templates/instances/power_tab.html:47
#: instances/templates/instances/power_tab.html:121
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:123 instances/views.py:245
+=======
#: instances/templates/instances/power_tab.html:123 instances/views.py:239
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Power On"
msgstr ""
#: instances/templates/instance_actions.html:15
#: instances/templates/instances/power_tab.html:9
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:59 instances/views.py:261
+=======
#: instances/templates/instances/power_tab.html:59 instances/views.py:255
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Power Off"
msgstr ""
#: instances/templates/instance_actions.html:16
#: instances/templates/instance_actions.html:29
#: instances/templates/instances/power_tab.html:14
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:66 instances/views.py:254
+=======
#: instances/templates/instances/power_tab.html:66 instances/views.py:248
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Power Cycle"
msgstr ""
@@ -1797,7 +1910,11 @@ msgstr ""
#: instances/templates/instance_actions.html:22
#: instances/templates/instances/power_tab.html:34
#: instances/templates/instances/power_tab.html:93
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:108 instances/views.py:278
+=======
#: instances/templates/instances/power_tab.html:108 instances/views.py:272
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Resume"
msgstr ""
@@ -1805,7 +1922,11 @@ msgstr ""
#: instances/templates/instances/power_tab.html:19
#: instances/templates/instances/power_tab.html:39
#: instances/templates/instances/power_tab.html:74
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:100 instances/views.py:285
+=======
#: instances/templates/instances/power_tab.html:100 instances/views.py:279
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Force Off"
msgstr ""
@@ -2452,7 +2573,7 @@ msgstr ""
#: instances/templates/instances/snapshots_tab.html:22
msgid ""
"This may take more than an hour, depending on how much content is on your "
-"droplet and how large the disk is."
+"instance and how large the disk is."
msgstr ""
#: instances/templates/instances/snapshots_tab.html:27
@@ -2507,6 +2628,26 @@ msgstr ""
msgid "None available device name"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:242
+msgid "Templates cannot be started."
+msgstr ""
+
+#: instances/views.py:345
+#, python-format
+msgid "Instance is migrated to %(hostname)s"
+msgstr ""
+
+#: instances/views.py:368
+msgid "Reset root password"
+msgstr ""
+
+#: instances/views.py:374 instances/views.py:403
+msgid "Please shutdown down your instance and then try again"
+msgstr ""
+
+#: instances/views.py:395
+=======
#: instances/views.py:236
msgid "Templates cannot be started."
msgstr ""
@@ -2525,37 +2666,75 @@ msgid "Please shutdown down your instance and then try again"
msgstr ""
#: instances/views.py:389
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Installed new SSH public key %(keyname)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:422
+=======
#: instances/views.py:416
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"User %(quota_msg)s quota reached, cannot resize CPU of '%(instance_name)s'!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:431
+#, python-format
+msgid "CPU is resized: %(old)s to %(new)s"
+msgstr ""
+
+#: instances/views.py:459
+=======
#: instances/views.py:425
msgid "Resize CPU"
msgstr ""
#: instances/views.py:453
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"User %(quota_msg)s quota reached, cannot resize memory of "
"'%(instance_name)s'!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:466
+#, python-format
+msgid ""
+"Memory is resized: current/max: %(old_cur)s/%(old_max)s to %(new_cur)s/"
+"%(new_max)s"
+msgstr ""
+
+#: instances/views.py:500
+=======
#: instances/views.py:462
msgid "Resize Memory"
msgstr ""
#: instances/views.py:491
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"User %(quota_msg)s quota reached, cannot resize disks of '%(instance_name)s'!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:507
+#, python-format
+msgid "Disk is resized: %(dev)s"
+msgstr ""
+
+#: instances/views.py:546
+#, python-format
+msgid "Attach new disk: %(name)s (%(format)s)"
+msgstr ""
+
+#: instances/views.py:577
+=======
#: instances/views.py:498
msgid "Disk resize"
msgstr ""
@@ -2566,11 +2745,16 @@ msgid "Attach new disk %(name)s (%(format)s)"
msgstr ""
#: instances/views.py:568
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Attach Existing disk: %(target_dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:635
+=======
#: instances/views.py:624
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Volume changes are applied. But it will be activated after shutdown"
msgstr ""
@@ -2578,41 +2762,79 @@ msgstr ""
msgid "Volume is changed successfully."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:639
+=======
#: instances/views.py:627
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Edit disk: %(target_dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:661
+=======
#: instances/views.py:649
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Delete disk: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:677
+=======
#: instances/views.py:665
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Detach disk: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:690
+=======
#: instances/views.py:678
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Add CD-ROM: %(target)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:703
+=======
#: instances/views.py:691
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Detach CD-ROM: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:716
+=======
#: instances/views.py:704
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Mount media: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:729
+=======
#: instances/views.py:717
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Unmount media: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:742
+#, python-format
+msgid "Create snapshot: %(snap)s"
+msgstr ""
+
+#: instances/views.py:753
+#, python-format
+msgid "Delete snapshot: %(snap)s"
+=======
#: instances/views.py:730
#, python-format
msgid "New snapshot: %(name)s"
@@ -2621,26 +2843,62 @@ msgstr ""
#: instances/views.py:741
#, python-format
msgid "Delete snapshot: %(snap_name)s"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: instances/views.py:752
msgid "Successful revert snapshot: "
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:767
+msgid "Revert snapshot: %(snap)"
+msgstr ""
+
+#: instances/views.py:781
+=======
#: instances/views.py:755
msgid "Revert snapshot"
msgstr ""
#: instances/views.py:769
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "VCPU %(id)s is enabled=%(enabled)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:790
+=======
#: instances/views.py:780
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "VCPU Hot-plug is enabled=%(status)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:800
+msgid "Set autostart"
+msgstr ""
+
+#: instances/views.py:809
+msgid "Unset autostart"
+msgstr ""
+
+#: instances/views.py:818
+msgid "Enable boot menu"
+msgstr ""
+
+#: instances/views.py:827
+msgid "Disable boot menu"
+msgstr ""
+
+#: instances/views.py:842
+msgid "Set boot order"
+msgstr ""
+
+#: instances/views.py:847
+=======
#: instances/views.py:791
msgid "Set autostart"
msgstr ""
@@ -2662,6 +2920,7 @@ msgid "Set boot order"
msgstr ""
#: instances/views.py:836
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Boot menu changes applied. But it will be activated after shutdown"
msgstr ""
@@ -2669,6 +2928,19 @@ msgstr ""
msgid "Boot order changed successfully."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:861
+msgid "Change instance XML"
+msgstr ""
+
+#: instances/views.py:875
+#, python-format
+msgid "Set Guest Agent: %(status)s"
+msgstr ""
+
+#: instances/views.py:885
+msgid "Set Video Model: %(model)"
+=======
#: instances/views.py:849
msgid "Edit XML"
msgstr ""
@@ -2680,6 +2952,7 @@ msgstr ""
#: instances/views.py:873
msgid "Set Video Model"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: instances/views.py:882
@@ -2690,6 +2963,19 @@ msgstr ""
msgid "Network Device Config is changed. Please shutdown instance to activate."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:922
+#, python-format
+msgid "Add network: %(mac)s"
+msgstr ""
+
+#: instances/views.py:933
+#, python-format
+msgid "Delete Network: %(mac)s"
+msgstr ""
+
+#: instances/views.py:946
+=======
#: instances/views.py:903
msgid "Add network"
msgstr ""
@@ -2699,78 +2985,213 @@ msgid "Delete network"
msgstr ""
#: instances/views.py:933
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Set Link State: %(state)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:966 networks/views.py:231
+=======
#: instances/views.py:952
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "%(qos_dir)s QoS is set"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:971
+=======
#: instances/views.py:956
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"%(qos_dir)s QoS is set. Network XML is changed. Stop and "
"start network to activate new config."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:988 networks/views.py:246
+=======
#: instances/views.py:970
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "%(qos_dir)s QoS is deleted"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:993
+=======
#: instances/views.py:974
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"%(qos_dir)s QoS is deleted. Network XML is changed. Stop and "
"start network to activate new config."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1012
+msgid "Only one owner is allowed and the one already added"
+msgstr ""
+
+#: instances/views.py:1017
+=======
#: instances/views.py:990
msgid "Only one owner is allowed and the one already added"
msgstr ""
#: instances/views.py:995
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
-msgid "Added owner %(user)s"
+msgid "Add owner: %(user)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1028
+#, python-format
+msgid "Delete owner: %(userinstance_id)s "
+msgstr ""
+
+#: instances/views.py:1060
+=======
#: instances/views.py:1006
#, python-format
msgid "Deleted owner %(userinstance_id)s"
msgstr ""
#: instances/views.py:1038
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "User '%(quota_msg)s' quota reached, cannot create '%(clone_name)s'!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1066
+#, python-format
+msgid "Instance '%(clone_name)s' already exists!"
+msgstr ""
+
+#: instances/views.py:1069
+=======
#: instances/views.py:1044
msgid "Instance 'clone_name' already exists!"
msgstr ""
#: instances/views.py:1047
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Instance name '%(clone_name)s' contains invalid characters!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1072
+=======
#: instances/views.py:1050
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Instance MAC '%(clone_mac)s' invalid format!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1082
+#, python-format
+msgid "Create a clone of '%(instance_name)s'"
+msgstr ""
+
+#: instances/views.py:1121
+=======
#: instances/views.py:1060
#, python-format
msgid "Clone of '%(instance_name)s'"
msgstr ""
#: instances/views.py:1093
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid ""
"Error setting console password. You should check that your instance have an "
"graphic device."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1126
+msgid "Set VNC password"
+msgstr ""
+
+#: instances/views.py:1135
+msgid "Set VNC keymap"
+msgstr ""
+
+#: instances/views.py:1140
+msgid "Set VNC type"
+msgstr ""
+
+#: instances/views.py:1145
+msgid "Set VNC listen address"
+msgstr ""
+
+#: instances/views.py:1168
+msgid "Edit options"
+msgstr ""
+
+#: instances/views.py:1182
+msgid "Send console.vv file"
+msgstr ""
+
+#: instances/views.py:1243 instances/views.py:1337
+msgid "A virtual machine with this name already exists"
+msgstr ""
+
+#: instances/views.py:1320
+msgid "You haven't defined any storage pools"
+msgstr ""
+
+#: instances/views.py:1322
+msgid "You haven't defined any network pools"
+msgstr ""
+
+#: instances/views.py:1339
+msgid "There is an instance with same name. Remove it and try again!"
+msgstr ""
+
+#: instances/views.py:1343
+msgid "No Virtual Machine MAC has been entered"
+msgstr ""
+
+#: instances/views.py:1374
+msgid "Image has already exist. Please check volumes or change instance name"
+msgstr ""
+
+#: instances/views.py:1401
+msgid "First you need to create or select an image"
+msgstr ""
+
+#: instances/views.py:1419
+msgid "Invalid cache mode"
+msgstr ""
+
+#: instances/views.py:1460
+msgid "Instance is created"
+msgstr ""
+
+#: instances/views.py:1481
+msgid "Flavor Created"
+msgstr ""
+
+#: instances/views.py:1487
+msgid "Create Flavor"
+msgstr ""
+
+#: instances/views.py:1497
+msgid "Flavor Updated"
+msgstr ""
+
+#: instances/views.py:1503
+msgid "Update Flavor"
+msgstr ""
+
+#: instances/views.py:1512
+=======
#: instances/views.py:1096
msgid "Set VNC password"
msgstr ""
@@ -2848,46 +3269,47 @@ msgid "Update Flavor"
msgstr ""
#: instances/views.py:1460
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Flavor Deleted"
msgstr ""
-#: interfaces/forms.py:25
+#: interfaces/forms.py:26
msgid "The IPv4 address must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:27
+#: interfaces/forms.py:28
msgid "The IPv4 address must not exceed 20 characters"
msgstr ""
-#: interfaces/forms.py:34
+#: interfaces/forms.py:35
msgid "The IPv4 gateway must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:36
+#: interfaces/forms.py:37
msgid "The IPv4 gateway must not exceed 20 characters"
msgstr ""
-#: interfaces/forms.py:43
+#: interfaces/forms.py:44
msgid "The IPv6 address must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:45
+#: interfaces/forms.py:46
msgid "The IPv6 address must not exceed 100 characters"
msgstr ""
-#: interfaces/forms.py:52
+#: interfaces/forms.py:53
msgid "The IPv6 gateway must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:54
+#: interfaces/forms.py:55
msgid "The IPv6 gateway must not exceed 100 characters"
msgstr ""
-#: interfaces/forms.py:61 interfaces/forms.py:70
+#: interfaces/forms.py:62 interfaces/forms.py:71
msgid "The interface must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:63 interfaces/forms.py:72
+#: interfaces/forms.py:64 interfaces/forms.py:73
msgid "The interface must not exceed 10 characters"
msgstr ""
@@ -3021,63 +3443,63 @@ msgstr ""
msgid "Hypervisor doesn't have any Interfaces"
msgstr ""
-#: logs/models.py:6
+#: logs/models.py:5
msgid "user"
msgstr ""
-#: logs/models.py:7
+#: logs/models.py:6
msgid "instance"
msgstr ""
-#: logs/models.py:8
+#: logs/models.py:7
msgid "message"
msgstr ""
-#: logs/models.py:9
+#: logs/models.py:8
msgid "date"
msgstr ""
-#: networks/forms.py:7 storages/forms.py:7
+#: networks/forms.py:8 storages/forms.py:8
msgid "No pool name has been entered"
msgstr ""
-#: networks/forms.py:9
+#: networks/forms.py:10
msgid "No IPv4 subnet has been entered"
msgstr ""
-#: networks/forms.py:11
+#: networks/forms.py:15
msgid "No IPv6 subnet has been entered"
msgstr ""
-#: networks/forms.py:24 storages/forms.py:22
+#: networks/forms.py:30 storages/forms.py:23
msgid "The pool name must not contain any special characters"
msgstr ""
-#: networks/forms.py:26 storages/forms.py:24
+#: networks/forms.py:32 storages/forms.py:25
msgid "The pool name must not exceed 20 characters"
msgstr ""
-#: networks/forms.py:33
+#: networks/forms.py:39
msgid "The IPv4 subnet must not contain any special characters"
msgstr ""
-#: networks/forms.py:35
+#: networks/forms.py:41
msgid "The IPv4 subnet must not exceed 20 characters"
msgstr ""
-#: networks/forms.py:42
+#: networks/forms.py:48
msgid "The IPv6 subnet must not contain any special characters"
msgstr ""
-#: networks/forms.py:44
+#: networks/forms.py:50
msgid "The IPv6 subnet must not exceed 42 characters"
msgstr ""
-#: networks/forms.py:52
+#: networks/forms.py:58
msgid "The pool bridge name must not contain any special characters"
msgstr ""
-#: networks/forms.py:54
+#: networks/forms.py:60
msgid "The pool bridge name must not exceed 20 characters"
msgstr ""
@@ -3273,6 +3695,32 @@ msgstr ""
msgid "Please enter bridge/dev name"
msgstr ""
+<<<<<<< HEAD
+#: networks/views.py:57
+msgid "For libvirt, the IPv6 network prefix must be /64"
+msgstr ""
+
+#: networks/views.py:130
+msgid "Unknown Network Family"
+msgstr ""
+
+#: networks/views.py:180
+#, python-format
+msgid "Fixed address operation completed for %(family)s"
+msgstr ""
+
+#: networks/views.py:190
+#, python-format
+msgid "%(family)s Fixed Address is Deleted."
+msgstr ""
+
+#: networks/views.py:198
+#, python-format
+msgid "%(family)s DHCP Range is Changed."
+msgstr ""
+
+#: networks/views.py:210
+=======
#: networks/views.py:56
msgid "For libvirt, the IPv6 network prefix must be /64"
msgstr ""
@@ -3294,10 +3742,29 @@ msgid "{family.upper()} DHCP Range is Changed."
msgstr ""
#: networks/views.py:203
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid ""
"Network XML is changed. \\Stop and start network to activate new config."
msgstr ""
+<<<<<<< HEAD
+#: networks/views.py:215
+msgid "Network XML is changed."
+msgstr ""
+
+#: networks/views.py:228
+#, python-format
+msgid ""
+"%(qos_dir)s QoS is updated. Network XML is changed. Stop and start network "
+"to activate new config"
+msgstr ""
+
+#: networks/views.py:242
+#, python-format
+msgid ""
+"%(qos_dir)s QoS is deleted. Network XML is changed. "
+"Stop and start network to activate new config"
+=======
#: networks/views.py:205
msgid "Network XML is changed."
msgstr ""
@@ -3312,6 +3779,7 @@ msgstr ""
#: networks/views.py:221
msgid "{} QoS is set"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: networks/views.py:232
@@ -3387,6 +3855,17 @@ msgstr ""
msgid "Hypervisor doesn't have any NWFilters"
msgstr ""
+<<<<<<< HEAD
+#: nwfilters/views.py:44
+msgid "A network filter with this name already exists"
+msgstr ""
+
+#: nwfilters/views.py:47
+msgid "A network filter with this UUID already exists"
+msgstr ""
+
+#: nwfilters/views.py:51
+=======
#: nwfilters/views.py:41
msgid "A network filter with this name already exists"
msgstr ""
@@ -3396,10 +3875,26 @@ msgid "A network filter with this UUID already exists"
msgstr ""
#: nwfilters/views.py:48
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
-msgid "Creating NWFilter: %s"
+msgid "%(filter)s network filter is created"
msgstr ""
+<<<<<<< HEAD
+#: nwfilters/views.py:60
+#, python-format
+msgid "%(filter)s network filter is deleted"
+msgstr ""
+
+#: nwfilters/views.py:76
+#, python-format
+msgid "NWFilter is in use by %(instance)s. Cannot be deleted."
+msgstr ""
+
+#: nwfilters/views.py:93
+#, python-format
+msgid "Cloning NWFilter %(name)s as %(clone)s"
+=======
#: nwfilters/views.py:57
#, python-brace-format
msgid "Deleting NWFilter: {name}"
@@ -3413,6 +3908,7 @@ msgstr ""
#: nwfilters/views.py:86
#, python-brace-format
msgid "Cloning NWFilter {name} as {cln_name}"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: secrets/templates/create_secret_block.html:12
@@ -3463,27 +3959,27 @@ msgstr ""
msgid "Value"
msgstr ""
-#: storages/forms.py:9 storages/forms.py:36
+#: storages/forms.py:10 storages/forms.py:37
msgid "No path has been entered"
msgstr ""
-#: storages/forms.py:33
+#: storages/forms.py:34
msgid "The target must not contain any special characters"
msgstr ""
-#: storages/forms.py:45
+#: storages/forms.py:46
msgid "No device or path has been entered"
msgstr ""
-#: storages/forms.py:47
+#: storages/forms.py:48
msgid "The disk source must not contain any special characters"
msgstr ""
-#: storages/forms.py:61 storages/forms.py:76
+#: storages/forms.py:62 storages/forms.py:77
msgid "The image name must not contain any special characters"
msgstr ""
-#: storages/forms.py:78
+#: storages/forms.py:79
msgid "The image name must not exceed 120 characters"
msgstr ""
@@ -3616,7 +4112,7 @@ msgstr ""
msgid "Hypervisor doesn't have any Storages"
msgstr ""
-#: storages/views.py:40
+#: storages/views.py:39
msgid "Pool name already use"
msgstr ""
@@ -3624,6 +4120,38 @@ msgstr ""
msgid "You need create secret for pool"
msgstr ""
+<<<<<<< HEAD
+#: storages/views.py:48
+msgid "You need input all fields for creating ceph pool"
+msgstr ""
+
+#: storages/views.py:144
+#, python-format
+msgid "Volume: %(volume)s is deleted."
+msgstr ""
+
+#: storages/views.py:149
+msgid "ISO image already exist"
+msgstr ""
+
+#: storages/views.py:153
+#, python-format
+msgid "ISO: %(file)s is uploaded."
+msgstr ""
+
+#: storages/views.py:162
+msgid "Name of volume already in use"
+msgstr ""
+
+#: storages/views.py:174
+#, python-format
+msgid "%(image)s image cloned as %(clone)s successfully"
+msgstr ""
+
+#: storages/views.py:220
+#, python-format
+msgid "Image file %(name)s is created successfully"
+=======
#: storages/views.py:49
msgid "You need input all fields for creating ceph pool"
msgstr ""
@@ -3652,6 +4180,7 @@ msgstr ""
#: storages/views.py:199
#, python-brace-format
msgid "Image file {name} is created successfully"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: templates/403.html:3
diff --git a/locale/tr/LC_MESSAGES/django.mo b/locale/tr/LC_MESSAGES/django.mo
index 663af1d..4d879b1 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 7b49fe5..1288a52 100644
--- a/locale/tr/LC_MESSAGES/django.po
+++ b/locale/tr/LC_MESSAGES/django.po
@@ -11,8 +11,13 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
+<<<<<<< HEAD
+"POT-Creation-Date: 2020-11-05 09:36+0000\n"
+"PO-Revision-Date: 2020-11-04 12:00+0000\n"
+=======
"POT-Creation-Date: 2020-10-23 07:53+0000\n"
"PO-Revision-Date: 2020-06-09 12:00+0000\n"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
"Last-Translator: catborise , 2020\n"
"Language-Team: Turkish (https://www.transifex.com/catborise/teams/110663/"
"tr/)\n"
@@ -23,8 +28,11 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: accounts/forms.py:25
+<<<<<<< HEAD
+=======
#, fuzzy
#| msgid "Instance owners"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Instance owned by another user"
msgstr "Diğer kullanının sanal makineleri"
@@ -37,6 +45,15 @@ msgid "Public key already exist"
msgstr "Açık anahtar zaten mevcut"
#: accounts/forms.py:59
+<<<<<<< HEAD
+msgid "Invalid key"
+msgstr "Geçersiz anahtar"
+
+#: accounts/forms.py:75
+msgid "Email"
+msgstr "E-posta"
+
+=======
#, fuzzy
#| msgid "Invalid cache mode"
msgid "Invalid key"
@@ -46,6 +63,7 @@ msgstr "Geçersiz anahtar"
msgid "Email"
msgstr "E-posta"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#: accounts/models.py:23
#, python-format
msgid "Instance \"%(inst)s\" of user %(user)s"
@@ -85,14 +103,25 @@ msgid "Can change password"
msgstr "Parola deÄŸiÅŸtirebilir"
#: accounts/templates/account.html:7 accounts/templates/account.html:8
+<<<<<<< HEAD
+=======
#, fuzzy
#| msgid "View Profile"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "User Profile"
msgstr "Kullanıcı Profili"
#: accounts/templates/account.html:12
msgid "Email OTP QR code"
msgstr "OTP QR Kodu e-postası"
+<<<<<<< HEAD
+
+#: accounts/templates/account.html:16
+msgid "Edit user"
+msgstr "Kullanıcı düzenle"
+
+#: accounts/templates/account.html:19
+=======
#: accounts/templates/account.html:16
#, fuzzy
@@ -103,6 +132,7 @@ msgstr "Kullanıcı düzenle"
#: accounts/templates/account.html:19
#, fuzzy
#| msgid "Create new instance"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Create user instance"
msgstr "Yeni sanal makine oluÅŸtur"
@@ -123,8 +153,11 @@ msgid "Instances"
msgstr "Sanal Makineler"
#: accounts/templates/account.html:30
+<<<<<<< HEAD
+=======
#, fuzzy
#| msgid "Public key"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Public Keys"
msgstr "Açık anahtar"
@@ -147,7 +180,11 @@ msgstr "VNC"
#: instances/templates/instances/resize_tab.html:153
#: instances/templates/instances/resize_tab.html:158
msgid "Resize"
+<<<<<<< HEAD
+msgstr "Boyutlandır"
+=======
msgstr "Yeniden Boyutlandır"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#: accounts/templates/account.html:43 accounts/templates/account.html:61
#: accounts/templates/profile.html:51 admin/templates/admin/group_list.html:46
@@ -190,8 +227,11 @@ msgstr "Açık anahtar"
#: accounts/templates/accounts/change_password_form.html:7
#: accounts/templates/accounts/change_password_form.html:14
#: accounts/templates/profile.html:29
+<<<<<<< HEAD
+=======
#, fuzzy
#| msgid "Can change password"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Change Password"
msgstr "Parola DeÄŸiÅŸtir"
@@ -218,7 +258,13 @@ msgstr "DeÄŸiÅŸtir"
msgid ""
"\n"
"Scan this QR code to get OTP for account '%(user)s'\n"
+<<<<<<< HEAD
+msgstr ""
+"\n"
+"'%(user)s' hesabı için bu OTP QR kodunu tarayin\n"
+=======
msgstr "'%(user)s' hesabında OTP açmak içim bu QR kodunu tara\n"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#: accounts/templates/accounts/email_otp_form.html:12
msgid ""
@@ -227,6 +273,15 @@ msgid ""
" "
msgstr ""
"\n"
+<<<<<<< HEAD
+" OTP QR kodunun gönderileceği e-posta adresini giriniz.\n"
+" "
+
+#: accounts/templates/accounts/email_otp_form.html:27
+msgid "Send"
+msgstr "Gönder"
+
+=======
" OTP QR kodunun gönderileceği e-posta adresini giriniz.\n"
" "
@@ -234,6 +289,7 @@ msgstr ""
msgid "Send"
msgstr "Gönder"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#: accounts/templates/accounts/otp_login.html:23
msgid "I do not have/lost my OTP!"
msgstr "OTP mevcut deÄŸil/kaybettim!"
@@ -293,16 +349,24 @@ msgstr "SSH Anahtarları"
#: accounts/templates/profile.html:34
#: instances/templates/instances/settings_tab.html:686
#: instances/templates/instances/settings_tab.html:688
+<<<<<<< HEAD
+=======
#, fuzzy
#| msgid "date"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Update"
msgstr "Güncelle"
#: accounts/templates/profile.html:64
+<<<<<<< HEAD
+msgid "Add SSH Key"
+msgstr "SSH Anahtarı Ekle"
+=======
#, fuzzy
#| msgid "SSH Keys"
msgid "Add SSH Key"
msgstr "Ekle SSH Anahtarı"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#: accounts/templates/profile.html:72
#: instances/templates/add_instance_network_block.html:50
@@ -319,6 +383,56 @@ msgstr "OTP QR Kodu"
#: accounts/utils.py:51
msgid "Please view HTML version of this message."
msgstr "Lütfen bu mesajın HTML sürümünü görüntüleyin."
+<<<<<<< HEAD
+
+#: accounts/views.py:26
+msgid "Profile updated"
+msgstr "Profil güncellendi"
+
+#: accounts/views.py:44
+msgid "SSH key added"
+msgstr "SSH anahtarı eklendi"
+
+#: accounts/views.py:52
+msgid "Add SSH key"
+msgstr "SSH Anahtarı Ekle"
+
+#: accounts/views.py:61
+msgid "SSH key deleted"
+msgstr "SSH anahtarı silindi"
+
+#: accounts/views.py:69
+msgid "Delete SSH key"
+msgstr "SSH anahtarı sil"
+
+#: accounts/views.py:101
+msgid "Password Changed"
+msgstr "Parola DeÄŸiÅŸti"
+
+#: accounts/views.py:121
+msgid "Create User Instance"
+msgstr "Yeni Kullanıcı Sanal Makinesi Oluştur"
+
+#: accounts/views.py:139
+msgid "Update User Instance"
+msgstr "Kullanıcı Sanal Makinesini Güncelle"
+
+#: accounts/views.py:175
+#, python-format
+msgid "OTP Sent to %(email)s"
+msgstr "OTP %(email)s ye gönderildi"
+
+#: accounts/views.py:183
+msgid "Email OTP"
+msgstr "OTP E-Posta"
+
+#: accounts/views.py:194
+#, python-format
+msgid "OTP QR code was emailed to user %(user)s"
+msgstr "OTP QR kodu %(user)s kullanıcısına gönderildi"
+
+#: accounts/views.py:196
+=======
#: accounts/views.py:26
#, fuzzy
@@ -381,6 +495,7 @@ msgid "OTP QR code was emailed to user %s"
msgstr "OTP QR kodu %s kullanıcısına gönderildi"
#: accounts/views.py:177
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "User email not set, failed to send QR code"
msgstr "Kullanıcı e-postası girilmemiş, QR kod gönderimi başarısız"
@@ -393,11 +508,25 @@ msgstr "Ä°zinler"
msgid "Groups"
msgstr "Gruplar"
+<<<<<<< HEAD
+#: admin/forms.py:81
+#, fuzzy
+#| msgid ""
+#| "Raw passwords are not stored, so there is no way to see\n"
+#| " this user's password, but you can change the password "
+#| "using this form."
+msgid ""
+"Raw passwords are not stored, so there is no way to see this user's "
+"password, \n"
+" but you can change the password using this "
+"form."
+=======
#: admin/forms.py:79
msgid ""
"Raw passwords are not stored, so there is no way to see\n"
" this user's password, but you can change the password using "
"this form."
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
"Açık parolalar saklanmadığından bu kullanıcının parolasını\n"
" görme imkanı yok. Faka parolayı bu formu "
@@ -547,6 +676,21 @@ msgstr "Grubu Güncelle"
msgid "Create User"
msgstr "Kullanıcı Oluştur"
+<<<<<<< HEAD
+#: admin/views.py:129
+msgid "Update User"
+msgstr "Kullanıcı Güncelle"
+
+#: admin/views.py:141
+#, python-format
+msgid "Password changed for %(user)s"
+msgstr "%(user)s parolası değiştirildi"
+
+#: admin/views.py:144
+msgid "Wrong Data Provided"
+msgstr "Hatalı Veri"
+
+=======
#: admin/views.py:136
msgid "Update User"
msgstr "Kullanıcı Güncelle"
@@ -561,6 +705,7 @@ msgstr "Kullanıcı parolası değişti: {}"
msgid "Wrong Data Provided"
msgstr "Hatalı Veri"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#: appsettings/migrations/0002_auto_20200527_1603.py:11
msgid "Theme"
msgstr "Tema"
@@ -774,10 +919,12 @@ msgid "Show access ssh keys"
msgstr "SSH Erişim Anahtarlarını Göster"
#: appsettings/migrations/0004_auto_20200716_0637.py:11
-#, fuzzy
-#| msgid "Console Access"
msgid "Console Scale"
+<<<<<<< HEAD
+msgstr "Konsolu Ölçekle"
+=======
msgstr "Konsol Ölçekle"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#: appsettings/migrations/0004_auto_20200716_0637.py:11
msgid "Allow console to scaling view"
@@ -792,26 +939,22 @@ msgid "Allow only view not modify"
msgstr "Sadece görüntülemeye izin ver düzenlemeye izin verme"
#: appsettings/migrations/0004_auto_20200716_0637.py:13
-#, fuzzy
-#| msgid "Console Access"
msgid "Console Resize Session"
+<<<<<<< HEAD
+msgstr "Konsol Oturumunu Boyutlandır"
+=======
msgstr "Konsol Oturum Boyutlandır"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#: appsettings/migrations/0004_auto_20200716_0637.py:13
-#, fuzzy
-#| msgid "Allow to have multiple owner for instance"
msgid "Allow to resize session for console"
msgstr "Bir sanal makine için çoklu sahip atanmasına izin verir"
#: appsettings/migrations/0004_auto_20200716_0637.py:14
-#, fuzzy
-#| msgid "Console port"
msgid "Console Clip Viewport"
msgstr "Konsol bağlantı noktası"
#: appsettings/migrations/0004_auto_20200716_0637.py:14
-#, fuzzy
-#| msgid "Console port"
msgid "Clip console viewport"
msgstr "Konsol bağlantı noktası"
@@ -857,6 +1000,21 @@ msgid "Other Settings"
msgstr "DiÄŸer Ayarlar"
#: appsettings/views.py:38
+<<<<<<< HEAD
+#, python-format
+msgid "SASS directory path is changed. Now: %(dir)s"
+msgstr "SASS dizin yolu deÄŸiÅŸtirildi. Åžimdi: %(dir)s"
+
+#: appsettings/views.py:67
+#, python-format
+msgid "Theme is changed. Now: %(theme)s"
+msgstr "Tema deÄŸiÅŸtirildi. Åžimdi: %(theme)s"
+
+#: appsettings/views.py:82
+#, python-format
+msgid "%(setting)s is changed. Now: %(value)s"
+msgstr "%(setting)s deÄŸiÅŸtirildi. Åžimdi: %(value)s"
+=======
#, python-brace-format
msgid "SASS directory path is changed. Now: {sass_dir.value}"
msgstr "SASS dizin yolu deÄŸiÅŸtirildi. Åžimdi: {sass_dir.value}"
@@ -870,6 +1028,7 @@ msgstr "Tema deÄŸiÅŸtirildi. Åžimdi: {theme}"
#, python-brace-format
msgid "{setting.name} is changed. Now: {setting.value}"
msgstr "{setting.name} deÄŸiÅŸtirildi. Åžimdi: {setting.value}"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#: computes/forms.py:21
msgid "FQDN/IP"
@@ -1037,10 +1196,8 @@ msgstr "Kapalı"
#: computes/templates/computes/instances.html:98
#: instances/templates/allinstances_index_grouped.html:60
#: instances/templates/allinstances_index_nongrouped.html:44
-#, fuzzy
-#| msgid "Suspend"
msgid "Suspended"
-msgstr "Duraklat"
+msgstr "Duraklatılmış"
#: computes/templates/computes/list.html:6
#: computes/templates/computes/list.html:12 templates/navbar.html:18
@@ -1048,8 +1205,11 @@ msgid "Computes"
msgstr "Sunucular"
#: computes/templates/computes/list.html:20
+<<<<<<< HEAD
+=======
#, fuzzy
#| msgid "You don't have any groups"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "You don't have any computes"
msgstr "Hiç sunucunuz yok"
@@ -1183,15 +1343,11 @@ msgstr "sunucu adresi ve portu ayarlanmalı"
#: console/templates/console-spice-full.html:97
#: console/templates/console-spice-lite.html:138
#: console/templates/console-spice-lite.html:150
-#, fuzzy
-#| msgid "Disconnected"
msgid "disconnect"
msgstr "bağlantı kes"
#: console/templates/console-spice-full.html:114
#: console/templates/console-spice-lite.html:167
-#, fuzzy
-#| msgid "Console type not supported"
msgid "File API is not supported"
msgstr "Dosya API desteklenmiyor"
@@ -1289,8 +1445,11 @@ msgid "created"
msgstr "oluÅŸturuldu"
#: instances/models.py:220
+<<<<<<< HEAD
+=======
#, fuzzy
#| msgid "Show access root password"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Can access console without password"
msgstr "Parolasız konsol erişimi yapabilir"
@@ -1767,7 +1926,11 @@ msgstr "Sıfırları yakala"
#: instances/templates/instance_actions.html:25
#: instances/templates/instance_actions.html:37
#: instances/templates/instances/power_tab.html:25
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:82 instances/views.py:270
+=======
#: instances/templates/instances/power_tab.html:82 instances/views.py:264
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Suspend"
msgstr "Duraklat"
@@ -1821,7 +1984,11 @@ msgstr "Ä°statistikler"
#: instances/templates/instances/destroy_instance_form.html:40
#: instances/templates/instances/destroy_tab.html:18
#: instances/templates/instances/destroy_tab.html:20
+<<<<<<< HEAD
+#: instances/templates/instances/destroy_tab.html:23 instances/views.py:312
+=======
#: instances/templates/instances/destroy_tab.html:23 instances/views.py:306
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Destroy"
msgstr "Sil"
@@ -1839,20 +2006,32 @@ msgstr "Klonla"
#: instances/templates/instance_actions.html:35
#: instances/templates/instances/power_tab.html:47
#: instances/templates/instances/power_tab.html:121
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:123 instances/views.py:245
+=======
#: instances/templates/instances/power_tab.html:123 instances/views.py:239
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Power On"
msgstr "BaÅŸlat"
#: instances/templates/instance_actions.html:15
#: instances/templates/instances/power_tab.html:9
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:59 instances/views.py:261
+=======
#: instances/templates/instances/power_tab.html:59 instances/views.py:255
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Power Off"
msgstr "Kapat"
#: instances/templates/instance_actions.html:16
#: instances/templates/instance_actions.html:29
#: instances/templates/instances/power_tab.html:14
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:66 instances/views.py:254
+=======
#: instances/templates/instances/power_tab.html:66 instances/views.py:248
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Power Cycle"
msgstr "Yeniden baÅŸlat"
@@ -1864,7 +2043,11 @@ msgstr "VNC Konsol"
#: instances/templates/instance_actions.html:22
#: instances/templates/instances/power_tab.html:34
#: instances/templates/instances/power_tab.html:93
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:108 instances/views.py:278
+=======
#: instances/templates/instances/power_tab.html:108 instances/views.py:272
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Resume"
msgstr "Devam ettir"
@@ -1872,7 +2055,11 @@ msgstr "Devam ettir"
#: instances/templates/instances/power_tab.html:19
#: instances/templates/instances/power_tab.html:39
#: instances/templates/instances/power_tab.html:74
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:100 instances/views.py:285
+=======
#: instances/templates/instances/power_tab.html:100 instances/views.py:279
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Force Off"
msgstr "Zorla Kapat"
@@ -1896,14 +2083,12 @@ msgid "VDI"
msgstr "VDI"
#: instances/templates/instances/access_tab.html:39
-#, fuzzy, python-format
-#| msgid ""
-#| "This action opens a new window with a VNC connection to the console of "
-#| "the instance."
+#, python-format
msgid ""
" This action opens a new window with a %(type)s connection to the console of "
"the instance."
-msgstr "Bu eylem sanal makinenin konsoluna bir VNC bağlantısı penceresi açar."
+msgstr ""
+"Bu eylem sanal makinenin konsoluna bir %(type)s bağlantısı penceresi açar."
#: instances/templates/instances/access_tab.html:47
msgid "Scale"
@@ -1914,8 +2099,6 @@ msgid "View Only"
msgstr "Sadece Görüntüle"
#: instances/templates/instances/access_tab.html:63
-#, fuzzy
-#| msgid "Resize Memory"
msgid "Resize Session"
msgstr "Oturumu Boyutlandır"
@@ -1975,20 +2158,21 @@ msgid "To download console.vv file for virt-viewer."
msgstr "virt-viewer için console.vv dosyasını indir."
#: instances/templates/instances/access_tab.html:160
+<<<<<<< HEAD
+msgid "Get console.vv"
+msgstr "console.vv dosyası al"
+=======
#, fuzzy
#| msgid "Send console.vv file"
msgid "Get console.vv"
msgstr "console.vv dosyası gönder"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#: instances/templates/instances/destroy_instance_form.html:4
-#, fuzzy
-#| msgid "Destroy"
msgid "Confirm Destroy"
-msgstr "Sil"
+msgstr "Silme iÅŸlemini onayla"
#: instances/templates/instances/destroy_instance_form.html:8
-#, fuzzy
-#| msgid "Destroy Instance"
msgid "Destroy instance"
msgstr "Sanal makineyi sil"
@@ -2009,8 +2193,6 @@ msgid "Remove Instance's NVRAM"
msgstr "Sanal makine NVRAM'ini sil"
#: instances/templates/instances/destroy_instance_form.html:46
-#, fuzzy
-#| msgid "Destroy Instance"
msgid "You cannot destroy instance!"
msgstr "Sanal makineyi silemezsiniz!"
@@ -2019,8 +2201,6 @@ msgid "Destroy Instance"
msgstr "Sanal makineyi sil"
#: instances/templates/instances/destroy_tab.html:15
-#, fuzzy
-#| msgid "This action restore the instance after suspend."
msgid "This action starts remove instance process"
msgstr "Bu eylem sanal makine silme işlemini başlatır."
@@ -2331,6 +2511,11 @@ msgid ""
"In most configurations, macvtap does not work for host to guest network "
"communication"
msgstr ""
+<<<<<<< HEAD
+"macvtap bir çok yapılandırmada sunucu ile sanal makine ağı arasındaki "
+"iletişimde çalışmaz"
+=======
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#: instances/templates/instances/settings_tab.html:481
#: networks/templates/network.html:322
@@ -2430,8 +2615,11 @@ msgid "Instance owners"
msgstr "Sanal makine sahipleri"
#: instances/templates/instances/settings_tab.html:680
+<<<<<<< HEAD
+=======
#, fuzzy
#| msgid "To create console password, shutdown the instance."
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "To change console settings, shutdown the instance."
msgstr "Konsol ayarlarını değiştirmek için sanal makineyi kapatın"
@@ -2544,8 +2732,10 @@ msgstr "Anlık Görüntüleri Yönet"
#: instances/templates/instances/snapshots_tab.html:22
msgid ""
"This may take more than an hour, depending on how much content is on your "
-"droplet and how large the disk is."
+"instance and how large the disk is."
msgstr ""
+"Bu işlem diskinizin büyüklüğüne ve sanal makinenizin boyutuna göre bir "
+"saatten fazla sürebilir"
#: instances/templates/instances/snapshots_tab.html:27
msgid "Enter Snapshot Name"
@@ -2599,6 +2789,27 @@ msgstr "Disk I/O aygıtı"
msgid "None available device name"
msgstr "Hiçbiri uygun aygıt adı değil"
+<<<<<<< HEAD
+#: instances/views.py:242
+msgid "Templates cannot be started."
+msgstr "Şablon makineler başlatılamaz."
+
+#: instances/views.py:345
+#, fuzzy, python-format
+#| msgid "Instance is migrated to %(hostname)s"
+msgid "Instance is migrated to %(hostname)s"
+msgstr "Sanal makine %(hostname)% ya taşındı"
+
+#: instances/views.py:368
+msgid "Reset root password"
+msgstr "Kök parolayı sıfırla"
+
+#: instances/views.py:374 instances/views.py:403
+msgid "Please shutdown down your instance and then try again"
+msgstr "Lütfen sanal makinenizi kapatın ve yeniden deneyin"
+
+#: instances/views.py:395
+=======
#: instances/views.py:236
msgid "Templates cannot be started."
msgstr "Şablon makineler başlatılamaz."
@@ -2618,10 +2829,28 @@ msgid "Please shutdown down your instance and then try again"
msgstr "Lütfen sanal makinenizi kapatın ve yeniden deneyin"
#: instances/views.py:389
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Installed new SSH public key %(keyname)s"
msgstr "Yeni %(keyname)s SSH açık anahtarı kuruldu"
+<<<<<<< HEAD
+#: instances/views.py:422
+#, python-format
+msgid ""
+"User %(quota_msg)s quota reached, cannot resize CPU of '%(instance_name)s'!"
+msgstr ""
+"%(quota_msg)s kullanıcısı kotası doldu, '%(instance_name)s' in CPU su "
+"yeniden boyutlandırılamıyor!"
+
+#: instances/views.py:431
+#, python-format
+msgid "CPU is resized: %(old)s to %(new)s"
+msgstr "CPU sayısı değiştirildi: %(old)s -> %(new)s"
+
+#: instances/views.py:459
+#, python-format
+=======
#: instances/views.py:416
#, fuzzy, python-format
#| msgid ""
@@ -2640,6 +2869,7 @@ msgstr "CPU Boyutlandır"
#, fuzzy, python-format
#| msgid ""
#| "User {quota_msg} quota reached, cannot resize memory of '{instance.name}'!"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid ""
"User %(quota_msg)s quota reached, cannot resize memory of "
"'%(instance_name)s'!"
@@ -2647,6 +2877,20 @@ msgstr ""
"%(quota_msg)s kullanıcı kotası doldu, '%(instance_name)s' in belleği yeniden "
"boyutlandırılamıyor!"
+<<<<<<< HEAD
+#: instances/views.py:466
+#, fuzzy, python-format
+#| msgid "Memory is resized"
+msgid ""
+"Memory is resized: current/max: %(old_cur)s/%(old_max)s to %(new_cur)s/"
+"%(new_max)s"
+msgstr ""
+"Bellek kapasitesi deÄŸiÅŸtirildi: current/max: %(old_cur)s/%(old_max)s/"
+"%(new_max)s"
+
+#: instances/views.py:500
+#, python-format
+=======
#: instances/views.py:462
msgid "Resize Memory"
msgstr "Bellek Boyutlandır"
@@ -2655,12 +2899,32 @@ msgstr "Bellek Boyutlandır"
#, fuzzy, python-format
#| msgid ""
#| "User {quota_msg} quota reached, cannot resize disks of '{instance.name}'!"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid ""
"User %(quota_msg)s quota reached, cannot resize disks of '%(instance_name)s'!"
msgstr ""
"%(quota_msg)s kullanıcı kotası doldu, '%(instance_name)s' in diski yeniden "
"boyutlandırılamıyor!"
+<<<<<<< HEAD
+#: instances/views.py:507
+#, python-format
+msgid "Disk is resized: %(dev)s"
+msgstr "Disk boyutu deÄŸiÅŸtirildi: %(dev)s"
+
+#: instances/views.py:546
+#, fuzzy, python-format
+#| msgid "Attach new disk %(name)s (%(format)s)"
+msgid "Attach new disk: %(name)s (%(format)s)"
+msgstr "Yeni disk tak %(name)s (%(format)s)"
+
+#: instances/views.py:577
+#, python-format
+msgid "Attach Existing disk: %(target_dev)s"
+msgstr "Takılan mevcut disk: %(target_dev)s"
+
+#: instances/views.py:635
+=======
#: instances/views.py:498
msgid "Disk resize"
msgstr "Disk Boyutlandır"
@@ -2678,6 +2942,7 @@ msgid "Attach Existing disk: %(target_dev)s"
msgstr "Takılan mevcut disk: %(target_dev)s"
#: instances/views.py:624
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
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"
@@ -2686,6 +2951,53 @@ msgstr ""
msgid "Volume is changed successfully."
msgstr "Birim başarıyla değiştirildi."
+<<<<<<< HEAD
+#: instances/views.py:639
+#, python-format
+msgid "Edit disk: %(target_dev)s"
+msgstr "Disk düzenle: %(target_dev)s"
+
+#: instances/views.py:661
+#, python-format
+msgid "Delete disk: %(dev)s"
+msgstr "Disk sil: %(dev)s"
+
+#: instances/views.py:677
+#, python-format
+msgid "Detach disk: %(dev)s"
+msgstr "Diski ayır: %(dev)s"
+
+#: instances/views.py:690
+#, python-format
+msgid "Add CD-ROM: %(target)s"
+msgstr "CD-ROM Ekle: %(target)s"
+
+#: instances/views.py:703
+#, python-format
+msgid "Detach CD-ROM: %(dev)s"
+msgstr "CD-ROM ayır: %(dev)s"
+
+#: instances/views.py:716
+#, python-format
+msgid "Mount media: %(dev)s"
+msgstr "Medya tak: %(dev)s"
+
+#: instances/views.py:729
+#, python-format
+msgid "Unmount media: %(dev)s"
+msgstr "Medyayı ayır: %(dev)s"
+
+#: instances/views.py:742
+#, fuzzy, python-format
+#| msgid "Create snapshot: %(snap)s"
+msgid "Create snapshot: %(snap)s"
+msgstr "Anlık görüntü oluştur: %(snap_name)s"
+
+#: instances/views.py:753
+#, fuzzy, python-format
+#| msgid "Delete snapshot: %(snap)s"
+msgid "Delete snapshot: %(snap)s"
+=======
#: instances/views.py:627
#, fuzzy, python-format
#| msgid "Edit disk: {target_dev}"
@@ -2738,26 +3050,64 @@ msgstr "Yeni anlık görüntü: %(name)s"
#, fuzzy, python-format
#| msgid "Delete snapshot : {snap_name}"
msgid "Delete snapshot: %(snap_name)s"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr "Anlık görüntü sil: %(snap_name)s"
#: instances/views.py:752
msgid "Successful revert snapshot: "
msgstr "Anlık görüntü geri dönüş başarılı:"
+<<<<<<< HEAD
+#: instances/views.py:767
+#, fuzzy
+#| msgid "Delete snapshot: %(snap_name)s"
+msgid "Revert snapshot: %(snap)"
+msgstr "Anlık görüntüye dönüldü: %(snap_name)s"
+
+#: instances/views.py:781
+=======
#: instances/views.py:755
msgid "Revert snapshot"
msgstr "Snapshota dön"
#: instances/views.py:769
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "VCPU %(id)s is enabled=%(enabled)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:790
+=======
#: instances/views.py:780
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "VCPU Hot-plug is enabled=%(status)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:800
+msgid "Set autostart"
+msgstr "Otomatik başlatmayı ayarla"
+
+#: instances/views.py:809
+msgid "Unset autostart"
+msgstr "Otomatik başlatmayı iptal et"
+
+#: instances/views.py:818
+msgid "Enable boot menu"
+msgstr "Ön yükleme menüsünü etkinleştir"
+
+#: instances/views.py:827
+msgid "Disable boot menu"
+msgstr "Ön yükleme menüsünü devredışı bırak"
+
+#: instances/views.py:842
+msgid "Set boot order"
+msgstr "Ön yükleme sırasını ayarla"
+
+#: instances/views.py:847
+=======
#: instances/views.py:791
msgid "Set autostart"
msgstr "Otomatik başlatmayı ayarla"
@@ -2779,6 +3129,7 @@ msgid "Set boot order"
msgstr "Ön yükleme sırasını ayarla"
#: instances/views.py:836
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Boot menu changes applied. But it will be activated after shutdown"
msgstr ""
"Ön yükleme menüsü değişiklikleri uygulandı. Fakat yeniden başlatılınca "
@@ -2788,6 +3139,23 @@ msgstr ""
msgid "Boot order changed successfully."
msgstr "Ön yükleme sırası başarıyla değiştirildi."
+<<<<<<< HEAD
+#: instances/views.py:861
+#, fuzzy
+#| msgid "Can clone instances"
+msgid "Change instance XML"
+msgstr "Sanal makineleri klonlayabilir"
+
+#: instances/views.py:875
+#, python-format
+msgid "Set Guest Agent: %(status)s"
+msgstr "Misafir Ajanını Ayarla: %(status)s"
+
+#: instances/views.py:885
+#, fuzzy
+#| msgid "Set Video Model"
+msgid "Set Video Model: %(model)"
+=======
#: instances/views.py:849
msgid "Edit XML"
msgstr "XML Düzenle"
@@ -2800,6 +3168,7 @@ msgstr "Misafir Aracı Ayarla {status}"
#: instances/views.py:873
msgid "Set Video Model"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr "Video Modeli Ayarla"
#: instances/views.py:882
@@ -2812,6 +3181,31 @@ msgstr ""
"Ağ aygıtı yapılandırması değiştirildi. Aktifleştirmek için lütfen sanal "
"makineyi kapatın."
+<<<<<<< HEAD
+#: instances/views.py:922
+#, fuzzy, python-format
+#| msgid "Add network"
+msgid "Add network: %(mac)s"
+msgstr "AÄŸ ekle: %(mac)s"
+
+#: instances/views.py:933
+#, python-format
+msgid "Delete Network: %(mac)s"
+msgstr "AÄŸ sil: %(mac)s"
+
+#: instances/views.py:946
+#, python-format
+msgid "Set Link State: %(state)s"
+msgstr "Bağlantı durumunu ayarla: %(state)s"
+
+#: instances/views.py:966 networks/views.py:231
+#, python-format
+msgid "%(qos_dir)s QoS is set"
+msgstr "%(qos_dir)s QoS ayarlandı"
+
+#: instances/views.py:971
+#, python-format
+=======
#: instances/views.py:903
msgid "Add network"
msgstr "AÄŸ ekle"
@@ -2836,6 +3230,7 @@ msgstr "%(qos_dir)s QoS ayarlandı"
#, fuzzy, python-format
#| msgid ""
#| "Network XML is changed. \\Stop and start network to activate new config."
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid ""
"%(qos_dir)s QoS is set. Network XML is changed. Stop and "
"start network to activate new config."
@@ -2843,6 +3238,15 @@ msgstr ""
"%(qos_dir)s QoS ayarlandı. Ağ XML i değiştirildi. \\ Aktifleştirmek için "
"durdurun ve yeniden başlatın."
+<<<<<<< HEAD
+#: instances/views.py:988 networks/views.py:246
+#, python-format
+msgid "%(qos_dir)s QoS is deleted"
+msgstr "%(qos_dir)s QoS silindi"
+
+#: instances/views.py:993
+#, python-format
+=======
#: instances/views.py:970
#, fuzzy, python-format
#| msgid "{qos_dir.capitalize()} QoS is deleted"
@@ -2853,6 +3257,7 @@ msgstr "%(qos_dir)s QoS silindi"
#, fuzzy, python-format
#| msgid ""
#| "Network XML is changed. \\Stop and start network to activate new config."
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid ""
"%(qos_dir)s QoS is deleted. Network XML is changed. Stop and "
"start network to activate new config."
@@ -2860,6 +3265,24 @@ msgstr ""
"%(qos_dir)s QoS silindi. Ağ XML i değiştirildi. \\ Aktifleştirmek için "
"durdurun ve yeniden başlatın."
+<<<<<<< HEAD
+#: instances/views.py:1012
+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:1017
+#, python-format
+msgid "Add owner: %(user)s"
+msgstr "Sahip ekle: %(user)s"
+
+#: instances/views.py:1028
+#, python-format
+msgid "Delete owner: %(userinstance_id)s "
+msgstr "Sahip sil: %(userinstance_id)s"
+
+#: instances/views.py:1060
+#, python-format
+=======
#: instances/views.py:990
msgid "Only one owner is allowed and the one already added"
msgstr "Sadece bir sahibe izin verilmiÅŸtir ve bir sahip zaten eklenmiÅŸ"
@@ -2880,11 +3303,35 @@ msgstr "SilinmiÅŸ sahip %(userinstance_id)s"
#, fuzzy, python-format
#| msgid ""
#| "User {quota_msg} quota reached, cannot resize CPU of '{instance.name}'!"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "User '%(quota_msg)s' quota reached, cannot create '%(clone_name)s'!"
msgstr ""
"%(quota_msg)s' Kullanıcı kotası doldu, '%(clone_name)s' in CPU su yeniden "
"boyutlandırılamıyor!"
+<<<<<<< HEAD
+#: instances/views.py:1066
+#, python-format
+msgid "Instance '%(clone_name)s' already exists!"
+msgstr "'%(clone_name)s' sanal makinesi zaten mevcut!"
+
+#: instances/views.py:1069
+#, python-format
+msgid "Instance name '%(clone_name)s' contains invalid characters!"
+msgstr "Sanal makine adı '%(clone_name)s' geçersiz karakterler içermektedir!"
+
+#: instances/views.py:1072
+#, python-format
+msgid "Instance MAC '%(clone_mac)s' invalid format!"
+msgstr "Sanal makine MAC adresi '%(clone_mac)s' geçersiz biçemde belirtilmiş!"
+
+#: instances/views.py:1082
+#, python-format
+msgid "Create a clone of '%(instance_name)s'"
+msgstr "'%(instance_name)s' un klonu oluÅŸtur"
+
+#: instances/views.py:1121
+=======
#: instances/views.py:1044
#, fuzzy
#| msgid "Instance '{clone_data['name']}' already exists!"
@@ -2910,6 +3357,7 @@ msgid "Clone of '%(instance_name)s'"
msgstr "'%(instance_name)s' un klonu"
#: instances/views.py:1093
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid ""
"Error setting console password. You should check that your instance have an "
"graphic device."
@@ -2917,6 +3365,53 @@ msgstr ""
"Konsol parolası ayarlanırken hata oluştu. Sanal makinenin bir grafik "
"aygıtına sahip olduğundan emin olunuz."
+<<<<<<< HEAD
+#: instances/views.py:1126
+msgid "Set VNC password"
+msgstr "VNC parolası ayarlar"
+
+#: instances/views.py:1135
+msgid "Set VNC keymap"
+msgstr "VNC Keymapi ayarla"
+
+#: instances/views.py:1140
+msgid "Set VNC type"
+msgstr "VNC tipini ayarla"
+
+#: instances/views.py:1145
+msgid "Set VNC listen address"
+msgstr "VNC dinleme adresini ayarla"
+
+#: instances/views.py:1168
+msgid "Edit options"
+msgstr "Seçenekleri düzenle"
+
+#: instances/views.py:1182
+msgid "Send console.vv file"
+msgstr "console.vv dosyası gönder"
+
+#: instances/views.py:1243 instances/views.py:1337
+msgid "A virtual machine with this name already exists"
+msgstr "Bu isimde bir sanal makine mevcut"
+
+#: instances/views.py:1320
+msgid "You haven't defined any storage pools"
+msgstr "Hiç bir depolama havuzu tanımlamadınız"
+
+#: instances/views.py:1322
+msgid "You haven't defined any network pools"
+msgstr "Hiç bir ağ havuzu tanımlamadınız"
+
+#: instances/views.py:1339
+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/views.py:1343
+msgid "No Virtual Machine MAC has been entered"
+msgstr "Sanal makine için MAC adresi belirtmediniz"
+
+#: instances/views.py:1374
+=======
#: instances/views.py:1096
msgid "Set VNC password"
msgstr "VNC parolası ayarlar"
@@ -2964,11 +3459,43 @@ msgid "No Virtual Machine MAC has been entered"
msgstr "Sanal makine için MAC adresi belirtmediniz"
#: instances/views.py:1327
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
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"
+<<<<<<< HEAD
+#: instances/views.py:1401
+msgid "First you need to create or select an image"
+msgstr "Ya daha önce oluşturun ya da bir imaj seçin"
+
+#: instances/views.py:1419
+msgid "Invalid cache mode"
+msgstr "Geçersiz önbellek modu"
+
+#: instances/views.py:1460
+msgid "Instance is created"
+msgstr "Sanal makine oluÅŸturuldu"
+
+#: instances/views.py:1481
+msgid "Flavor Created"
+msgstr "Flavor OluÅŸturuldu"
+
+#: instances/views.py:1487
+msgid "Create Flavor"
+msgstr "Kullanıcı Oluştur"
+
+#: instances/views.py:1497
+msgid "Flavor Updated"
+msgstr "Flavor Güncellendi"
+
+#: instances/views.py:1503
+msgid "Update Flavor"
+msgstr "Flavor Güncelle"
+
+#: instances/views.py:1512
+=======
#: instances/views.py:1347
msgid "First you need to create or select an image"
msgstr "Ya daha önce oluşturun ya da bir imaj seçin"
@@ -3006,46 +3533,47 @@ msgstr "Flavor Güncelle"
#: instances/views.py:1460
#, fuzzy
#| msgid "Delete"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Flavor Deleted"
msgstr "Flavor Silindi"
-#: interfaces/forms.py:25
+#: interfaces/forms.py:26
msgid "The IPv4 address must not contain any special characters"
msgstr "IPv4 adresi herhangi bir özel karakter içeremez"
-#: interfaces/forms.py:27
+#: interfaces/forms.py:28
msgid "The IPv4 address must not exceed 20 characters"
msgstr "IPv4 adresi 20 karakterden fazla olamaz"
-#: interfaces/forms.py:34
+#: interfaces/forms.py:35
msgid "The IPv4 gateway must not contain any special characters"
msgstr "IPv4 ağ geçidi adresi herhangi bir özel karakter içeremez"
-#: interfaces/forms.py:36
+#: interfaces/forms.py:37
msgid "The IPv4 gateway must not exceed 20 characters"
msgstr "IPv4 ağ geçidi adresi 20 karakterden fazla olamaz"
-#: interfaces/forms.py:43
+#: interfaces/forms.py:44
msgid "The IPv6 address must not contain any special characters"
msgstr "IPv6 adresi herhangi bir özel karakter içeremez"
-#: interfaces/forms.py:45
+#: interfaces/forms.py:46
msgid "The IPv6 address must not exceed 100 characters"
msgstr "IPv6 adresi 100 karakterden fazla olamaz"
-#: interfaces/forms.py:52
+#: interfaces/forms.py:53
msgid "The IPv6 gateway must not contain any special characters"
msgstr "IPv6 ağ geçidi adresi herhangi bir özel karakter içeremez"
-#: interfaces/forms.py:54
+#: interfaces/forms.py:55
msgid "The IPv6 gateway must not exceed 100 characters"
msgstr "IPv6 ağ geçidi adresi 100 karakterden fazla olamaz"
-#: interfaces/forms.py:61 interfaces/forms.py:70
+#: interfaces/forms.py:62 interfaces/forms.py:71
msgid "The interface must not contain any special characters"
msgstr "Arabirim hehangi bir özel karakter içeremez"
-#: interfaces/forms.py:63 interfaces/forms.py:72
+#: interfaces/forms.py:64 interfaces/forms.py:73
msgid "The interface must not exceed 10 characters"
msgstr "Arabirim 10 karakterden fazla olamaz"
@@ -3179,63 +3707,63 @@ msgstr "Hız"
msgid "Hypervisor doesn't have any Interfaces"
msgstr "Hipervizör hiçbir arabirime sahip değil"
-#: logs/models.py:6
+#: logs/models.py:5
msgid "user"
msgstr "kullanıcı"
-#: logs/models.py:7
+#: logs/models.py:6
msgid "instance"
msgstr "sanal makine"
-#: logs/models.py:8
+#: logs/models.py:7
msgid "message"
msgstr "mesaj"
-#: logs/models.py:9
+#: logs/models.py:8
msgid "date"
msgstr "tarih"
-#: networks/forms.py:7 storages/forms.py:7
+#: networks/forms.py:8 storages/forms.py:8
msgid "No pool name has been entered"
msgstr "Havuz adı girilmedi"
-#: networks/forms.py:9
+#: networks/forms.py:10
msgid "No IPv4 subnet has been entered"
msgstr "IPv4 subneti girilmemiÅŸ"
-#: networks/forms.py:11
+#: networks/forms.py:15
msgid "No IPv6 subnet has been entered"
msgstr "IPv6 subneti girilmemiÅŸ"
-#: networks/forms.py:24 storages/forms.py:22
+#: networks/forms.py:30 storages/forms.py:23
msgid "The pool name must not contain any special characters"
msgstr "Havuz adı herhangi bir özel karakter içermemelidir"
-#: networks/forms.py:26 storages/forms.py:24
+#: networks/forms.py:32 storages/forms.py:25
msgid "The pool name must not exceed 20 characters"
msgstr "Havuz adı 20 karakterden fazla olamaz"
-#: networks/forms.py:33
+#: networks/forms.py:39
msgid "The IPv4 subnet must not contain any special characters"
msgstr "IPv4 subnet herhangi bir özel karakter içeremez"
-#: networks/forms.py:35
+#: networks/forms.py:41
msgid "The IPv4 subnet must not exceed 20 characters"
msgstr "IPv4 subneti 20 karakterden fazla olamaz"
-#: networks/forms.py:42
+#: networks/forms.py:48
msgid "The IPv6 subnet must not contain any special characters"
msgstr "IPv6 subneti herhangi bir özel karakter içeremez"
-#: networks/forms.py:44
+#: networks/forms.py:50
msgid "The IPv6 subnet must not exceed 42 characters"
msgstr "IPv6 subneti 42 karakterden fazla olamaz"
-#: networks/forms.py:52
+#: networks/forms.py:58
msgid "The pool bridge name must not contain any special characters"
msgstr "Havuz köprü adı herhangi bir özel karakter içeremez"
-#: networks/forms.py:54
+#: networks/forms.py:60
msgid "The pool bridge name must not exceed 20 characters"
msgstr "Havuz köprü adı 20 karakterden fazla olamaz"
@@ -3428,6 +3956,35 @@ msgid "Network pool name already in use"
msgstr "Ağ havuzu adı zaten kullanımda"
#: networks/views.py:47
+<<<<<<< HEAD
+msgid "Please enter bridge/dev name"
+msgstr "Lütfen köprü/aygıt adı giriniz"
+
+#: networks/views.py:57
+msgid "For libvirt, the IPv6 network prefix must be /64"
+msgstr "Libvirt için IPv6 ağ prefixi /64 olmak zorundadır"
+
+#: networks/views.py:130
+msgid "Unknown Network Family"
+msgstr "Bilinmeyen AÄŸ Ailesi"
+
+#: networks/views.py:180
+#, python-format
+msgid "Fixed address operation completed for %(family)s"
+msgstr "{%(family)s} sabit adres operasyonu tamamlandı."
+
+#: networks/views.py:190
+#, python-format
+msgid "%(family)s Fixed Address is Deleted."
+msgstr "%(family)s sabit adresi silindi."
+
+#: networks/views.py:198
+#, python-format
+msgid "%(family)s DHCP Range is Changed."
+msgstr "%(family)s DHCP aralığı değiştirildi."
+
+#: networks/views.py:210
+=======
#, fuzzy
#| msgid "Please enter bridge name"
msgid "Please enter bridge/dev name"
@@ -3454,11 +4011,38 @@ msgid "{family.upper()} DHCP Range is Changed."
msgstr "{family.upper()} DHCP aralığı değiştirildi."
#: networks/views.py:203
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid ""
"Network XML is changed. \\Stop and start network to activate new config."
msgstr ""
"Ağ XML i değiştirildi. \\ Aktifleştirmek için durdurun ve yeniden başlatın."
+<<<<<<< HEAD
+#: networks/views.py:215
+msgid "Network XML is changed."
+msgstr "AÄŸ XML i deÄŸiÅŸtirildi."
+
+#: networks/views.py:228
+#, python-format
+msgid ""
+"%(qos_dir)s QoS is updated. Network XML is changed. Stop and start network "
+"to activate new config"
+msgstr ""
+"%(qos_dir)s QoS is updated.Ağ XML i değiştirildi. \\ Aktifleştirmek için "
+"durdurun ve yeniden başlatın."
+
+#: networks/views.py:242
+#, fuzzy, python-format
+#| msgid ""
+#| "%(qos_dir)s QoS is deleted. Network XML is changed. Stop "
+#| "and start network to activate new config."
+msgid ""
+"%(qos_dir)s QoS is deleted. Network XML is changed. "
+"Stop and start network to activate new config"
+msgstr ""
+"%(qos_dir)s QoS silindi. Ağ XML i değiştirildi. \\ Aktifleştirmek için "
+"durdurun ve yeniden başlatın."
+=======
#: networks/views.py:205
msgid "Network XML is changed."
msgstr "AÄŸ XML i deÄŸiÅŸtirildi."
@@ -3475,6 +4059,7 @@ msgstr "Yeni yapılandırmayı aktifleştirmek için ağı durdurun ve başlatı
#: networks/views.py:221
msgid "{} QoS is set"
msgstr "{} QoS ayarlandı"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#: networks/views.py:232
msgid "{qos_dir.capitalize()} QoS is deleted. Network XML is changed. "
@@ -3550,6 +4135,17 @@ msgstr "AÄŸFiltresi Klonla"
msgid "Hypervisor doesn't have any NWFilters"
msgstr "Hipervizör hiç bir AğFiltresine sahip değil"
+<<<<<<< HEAD
+#: nwfilters/views.py:44
+msgid "A network filter with this name already exists"
+msgstr "Bu isimde bir aÄŸ filtresi zaten mevcut"
+
+#: nwfilters/views.py:47
+msgid "A network filter with this UUID already exists"
+msgstr "Bu UUID ye sahip bir aÄŸ filtresi zaten mevcut"
+
+#: nwfilters/views.py:51
+=======
#: nwfilters/views.py:41
msgid "A network filter with this name already exists"
msgstr "Bu isimde bir aÄŸ filtresi zaten mevcut"
@@ -3559,10 +4155,27 @@ msgid "A network filter with this UUID already exists"
msgstr "Bu UUID ye sahip bir aÄŸ filtresi zaten mevcut"
#: nwfilters/views.py:48
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
-msgid "Creating NWFilter: %s"
-msgstr "AÄŸFiltresi OluÅŸturuluyor: %s"
+msgid "%(filter)s network filter is created"
+msgstr "%(filter)s aÄŸ filtresi oluÅŸturuldu"
+<<<<<<< HEAD
+#: nwfilters/views.py:60
+#, python-format
+msgid "%(filter)s network filter is deleted"
+msgstr "%(filter)s aÄŸ filtresi silindi"
+
+#: nwfilters/views.py:76
+#, python-format
+msgid "NWFilter is in use by %(instance)s. Cannot be deleted."
+msgstr "AğFiltresi, %(instance)s tarafından kullanımda. Silinemiyor."
+
+#: nwfilters/views.py:93
+#, python-format
+msgid "Cloning NWFilter %(name)s as %(clone)s"
+msgstr "Ağfiltresi %(name)s , %(clone)s olarak klonlanıyor"
+=======
#: nwfilters/views.py:57
#, python-brace-format
msgid "Deleting NWFilter: {name}"
@@ -3577,6 +4190,7 @@ msgstr "AğFiltresi, {inst} tarafından kullanımda. Silinemiyor."
#, python-brace-format
msgid "Cloning NWFilter {name} as {cln_name}"
msgstr "Ağfiltresi {name} , {cln_name} olarak klonlanıyor"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#: secrets/templates/create_secret_block.html:12
msgid "Create New Secret"
@@ -3626,27 +4240,27 @@ msgstr ""
msgid "Value"
msgstr "DeÄŸer"
-#: storages/forms.py:9 storages/forms.py:36
+#: storages/forms.py:10 storages/forms.py:37
msgid "No path has been entered"
msgstr "Yol girilmedi"
-#: storages/forms.py:33
+#: storages/forms.py:34
msgid "The target must not contain any special characters"
msgstr "Hedef herhangi bir özel karakter içeremez"
-#: storages/forms.py:45
+#: storages/forms.py:46
msgid "No device or path has been entered"
msgstr "Aygıt ya da yol girilmedi"
-#: storages/forms.py:47
+#: storages/forms.py:48
msgid "The disk source must not contain any special characters"
msgstr "Disk kaynağı herhangi bir özel karakter içermemelidir"
-#: storages/forms.py:61 storages/forms.py:76
+#: storages/forms.py:62 storages/forms.py:77
msgid "The image name must not contain any special characters"
msgstr "İmaj adı herhangi bir özel karakter içeremez"
-#: storages/forms.py:78
+#: storages/forms.py:79
msgid "The image name must not exceed 120 characters"
msgstr "İmaj adı 120 karakterden fazla olamaz"
@@ -3697,7 +4311,7 @@ msgstr "Uzak Yol"
#: storages/templates/create_stg_block.html:186
msgid "auto"
-msgstr "oto"
+msgstr "otomatik"
#: storages/templates/create_stg_block.html:187
msgid "nfs"
@@ -3779,7 +4393,7 @@ msgstr "Hipervizör hiçbir birime sahip değil"
msgid "Hypervisor doesn't have any Storages"
msgstr "Hipervizör hiç bir depolama alanına sahip değil"
-#: storages/views.py:40
+#: storages/views.py:39
msgid "Pool name already use"
msgstr "Havuz adı zaten kullanılıyor"
@@ -3787,10 +4401,43 @@ msgstr "Havuz adı zaten kullanılıyor"
msgid "You need create secret for pool"
msgstr ""
+<<<<<<< HEAD
+#: storages/views.py:48
+=======
#: storages/views.py:49
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "You need input all fields for creating ceph pool"
-msgstr ""
+msgstr "CEPH havuzu oluşturmak için tüm alanların doldurulmasına ihtiyaç var"
+<<<<<<< HEAD
+#: storages/views.py:144
+#, python-format
+msgid "Volume: %(volume)s is deleted."
+msgstr "Birim: %(volume)s silindi."
+
+#: storages/views.py:149
+msgid "ISO image already exist"
+msgstr "ISO imajı zaten mevcut"
+
+#: storages/views.py:153
+#, python-format
+msgid "ISO: %(file)s is uploaded."
+msgstr "ISO: %(file)s yüklendi."
+
+#: storages/views.py:162
+msgid "Name of volume already in use"
+msgstr "Birim adı zaten kullanımda"
+
+#: storages/views.py:174
+#, python-format
+msgid "%(image)s image cloned as %(clone)s successfully"
+msgstr "%(image)s imajı %(clone)s olarak başarıyla klonlandı"
+
+#: storages/views.py:220
+#, python-format
+msgid "Image file %(name)s is created successfully"
+msgstr "İmaj dosyası %(name)s başarıyla oluşturuldu"
+=======
#: storages/views.py:132
#, python-brace-format
msgid "Volume: {volname} is deleted."
@@ -3816,6 +4463,7 @@ msgstr "{data['image']} imajı {name} olarak başarıyla klonlandı"
#, python-brace-format
msgid "Image file {name} is created successfully"
msgstr "İmaj dosyası {name} başarıyla oluşturuldu"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#: templates/403.html:3
msgid "403"
@@ -3823,7 +4471,7 @@ msgstr "403"
#: templates/403.html:7 templates/404.html:7 templates/500.html:7
msgid "Oops!"
-msgstr "Oops!"
+msgstr "Amann!"
#: templates/403.html:9
msgid "403 Forbidden"
@@ -5290,12 +5938,20 @@ msgstr "Bağlan, yardım al veya katkıda bulun"
#: venv/lib/python3.6/site-packages/django_icons/renderers/image.py:217
msgid "Icon of {}"
+<<<<<<< HEAD
+msgstr "{} ikonu"
+=======
msgstr ""
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#: venv/lib/python3.6/site-packages/qr_code/qrcode/utils.py:73
#, python-format
msgid "The option '%s' is not a valid option for a QR code."
+<<<<<<< HEAD
+msgstr "'%s' seçeneği QR kodu için geçerli bir seçenek değil."
+=======
msgstr ""
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#: venv2/lib/python2.7/site-packages/django/forms/models.py:1093
msgid "The inline foreign key did not match the parent instance primary key."
@@ -5350,10 +6006,8 @@ msgstr ""
"ayarlamamışsınız."
#: venv2/lib/python2.7/site-packages/gunicorn/argparse_compat.py:313
-#, fuzzy
-#| msgid "Usage"
msgid "usage: "
-msgstr "Kullanım"
+msgstr "kullanım:"
#: venv2/lib/python2.7/site-packages/gunicorn/argparse_compat.py:821
msgid ".__call__() not defined"
@@ -5498,13 +6152,81 @@ msgstr ""
#: venv2/lib/python2.7/site-packages/gunicorn/argparse_compat.py:2362
#, python-format
msgid "%s: error: %s\n"
-msgstr ""
+msgstr "%s hata: %s\n"
#: webvirtcloud/middleware.py:18
#, python-format
msgid "libvirt Error - %(exception)s"
msgstr "libvirt Hatası - %(exception)s"
+<<<<<<< HEAD
+#~ msgid ""
+#~ "%(qos_dir)s QoS is deleted. Network XML is changed. Stop and start "
+#~ "network to activate new config"
+#~ msgstr ""
+#~ "Ağ XML i değiştirildi. \\ Aktifleştirmek için durdurun ve yeniden "
+#~ "başlatın."
+
+#~ msgid "Stop and start network to activate new config."
+#~ msgstr ""
+#~ "Yeni yapılandırmayı aktifleştirmek için ağı durdurun ve yeniden başlatın."
+
+#~ msgid "CPU is resized"
+#~ msgstr "Disk yeniden boyutlandırıldı"
+
+#~ msgid "New snapshot: %(name)s"
+#~ msgstr "Yeni anlık görüntü: %(name)s"
+
+#~ msgid "Revert snapshot"
+#~ msgstr "Snapshota dön"
+
+#~ msgid "Edit XML"
+#~ msgstr "XML Düzenle"
+
+#, fuzzy
+#~| msgid "Password"
+#~ msgid "User password changed: {}"
+#~ msgstr "Kullanıcı parolası değişti: {}"
+
+#, fuzzy
+#~| msgid "Theme changed. Now: {theme}"
+#~ msgid "{} is changed. Now: {}"
+#~ msgstr "Tema deÄŸiÅŸtirildi. Åžimdi: {theme}"
+
+#~ msgid "{} QoS is set"
+#~ msgstr "{} QoS ayarlandı"
+
+#~ msgid "{} QoS is deleted"
+#~ msgstr "{} QoS silindi"
+
+#, fuzzy
+#~| msgid "Creating NWFilter: %s"
+#~ msgid "Creating NWFilter: {}"
+#~ msgstr "AÄŸFiltresi OluÅŸturuluyor: {}"
+
+#, fuzzy
+#~| msgid "Deleting NWFilter: {name}"
+#~ msgid "Deleting NWFilter: {}"
+#~ msgstr "AÄŸFiltresi Siliniyor: {}"
+
+#~ msgid "Resize CPU"
+#~ msgstr "CPU Boyutlandır"
+
+#~ msgid "Resize Memory"
+#~ msgstr "Bellek Boyutlandır"
+
+#~ msgid "{qos_dir.capitalize()} QoS is set. Network XML is changed."
+#~ msgstr ""
+#~ "{qos_dir.capitalize()} QoS ayarlandı. Ağ ayarları XML ile değiştirildi."
+
+#~ msgid "Stop and start network to activate new config"
+#~ msgstr "Yeni yapılandırmayı aktifleştirmek için ağı durdurun ve başlatın"
+
+#~ msgid "{qos_dir.capitalize()} QoS is deleted. Network XML is changed. "
+#~ msgstr "{qos_dir.capitalize()} QoS silindi. AÄŸ XML'i deÄŸiÅŸtirildi."
+
+=======
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#~ msgid "Login"
#~ msgstr "BaÄŸlan"
@@ -5514,9 +6236,12 @@ msgstr "libvirt Hatası - %(exception)s"
#~ msgid "Is superuser"
#~ msgstr "Süperkullanıcı mı"
+<<<<<<< HEAD
+=======
#~ msgid "Can clone instances"
#~ msgstr "Sanal makineleri klonlayabilir"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#~ msgid "Max instances"
#~ msgstr "Maksimum sanal makine"
diff --git a/locale/uk/LC_MESSAGES/django.po b/locale/uk/LC_MESSAGES/django.po
index 6de07c0..5a318c7 100644
--- a/locale/uk/LC_MESSAGES/django.po
+++ b/locale/uk/LC_MESSAGES/django.po
@@ -8,7 +8,11 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
+<<<<<<< HEAD
+"POT-Creation-Date: 2020-11-05 09:36+0000\n"
+=======
"POT-Creation-Date: 2020-10-23 07:53+0000\n"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -296,6 +300,57 @@ msgstr ""
#: accounts/utils.py:51
msgid "Please view HTML version of this message."
+<<<<<<< HEAD
+msgstr ""
+
+#: accounts/views.py:26
+msgid "Profile updated"
+msgstr ""
+
+#: accounts/views.py:44
+msgid "SSH key added"
+msgstr ""
+
+#: accounts/views.py:52
+msgid "Add SSH key"
+msgstr ""
+
+#: accounts/views.py:61
+msgid "SSH key deleted"
+msgstr ""
+
+#: accounts/views.py:69
+msgid "Delete SSH key"
+msgstr ""
+
+#: accounts/views.py:101
+msgid "Password Changed"
+msgstr ""
+
+#: accounts/views.py:121
+msgid "Create User Instance"
+msgstr ""
+
+#: accounts/views.py:139
+msgid "Update User Instance"
+msgstr ""
+
+#: accounts/views.py:175
+#, python-format
+msgid "OTP Sent to %(email)s"
+msgstr ""
+
+#: accounts/views.py:183
+msgid "Email OTP"
+msgstr ""
+
+#: accounts/views.py:194
+#, python-format
+msgid "OTP QR code was emailed to user %(user)s"
+msgstr ""
+
+#: accounts/views.py:196
+=======
msgstr ""
#: accounts/views.py:26
@@ -345,6 +400,7 @@ msgid "OTP QR code was emailed to user %s"
msgstr ""
#: accounts/views.py:177
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "User email not set, failed to send QR code"
msgstr ""
@@ -357,11 +413,20 @@ msgstr ""
msgid "Groups"
msgstr ""
+<<<<<<< HEAD
+#: admin/forms.py:81
+msgid ""
+"Raw passwords are not stored, so there is no way to see this user's "
+"password, \n"
+" but you can change the password using this "
+"form."
+=======
#: admin/forms.py:79
msgid ""
"Raw passwords are not stored, so there is no way to see\n"
" this user's password, but you can change the password using "
"this form."
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: admin/templates/admin/group_list.html:5 admin/views.py:87
@@ -508,6 +573,18 @@ msgstr ""
msgid "Create User"
msgstr ""
+<<<<<<< HEAD
+#: admin/views.py:129
+msgid "Update User"
+msgstr ""
+
+#: admin/views.py:141
+#, python-format
+msgid "Password changed for %(user)s"
+msgstr ""
+
+#: admin/views.py:144
+=======
#: admin/views.py:136
msgid "Update User"
msgstr ""
@@ -517,6 +594,7 @@ msgid "User password changed: {}"
msgstr ""
#: admin/views.py:152
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Wrong Data Provided"
msgstr ""
@@ -802,6 +880,20 @@ msgid "Other Settings"
msgstr ""
#: appsettings/views.py:38
+<<<<<<< HEAD
+#, python-format
+msgid "SASS directory path is changed. Now: %(dir)s"
+msgstr ""
+
+#: appsettings/views.py:67
+#, python-format
+msgid "Theme is changed. Now: %(theme)s"
+msgstr ""
+
+#: appsettings/views.py:82
+#, python-format
+msgid "%(setting)s is changed. Now: %(value)s"
+=======
#, python-brace-format
msgid "SASS directory path is changed. Now: {sass_dir.value}"
msgstr ""
@@ -814,6 +906,7 @@ msgstr ""
#: appsettings/views.py:80
#, python-brace-format
msgid "{setting.name} is changed. Now: {setting.value}"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: computes/forms.py:21
@@ -1701,7 +1794,11 @@ msgstr ""
#: instances/templates/instance_actions.html:25
#: instances/templates/instance_actions.html:37
#: instances/templates/instances/power_tab.html:25
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:82 instances/views.py:270
+=======
#: instances/templates/instances/power_tab.html:82 instances/views.py:264
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Suspend"
msgstr ""
@@ -1755,7 +1852,11 @@ msgstr ""
#: instances/templates/instances/destroy_instance_form.html:40
#: instances/templates/instances/destroy_tab.html:18
#: instances/templates/instances/destroy_tab.html:20
+<<<<<<< HEAD
+#: instances/templates/instances/destroy_tab.html:23 instances/views.py:312
+=======
#: instances/templates/instances/destroy_tab.html:23 instances/views.py:306
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Destroy"
msgstr ""
@@ -1773,20 +1874,32 @@ msgstr ""
#: instances/templates/instance_actions.html:35
#: instances/templates/instances/power_tab.html:47
#: instances/templates/instances/power_tab.html:121
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:123 instances/views.py:245
+=======
#: instances/templates/instances/power_tab.html:123 instances/views.py:239
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Power On"
msgstr ""
#: instances/templates/instance_actions.html:15
#: instances/templates/instances/power_tab.html:9
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:59 instances/views.py:261
+=======
#: instances/templates/instances/power_tab.html:59 instances/views.py:255
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Power Off"
msgstr ""
#: instances/templates/instance_actions.html:16
#: instances/templates/instance_actions.html:29
#: instances/templates/instances/power_tab.html:14
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:66 instances/views.py:254
+=======
#: instances/templates/instances/power_tab.html:66 instances/views.py:248
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Power Cycle"
msgstr ""
@@ -1798,7 +1911,11 @@ msgstr ""
#: instances/templates/instance_actions.html:22
#: instances/templates/instances/power_tab.html:34
#: instances/templates/instances/power_tab.html:93
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:108 instances/views.py:278
+=======
#: instances/templates/instances/power_tab.html:108 instances/views.py:272
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Resume"
msgstr ""
@@ -1806,7 +1923,11 @@ msgstr ""
#: instances/templates/instances/power_tab.html:19
#: instances/templates/instances/power_tab.html:39
#: instances/templates/instances/power_tab.html:74
+<<<<<<< HEAD
+#: instances/templates/instances/power_tab.html:100 instances/views.py:285
+=======
#: instances/templates/instances/power_tab.html:100 instances/views.py:279
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Force Off"
msgstr ""
@@ -2453,7 +2574,7 @@ msgstr ""
#: instances/templates/instances/snapshots_tab.html:22
msgid ""
"This may take more than an hour, depending on how much content is on your "
-"droplet and how large the disk is."
+"instance and how large the disk is."
msgstr ""
#: instances/templates/instances/snapshots_tab.html:27
@@ -2508,6 +2629,26 @@ msgstr ""
msgid "None available device name"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:242
+msgid "Templates cannot be started."
+msgstr ""
+
+#: instances/views.py:345
+#, python-format
+msgid "Instance is migrated to %(hostname)s"
+msgstr ""
+
+#: instances/views.py:368
+msgid "Reset root password"
+msgstr ""
+
+#: instances/views.py:374 instances/views.py:403
+msgid "Please shutdown down your instance and then try again"
+msgstr ""
+
+#: instances/views.py:395
+=======
#: instances/views.py:236
msgid "Templates cannot be started."
msgstr ""
@@ -2526,37 +2667,75 @@ msgid "Please shutdown down your instance and then try again"
msgstr ""
#: instances/views.py:389
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Installed new SSH public key %(keyname)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:422
+=======
#: instances/views.py:416
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"User %(quota_msg)s quota reached, cannot resize CPU of '%(instance_name)s'!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:431
+#, python-format
+msgid "CPU is resized: %(old)s to %(new)s"
+msgstr ""
+
+#: instances/views.py:459
+=======
#: instances/views.py:425
msgid "Resize CPU"
msgstr ""
#: instances/views.py:453
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"User %(quota_msg)s quota reached, cannot resize memory of "
"'%(instance_name)s'!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:466
+#, python-format
+msgid ""
+"Memory is resized: current/max: %(old_cur)s/%(old_max)s to %(new_cur)s/"
+"%(new_max)s"
+msgstr ""
+
+#: instances/views.py:500
+=======
#: instances/views.py:462
msgid "Resize Memory"
msgstr ""
#: instances/views.py:491
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"User %(quota_msg)s quota reached, cannot resize disks of '%(instance_name)s'!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:507
+#, python-format
+msgid "Disk is resized: %(dev)s"
+msgstr ""
+
+#: instances/views.py:546
+#, python-format
+msgid "Attach new disk: %(name)s (%(format)s)"
+msgstr ""
+
+#: instances/views.py:577
+=======
#: instances/views.py:498
msgid "Disk resize"
msgstr ""
@@ -2567,11 +2746,16 @@ msgid "Attach new disk %(name)s (%(format)s)"
msgstr ""
#: instances/views.py:568
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Attach Existing disk: %(target_dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:635
+=======
#: instances/views.py:624
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Volume changes are applied. But it will be activated after shutdown"
msgstr ""
@@ -2579,41 +2763,79 @@ msgstr ""
msgid "Volume is changed successfully."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:639
+=======
#: instances/views.py:627
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Edit disk: %(target_dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:661
+=======
#: instances/views.py:649
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Delete disk: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:677
+=======
#: instances/views.py:665
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Detach disk: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:690
+=======
#: instances/views.py:678
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Add CD-ROM: %(target)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:703
+=======
#: instances/views.py:691
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Detach CD-ROM: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:716
+=======
#: instances/views.py:704
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Mount media: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:729
+=======
#: instances/views.py:717
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Unmount media: %(dev)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:742
+#, python-format
+msgid "Create snapshot: %(snap)s"
+msgstr ""
+
+#: instances/views.py:753
+#, python-format
+msgid "Delete snapshot: %(snap)s"
+=======
#: instances/views.py:730
#, python-format
msgid "New snapshot: %(name)s"
@@ -2622,26 +2844,62 @@ msgstr ""
#: instances/views.py:741
#, python-format
msgid "Delete snapshot: %(snap_name)s"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: instances/views.py:752
msgid "Successful revert snapshot: "
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:767
+msgid "Revert snapshot: %(snap)"
+msgstr ""
+
+#: instances/views.py:781
+=======
#: instances/views.py:755
msgid "Revert snapshot"
msgstr ""
#: instances/views.py:769
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "VCPU %(id)s is enabled=%(enabled)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:790
+=======
#: instances/views.py:780
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "VCPU Hot-plug is enabled=%(status)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:800
+msgid "Set autostart"
+msgstr ""
+
+#: instances/views.py:809
+msgid "Unset autostart"
+msgstr ""
+
+#: instances/views.py:818
+msgid "Enable boot menu"
+msgstr ""
+
+#: instances/views.py:827
+msgid "Disable boot menu"
+msgstr ""
+
+#: instances/views.py:842
+msgid "Set boot order"
+msgstr ""
+
+#: instances/views.py:847
+=======
#: instances/views.py:791
msgid "Set autostart"
msgstr ""
@@ -2663,6 +2921,7 @@ msgid "Set boot order"
msgstr ""
#: instances/views.py:836
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Boot menu changes applied. But it will be activated after shutdown"
msgstr ""
@@ -2670,6 +2929,19 @@ msgstr ""
msgid "Boot order changed successfully."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:861
+msgid "Change instance XML"
+msgstr ""
+
+#: instances/views.py:875
+#, python-format
+msgid "Set Guest Agent: %(status)s"
+msgstr ""
+
+#: instances/views.py:885
+msgid "Set Video Model: %(model)"
+=======
#: instances/views.py:849
msgid "Edit XML"
msgstr ""
@@ -2681,6 +2953,7 @@ msgstr ""
#: instances/views.py:873
msgid "Set Video Model"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: instances/views.py:882
@@ -2691,6 +2964,19 @@ msgstr ""
msgid "Network Device Config is changed. Please shutdown instance to activate."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:922
+#, python-format
+msgid "Add network: %(mac)s"
+msgstr ""
+
+#: instances/views.py:933
+#, python-format
+msgid "Delete Network: %(mac)s"
+msgstr ""
+
+#: instances/views.py:946
+=======
#: instances/views.py:903
msgid "Add network"
msgstr ""
@@ -2700,78 +2986,213 @@ msgid "Delete network"
msgstr ""
#: instances/views.py:933
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Set Link State: %(state)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:966 networks/views.py:231
+=======
#: instances/views.py:952
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "%(qos_dir)s QoS is set"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:971
+=======
#: instances/views.py:956
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"%(qos_dir)s QoS is set. Network XML is changed. Stop and "
"start network to activate new config."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:988 networks/views.py:246
+=======
#: instances/views.py:970
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "%(qos_dir)s QoS is deleted"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:993
+=======
#: instances/views.py:974
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid ""
"%(qos_dir)s QoS is deleted. Network XML is changed. Stop and "
"start network to activate new config."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1012
+msgid "Only one owner is allowed and the one already added"
+msgstr ""
+
+#: instances/views.py:1017
+=======
#: instances/views.py:990
msgid "Only one owner is allowed and the one already added"
msgstr ""
#: instances/views.py:995
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
-msgid "Added owner %(user)s"
+msgid "Add owner: %(user)s"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1028
+#, python-format
+msgid "Delete owner: %(userinstance_id)s "
+msgstr ""
+
+#: instances/views.py:1060
+=======
#: instances/views.py:1006
#, python-format
msgid "Deleted owner %(userinstance_id)s"
msgstr ""
#: instances/views.py:1038
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "User '%(quota_msg)s' quota reached, cannot create '%(clone_name)s'!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1066
+#, python-format
+msgid "Instance '%(clone_name)s' already exists!"
+msgstr ""
+
+#: instances/views.py:1069
+=======
#: instances/views.py:1044
msgid "Instance 'clone_name' already exists!"
msgstr ""
#: instances/views.py:1047
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Instance name '%(clone_name)s' contains invalid characters!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1072
+=======
#: instances/views.py:1050
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
msgid "Instance MAC '%(clone_mac)s' invalid format!"
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1082
+#, python-format
+msgid "Create a clone of '%(instance_name)s'"
+msgstr ""
+
+#: instances/views.py:1121
+=======
#: instances/views.py:1060
#, python-format
msgid "Clone of '%(instance_name)s'"
msgstr ""
#: instances/views.py:1093
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid ""
"Error setting console password. You should check that your instance have an "
"graphic device."
msgstr ""
+<<<<<<< HEAD
+#: instances/views.py:1126
+msgid "Set VNC password"
+msgstr ""
+
+#: instances/views.py:1135
+msgid "Set VNC keymap"
+msgstr ""
+
+#: instances/views.py:1140
+msgid "Set VNC type"
+msgstr ""
+
+#: instances/views.py:1145
+msgid "Set VNC listen address"
+msgstr ""
+
+#: instances/views.py:1168
+msgid "Edit options"
+msgstr ""
+
+#: instances/views.py:1182
+msgid "Send console.vv file"
+msgstr ""
+
+#: instances/views.py:1243 instances/views.py:1337
+msgid "A virtual machine with this name already exists"
+msgstr ""
+
+#: instances/views.py:1320
+msgid "You haven't defined any storage pools"
+msgstr ""
+
+#: instances/views.py:1322
+msgid "You haven't defined any network pools"
+msgstr ""
+
+#: instances/views.py:1339
+msgid "There is an instance with same name. Remove it and try again!"
+msgstr ""
+
+#: instances/views.py:1343
+msgid "No Virtual Machine MAC has been entered"
+msgstr ""
+
+#: instances/views.py:1374
+msgid "Image has already exist. Please check volumes or change instance name"
+msgstr ""
+
+#: instances/views.py:1401
+msgid "First you need to create or select an image"
+msgstr ""
+
+#: instances/views.py:1419
+msgid "Invalid cache mode"
+msgstr ""
+
+#: instances/views.py:1460
+msgid "Instance is created"
+msgstr ""
+
+#: instances/views.py:1481
+msgid "Flavor Created"
+msgstr ""
+
+#: instances/views.py:1487
+msgid "Create Flavor"
+msgstr ""
+
+#: instances/views.py:1497
+msgid "Flavor Updated"
+msgstr ""
+
+#: instances/views.py:1503
+msgid "Update Flavor"
+msgstr ""
+
+#: instances/views.py:1512
+=======
#: instances/views.py:1096
msgid "Set VNC password"
msgstr ""
@@ -2849,46 +3270,47 @@ msgid "Update Flavor"
msgstr ""
#: instances/views.py:1460
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid "Flavor Deleted"
msgstr ""
-#: interfaces/forms.py:25
+#: interfaces/forms.py:26
msgid "The IPv4 address must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:27
+#: interfaces/forms.py:28
msgid "The IPv4 address must not exceed 20 characters"
msgstr ""
-#: interfaces/forms.py:34
+#: interfaces/forms.py:35
msgid "The IPv4 gateway must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:36
+#: interfaces/forms.py:37
msgid "The IPv4 gateway must not exceed 20 characters"
msgstr ""
-#: interfaces/forms.py:43
+#: interfaces/forms.py:44
msgid "The IPv6 address must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:45
+#: interfaces/forms.py:46
msgid "The IPv6 address must not exceed 100 characters"
msgstr ""
-#: interfaces/forms.py:52
+#: interfaces/forms.py:53
msgid "The IPv6 gateway must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:54
+#: interfaces/forms.py:55
msgid "The IPv6 gateway must not exceed 100 characters"
msgstr ""
-#: interfaces/forms.py:61 interfaces/forms.py:70
+#: interfaces/forms.py:62 interfaces/forms.py:71
msgid "The interface must not contain any special characters"
msgstr ""
-#: interfaces/forms.py:63 interfaces/forms.py:72
+#: interfaces/forms.py:64 interfaces/forms.py:73
msgid "The interface must not exceed 10 characters"
msgstr ""
@@ -3022,63 +3444,63 @@ msgstr ""
msgid "Hypervisor doesn't have any Interfaces"
msgstr ""
-#: logs/models.py:6
+#: logs/models.py:5
msgid "user"
msgstr ""
-#: logs/models.py:7
+#: logs/models.py:6
msgid "instance"
msgstr ""
-#: logs/models.py:8
+#: logs/models.py:7
msgid "message"
msgstr ""
-#: logs/models.py:9
+#: logs/models.py:8
msgid "date"
msgstr ""
-#: networks/forms.py:7 storages/forms.py:7
+#: networks/forms.py:8 storages/forms.py:8
msgid "No pool name has been entered"
msgstr ""
-#: networks/forms.py:9
+#: networks/forms.py:10
msgid "No IPv4 subnet has been entered"
msgstr ""
-#: networks/forms.py:11
+#: networks/forms.py:15
msgid "No IPv6 subnet has been entered"
msgstr ""
-#: networks/forms.py:24 storages/forms.py:22
+#: networks/forms.py:30 storages/forms.py:23
msgid "The pool name must not contain any special characters"
msgstr ""
-#: networks/forms.py:26 storages/forms.py:24
+#: networks/forms.py:32 storages/forms.py:25
msgid "The pool name must not exceed 20 characters"
msgstr ""
-#: networks/forms.py:33
+#: networks/forms.py:39
msgid "The IPv4 subnet must not contain any special characters"
msgstr ""
-#: networks/forms.py:35
+#: networks/forms.py:41
msgid "The IPv4 subnet must not exceed 20 characters"
msgstr ""
-#: networks/forms.py:42
+#: networks/forms.py:48
msgid "The IPv6 subnet must not contain any special characters"
msgstr ""
-#: networks/forms.py:44
+#: networks/forms.py:50
msgid "The IPv6 subnet must not exceed 42 characters"
msgstr ""
-#: networks/forms.py:52
+#: networks/forms.py:58
msgid "The pool bridge name must not contain any special characters"
msgstr ""
-#: networks/forms.py:54
+#: networks/forms.py:60
msgid "The pool bridge name must not exceed 20 characters"
msgstr ""
@@ -3274,6 +3696,32 @@ msgstr ""
msgid "Please enter bridge/dev name"
msgstr ""
+<<<<<<< HEAD
+#: networks/views.py:57
+msgid "For libvirt, the IPv6 network prefix must be /64"
+msgstr ""
+
+#: networks/views.py:130
+msgid "Unknown Network Family"
+msgstr ""
+
+#: networks/views.py:180
+#, python-format
+msgid "Fixed address operation completed for %(family)s"
+msgstr ""
+
+#: networks/views.py:190
+#, python-format
+msgid "%(family)s Fixed Address is Deleted."
+msgstr ""
+
+#: networks/views.py:198
+#, python-format
+msgid "%(family)s DHCP Range is Changed."
+msgstr ""
+
+#: networks/views.py:210
+=======
#: networks/views.py:56
msgid "For libvirt, the IPv6 network prefix must be /64"
msgstr ""
@@ -3295,10 +3743,29 @@ msgid "{family.upper()} DHCP Range is Changed."
msgstr ""
#: networks/views.py:203
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgid ""
"Network XML is changed. \\Stop and start network to activate new config."
msgstr ""
+<<<<<<< HEAD
+#: networks/views.py:215
+msgid "Network XML is changed."
+msgstr ""
+
+#: networks/views.py:228
+#, python-format
+msgid ""
+"%(qos_dir)s QoS is updated. Network XML is changed. Stop and start network "
+"to activate new config"
+msgstr ""
+
+#: networks/views.py:242
+#, python-format
+msgid ""
+"%(qos_dir)s QoS is deleted. Network XML is changed. "
+"Stop and start network to activate new config"
+=======
#: networks/views.py:205
msgid "Network XML is changed."
msgstr ""
@@ -3313,6 +3780,7 @@ msgstr ""
#: networks/views.py:221
msgid "{} QoS is set"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: networks/views.py:232
@@ -3388,6 +3856,17 @@ msgstr ""
msgid "Hypervisor doesn't have any NWFilters"
msgstr ""
+<<<<<<< HEAD
+#: nwfilters/views.py:44
+msgid "A network filter with this name already exists"
+msgstr ""
+
+#: nwfilters/views.py:47
+msgid "A network filter with this UUID already exists"
+msgstr ""
+
+#: nwfilters/views.py:51
+=======
#: nwfilters/views.py:41
msgid "A network filter with this name already exists"
msgstr ""
@@ -3397,10 +3876,26 @@ msgid "A network filter with this UUID already exists"
msgstr ""
#: nwfilters/views.py:48
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
#, python-format
-msgid "Creating NWFilter: %s"
+msgid "%(filter)s network filter is created"
msgstr ""
+<<<<<<< HEAD
+#: nwfilters/views.py:60
+#, python-format
+msgid "%(filter)s network filter is deleted"
+msgstr ""
+
+#: nwfilters/views.py:76
+#, python-format
+msgid "NWFilter is in use by %(instance)s. Cannot be deleted."
+msgstr ""
+
+#: nwfilters/views.py:93
+#, python-format
+msgid "Cloning NWFilter %(name)s as %(clone)s"
+=======
#: nwfilters/views.py:57
#, python-brace-format
msgid "Deleting NWFilter: {name}"
@@ -3414,6 +3909,7 @@ msgstr ""
#: nwfilters/views.py:86
#, python-brace-format
msgid "Cloning NWFilter {name} as {cln_name}"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: secrets/templates/create_secret_block.html:12
@@ -3464,27 +3960,27 @@ msgstr ""
msgid "Value"
msgstr ""
-#: storages/forms.py:9 storages/forms.py:36
+#: storages/forms.py:10 storages/forms.py:37
msgid "No path has been entered"
msgstr ""
-#: storages/forms.py:33
+#: storages/forms.py:34
msgid "The target must not contain any special characters"
msgstr ""
-#: storages/forms.py:45
+#: storages/forms.py:46
msgid "No device or path has been entered"
msgstr ""
-#: storages/forms.py:47
+#: storages/forms.py:48
msgid "The disk source must not contain any special characters"
msgstr ""
-#: storages/forms.py:61 storages/forms.py:76
+#: storages/forms.py:62 storages/forms.py:77
msgid "The image name must not contain any special characters"
msgstr ""
-#: storages/forms.py:78
+#: storages/forms.py:79
msgid "The image name must not exceed 120 characters"
msgstr ""
@@ -3617,7 +4113,7 @@ msgstr ""
msgid "Hypervisor doesn't have any Storages"
msgstr ""
-#: storages/views.py:40
+#: storages/views.py:39
msgid "Pool name already use"
msgstr ""
@@ -3625,6 +4121,38 @@ msgstr ""
msgid "You need create secret for pool"
msgstr ""
+<<<<<<< HEAD
+#: storages/views.py:48
+msgid "You need input all fields for creating ceph pool"
+msgstr ""
+
+#: storages/views.py:144
+#, python-format
+msgid "Volume: %(volume)s is deleted."
+msgstr ""
+
+#: storages/views.py:149
+msgid "ISO image already exist"
+msgstr ""
+
+#: storages/views.py:153
+#, python-format
+msgid "ISO: %(file)s is uploaded."
+msgstr ""
+
+#: storages/views.py:162
+msgid "Name of volume already in use"
+msgstr ""
+
+#: storages/views.py:174
+#, python-format
+msgid "%(image)s image cloned as %(clone)s successfully"
+msgstr ""
+
+#: storages/views.py:220
+#, python-format
+msgid "Image file %(name)s is created successfully"
+=======
#: storages/views.py:49
msgid "You need input all fields for creating ceph pool"
msgstr ""
@@ -3653,6 +4181,7 @@ msgstr ""
#: storages/views.py:199
#, python-brace-format
msgid "Image file {name} is created successfully"
+>>>>>>> 159e06221af435700047a8e5ababe758a12d7579
msgstr ""
#: templates/403.html:3
diff --git a/logs/models.py b/logs/models.py
index d45c056..ad9946b 100644
--- a/logs/models.py
+++ b/logs/models.py
@@ -1,12 +1,11 @@
-from django.db.models import Model, CharField, DateTimeField
+from django.db.models import CharField, DateTimeField, Model
from django.utils.translation import gettext_lazy as _
-
class Logs(Model):
- user = CharField(_('user'), max_length=50)
- instance = CharField(_('instance'), max_length=50)
- message = CharField(_('message'), max_length=255)
- date = DateTimeField(_('date'), auto_now=True)
+ user = CharField(_("user"), max_length=50)
+ instance = CharField(_("instance"), max_length=50)
+ message = CharField(_("message"), max_length=255)
+ date = DateTimeField(_("date"), auto_now=True)
def __str__(self):
return self.instance
diff --git a/logs/urls.py b/logs/urls.py
index 41618ae..2e8ca5a 100644
--- a/logs/urls.py
+++ b/logs/urls.py
@@ -1,6 +1,7 @@
from django.urls import path
+
from . import views
urlpatterns = [
- path('vm_logs//', views.vm_logs, name='vm_logs'),
+ path("vm_logs//", views.vm_logs, name="vm_logs"),
]
diff --git a/logs/views.py b/logs/views.py
index 7e98221..0f94940 100644
--- a/logs/views.py
+++ b/logs/views.py
@@ -1,8 +1,6 @@
import json
-from django.http import HttpResponse, HttpResponseRedirect
-from django.shortcuts import render
-from django.urls import reverse
+from django.http import HttpResponse
from admin.decorators import superuser_only
from instances.models import Instance
@@ -29,14 +27,14 @@ def vm_logs(request, vname):
"""
vm = Instance.objects.get(name=vname)
- logs_ = Logs.objects.filter(instance=vm.name, date__gte=vm.created).order_by('-date')
+ logs_ = Logs.objects.filter(instance=vm.name, date__gte=vm.created).order_by("-date")
logs = []
for l in logs_:
log = dict()
- log['user'] = l.user
- log['instance'] = l.instance
- log['message'] = l.message
- log['date'] = l.date.strftime('%x %X')
+ log["user"] = l.user
+ log["instance"] = l.instance
+ log["message"] = l.message
+ log["date"] = l.date.strftime("%x %X")
logs.append(log)
return HttpResponse(json.dumps(logs))
diff --git a/networks/forms.py b/networks/forms.py
index 6b9189f..36ceed9 100644
--- a/networks/forms.py
+++ b/networks/forms.py
@@ -1,15 +1,21 @@
import re
+
from django import forms
from django.utils.translation import gettext_lazy as _
class AddNetPool(forms.Form):
- name = forms.CharField(error_messages={'required': _('No pool name has been entered')},
- max_length=20)
- subnet = forms.CharField(error_messages={'required': _('No IPv4 subnet has been entered')},
- max_length=20, required=False)
- subnet6 = forms.CharField(error_messages={'required': _('No IPv6 subnet has been entered')},
- max_length=42, required=False)
+ name = forms.CharField(error_messages={"required": _("No pool name has been entered")}, max_length=20)
+ subnet = forms.CharField(
+ error_messages={"required": _("No IPv4 subnet has been entered")},
+ max_length=20,
+ required=False,
+ )
+ subnet6 = forms.CharField(
+ error_messages={"required": _("No IPv6 subnet has been entered")},
+ max_length=42,
+ required=False,
+ )
forward = forms.CharField(max_length=100)
dhcp4 = forms.BooleanField(required=False)
dhcp6 = forms.BooleanField(required=False)
@@ -18,38 +24,38 @@ class AddNetPool(forms.Form):
openvswitch = forms.BooleanField(required=False)
def clean_name(self):
- name = self.cleaned_data['name']
- have_symbol = re.match('^[a-zA-Z0-9\.\_\-]+$', name)
+ name = self.cleaned_data["name"]
+ have_symbol = re.match(r"^[a-zA-Z0-9\.\_\-]+$", name)
if not have_symbol:
- raise forms.ValidationError(_('The pool name must not contain any special characters'))
+ raise forms.ValidationError(_("The pool name must not contain any special characters"))
elif len(name) > 20:
- raise forms.ValidationError(_('The pool name must not exceed 20 characters'))
+ raise forms.ValidationError(_("The pool name must not exceed 20 characters"))
return name
def clean_subnet(self):
- subnet = self.cleaned_data['subnet']
- have_symbol = re.match('^[0-9./]+$', subnet if subnet else ".")
+ subnet = self.cleaned_data["subnet"]
+ have_symbol = re.match("^[0-9./]+$", subnet if subnet else ".")
if not have_symbol:
- raise forms.ValidationError(_('The IPv4 subnet must not contain any special characters'))
+ raise forms.ValidationError(_("The IPv4 subnet must not contain any special characters"))
elif len(subnet) > 20:
- raise forms.ValidationError(_('The IPv4 subnet must not exceed 20 characters'))
+ raise forms.ValidationError(_("The IPv4 subnet must not exceed 20 characters"))
return subnet
def clean_subnet6(self):
- subnet = self.cleaned_data['subnet6']
- have_symbol = re.match('^[0-9a-fA-F:/]+$', subnet if subnet else ":")
+ subnet = self.cleaned_data["subnet6"]
+ have_symbol = re.match("^[0-9a-fA-F:/]+$", subnet if subnet else ":")
if not have_symbol:
- raise forms.ValidationError(_('The IPv6 subnet must not contain any special characters'))
+ raise forms.ValidationError(_("The IPv6 subnet must not contain any special characters"))
elif len(subnet) > 42:
- raise forms.ValidationError(_('The IPv6 subnet must not exceed 42 characters'))
+ raise forms.ValidationError(_("The IPv6 subnet must not exceed 42 characters"))
return subnet
def clean_bridge_name(self):
- bridge_name = self.cleaned_data['bridge_name']
- if self.cleaned_data['forward'] in ['bridge', 'macvtap']:
- have_symbol = re.match('^[a-zA-Z0-9\.\_\:\-]+$', bridge_name)
+ bridge_name = self.cleaned_data["bridge_name"]
+ if self.cleaned_data["forward"] in ["bridge", "macvtap"]:
+ have_symbol = re.match(r"^[a-zA-Z0-9\.\_\:\-]+$", bridge_name)
if not have_symbol:
- raise forms.ValidationError(_('The pool bridge name must not contain any special characters'))
+ raise forms.ValidationError(_("The pool bridge name must not contain any special characters"))
elif len(bridge_name) > 20:
- raise forms.ValidationError(_('The pool bridge name must not exceed 20 characters'))
+ raise forms.ValidationError(_("The pool bridge name must not exceed 20 characters"))
return bridge_name
diff --git a/networks/views.py b/networks/views.py
index aade157..f40a395 100644
--- a/networks/views.py
+++ b/networks/views.py
@@ -30,35 +30,37 @@ def networks(request, compute_id):
compute.type,
)
networks = conn.get_networks_info()
- dhcp4 = netmask4 = gateway4 = ''
- dhcp6 = prefix6 = gateway6 = ''
+ dhcp4 = netmask4 = gateway4 = ""
+ dhcp6 = prefix6 = gateway6 = ""
ipv4 = ipv6 = False
- if request.method == 'POST':
- if 'create' in request.POST:
+ if request.method == "POST":
+ if "create" in request.POST:
form = AddNetPool(request.POST)
if form.is_valid():
data = form.cleaned_data
- if data['name'] in networks:
+ if data["name"] in networks:
msg = _("Network pool name already in use")
messages.error(request, msg)
errors = True
- if data['forward'] in ['bridge', 'macvtap'] and data['bridge_name'] == '':
- messages.error(request, _('Please enter bridge/dev name'))
+ if data["forward"] in ["bridge", "macvtap"] and data["bridge_name"] == "":
+ messages.error(request, _("Please enter bridge/dev name"))
errors = True
- if data['subnet']:
+ if data["subnet"]:
ipv4 = True
- gateway4, netmask4, dhcp4 = network_size(data['subnet'], data['dhcp4'])
- if data['subnet6']:
+ gateway4, netmask4, dhcp4 = network_size(data["subnet"], data["dhcp4"])
+ if data["subnet6"]:
ipv6 = True
- gateway6, prefix6, dhcp6 = network_size(data['subnet6'], data['dhcp6'])
- if prefix6 != '64':
- messages.error(request, _('For libvirt, the IPv6 network prefix must be /64'))
+ gateway6, prefix6, dhcp6 = network_size(data["subnet6"], data["dhcp6"])
+ if prefix6 != "64":
+ messages.error(
+ request, _("For libvirt, the IPv6 network prefix must be /64")
+ )
errors = True
if not errors:
conn.create_network(
- data['name'],
- data['forward'],
+ data["name"],
+ data["forward"],
ipv4,
gateway4,
netmask4,
@@ -67,11 +69,13 @@ def networks(request, compute_id):
gateway6,
prefix6,
dhcp6,
- data['bridge_name'],
- data['openvswitch'],
- data['fixed'],
+ data["bridge_name"],
+ data["openvswitch"],
+ data["fixed"],
+ )
+ return HttpResponseRedirect(
+ reverse("network", args=[compute_id, data["name"]])
)
- return HttpResponseRedirect(reverse('network', args=[compute_id, data['name']]))
else:
for msg_err in form.errors.values():
messages.error(request, msg_err.as_text())
@@ -79,7 +83,7 @@ def networks(request, compute_id):
except libvirtError as lib_err:
messages.error(request, lib_err)
- return render(request, 'networks.html', locals())
+ return render(request, "networks.html", locals())
@superuser_only
@@ -128,112 +132,119 @@ def network(request, compute_id, pool):
xml = conn._XMLDesc(0)
except libvirtError as lib_err:
messages.error(request, lib_err)
- return HttpResponseRedirect(reverse('networks', args=compute_id))
+ return HttpResponseRedirect(reverse("networks", args=compute_id))
- if request.method == 'POST':
- if 'start' in request.POST:
+ if request.method == "POST":
+ if "start" in request.POST:
try:
conn.start()
return HttpResponseRedirect(request.get_full_path())
except libvirtError as lib_err:
messages.error(request, lib_err)
- if 'stop' in request.POST:
+ if "stop" in request.POST:
try:
conn.stop()
return HttpResponseRedirect(request.get_full_path())
except libvirtError as lib_err:
messages.error(request, lib_err)
- if 'delete' in request.POST:
+ if "delete" in request.POST:
try:
conn.delete()
- return HttpResponseRedirect(reverse('networks', args=[compute_id]))
+ return HttpResponseRedirect(reverse("networks", args=[compute_id]))
except libvirtError as lib_err:
messages.error(request, lib_err)
- if 'set_autostart' in request.POST:
+ if "set_autostart" in request.POST:
try:
conn.set_autostart(1)
return HttpResponseRedirect(request.get_full_path())
except libvirtError as lib_err:
messages.error(request, lib_err)
- if 'unset_autostart' in request.POST:
+ if "unset_autostart" in request.POST:
try:
conn.set_autostart(0)
return HttpResponseRedirect(request.get_full_path())
except libvirtError as lib_err:
messages.error(request, lib_err)
- if 'modify_fixed_address' in request.POST:
- name = request.POST.get('name', '')
- address = request.POST.get('address', '')
- family = request.POST.get('family', 'ipv4')
+ if "modify_fixed_address" in request.POST:
+ name = request.POST.get("name", "")
+ address = request.POST.get("address", "")
+ family = request.POST.get("family", "ipv4")
- if family == 'ipv4':
- mac_duid = request.POST.get('mac', '')
- if family == 'ipv6':
- mac_duid = request.POST.get('id', '')
+ if family == "ipv4":
+ mac_duid = request.POST.get("mac", "")
+ if family == "ipv6":
+ mac_duid = request.POST.get("id", "")
try:
ret_val = conn.modify_fixed_address(name, address, mac_duid, family)
- messages.success(request, _(f"{family.upper()} Fixed Address Operation Completed."))
+ messages.success(request, _("Fixed address operation completed for %(family)s") % {"family": family.upper()})
return HttpResponseRedirect(request.get_full_path())
except libvirtError as lib_err:
messages.error(request, lib_err)
except ValueError as val_err:
messages.error(request, val_err)
- if 'delete_fixed_address' in request.POST:
- ip = request.POST.get('address', '')
- family = request.POST.get('family', 'ipv4')
+ if "delete_fixed_address" in request.POST:
+ ip = request.POST.get("address", "")
+ family = request.POST.get("family", "ipv4")
conn.delete_fixed_address(ip, family)
- messages.success(request, _(f"{family.upper()} Fixed Address is Deleted."))
+ messages.success(request, _("%(family)s Fixed Address is Deleted.") % {"family": family.upper()})
return HttpResponseRedirect(request.get_full_path())
- if 'modify_dhcp_range' in request.POST:
- range_start = request.POST.get('range_start', '')
- range_end = request.POST.get('range_end', '')
- family = request.POST.get('family', 'ipv4')
+ if "modify_dhcp_range" in request.POST:
+ range_start = request.POST.get("range_start", "")
+ range_end = request.POST.get("range_end", "")
+ family = request.POST.get("family", "ipv4")
try:
conn.modify_dhcp_range(range_start, range_end, family)
- messages.success(request, _(f"{family.upper()} DHCP Range is Changed."))
+ messages.success(request, _("%(family)s DHCP Range is Changed.") % {"family": family.upper()})
return HttpResponseRedirect(request.get_full_path())
except libvirtError as lib_err:
messages.error(request, lib_err)
- if 'edit_network' in request.POST:
- edit_xml = request.POST.get('edit_xml', '')
+ if "edit_network" in request.POST:
+ edit_xml = request.POST.get("edit_xml", "")
if edit_xml:
conn.edit_network(edit_xml)
if conn.is_active():
- messages.success(request, _("Network XML is changed. \\" "Stop and start network to activate new config."))
+ messages.success(
+ request,
+ _(
+ "Network XML is changed. \\"
+ "Stop and start network to activate new config."
+ ),
+ )
else:
messages.success(request, _("Network XML is changed."))
return HttpResponseRedirect(request.get_full_path())
- if 'set_qos' in request.POST:
- qos_dir = request.POST.get('qos_direction', '')
- average = request.POST.get('qos_average') or 0
- peak = request.POST.get('qos_peak') or 0
- burst = request.POST.get('qos_burst') or 0
+ if "set_qos" in request.POST:
+ qos_dir = request.POST.get("qos_direction", "")
+ average = request.POST.get("qos_average") or 0
+ peak = request.POST.get("qos_peak") or 0
+ burst = request.POST.get("qos_burst") or 0
try:
conn.set_qos(qos_dir, average, peak, burst)
if conn.is_active():
messages.success(
request,
- _(f"{qos_dir.capitalize()} QoS is set. Network XML is changed.") +
- _("Stop and start network to activate new config"))
+ _("%(qos_dir)s QoS is updated. Network XML is changed. Stop and start network to activate new config") % {"qos_dir": qos_dir.capitalize()}
+ )
else:
- messages.success(request, _("{} QoS is set").format(qos_dir.capitalize()))
+ messages.success(request, _("%(qos_dir)s QoS is set") % {"qos_dir": qos_dir.capitalize()})
except libvirtError as lib_err:
messages.error(request, lib_err)
return HttpResponseRedirect(request.get_full_path())
- if 'unset_qos' in request.POST:
- qos_dir = request.POST.get('qos_direction', '')
+ if "unset_qos" in request.POST:
+ qos_dir = request.POST.get("qos_direction", "")
conn.unset_qos(qos_dir)
if conn.is_active():
messages.success(
request,
- _(f"{qos_dir.capitalize()} QoS is deleted. Network XML is changed. ") +
- _("Stop and start network to activate new config."))
+ _("%(qos_dir)s QoS is deleted. Network XML is changed. \
+ Stop and start network to activate new config") % {"qos_dir": qos_dir.capitalize()}
+ )
else:
- messages.success(request, _(f"{qos_dir.capitalize()} QoS is deleted"))
+ messages.success(request, _("%(qos_dir)s QoS is deleted") % {"qos_dir": qos_dir.capitalize()})
return HttpResponseRedirect(request.get_full_path())
conn.close()
- return render(request, 'network.html', locals())
+ return render(request, "network.html", locals())
diff --git a/nwfilters/apps.py b/nwfilters/apps.py
index 11475c5..496ed18 100644
--- a/nwfilters/apps.py
+++ b/nwfilters/apps.py
@@ -5,4 +5,4 @@ from django.apps import AppConfig
class NwfiltersConfig(AppConfig):
- name = 'nwfilters'
+ name = "nwfilters"
diff --git a/nwfilters/views.py b/nwfilters/views.py
index 3ac9407..7cb690d 100644
--- a/nwfilters/views.py
+++ b/nwfilters/views.py
@@ -25,48 +25,55 @@ def nwfilters(request, compute_id):
try:
conn = wvmNWFilters(compute.hostname, compute.login, compute.password, compute.type)
- if request.method == 'POST':
- if 'create_nwfilter' in request.POST:
- xml = request.POST.get('nwfilter_xml', '')
+ for nwf in conn.get_nwfilters():
+ nwfilters_all.append(conn.get_nwfilter_info(nwf))
+
+ if request.method == "POST":
+ if "create_nwfilter" in request.POST:
+ xml = request.POST.get("nwfilter_xml", "")
if xml:
try:
util.etree.fromstring(xml)
- name = util.get_xml_path(xml, '/filter/@name')
- uuid = util.get_xml_path(xml, '/filter/uuid')
+ name = util.get_xml_path(xml, "/filter/@name")
+ uuid = util.get_xml_path(xml, "/filter/uuid")
except util.etree.ParseError:
name = None
- for nwf in nwfilters:
- if name == nwf.name():
+ for nwf in nwfilters_all:
+ if name == nwf["name"]:
error_msg = _("A network filter with this name already exists")
raise Exception(error_msg)
- if uuid == nwf.UUIDString():
+ if uuid == nwf["uuid"]:
error_msg = _("A network filter with this UUID already exists")
raise Exception(error_msg)
else:
try:
- msg = _("Creating NWFilter: %s" % name)
+ msg = _("%(filter)s network filter is created") % {"filter": name}
conn.create_nwfilter(xml)
addlogmsg(request.user.username, compute.hostname, msg)
except libvirtError as lib_err:
messages.error(request, lib_err)
addlogmsg(request.user.username, compute.hostname, lib_err)
- if 'del_nwfilter' in request.POST:
- name = request.POST.get('nwfiltername', '')
- msg = _(f"Deleting NWFilter: {name}")
+ if "del_nwfilter" in request.POST:
+ name = request.POST.get("nwfiltername", "")
+ msg = _("%(filter)s network filter is deleted") % {"filter": name}
in_use = False
nwfilter = conn.get_nwfilter(name)
- is_conn = wvmInstances(compute.hostname, compute.login, compute.password, compute.type)
+ is_conn = wvmInstances(
+ compute.hostname, compute.login, compute.password, compute.type
+ )
instances = is_conn.get_instances()
for inst in instances:
- i_conn = wvmInstance(compute.hostname, compute.login, compute.password, compute.type, inst)
+ i_conn = wvmInstance(
+ compute.hostname, compute.login, compute.password, compute.type, inst
+ )
dom_filterrefs = i_conn.get_filterrefs()
if name in dom_filterrefs:
in_use = True
- msg = _(f"NWFilter is in use by {inst}. Cannot be deleted.")
+ msg = _("NWFilter is in use by %(instance)s. Cannot be deleted.") % {"instance": inst}
messages.error(request, msg)
addlogmsg(request.user.username, compute.hostname, msg)
i_conn.close()
@@ -77,18 +84,15 @@ def nwfilters(request, compute_id):
nwfilter.undefine()
addlogmsg(request.user.username, compute.hostname, msg)
- if 'cln_nwfilter' in request.POST:
+ if "cln_nwfilter" in request.POST:
- name = request.POST.get('nwfiltername', '')
- cln_name = request.POST.get('cln_name', name + '-clone')
+ name = request.POST.get("nwfiltername", "")
+ cln_name = request.POST.get("cln_name", name + "-clone")
conn.clone_nwfilter(name, cln_name)
- msg = _(f"Cloning NWFilter {name} as {cln_name}")
+ msg = _("Cloning NWFilter %(name)s as %(clone)s") % {"name":name, "clone": cln_name}
addlogmsg(request.user.username, compute.hostname, msg)
- for nwf in conn.get_nwfilters():
- nwfilters_all.append(conn.get_nwfilter_info(nwf))
-
conn.close()
except libvirtError as lib_err:
messages.error(request, lib_err)
@@ -97,10 +101,14 @@ def nwfilters(request, compute_id):
messages.error(request, err)
addlogmsg(request.user.username, compute.hostname, err)
- return render(request, 'nwfilters.html', {
- 'nwfilters': nwfilters_all,
- 'compute': compute,
- })
+ return render(
+ request,
+ "nwfilters.html",
+ {
+ "nwfilters": nwfilters_all,
+ "compute": compute,
+ },
+ )
def nwfilter(request, compute_id, nwfltr):
@@ -114,7 +122,9 @@ def nwfilter(request, compute_id, nwfltr):
compute = get_object_or_404(Compute, pk=compute_id)
try:
- nwfilter = wvmNWFilter(compute.hostname, compute.login, compute.password, compute.type, nwfltr)
+ nwfilter = wvmNWFilter(
+ compute.hostname, compute.login, compute.password, compute.type, nwfltr
+ )
conn = wvmNWFilters(compute.hostname, compute.login, compute.password, compute.type)
for nwf in conn.get_nwfilters():
@@ -126,10 +136,10 @@ def nwfilter(request, compute_id, nwfltr):
rules = nwfilter.get_rules()
refs = nwfilter.get_filter_refs()
- if request.method == 'POST':
+ if request.method == "POST":
- if 'edit_nwfilter' in request.POST:
- new_xml = request.POST.get('edit_xml', '')
+ if "edit_nwfilter" in request.POST:
+ new_xml = request.POST.get("edit_xml", "")
if new_xml:
nwfilter.delete()
@@ -139,10 +149,10 @@ def nwfilter(request, compute_id, nwfltr):
conn.create_nwfilter(xml)
raise libvirtError(lib_err)
- if 'del_nwfilter_rule' in request.POST:
- action = request.POST.get('action', '')
- direction = request.POST.get('direction', '')
- priority = request.POST.get('priority', '')
+ if "del_nwfilter_rule" in request.POST:
+ action = request.POST.get("action", "")
+ direction = request.POST.get("direction", "")
+ priority = request.POST.get("priority", "")
new_xml = nwfilter.delete_rule(action, direction, priority)
nwfilter.delete()
@@ -152,8 +162,8 @@ def nwfilter(request, compute_id, nwfltr):
conn.create_nwfilter(xml)
raise libvirtError(lib_err)
- if 'del_nwfilter_ref' in request.POST:
- ref_name = request.POST.get('ref')
+ if "del_nwfilter_ref" in request.POST:
+ ref_name = request.POST.get("ref")
new_xml = nwfilter.delete_ref(ref_name)
nwfilter.delete()
try:
@@ -162,8 +172,8 @@ def nwfilter(request, compute_id, nwfltr):
conn.create_nwfilter(xml)
raise libvirtError(lib_err)
- if 'add_nwfilter_rule' in request.POST:
- rule_xml = request.POST.get('nwfilterrule_xml', '')
+ if "add_nwfilter_rule" in request.POST:
+ rule_xml = request.POST.get("nwfilterrule_xml", "")
if not rule_xml:
return HttpResponseRedirect(request.get_full_path())
new_xml = nwfilter.add_rule(rule_xml)
@@ -174,8 +184,8 @@ def nwfilter(request, compute_id, nwfltr):
conn.create_nwfilter(xml)
raise libvirtError(lib_err)
- if 'add_nwfilter_ref' in request.POST:
- ref_name = request.POST.get('nwfilters_select', '')
+ if "add_nwfilter_ref" in request.POST:
+ ref_name = request.POST.get("nwfilters_select", "")
if not ref_name:
return HttpResponseRedirect(request.get_full_path())
new_xml = nwfilter.add_ref(ref_name)
@@ -194,4 +204,4 @@ def nwfilter(request, compute_id, nwfltr):
except Exception as error_msg:
messages.error(request, error_msg)
- return render(request, 'nwfilter.html', locals())
+ return render(request, "nwfilter.html", locals())
diff --git a/secrets/views.py b/secrets/views.py
index 3788d87..3bcee54 100644
--- a/secrets/views.py
+++ b/secrets/views.py
@@ -5,8 +5,14 @@ from computes.models import Compute
from django.contrib import messages
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
-from libvirt import (VIR_SECRET_USAGE_TYPE_CEPH, VIR_SECRET_USAGE_TYPE_ISCSI, VIR_SECRET_USAGE_TYPE_NONE,
- VIR_SECRET_USAGE_TYPE_TLS, VIR_SECRET_USAGE_TYPE_VOLUME, libvirtError)
+from libvirt import (
+ VIR_SECRET_USAGE_TYPE_CEPH,
+ VIR_SECRET_USAGE_TYPE_ISCSI,
+ VIR_SECRET_USAGE_TYPE_NONE,
+ VIR_SECRET_USAGE_TYPE_TLS,
+ VIR_SECRET_USAGE_TYPE_VOLUME,
+ libvirtError,
+)
from vrtManager.secrets import wvmSecrets
@@ -36,36 +42,38 @@ def secrets(request, compute_id):
secrt = conn.get_secret(uuid)
try:
secrt_value = conn.get_secret_value(uuid)
- except libvirtError as lib_err:
+ except libvirtError:
secrt_value = None
- secrets_all.append({
- 'usage': secrt.usageID(),
- 'uuid': secrt.UUIDString(),
- 'usageType': secret_usage_types[secrt.usageType()],
- 'value': secrt_value
- })
- if request.method == 'POST':
- if 'create' in request.POST:
+ secrets_all.append(
+ {
+ "usage": secrt.usageID(),
+ "uuid": secrt.UUIDString(),
+ "usageType": secret_usage_types[secrt.usageType()],
+ "value": secrt_value,
+ }
+ )
+ if request.method == "POST":
+ if "create" in request.POST:
form = AddSecret(request.POST)
if form.is_valid():
data = form.cleaned_data
conn.create_secret(
- data['ephemeral'],
- data['private'],
- data['usage_type'],
- data['data'],
+ data["ephemeral"],
+ data["private"],
+ data["usage_type"],
+ data["data"],
)
return HttpResponseRedirect(request.get_full_path())
else:
for msg_err in form.errors.values():
messages.error(request, msg_err.as_text())
- if 'delete' in request.POST:
- uuid = request.POST.get('uuid', '')
+ if "delete" in request.POST:
+ uuid = request.POST.get("uuid", "")
conn.delete_secret(uuid)
return HttpResponseRedirect(request.get_full_path())
- if 'set_value' in request.POST:
- uuid = request.POST.get('uuid', '')
- value = request.POST.get('value', '')
+ if "set_value" in request.POST:
+ uuid = request.POST.get("uuid", "")
+ value = request.POST.get("value", "")
try:
conn.set_secret_value(uuid, value)
except Exception as err:
@@ -74,4 +82,4 @@ def secrets(request, compute_id):
except libvirtError as err:
messages.error(request, err)
- return render(request, 'secrets.html', locals())
+ return render(request, "secrets.html", locals())
diff --git a/storages/forms.py b/storages/forms.py
index f2fd89b..64dcd3c 100644
--- a/storages/forms.py
+++ b/storages/forms.py
@@ -1,4 +1,5 @@
import re
+
from django import forms
from django.utils.translation import gettext_lazy as _
diff --git a/storages/views.py b/storages/views.py
index b3ee0b1..1934237 100644
--- a/storages/views.py
+++ b/storages/views.py
@@ -8,7 +8,6 @@ from django.utils.translation import gettext_lazy as _
from libvirt import libvirtError
from admin.decorators import superuser_only
-from appsettings.models import AppSettings
from appsettings.settings import app_settings
from computes.models import Compute
from storages.forms import AddStgPool, CloneImage, CreateVolumeForm
@@ -31,34 +30,46 @@ def storages(request, compute_id):
storages = conn.get_storages_info()
secrets = conn.get_secrets()
- if request.method == 'POST':
- if 'create' in request.POST:
+ if request.method == "POST":
+ if "create" in request.POST:
form = AddStgPool(request.POST)
if form.is_valid():
data = form.cleaned_data
- if data['name'] in storages:
+ if data["name"] in storages:
msg = _("Pool name already use")
messages.error(request, msg)
errors = True
- if data['stg_type'] == 'rbd':
- if not data['secret']:
+ if data["stg_type"] == "rbd":
+ if not data["secret"]:
msg = _("You need create secret for pool")
messages.error(request, msg)
errors = True
- if not data['ceph_pool'] and not data['ceph_host'] and not data['ceph_user']:
+ if not data["ceph_pool"] and not data["ceph_host"] and not data["ceph_user"]:
msg = _("You need input all fields for creating ceph pool")
messages.error(request, msg)
errors = True
if not errors:
- if data['stg_type'] == 'rbd':
- conn.create_storage_ceph(data['stg_type'], data['name'], data['ceph_pool'], data['ceph_host'],
- data['ceph_user'], data['secret'])
- elif data['stg_type'] == 'netfs':
- conn.create_storage_netfs(data['stg_type'], data['name'], data['netfs_host'], data['source'],
- data['source_format'], data['target'])
+ if data["stg_type"] == "rbd":
+ conn.create_storage_ceph(
+ data["stg_type"],
+ data["name"],
+ data["ceph_pool"],
+ data["ceph_host"],
+ data["ceph_user"],
+ data["secret"],
+ )
+ elif data["stg_type"] == "netfs":
+ conn.create_storage_netfs(
+ data["stg_type"],
+ data["name"],
+ data["netfs_host"],
+ data["source"],
+ data["source_format"],
+ data["target"],
+ )
else:
- conn.create_storage(data['stg_type'], data['name'], data['source'], data['target'])
- return HttpResponseRedirect(reverse('storage', args=[compute_id, data['name']]))
+ conn.create_storage(data["stg_type"], data["name"], data["source"], data["target"])
+ return HttpResponseRedirect(reverse("storage", args=[compute_id, data["name"]]))
else:
for msg_err in form.errors.values():
messages.error(request, msg_err.as_text())
@@ -66,7 +77,7 @@ def storages(request, compute_id):
except libvirtError as lib_err:
messages.error(request, lib_err)
- return render(request, 'storages.html', locals())
+ return render(request, "storages.html", locals())
@superuser_only
@@ -77,9 +88,10 @@ def storage(request, compute_id, pool):
:param pool:
:return:
"""
+
def handle_uploaded_file(path, f_name):
- target = path + '/' + str(f_name)
- destination = open(target, 'wb+')
+ target = path + "/" + str(f_name)
+ destination = open(target, "wb+")
for chunk in f_name.chunks():
destination.write(chunk)
destination.close()
@@ -93,7 +105,7 @@ def storage(request, compute_id, pool):
storages = conn.get_storages()
state = conn.is_active()
size, free = conn.get_size()
- used = (size - free)
+ used = size - free
if state:
percent = (used * 100) // size
else:
@@ -109,55 +121,58 @@ def storage(request, compute_id, pool):
else:
volumes = None
- if request.method == 'POST':
- if 'start' in request.POST:
+ if request.method == "POST":
+ if "start" in request.POST:
conn.start()
return HttpResponseRedirect(request.get_full_path())
- if 'stop' in request.POST:
+ if "stop" in request.POST:
conn.stop()
return HttpResponseRedirect(request.get_full_path())
- if 'delete' in request.POST:
+ if "delete" in request.POST:
conn.delete()
- return HttpResponseRedirect(reverse('storages', args=[compute_id]))
- if 'set_autostart' in request.POST:
+ return HttpResponseRedirect(reverse("storages", args=[compute_id]))
+ if "set_autostart" in request.POST:
conn.set_autostart(1)
return HttpResponseRedirect(request.get_full_path())
- if 'unset_autostart' in request.POST:
+ if "unset_autostart" in request.POST:
conn.set_autostart(0)
return HttpResponseRedirect(request.get_full_path())
- if 'del_volume' in request.POST:
- volname = request.POST.get('volname', '')
+ if "del_volume" in request.POST:
+ volname = request.POST.get("volname", "")
vol = conn.get_volume(volname)
vol.delete(0)
- messages.success(request, _(f"Volume: {volname} is deleted."))
- return redirect(reverse('storage', args=[compute.id, pool]))
+ messages.success(request, _("Volume: %(volume)s is deleted.") % {"vol": volname})
+ return redirect(reverse("storage", args=[compute.id, pool]))
# return HttpResponseRedirect(request.get_full_path())
- if 'iso_upload' in request.POST:
- if str(request.FILES['file']) in conn.update_volumes():
+ if "iso_upload" in request.POST:
+ if str(request.FILES["file"]) in conn.update_volumes():
error_msg = _("ISO image already exist")
messages.error(request, error_msg)
else:
- handle_uploaded_file(path, request.FILES['file'])
- messages.success(request, _(f"ISO: {request.FILES['file']} is uploaded."))
+ handle_uploaded_file(path, request.FILES["file"])
+ messages.success(request, _("ISO: %(file)s is uploaded.") % {"file": request.FILES["file"]})
return HttpResponseRedirect(request.get_full_path())
- if 'cln_volume' in request.POST:
+ if "cln_volume" in request.POST:
form = CloneImage(request.POST)
if form.is_valid():
data = form.cleaned_data
- img_name = data['name']
+ img_name = data["name"]
meta_prealloc = 0
if img_name in conn.update_volumes():
msg = _("Name of volume already in use")
messages.error(request, msg)
- if data['convert']:
- format = data['format']
- if data['meta_prealloc'] and data['format'] == 'qcow2':
+ if data["convert"]:
+ format = data["format"]
+ if data["meta_prealloc"] and data["format"] == "qcow2":
meta_prealloc = True
else:
format = None
try:
- name = conn.clone_volume(data['image'], data['name'], format, meta_prealloc)
- messages.success(request, _(f"{data['image']} image cloned as {name} successfully"))
+ name = conn.clone_volume(data["image"], data["name"], format, meta_prealloc)
+ messages.success(
+ request,
+ _("%(image)s image cloned as %(clone)s successfully") % {"image": data["image"], "name": name},
+ )
return HttpResponseRedirect(request.get_full_path())
except libvirtError as lib_err:
messages.error(request, lib_err)
@@ -167,11 +182,17 @@ def storage(request, compute_id, pool):
conn.close()
- return render(request, 'storage.html', locals())
+ return render(request, "storage.html", locals())
@superuser_only
def create_volume(request, compute_id, pool):
+ """
+ :param request:
+ :param compute_id: compute id
+ :param pool: pool name
+ :return:
+ """
compute = get_object_or_404(Compute, pk=compute_id)
meta_prealloc = False
@@ -182,26 +203,26 @@ def create_volume(request, compute_id, pool):
form = CreateVolumeForm(request.POST or None)
if form.is_valid():
data = form.cleaned_data
- if data['meta_prealloc'] and data['format'] == 'qcow2':
+ if data["meta_prealloc"] and data["format"] == "qcow2":
meta_prealloc = True
disk_owner_uid = int(app_settings.INSTANCE_VOLUME_DEFAULT_OWNER_UID)
disk_owner_gid = int(app_settings.INSTANCE_VOLUME_DEFAULT_OWNER_GID)
name = conn.create_volume(
- data['name'],
- data['size'],
- data['format'],
+ data["name"],
+ data["size"],
+ data["format"],
meta_prealloc,
disk_owner_uid,
disk_owner_gid,
)
- messages.success(request, _(f"Image file {name} is created successfully"))
+ messages.success(request, _("Image file %(name)s is created successfully") % {"name": name})
else:
for msg_err in form.errors.values():
messages.error(request, msg_err.as_text())
- return redirect(reverse('storage', args=[compute.id, pool]))
+ return redirect(reverse("storage", args=[compute.id, pool]))
def get_volumes(request, compute_id, pool):
@@ -216,7 +237,7 @@ def get_volumes(request, compute_id, pool):
try:
conn = wvmStorage(compute.hostname, compute.login, compute.password, compute.type, pool)
conn.refresh()
- data['vols'] = sorted(conn.get_volumes())
+ data["vols"] = sorted(conn.get_volumes())
except libvirtError:
pass
return HttpResponse(json.dumps(data))
diff --git a/vrtManager/IPy.py b/vrtManager/IPy.py
index b157f3d..163010b 100644
--- a/vrtManager/IPy.py
+++ b/vrtManager/IPy.py
@@ -6,7 +6,7 @@ Further Information might be available at:
https://github.com/haypo/python-ipy
"""
-__version__ = '1.00'
+__version__ = "1.00"
import bisect
import collections
@@ -17,16 +17,16 @@ import types
# this should include www.iana.org/assignments/ipv4-address-space
# and www.iana.org/assignments/multicast-addresses
IPv4ranges = {
- '0': 'PUBLIC', # fall back
- '00000000': 'PRIVATE', # 0/8
- '00001010': 'PRIVATE', # 10/8
- '0110010001': 'CARRIER_GRADE_NAT', # 100.64/10
- '01111111': 'LOOPBACK', # 127.0/8
- '1': 'PUBLIC', # fall back
- '1010100111111110': 'PRIVATE', # 169.254/16
- '101011000001': 'PRIVATE', # 172.16/12
- '1100000010101000': 'PRIVATE', # 192.168/16
- '111': 'RESERVED', # 224/3
+ "0": "PUBLIC", # fall back
+ "00000000": "PRIVATE", # 0/8
+ "00001010": "PRIVATE", # 10/8
+ "0110010001": "CARRIER_GRADE_NAT", # 100.64/10
+ "01111111": "LOOPBACK", # 127.0/8
+ "1": "PUBLIC", # fall back
+ "1010100111111110": "PRIVATE", # 169.254/16
+ "101011000001": "PRIVATE", # 172.16/12
+ "1100000010101000": "PRIVATE", # 192.168/16
+ "111": "RESERVED", # 224/3
}
# Definition of the Ranges for IPv6 IPs
@@ -34,92 +34,92 @@ IPv4ranges = {
# http://www.iana.org/assignments/ipv6-unicast-address-assignments/
# http://www.iana.org/assignments/ipv6-multicast-addresses/
IPv6ranges = {
- '00000000': 'RESERVED', # ::/8
- '0' * 96: 'RESERVED', # ::/96 Formerly IPV4COMP [RFC4291]
- '0' * 128: 'UNSPECIFIED', # ::/128
- '0' * 127 + '1': 'LOOPBACK', # ::1/128
- '0' * 80 + '1' * 16: 'IPV4MAP', # ::ffff:0:0/96
- '00000000011001001111111110011011' + '0' * 64: 'WKP46TRANS', # 0064:ff9b::/96 Well-Known-Prefix [RFC6052]
- '00000001': 'UNASSIGNED', # 0100::/8
- '0000001': 'RESERVED', # 0200::/7 Formerly NSAP [RFC4048]
- '0000010': 'RESERVED', # 0400::/7 Formerly IPX [RFC3513]
- '0000011': 'RESERVED', # 0600::/7
- '00001': 'RESERVED', # 0800::/5
- '0001': 'RESERVED', # 1000::/4
- '001': 'GLOBAL-UNICAST', # 2000::/3 [RFC4291]
- '00100000000000010000000': 'SPECIALPURPOSE', # 2001::/23 [RFC4773]
- '00100000000000010000000000000000': 'TEREDO', # 2001::/32 [RFC4380]
- '00100000000000010000000000000010' + '0' * 16: 'BMWG', # 2001:0002::/48 Benchmarking [RFC5180]
- '0010000000000001000000000001': 'ORCHID', # 2001:0010::/28 (Temp until 2014-03-21) [RFC4843]
- '00100000000000010000001': 'ALLOCATED APNIC', # 2001:0200::/23
- '00100000000000010000010': 'ALLOCATED ARIN', # 2001:0400::/23
- '00100000000000010000011': 'ALLOCATED RIPE NCC', # 2001:0600::/23
- '00100000000000010000100': 'ALLOCATED RIPE NCC', # 2001:0800::/23
- '00100000000000010000101': 'ALLOCATED RIPE NCC', # 2001:0a00::/23
- '00100000000000010000110': 'ALLOCATED APNIC', # 2001:0c00::/23
- '00100000000000010000110110111000': 'DOCUMENTATION', # 2001:0db8::/32 [RFC3849]
- '00100000000000010000111': 'ALLOCATED APNIC', # 2001:0e00::/23
- '00100000000000010001001': 'ALLOCATED LACNIC', # 2001:1200::/23
- '00100000000000010001010': 'ALLOCATED RIPE NCC', # 2001:1400::/23
- '00100000000000010001011': 'ALLOCATED RIPE NCC', # 2001:1600::/23
- '00100000000000010001100': 'ALLOCATED ARIN', # 2001:1800::/23
- '00100000000000010001101': 'ALLOCATED RIPE NCC', # 2001:1a00::/23
- '0010000000000001000111': 'ALLOCATED RIPE NCC', # 2001:1c00::/22
- '00100000000000010010': 'ALLOCATED RIPE NCC', # 2001:2000::/20
- '001000000000000100110': 'ALLOCATED RIPE NCC', # 2001:3000::/21
- '0010000000000001001110': 'ALLOCATED RIPE NCC', # 2001:3800::/22
- '0010000000000001001111': 'RESERVED', # 2001:3c00::/22 Possible future allocation to RIPE NCC
- '00100000000000010100000': 'ALLOCATED RIPE NCC', # 2001:4000::/23
- '00100000000000010100001': 'ALLOCATED AFRINIC', # 2001:4200::/23
- '00100000000000010100010': 'ALLOCATED APNIC', # 2001:4400::/23
- '00100000000000010100011': 'ALLOCATED RIPE NCC', # 2001:4600::/23
- '00100000000000010100100': 'ALLOCATED ARIN', # 2001:4800::/23
- '00100000000000010100101': 'ALLOCATED RIPE NCC', # 2001:4a00::/23
- '00100000000000010100110': 'ALLOCATED RIPE NCC', # 2001:4c00::/23
- '00100000000000010101': 'ALLOCATED RIPE NCC', # 2001:5000::/20
- '0010000000000001100': 'ALLOCATED APNIC', # 2001:8000::/19
- '00100000000000011010': 'ALLOCATED APNIC', # 2001:a000::/20
- '00100000000000011011': 'ALLOCATED APNIC', # 2001:b000::/20
- '0010000000000010': '6TO4', # 2002::/16 "6to4" [RFC3056]
- '001000000000001100': 'ALLOCATED RIPE NCC', # 2003::/18
- '001001000000': 'ALLOCATED APNIC', # 2400::/12
- '001001100000': 'ALLOCATED ARIN', # 2600::/12
- '00100110000100000000000': 'ALLOCATED ARIN', # 2610::/23
- '00100110001000000000000': 'ALLOCATED ARIN', # 2620::/23
- '001010000000': 'ALLOCATED LACNIC', # 2800::/12
- '001010100000': 'ALLOCATED RIPE NCC', # 2a00::/12
- '001011000000': 'ALLOCATED AFRINIC', # 2c00::/12
- '00101101': 'RESERVED', # 2d00::/8
- '0010111': 'RESERVED', # 2e00::/7
- '0011': 'RESERVED', # 3000::/4
- '010': 'RESERVED', # 4000::/3
- '011': 'RESERVED', # 6000::/3
- '100': 'RESERVED', # 8000::/3
- '101': 'RESERVED', # a000::/3
- '110': 'RESERVED', # c000::/3
- '1110': 'RESERVED', # e000::/4
- '11110': 'RESERVED', # f000::/5
- '111110': 'RESERVED', # f800::/6
- '1111110': 'ULA', # fc00::/7 [RFC4193]
- '111111100': 'RESERVED', # fe00::/9
- '1111111010': 'LINKLOCAL', # fe80::/10
- '1111111011': 'RESERVED', # fec0::/10 Formerly SITELOCAL [RFC4291]
- '11111111': 'MULTICAST', # ff00::/8
- '1111111100000001': 'NODE-LOCAL MULTICAST', # ff01::/16
- '1111111100000010': 'LINK-LOCAL MULTICAST', # ff02::/16
- '1111111100000100': 'ADMIN-LOCAL MULTICAST', # ff04::/16
- '1111111100000101': 'SITE-LOCAL MULTICAST', # ff05::/16
- '1111111100001000': 'ORG-LOCAL MULTICAST', # ff08::/16
- '1111111100001110': 'GLOBAL MULTICAST', # ff0e::/16
- '1111111100001111': 'RESERVED MULTICAST', # ff0f::/16
- '111111110011': 'PREFIX-BASED MULTICAST', # ff30::/12 [RFC3306]
- '111111110111': 'RP-EMBEDDED MULTICAST', # ff70::/12 [RFC3956]
+ "00000000": "RESERVED", # ::/8
+ "0" * 96: "RESERVED", # ::/96 Formerly IPV4COMP [RFC4291]
+ "0" * 128: "UNSPECIFIED", # ::/128
+ "0" * 127 + "1": "LOOPBACK", # ::1/128
+ "0" * 80 + "1" * 16: "IPV4MAP", # ::ffff:0:0/96
+ "00000000011001001111111110011011" + "0" * 64: "WKP46TRANS", # 0064:ff9b::/96 Well-Known-Prefix [RFC6052]
+ "00000001": "UNASSIGNED", # 0100::/8
+ "0000001": "RESERVED", # 0200::/7 Formerly NSAP [RFC4048]
+ "0000010": "RESERVED", # 0400::/7 Formerly IPX [RFC3513]
+ "0000011": "RESERVED", # 0600::/7
+ "00001": "RESERVED", # 0800::/5
+ "0001": "RESERVED", # 1000::/4
+ "001": "GLOBAL-UNICAST", # 2000::/3 [RFC4291]
+ "00100000000000010000000": "SPECIALPURPOSE", # 2001::/23 [RFC4773]
+ "00100000000000010000000000000000": "TEREDO", # 2001::/32 [RFC4380]
+ "00100000000000010000000000000010" + "0" * 16: "BMWG", # 2001:0002::/48 Benchmarking [RFC5180]
+ "0010000000000001000000000001": "ORCHID", # 2001:0010::/28 (Temp until 2014-03-21) [RFC4843]
+ "00100000000000010000001": "ALLOCATED APNIC", # 2001:0200::/23
+ "00100000000000010000010": "ALLOCATED ARIN", # 2001:0400::/23
+ "00100000000000010000011": "ALLOCATED RIPE NCC", # 2001:0600::/23
+ "00100000000000010000100": "ALLOCATED RIPE NCC", # 2001:0800::/23
+ "00100000000000010000101": "ALLOCATED RIPE NCC", # 2001:0a00::/23
+ "00100000000000010000110": "ALLOCATED APNIC", # 2001:0c00::/23
+ "00100000000000010000110110111000": "DOCUMENTATION", # 2001:0db8::/32 [RFC3849]
+ "00100000000000010000111": "ALLOCATED APNIC", # 2001:0e00::/23
+ "00100000000000010001001": "ALLOCATED LACNIC", # 2001:1200::/23
+ "00100000000000010001010": "ALLOCATED RIPE NCC", # 2001:1400::/23
+ "00100000000000010001011": "ALLOCATED RIPE NCC", # 2001:1600::/23
+ "00100000000000010001100": "ALLOCATED ARIN", # 2001:1800::/23
+ "00100000000000010001101": "ALLOCATED RIPE NCC", # 2001:1a00::/23
+ "0010000000000001000111": "ALLOCATED RIPE NCC", # 2001:1c00::/22
+ "00100000000000010010": "ALLOCATED RIPE NCC", # 2001:2000::/20
+ "001000000000000100110": "ALLOCATED RIPE NCC", # 2001:3000::/21
+ "0010000000000001001110": "ALLOCATED RIPE NCC", # 2001:3800::/22
+ "0010000000000001001111": "RESERVED", # 2001:3c00::/22 Possible future allocation to RIPE NCC
+ "00100000000000010100000": "ALLOCATED RIPE NCC", # 2001:4000::/23
+ "00100000000000010100001": "ALLOCATED AFRINIC", # 2001:4200::/23
+ "00100000000000010100010": "ALLOCATED APNIC", # 2001:4400::/23
+ "00100000000000010100011": "ALLOCATED RIPE NCC", # 2001:4600::/23
+ "00100000000000010100100": "ALLOCATED ARIN", # 2001:4800::/23
+ "00100000000000010100101": "ALLOCATED RIPE NCC", # 2001:4a00::/23
+ "00100000000000010100110": "ALLOCATED RIPE NCC", # 2001:4c00::/23
+ "00100000000000010101": "ALLOCATED RIPE NCC", # 2001:5000::/20
+ "0010000000000001100": "ALLOCATED APNIC", # 2001:8000::/19
+ "00100000000000011010": "ALLOCATED APNIC", # 2001:a000::/20
+ "00100000000000011011": "ALLOCATED APNIC", # 2001:b000::/20
+ "0010000000000010": "6TO4", # 2002::/16 "6to4" [RFC3056]
+ "001000000000001100": "ALLOCATED RIPE NCC", # 2003::/18
+ "001001000000": "ALLOCATED APNIC", # 2400::/12
+ "001001100000": "ALLOCATED ARIN", # 2600::/12
+ "00100110000100000000000": "ALLOCATED ARIN", # 2610::/23
+ "00100110001000000000000": "ALLOCATED ARIN", # 2620::/23
+ "001010000000": "ALLOCATED LACNIC", # 2800::/12
+ "001010100000": "ALLOCATED RIPE NCC", # 2a00::/12
+ "001011000000": "ALLOCATED AFRINIC", # 2c00::/12
+ "00101101": "RESERVED", # 2d00::/8
+ "0010111": "RESERVED", # 2e00::/7
+ "0011": "RESERVED", # 3000::/4
+ "010": "RESERVED", # 4000::/3
+ "011": "RESERVED", # 6000::/3
+ "100": "RESERVED", # 8000::/3
+ "101": "RESERVED", # a000::/3
+ "110": "RESERVED", # c000::/3
+ "1110": "RESERVED", # e000::/4
+ "11110": "RESERVED", # f000::/5
+ "111110": "RESERVED", # f800::/6
+ "1111110": "ULA", # fc00::/7 [RFC4193]
+ "111111100": "RESERVED", # fe00::/9
+ "1111111010": "LINKLOCAL", # fe80::/10
+ "1111111011": "RESERVED", # fec0::/10 Formerly SITELOCAL [RFC4291]
+ "11111111": "MULTICAST", # ff00::/8
+ "1111111100000001": "NODE-LOCAL MULTICAST", # ff01::/16
+ "1111111100000010": "LINK-LOCAL MULTICAST", # ff02::/16
+ "1111111100000100": "ADMIN-LOCAL MULTICAST", # ff04::/16
+ "1111111100000101": "SITE-LOCAL MULTICAST", # ff05::/16
+ "1111111100001000": "ORG-LOCAL MULTICAST", # ff08::/16
+ "1111111100001110": "GLOBAL MULTICAST", # ff0e::/16
+ "1111111100001111": "RESERVED MULTICAST", # ff0f::/16
+ "111111110011": "PREFIX-BASED MULTICAST", # ff30::/12 [RFC3306]
+ "111111110111": "RP-EMBEDDED MULTICAST", # ff70::/12 [RFC3956]
}
-MAX_IPV4_ADDRESS = 0xffffffff
-MAX_IPV6_ADDRESS = 0xffffffffffffffffffffffffffffffff
-IPV6_TEST_MAP = 0xffffffffffffffffffffffff00000000
-IPV6_MAP_MASK = 0x00000000000000000000ffff00000000
+MAX_IPV4_ADDRESS = 0xFFFFFFFF
+MAX_IPV6_ADDRESS = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+IPV6_TEST_MAP = 0xFFFFFFFFFFFFFFFFFFFFFFFF00000000
+IPV6_MAP_MASK = 0x00000000000000000000FFFF00000000
if sys.version_info >= (3,):
INT_TYPES = (int,)
@@ -202,7 +202,7 @@ class IPint(object):
elif isinstance(data, STR_TYPES):
# TODO: refactor me!
# splitting of a string into IP and prefixlen et. al.
- x = data.split('-')
+ x = data.split("-")
if len(x) == 2:
# a.b.c.0-a.b.c.255 specification ?
(ip, last) = x
@@ -219,10 +219,10 @@ class IPint(object):
# make sure the broadcast is the same as the last ip
# otherwise it will return /16 for something like:
# 192.168.0.0-192.168.191.255
- if IP('%s/%s' % (ip, 32 - netbits)).broadcast().int() != last:
+ if IP("%s/%s" % (ip, 32 - netbits)).broadcast().int() != last:
raise ValueError("the range %s is not on a network boundary." % data)
elif len(x) == 1:
- x = data.split('/')
+ x = data.split("/")
# if no prefix is given use defaults
if len(x) == 1:
ip = x[0]
@@ -231,7 +231,7 @@ class IPint(object):
raise ValueError("only one '/' allowed in IP Address")
else:
(ip, prefixlen) = x
- if prefixlen.find('.') != -1:
+ if prefixlen.find(".") != -1:
# check if the user might have used a netmask like
# a.b.c.d/255.255.255.0
(netmask, vers) = parseAddress(prefixlen)
@@ -255,8 +255,7 @@ class IPint(object):
if make_net:
self.ip = self.ip & _prefixlenToNetmask(self._prefixlen, self._ipversion)
- if not _checkNetaddrWorksWithPrefixlen(self.ip,
- self._prefixlen, self._ipversion):
+ if not _checkNetaddrWorksWithPrefixlen(self.ip, self._prefixlen, self._ipversion):
raise ValueError("%s has invalid prefix length (%s)" % (repr(self), self._prefixlen))
else:
raise TypeError("Unsupported data type: %s" % type(data))
@@ -314,8 +313,7 @@ class IPint(object):
want == 3 -lastip 1.2.3.0-1.2.3.255
"""
- if (self._ipversion == 4 and self._prefixlen == 32) or \
- (self._ipversion == 6 and self._prefixlen == 128):
+ if (self._ipversion == 4 and self._prefixlen == 32) or (self._ipversion == 6 and self._prefixlen == 128):
if self.NoPrefixForSingleIp:
want = 0
if want is None:
@@ -335,7 +333,7 @@ class IPint(object):
# default
return "/%d" % (self._prefixlen)
else:
- return ''
+ return ""
# We have different flavours to convert to:
# strFullsize 127.0.0.1 2001:0658:022a:cafe:0200:c0ff:fe8d:08fa
@@ -357,7 +355,7 @@ class IPint(object):
if self.WantPrefixLen is None and wantprefixlen is None:
wantprefixlen = 0
ret = _intToBin(self.ip)
- return '0' * (bits - len(ret)) + ret + self._printPrefix(wantprefixlen)
+ return "0" * (bits - len(ret)) + ret + self._printPrefix(wantprefixlen)
def strCompressed(self, wantprefixlen=None):
"""Return a string representation in compressed format using '::' Notation.
@@ -376,12 +374,12 @@ class IPint(object):
if self._ipversion == 4:
return self.strFullsize(wantprefixlen)
else:
- if self.ip >> 32 == 0xffff:
+ if self.ip >> 32 == 0xFFFF:
ipv4 = intToIp(self.ip & MAX_IPV4_ADDRESS, 4)
text = "::ffff:" + ipv4 + self._printPrefix(wantprefixlen)
return text
# find the longest sequence of '0'
- hextets = [int(x, 16) for x in self.strFullsize(0).split(':')]
+ hextets = [int(x, 16) for x in self.strFullsize(0).split(":")]
# every element of followingzeros will contain the number of zeros
# following the corresponding element of hextets
followingzeros = [0] * 8
@@ -392,15 +390,15 @@ class IPint(object):
if max(followingzeros) > 1:
# genererate string with the longest number of zeros cut out
# now we need hextets as strings
- hextets = [x for x in self.strNormal(0).split(':')]
- while compressionpos < len(hextets) and hextets[compressionpos] == '0':
- del (hextets[compressionpos])
- hextets.insert(compressionpos, '')
+ hextets = [x for x in self.strNormal(0).split(":")]
+ while compressionpos < len(hextets) and hextets[compressionpos] == "0":
+ del hextets[compressionpos]
+ hextets.insert(compressionpos, "")
if compressionpos + 1 >= len(hextets):
- hextets.append('')
+ hextets.append("")
if compressionpos == 0:
- hextets = [''] + hextets
- return ':'.join(hextets) + self._printPrefix(wantprefixlen)
+ hextets = [""] + hextets
+ return ":".join(hextets) + self._printPrefix(wantprefixlen)
else:
return self.strNormal(0) + self._printPrefix(wantprefixlen)
@@ -419,7 +417,7 @@ class IPint(object):
if self._ipversion == 4:
ret = self.strFullsize(0)
elif self._ipversion == 6:
- ret = ':'.join(["%x" % x for x in [int(x, 16) for x in self.strFullsize(0).split(':')]])
+ ret = ":".join(["%x" % x for x in [int(x, 16) for x in self.strFullsize(0).split(":")]])
else:
raise ValueError("only IPv4 and IPv6 supported")
@@ -451,7 +449,7 @@ class IPint(object):
if self.WantPrefixLen is None and wantprefixlen is None:
wantprefixlen = 0
- x = '0x%x' % self.ip
+ x = "0x%x" % self.ip
return x + self._printPrefix(wantprefixlen)
def strDec(self, wantprefixlen=None):
@@ -466,7 +464,7 @@ class IPint(object):
if self.WantPrefixLen is None and wantprefixlen is None:
wantprefixlen = 0
- x = '%d' % self.ip
+ x = "%d" % self.ip
return x + self._printPrefix(wantprefixlen)
def iptype(self):
@@ -581,10 +579,8 @@ class IPint(object):
raise ValueError("Only adjacent networks can be added together.")
ret = IP(self.int(), ipversion=self._ipversion)
ret._prefixlen = self.prefixlen() - 1
- if not _checkNetaddrWorksWithPrefixlen(ret.ip, ret._prefixlen,
- ret._ipversion):
- raise ValueError("The resulting %s has invalid prefix length (%s)"
- % (repr(ret), ret._prefixlen))
+ if not _checkNetaddrWorksWithPrefixlen(ret.ip, ret._prefixlen, ret._ipversion):
+ raise ValueError("The resulting %s has invalid prefix length (%s)" % (repr(ret), ret._prefixlen))
return ret
def __sub__(self, other):
@@ -692,7 +688,7 @@ class IPint(object):
IP('10.0.0.0/24')
"""
- return ("IPint('%s')" % (self.strCompressed(1)))
+ return "IPint('%s')" % (self.strCompressed(1))
def __cmp__(self, other):
"""Called by comparison operations.
@@ -777,7 +773,7 @@ class IPint(object):
thehash = int(-1)
ip = self.ip
while ip > 0:
- thehash = thehash ^ (ip & 0x7fffffff)
+ thehash = thehash ^ (ip & 0x7FFFFFFF)
ip = ip >> 32
thehash = thehash ^ self._prefixlen
return int(thehash)
@@ -811,17 +807,17 @@ class IP(IPint):
>>> IP('10.0.0.0/8').netmask()
IP('255.0.0.0')
- """
+ """
return IP(IPint.netmask(self), ipversion=self._ipversion)
def _getIPv4Map(self):
if self._ipversion != 6:
return None
- if (self.ip >> 32) != 0xffff:
+ if (self.ip >> 32) != 0xFFFF:
return None
ipv4 = self.ip & MAX_IPV4_ADDRESS
if self._prefixlen != 128:
- ipv4 = '%s/%s' % (ipv4, 32 - (128 - self._prefixlen))
+ ipv4 = "%s/%s" % (ipv4, 32 - (128 - self._prefixlen))
return IP(ipv4, ipversion=4)
def reverseNames(self):
@@ -872,7 +868,7 @@ class IP(IPint):
raise NotImplementedError("can't create IPv6 reverse names at sub nibble level")
s = list(s)
s.reverse()
- s = '.'.join(s)
+ s = ".".join(s)
first_nibble_index = int(32 - (self._prefixlen // 4)) * 2
return ["%s.ip6.arpa." % s[first_nibble_index:]]
else:
@@ -897,32 +893,34 @@ class IP(IPint):
if self._ipversion == 4:
s = self.strFullsize(0)
- s = s.split('.')
+ s = s.split(".")
s.reverse()
first_byte_index = int(4 - (self._prefixlen // 8))
if self._prefixlen % 8 != 0:
nibblepart = "%s-%s" % (
- s[3 - (self._prefixlen // 8)], intToIp(self.ip + self.len() - 1, 4).split('.')[-1])
- nibblepart += '.'
+ s[3 - (self._prefixlen // 8)],
+ intToIp(self.ip + self.len() - 1, 4).split(".")[-1],
+ )
+ nibblepart += "."
else:
nibblepart = ""
- s = '.'.join(s[first_byte_index:])
+ s = ".".join(s[first_byte_index:])
return "%s%s.in-addr.arpa." % (nibblepart, s)
elif self._ipversion == 6:
ipv4 = self._getIPv4Map()
if ipv4 is not None:
return ipv4.reverseName()
- s = '%032x' % self.ip
+ s = "%032x" % self.ip
if self._prefixlen % 4 != 0:
- nibblepart = "%s-%x" % (s[self._prefixlen:], self.ip + self.len() - 1)
- nibblepart += '.'
+ nibblepart = "%s-%x" % (s[self._prefixlen :], self.ip + self.len() - 1)
+ nibblepart += "."
else:
nibblepart = ""
s = list(s)
s.reverse()
- s = '.'.join(s)
+ s = ".".join(s)
first_nibble_index = int(32 - (self._prefixlen // 4)) * 2
return "%s%s.ip6.arpa." % (nibblepart, s[first_nibble_index:])
else:
@@ -937,9 +935,9 @@ class IP(IPint):
>>> print(IP('127.0.0.1').make_net('255.0.0.0'))
127.0.0.0/8
"""
- if '/' in str(netmask):
+ if "/" in str(netmask):
raise ValueError("invalid netmask (%s)" % netmask)
- return IP('%s/%s' % (self, netmask), make_net=True)
+ return IP("%s/%s" % (self, netmask), make_net=True)
def __getitem__(self, key):
"""Called to implement evaluation of self[key].
@@ -968,7 +966,7 @@ class IP(IPint):
IP('10.0.0.0/8')
"""
- return ("IP('%s')" % (self.strCompressed(1)))
+ return "IP('%s')" % (self.strCompressed(1))
def get_mac(self):
"""
@@ -980,15 +978,15 @@ class IP(IPint):
"""
if self._ipversion != 6:
return None
- if (self.ip & 0x20000ffff000000) != 0x20000fffe000000:
+ if (self.ip & 0x20000FFFF000000) != 0x20000FFFE000000:
return None
- return '%02x:%02x:%02x:%02x:%02x:%02x' % (
- (((self.ip >> 56) & 0xff) & 0xfd),
- (self.ip >> 48) & 0xff,
- (self.ip >> 40) & 0xff,
- (self.ip >> 16) & 0xff,
- (self.ip >> 8) & 0xff,
- self.ip & 0xff,
+ return "%02x:%02x:%02x:%02x:%02x:%02x" % (
+ (((self.ip >> 56) & 0xFF) & 0xFD),
+ (self.ip >> 48) & 0xFF,
+ (self.ip >> 40) & 0xFF,
+ (self.ip >> 16) & 0xFF,
+ (self.ip >> 8) & 0xFF,
+ self.ip & 0xFF,
)
def v46map(self):
@@ -1003,14 +1001,11 @@ class IP(IPint):
IP('192.168.1.1')
"""
if self._ipversion == 4:
- return IP(str(IPV6_MAP_MASK + self.ip) +
- "/%s" % (self._prefixlen + 96))
+ return IP(str(IPV6_MAP_MASK + self.ip) + "/%s" % (self._prefixlen + 96))
else:
if self.ip & IPV6_TEST_MAP == IPV6_MAP_MASK:
- return IP(str(self.ip - IPV6_MAP_MASK) +
- "/%s" % (self._prefixlen - 96))
- raise ValueError("%s cannot be converted to an IPv4 address."
- % repr(self))
+ return IP(str(self.ip - IPV6_MAP_MASK) + "/%s" % (self._prefixlen - 96))
+ raise ValueError("%s cannot be converted to an IPv4 address." % repr(self))
class IPSet(collections.MutableSet):
@@ -1022,7 +1017,7 @@ class IPSet(collections.MutableSet):
# Make sure we only accept IP objects
for prefix in iterable:
if not isinstance(prefix, IP):
- raise ValueError('Only IP objects can be added to an IPSet')
+ raise ValueError("Only IP objects can be added to an IPSet")
# Store and optimize
self.prefixes = iterable[:]
@@ -1083,7 +1078,7 @@ class IPSet(collections.MutableSet):
return IPSet(result)
def __repr__(self):
- return '%s([' % self.__class__.__name__ + ', '.join(map(repr, self.prefixes)) + '])'
+ return "%s([" % self.__class__.__name__ + ", ".join(map(repr, self.prefixes)) + "])"
def len(self):
return sum(prefix.len() for prefix in self.prefixes)
@@ -1096,7 +1091,7 @@ class IPSet(collections.MutableSet):
# Check type
for prefix in value:
if not isinstance(prefix, IP):
- raise ValueError('Only IP objects can be added to an IPSet')
+ raise ValueError("Only IP objects can be added to an IPSet")
# Append and optimize
self.prefixes.extend(value)
@@ -1114,7 +1109,7 @@ class IPSet(collections.MutableSet):
# Remove
for del_prefix in value:
if not isinstance(del_prefix, IP):
- raise ValueError('Only IP objects can be removed from an IPSet')
+ raise ValueError("Only IP objects can be removed from an IPSet")
# First check if this prefix contains anything in our list
found = False
@@ -1134,7 +1129,7 @@ class IPSet(collections.MutableSet):
found = False
for i in range(len(self.prefixes)):
if del_prefix in self.prefixes[i]:
- self.prefixes[i:i + 1] = self.prefixes[i] - del_prefix
+ self.prefixes[i : i + 1] = self.prefixes[i] - del_prefix
break
self.optimize()
@@ -1279,13 +1274,13 @@ def _parseAddressIPv6(ipstr):
fill_pos = len(items)
index += 2
continue
- pos = text.find(':')
+ pos = text.find(":")
if pos == 0:
# Invalid IPv6, eg. '1::2:'
raise ValueError("%r: Invalid IPv6 address" % ipstr)
if pos != -1:
items.append(text[:pos])
- if text[pos:pos + 2] == "::":
+ if text[pos : pos + 2] == "::":
index += pos
else:
index += pos + 1
@@ -1297,13 +1292,13 @@ def _parseAddressIPv6(ipstr):
items.append(text)
break
- if items and '.' in items[-1]:
+ if items and "." in items[-1]:
# IPv6 ending with IPv4 like '::ffff:192.168.0.1'
if (fill_pos is not None) and not (fill_pos <= len(items) - 1):
# Invalid IPv6: 'ffff:192.168.0.1::'
raise ValueError("%r: Invalid IPv6 address: '::' after IPv4" % ipstr)
value = parseAddress(items[-1])[0]
- items = items[:-1] + ["%04x" % (value >> 16), "%04x" % (value & 0xffff)]
+ items = items[:-1] + ["%04x" % (value >> 16), "%04x" % (value & 0xFFFF)]
# Expand fill_pos to fill with '0'
# ['1','2'] with fill_pos=1 => ['1', '0', '0', '0', '0', '0', '0', '2']
@@ -1311,7 +1306,7 @@ def _parseAddressIPv6(ipstr):
diff = 8 - len(items)
if diff <= 0:
raise ValueError("%r: Invalid IPv6 address: '::' is not needed" % ipstr)
- items = items[:fill_pos] + ['0'] * diff + items[fill_pos:]
+ items = items[:fill_pos] + ["0"] * diff + items[fill_pos:]
# Here we have a list of 8 strings
if len(items) != 8:
@@ -1324,7 +1319,7 @@ def _parseAddressIPv6(ipstr):
for item in items:
try:
item = int(item, 16)
- error = not (0 <= item <= 0xffff)
+ error = not (0 <= item <= 0xFFFF)
except ValueError:
error = True
if error:
@@ -1388,7 +1383,7 @@ def parseAddress(ipstr, ipversion=0):
except ValueError:
intval = None
- if ipstr.startswith('0x') and hexval is not None:
+ if ipstr.startswith("0x") and hexval is not None:
if hexval > MAX_IPV6_ADDRESS:
raise ValueError("IP Address can't be larger than %x: %x" % (MAX_IPV6_ADDRESS, hexval))
if hexval <= MAX_IPV4_ADDRESS:
@@ -1396,19 +1391,19 @@ def parseAddress(ipstr, ipversion=0):
else:
return (hexval, 6)
- if ipstr.find(':') != -1:
+ if ipstr.find(":") != -1:
return (_parseAddressIPv6(ipstr), 6)
elif len(ipstr) == 32 and hexval is not None:
# assume IPv6 in pure hexadecimal notation
return (hexval, 6)
- elif ipstr.find('.') != -1 or (intval is not None and intval < 256 and ipversion != 6):
+ elif ipstr.find(".") != -1 or (intval is not None and intval < 256 and ipversion != 6):
# assume IPv4 ('127' gets interpreted as '127.0.0.0')
- bytes = ipstr.split('.')
+ bytes = ipstr.split(".")
if len(bytes) > 4:
raise ValueError("IPv4 Address with more than 4 bytes")
- bytes += ['0'] * (4 - len(bytes))
+ bytes += ["0"] * (4 - len(bytes))
bytes = [int(x) for x in bytes]
for x in bytes:
if x > 255 or x < 0:
@@ -1438,12 +1433,12 @@ def intToIp(ip, version):
if ip < 0:
raise ValueError("IPs can't be negative: %d" % (ip))
- ret = ''
+ ret = ""
if version == 4:
if ip > MAX_IPV4_ADDRESS:
raise ValueError("IPv4 Address can't be larger than %x: %x" % (MAX_IPV4_ADDRESS, ip))
for l in xrange(4):
- ret = str(ip & 0xff) + '.' + ret
+ ret = str(ip & 0xFF) + "." + ret
ip = ip >> 8
ret = ret[:-1]
elif version == 6:
@@ -1453,7 +1448,7 @@ def intToIp(ip, version):
for x in xrange(1, 33):
ret = l[-x] + ret
if x % 4 == 0:
- ret = ':' + ret
+ ret = ":" + ret
ret = ret[1:]
else:
raise ValueError("only IPv4 and IPv6 supported")
@@ -1494,10 +1489,24 @@ def _countFollowingZeros(l):
return 1 + _countFollowingZeros(l[1:])
-_BitTable = {'0': '0000', '1': '0001', '2': '0010', '3': '0011',
- '4': '0100', '5': '0101', '6': '0110', '7': '0111',
- '8': '1000', '9': '1001', 'a': '1010', 'b': '1011',
- 'c': '1100', 'd': '1101', 'e': '1110', 'f': '1111'}
+_BitTable = {
+ "0": "0000",
+ "1": "0001",
+ "2": "0010",
+ "3": "0011",
+ "4": "0100",
+ "5": "0101",
+ "6": "0110",
+ "7": "0111",
+ "8": "1000",
+ "9": "1001",
+ "a": "1010",
+ "b": "1011",
+ "c": "1100",
+ "d": "1101",
+ "e": "1110",
+ "f": "1111",
+}
def _intToBin(val):
@@ -1506,11 +1515,11 @@ def _intToBin(val):
if val < 0:
raise ValueError("Only positive values allowed")
s = "%x" % val
- ret = ''
+ ret = ""
for x in s:
ret += _BitTable[x]
# remove leading zeros
- while ret[0] == '0' and len(ret) > 1:
+ while ret[0] == "0" and len(ret) > 1:
ret = ret[1:]
return ret
@@ -1595,7 +1604,7 @@ def _checkNetmask(netmask, masklen):
def _checkNetaddrWorksWithPrefixlen(net, prefixlen, version):
"""Check if a base addess of a network is compatible with a prefixlen"""
try:
- return (net & _prefixlenToNetmask(prefixlen, version) == net)
+ return net & _prefixlenToNetmask(prefixlen, version) == net
except ValueError:
return False
@@ -1637,8 +1646,8 @@ def _remove_subprefix(prefix, subprefix):
# Start cutting in half, recursively
prefixes = [
- IP('%s/%d' % (prefix[0], prefix._prefixlen + 1)),
- IP('%s/%d' % (prefix[int(prefix.len() / 2)], prefix._prefixlen + 1)),
+ IP("%s/%d" % (prefix[0], prefix._prefixlen + 1)),
+ IP("%s/%d" % (prefix[int(prefix.len() / 2)], prefix._prefixlen + 1)),
]
if subprefix in prefixes[0]:
return _remove_subprefix(prefixes[0], subprefix) + IPSet([prefixes[1]])
diff --git a/vrtManager/connection.py b/vrtManager/connection.py
index 4ac9f4f..0272353 100644
--- a/vrtManager/connection.py
+++ b/vrtManager/connection.py
@@ -1,11 +1,12 @@
-import libvirt
-import threading
-import socket
import re
-from vrtManager import util
-from vrtManager.rwlock import ReadWriteLock
+import socket
+import threading
+
+import libvirt
from django.conf import settings
from libvirt import libvirtError
+from vrtManager import util
+from vrtManager.rwlock import ReadWriteLock
CONN_SOCKET = 4
CONN_TLS = 3
@@ -18,6 +19,7 @@ TCP_PORT = 16509
class wvmEventLoop(threading.Thread):
""" Event Loop Class"""
+
def __init__(self, group=None, target=None, name=None, args=(), kwargs={}):
# register the default event implementation
# of libvirt, as we do not have an existing
@@ -25,7 +27,7 @@ class wvmEventLoop(threading.Thread):
libvirt.virEventRegisterDefaultImpl()
if name is None:
- name = 'libvirt event loop'
+ name = "libvirt event loop"
super(wvmEventLoop, self).__init__(group, target, name, args, kwargs)
@@ -46,6 +48,7 @@ class wvmConnection(object):
class representing a single connection stored in the Connection Manager
# to-do: may also need some locking to ensure to not connect simultaniously in 2 threads
"""
+
def __init__(self, host, login, passwd, conn):
"""
Sets all class attributes and tries to open the connection
@@ -86,10 +89,12 @@ class wvmConnection(object):
# * set keep alive interval
# * set connection close/fail handler
try:
- self.connection.setKeepAlive(connection_manager.keepalive_interval, connection_manager.keepalive_count)
+ self.connection.setKeepAlive(
+ connection_manager.keepalive_interval, connection_manager.keepalive_count
+ )
try:
self.connection.registerCloseCallback(self.__connection_close_callback, None)
- except:
+ except Exception:
# Temporary fix for libvirt > libvirt-0.10.2-41
pass
except libvirtError as e:
@@ -134,49 +139,49 @@ class wvmConnection(object):
def __connect_tcp(self):
flags = [libvirt.VIR_CRED_AUTHNAME, libvirt.VIR_CRED_PASSPHRASE]
auth = [flags, self.__libvirt_auth_credentials_callback, None]
- uri = f'qemu+tcp://{self.host}/system'
+ uri = f"qemu+tcp://{self.host}/system"
try:
self.connection = libvirt.openAuth(uri, auth, 0)
self.last_error = None
except libvirtError as e:
- self.last_error = f'Connection Failed: {str(e)}'
+ self.last_error = f"Connection Failed: {str(e)}"
self.connection = None
def __connect_ssh(self):
- uri = 'qemu+ssh://%s@%s/system' % (self.login, self.host)
+ uri = "qemu+ssh://%s@%s/system" % (self.login, self.host)
try:
self.connection = libvirt.open(uri)
self.last_error = None
except libvirtError as e:
- self.last_error = f'Connection Failed: {str(e)} --- ' + repr(libvirt.virGetLastError())
+ self.last_error = f"Connection Failed: {str(e)} --- " + repr(libvirt.virGetLastError())
self.connection = None
def __connect_tls(self):
flags = [libvirt.VIR_CRED_AUTHNAME, libvirt.VIR_CRED_PASSPHRASE]
auth = [flags, self.__libvirt_auth_credentials_callback, None]
- uri = 'qemu+tls://%s@%s/system' % (self.login, self.host)
+ uri = "qemu+tls://%s@%s/system" % (self.login, self.host)
try:
self.connection = libvirt.openAuth(uri, auth, 0)
self.last_error = None
except libvirtError as e:
- self.last_error = f'Connection Failed: {str(e)}'
+ self.last_error = f"Connection Failed: {str(e)}"
self.connection = None
def __connect_socket(self):
- uri = 'qemu:///system'
+ uri = "qemu:///system"
try:
self.connection = libvirt.open(uri)
self.last_error = None
except libvirtError as e:
- self.last_error = f'Connection Failed: {str(e)}'
+ self.last_error = f"Connection Failed: {str(e)}"
self.connection = None
def close(self):
@@ -202,23 +207,23 @@ class wvmConnection(object):
# unregister callback (as it is no longer valid if this instance gets deleted)
try:
self.connection.unregisterCloseCallback()
- except:
+ except Exception:
pass
def __str__(self):
if self.type == CONN_TCP:
- type_str = 'tcp'
+ type_str = "tcp"
elif self.type == CONN_SSH:
- type_str = 'ssh'
+ type_str = "ssh"
elif self.type == CONN_TLS:
- type_str = 'tls'
+ type_str = "tls"
else:
- type_str = 'invalid_type'
+ type_str = "invalid_type"
- return f'qemu+{type_str}://{self.login}@{self.host}/system'
+ return f"qemu+{type_str}://{self.login}@{self.host}/system"
def __repr__(self):
- return f''
+ return f""
class wvmConnectionManager(object):
@@ -307,7 +312,7 @@ class wvmConnectionManager(object):
socket_host = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket_host.settimeout(1)
if conn_type == CONN_SSH:
- if ':' in hostname:
+ if ":" in hostname:
libvirt_host, PORT = hostname.split(":")
PORT = int(PORT)
else:
@@ -320,7 +325,7 @@ class wvmConnectionManager(object):
socket_host.connect((hostname, TLS_PORT))
if conn_type == CONN_SOCKET:
socket_host = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
- socket_host.connect('/var/run/libvirt/libvirt-sock')
+ socket_host.connect("/var/run/libvirt/libvirt-sock")
socket_host.close()
return True
except Exception as err:
@@ -328,8 +333,8 @@ class wvmConnectionManager(object):
connection_manager = wvmConnectionManager(
- settings.LIBVIRT_KEEPALIVE_INTERVAL if hasattr(settings, 'LIBVIRT_KEEPALIVE_INTERVAL') else 5,
- settings.LIBVIRT_KEEPALIVE_COUNT if hasattr(settings, 'LIBVIRT_KEEPALIVE_COUNT') else 5,
+ settings.LIBVIRT_KEEPALIVE_INTERVAL if hasattr(settings, "LIBVIRT_KEEPALIVE_INTERVAL") else 5,
+ settings.LIBVIRT_KEEPALIVE_COUNT if hasattr(settings, "LIBVIRT_KEEPALIVE_COUNT") else 5,
)
@@ -353,15 +358,16 @@ class wvmConnect(object):
def get_dom_cap_xml(self, arch, machine):
""" Return domain capabilities xml"""
emulatorbin = self.get_emulator(arch)
- virttype = 'kvm' if 'kvm' in self.get_hypervisors_domain_types()[arch] else 'qemu'
+ virttype = "kvm" if "kvm" in self.get_hypervisors_domain_types()[arch] else "qemu"
machine_types = self.get_machine_types(arch)
if not machine or machine not in machine_types:
- machine = 'pc' if 'pc' in machine_types else machine_types[0]
+ machine = "pc" if "pc" in machine_types else machine_types[0]
return self.wvm.getDomainCapabilities(emulatorbin, arch, machine, virttype)
def get_capabilities(self, arch):
""" Host Capabilities for specified architecture """
+
def guests(ctx):
result = dict()
for arch_el in ctx.xpath("/capabilities/guest/arch[@name='{}']".format(arch)):
@@ -371,11 +377,9 @@ class wvmConnect(object):
result["machines"] = []
for m in arch_el.xpath("machine"):
- result["machines"].append({
- "machine": m.text,
- "max_cpu": m.get("maxCpus"),
- "canonical": m.get("canonical")
- })
+ result["machines"].append(
+ {"machine": m.text, "max_cpu": m.get("maxCpus"), "canonical": m.get("canonical")}
+ )
guest_el = arch_el.getparent()
for f in guest_el.xpath("features"):
@@ -400,7 +404,7 @@ class wvmConnect(object):
result["os_support"] = util.get_xml_path(xml, "/domainCapabilities/os/@supported")
result["loader_support"] = util.get_xml_path(xml, "/domainCapabilities/os/loader/@supported")
- if result["loader_support"] == 'yes':
+ if result["loader_support"] == "yes":
result["loaders"] = self.get_os_loaders(arch, machine)
result["loader_enums"] = self.get_os_loader_enums(arch, machine)
@@ -410,27 +414,29 @@ class wvmConnect(object):
result["cpu_custom_models"] = self.get_cpu_custom_types(arch, machine)
result["disk_support"] = util.get_xml_path(xml, "/domainCapabilities/devices/disk/@supported")
- if result["disk_support"] == 'yes':
+ if result["disk_support"] == "yes":
result["disk_devices"] = self.get_disk_device_types(arch, machine)
result["disk_bus"] = self.get_disk_bus_types(arch, machine)
result["graphics_support"] = util.get_xml_path(xml, "/domainCapabilities/devices/graphics/@supported")
- if result["graphics_support"] == 'yes':
+ if result["graphics_support"] == "yes":
result["graphics_types"] = self.get_graphics_types(arch, machine)
result["video_support"] = util.get_xml_path(xml, "/domainCapabilities/devices/video/@supported")
- if result["video_support"] == 'yes':
+ if result["video_support"] == "yes":
result["video_types"] = self.get_video_models(arch, machine)
result["hostdev_support"] = util.get_xml_path(xml, "/domainCapabilities/devices/hostdev/@supported")
- if result["hostdev_support"] == 'yes':
+ if result["hostdev_support"] == "yes":
result["hostdev_types"] = self.get_hostdev_modes(arch, machine)
result["hostdev_startup_policies"] = self.get_hostdev_startup_policies(arch, machine)
result["hostdev_subsys_types"] = self.get_hostdev_subsys_types(arch, machine)
result["features_gic_support"] = util.get_xml_path(xml, "/domainCapabilities/features/gic/@supported")
result["features_genid_support"] = util.get_xml_path(xml, "/domainCapabilities/features/genid/@supported")
- result["features_vmcoreinfo_support"] = util.get_xml_path(xml, "/domainCapabilities/features/vmcoreinfo/@supported")
+ result["features_vmcoreinfo_support"] = util.get_xml_path(
+ xml, "/domainCapabilities/features/vmcoreinfo/@supported"
+ )
result["features_sev_support"] = util.get_xml_path(xml, "/domainCapabilities/features/sev/@supported")
return result
@@ -510,12 +516,12 @@ class wvmConnect(object):
:return: Get cache available modes
"""
return {
- 'default': 'Default',
- 'none': 'Disabled',
- 'writethrough': 'Write through',
- 'writeback': 'Write back',
- 'directsync': 'Direct sync', # since libvirt 0.9.5
- 'unsafe': 'Unsafe', # since libvirt 0.9.7
+ "default": "Default",
+ "none": "Disabled",
+ "writethrough": "Write through",
+ "writeback": "Write back",
+ "directsync": "Direct sync", # since libvirt 0.9.5
+ "unsafe": "Unsafe", # since libvirt 0.9.7
}
def get_io_modes(self):
@@ -523,9 +529,9 @@ class wvmConnect(object):
:return: available io modes
"""
return {
- 'default': 'Default',
- 'native': 'Native',
- 'threads': 'Threads',
+ "default": "Default",
+ "native": "Native",
+ "threads": "Threads",
}
def get_discard_modes(self):
@@ -533,9 +539,9 @@ class wvmConnect(object):
:return: available discard modes
"""
return {
- 'default': 'Default',
- 'ignore': 'Ignore',
- 'unmap': 'Unmap',
+ "default": "Default",
+ "ignore": "Ignore",
+ "unmap": "Unmap",
}
def get_detect_zeroes_modes(self):
@@ -543,21 +549,22 @@ class wvmConnect(object):
:return: available detect zeroes modes
"""
return {
- 'default': 'Default',
- 'on': 'On',
- 'off': 'Off',
- 'unmap': 'Unmap',
+ "default": "Default",
+ "on": "On",
+ "off": "Off",
+ "unmap": "Unmap",
}
def get_hypervisors_domain_types(self):
"""
:return: hypervisor domain types
"""
+
def hypervisors(ctx):
result = {}
- for arch in ctx.xpath('/capabilities/guest/arch'):
- domain_types = arch.xpath('domain/@type')
- arch_name = arch.xpath('@name')[0]
+ for arch in ctx.xpath("/capabilities/guest/arch"):
+ domain_types = arch.xpath("domain/@type")
+ arch_name = arch.xpath("@name")[0]
result[arch_name] = domain_types
return result
@@ -567,9 +574,10 @@ class wvmConnect(object):
"""
:return: hypervisor and its machine types
"""
+
def machines(ctx):
result = dict()
- for arche in ctx.xpath('/capabilities/guest/arch'):
+ for arche in ctx.xpath("/capabilities/guest/arch"):
arch = arche.get("name")
result[arch] = self.get_machine_types(arch)
@@ -587,6 +595,7 @@ class wvmConnect(object):
"""
:return: canonical(if exist) name of machine types
"""
+
def machines(ctx):
result = list()
canonical_name = ctx.xpath("/capabilities/guest/arch[@name='{}']/machine[@canonical]".format(arch))
@@ -602,22 +611,24 @@ class wvmConnect(object):
"""
:return: host emulators list
"""
+
def emulators(ctx):
result = {}
- for arch in ctx.xpath('/capabilities/guest/arch'):
- emulator = arch.xpath('emulator')
- arch_name = arch.xpath('@name')[0]
+ for arch in ctx.xpath("/capabilities/guest/arch"):
+ emulator = arch.xpath("emulator")
+ arch_name = arch.xpath("@name")[0]
result[arch_name] = emulator
return result
return util.get_xml_path(self.get_cap_xml(), func=emulators)
- def get_os_loaders(self, arch='x86_64', machine='pc'):
+ def get_os_loaders(self, arch="x86_64", machine="pc"):
"""
:param arch: architecture
:param machine:
:return: available os loaders list
"""
+
def get_os_loaders(ctx):
return [v.text for v in ctx.xpath("/domainCapabilities/os/loader[@supported='yes']/value")]
@@ -629,6 +640,7 @@ class wvmConnect(object):
:param machine:
:return: available os loaders list
"""
+
def get_os_loader_enums(ctx):
result = dict()
enums = [v for v in ctx.xpath("/domainCapabilities/os/loader[@supported='yes']/enum/@name")]
@@ -645,6 +657,7 @@ class wvmConnect(object):
:param arch:
:return: available disk bus types list
"""
+
def get_bus_list(ctx):
return [v.text for v in ctx.xpath("/domainCapabilities/devices/disk/enum[@name='bus']/value")]
@@ -657,6 +670,7 @@ class wvmConnect(object):
:param machine:
:return: available disk device type list
"""
+
def get_device_list(ctx):
return [v.text for v in ctx.xpath("/domainCapabilities/devices/disk/enum[@name='diskDevice']/value")]
@@ -669,6 +683,7 @@ class wvmConnect(object):
:param machine:
:return: available graphics types
"""
+
def get_graphics_list(ctx):
return [v.text for v in ctx.xpath("/domainCapabilities/devices/graphics/enum[@name='type']/value")]
@@ -680,6 +695,7 @@ class wvmConnect(object):
:param machine:
:return: available cpu modes
"""
+
def get_cpu_modes(ctx):
return [v for v in ctx.xpath("/domainCapabilities/cpu/mode[@supported='yes']/@name")]
@@ -691,6 +707,7 @@ class wvmConnect(object):
:param machine:
:return: available graphics types
"""
+
def get_custom_list(ctx):
usable_yes = "/domainCapabilities/cpu/mode[@name='custom'][@supported='yes']/model[@usable='yes']"
usable_unknown = "/domainCapabilities/cpu/mode[@name='custom'][@supported='yes']/model[@usable='unknown']"
@@ -706,6 +723,7 @@ class wvmConnect(object):
:param machine:
:return. available nodedev modes
"""
+
def get_hostdev_list(ctx):
return [v.text for v in ctx.xpath("/domainCapabilities/devices/hostdev/enum[@name='mode']/value")]
@@ -717,6 +735,7 @@ class wvmConnect(object):
:param machine:
:return: available hostdev modes
"""
+
def get_hostdev_list(ctx):
return [v.text for v in ctx.xpath("/domainCapabilities/devices/hostdev/enum[@name='startupPolicy']/value")]
@@ -728,6 +747,7 @@ class wvmConnect(object):
:param machine:
:return: available nodedev sub system types
"""
+
def get_hostdev_list(ctx):
return [v.text for v in ctx.xpath("/domainCapabilities/devices/hostdev/enum[@name='subsysType']/value")]
@@ -737,19 +757,19 @@ class wvmConnect(object):
"""
:return: network card models
"""
- return ['default', 'e1000', 'virtio']
+ return ["default", "e1000", "virtio"]
def get_image_formats(self):
"""
:return: available image formats
"""
- return ['raw', 'qcow', 'qcow2']
+ return ["raw", "qcow", "qcow2"]
def get_file_extensions(self):
"""
:return: available image filename extensions
"""
- return ['img', 'qcow', 'qcow2']
+ return ["img", "qcow", "qcow2"]
def get_video_models(self, arch, machine):
"""
@@ -757,9 +777,10 @@ class wvmConnect(object):
:param machine:
:return: available graphics video types
"""
+
def get_video_list(ctx):
result = []
- for video_enum in ctx.xpath('/domainCapabilities/devices/video/enum'):
+ for video_enum in ctx.xpath("/domainCapabilities/devices/video/enum"):
if video_enum.xpath("@name")[0] == "modelType":
for values in video_enum:
result.append(values.text)
@@ -787,8 +808,8 @@ class wvmConnect(object):
def get_network_forward(self, net_name):
def get_forward(doc):
- forward_mode = util.get_xpath(doc, '/network/forward/@mode')
- return forward_mode or 'isolated'
+ forward_mode = util.get_xpath(doc, "/network/forward/@mode")
+ return forward_mode or "isolated"
net = self.get_network(net_name)
xml = net.XMLDesc(0)
@@ -825,14 +846,14 @@ class wvmConnect(object):
netdevice = []
def get_info(doc):
- dev_type = util.get_xpath(doc, '/device/capability/@type')
- interface = util.get_xpath(doc, '/device/capability/interface')
+ dev_type = util.get_xpath(doc, "/device/capability/@type")
+ interface = util.get_xpath(doc, "/device/capability/interface")
return dev_type, interface
for dev in self.wvm.listAllDevices(0):
xml = dev.XMLDesc(0)
(dev_type, interface) = util.get_xml_path(xml, func=get_info)
- if dev_type == 'net':
+ if dev_type == "net":
netdevice.append(interface)
return netdevice
@@ -850,9 +871,9 @@ class wvmConnect(object):
else:
vcpu = util.get_xpath(doc, "/domain/vcpu")
title = util.get_xpath(doc, "/domain/title")
- title = title if title else ''
+ title = title if title else ""
description = util.get_xpath(doc, "/domain/description")
- description = description if description else ''
+ description = description if description else ""
return mem, vcpu, title, description
for name in self.get_instances():
@@ -860,12 +881,12 @@ class wvmConnect(object):
xml = dom.XMLDesc(0)
(mem, vcpu, title, description) = util.get_xml_path(xml, func=get_info)
vname[dom.name()] = {
- 'status': dom.info()[0],
- 'uuid': dom.UUIDString(),
- 'vcpu': vcpu,
- 'memory': mem,
- 'title': title,
- 'description': description,
+ "status": dom.info()[0],
+ "uuid": dom.UUIDString(),
+ "vcpu": vcpu,
+ "memory": mem,
+ "title": title,
+ "description": description,
}
return vname
@@ -882,20 +903,20 @@ class wvmConnect(object):
else:
vcpu = util.get_xpath(ctx, "/domain/vcpu")
title = util.get_xpath(ctx, "/domain/title")
- title = title if title else ''
+ title = title if title else ""
description = util.get_xpath(ctx, "/domain/description")
- description = description if description else ''
+ description = description if description else ""
return mem, vcpu, title, description
(mem, vcpu, title, description) = util.get_xml_path(xml, func=get_info)
return {
- 'name': dom.name(),
- 'status': dom.info()[0],
- 'uuid': dom.UUIDString(),
- 'vcpu': vcpu,
- 'memory': mem,
- 'title': title,
- 'description': description,
+ "name": dom.name(),
+ "status": dom.info()[0],
+ "uuid": dom.UUIDString(),
+ "vcpu": vcpu,
+ "memory": mem,
+ "title": title,
+ "description": description,
}
def close(self):
@@ -931,7 +952,7 @@ class wvmConnect(object):
for arch, patterns in util.UEFI_ARCH_PATTERNS.items():
for pattern in patterns:
if re.match(pattern, path):
- return ("UEFI %(arch)s: %(path)s" % {"arch": arch, "path": path})
+ return "UEFI %(arch)s: %(path)s" % {"arch": arch, "path": path}
return "Custom: %(path)s" % {"path": path}
@@ -945,15 +966,17 @@ class wvmConnect(object):
"""
Return True if libvirt advertises support for proper UEFI setup
"""
- return ("readonly" in loader_enums and "yes" in loader_enums.get("readonly"))
+ return "readonly" in loader_enums and "yes" in loader_enums.get("readonly")
def is_supports_virtio(self, arch, machine):
if not self.is_qemu():
return False
# These _only_ support virtio so don't check the OS
- if arch in ["aarch64", "armv7l", "ppc64", "ppc64le", "s390x", "riscv64", "riscv32"] and \
- machine in ["virt", "pseries"]:
+ if arch in ["aarch64", "armv7l", "ppc64", "ppc64le", "s390x", "riscv64", "riscv32"] and machine in [
+ "virt",
+ "pseries",
+ ]:
return True
if arch in ["x86_64", "i686"]:
diff --git a/vrtManager/create.py b/vrtManager/create.py
index 641715c..9cdaca4 100644
--- a/vrtManager/create.py
+++ b/vrtManager/create.py
@@ -1,4 +1,5 @@
import string
+
from vrtManager import util
from vrtManager.connection import wvmConnect
@@ -12,15 +13,15 @@ def get_rbd_storage_data(stg):
for host in doc.xpath("/pool/source/host"):
name = host.prop("name")
if name:
- hosts.append({'name': name, 'port': host.prop("port")})
+ hosts.append({"name": name, "port": host.prop("port")})
return hosts
+
ceph_hosts = util.get_xml_path(xml, func=get_ceph_hosts)
secret_uuid = util.get_xml_path(xml, "/pool/source/auth/secret/@uuid")
return ceph_user, secret_uuid, ceph_hosts
class wvmCreate(wvmConnect):
-
def get_storages_images(self):
"""
Function return all images on all storages
@@ -31,10 +32,10 @@ class wvmCreate(wvmConnect):
stg = self.get_storage(storage)
try:
stg.refresh(0)
- except:
+ except Exception:
pass
for img in stg.listVolumes():
- if img.lower().endswith('.iso'):
+ if img.lower().endswith(".iso"):
pass
else:
images.append(img)
@@ -52,11 +53,11 @@ class wvmCreate(wvmConnect):
size = int(size) * 1073741824
stg = self.get_storage(storage)
storage_type = util.get_xml_path(stg.XMLDesc(0), "/pool/@type")
- if storage_type == 'dir':
- if image_format in ('qcow', 'qcow2'):
- name += '.' + image_format
+ if storage_type == "dir":
+ if image_format in ("qcow", "qcow2"):
+ name += "." + image_format
else:
- name += '.img'
+ name += ".img"
alloc = 0
else:
alloc = size
@@ -91,12 +92,12 @@ class wvmCreate(wvmConnect):
def get_volume_type(self, path):
vol = self.get_volume_by_path(path)
vol_type = util.get_xml_path(vol.XMLDesc(0), "/volume/target/format/@type")
- if vol_type == 'unknown' or vol_type == 'iso':
- return 'raw'
+ if vol_type == "unknown" or vol_type == "iso":
+ return "raw"
if vol_type:
return vol_type
else:
- return 'raw'
+ return "raw"
def get_volume_path(self, volume, pool=None):
if not pool:
@@ -125,8 +126,8 @@ class wvmCreate(wvmConnect):
storage_type = util.get_xml_path(stg.XMLDesc(0), "/pool/@type")
format = util.get_xml_path(vol.XMLDesc(0), "/volume/target/format/@type")
- if storage_type == 'dir':
- clone += '.img'
+ if storage_type == "dir":
+ clone += ".img"
else:
metadata = False
xml = f"""
@@ -159,9 +160,27 @@ class wvmCreate(wvmConnect):
vol = self.get_volume_by_path(path)
vol.delete()
- def create_instance(self, name, memory, vcpu, vcpu_mode, uuid, arch, machine, firmware, volumes,
- networks, nwfilter, graphics, virtio, listen_addr,
- video="vga", console_pass="random", mac=None, qemu_ga=True):
+ def create_instance(
+ self,
+ name,
+ memory,
+ vcpu,
+ vcpu_mode,
+ uuid,
+ arch,
+ machine,
+ firmware,
+ volumes,
+ networks,
+ nwfilter,
+ graphics,
+ virtio,
+ listen_addr,
+ video="vga",
+ console_pass="random",
+ mac=None,
+ qemu_ga=True,
+ ):
"""
Create VM function
"""
@@ -178,33 +197,37 @@ class wvmCreate(wvmConnect):
{memory}
{vcpu}"""
- if dom_caps["os_support"] == 'yes':
+ if dom_caps["os_support"] == "yes":
xml += f"""
{caps["os_type"]}"""
xml += """
"""
if firmware:
- if firmware["secure"] == 'yes':
- xml += """%s""" % (firmware["readonly"],
- firmware["type"],
- firmware["secure"],
- firmware["loader"])
- if firmware["secure"] == 'no':
- xml += """%s""" % (firmware["readonly"],
- firmware["type"],
- firmware["loader"])
+ if firmware["secure"] == "yes":
+ xml += """%s""" % (
+ firmware["readonly"],
+ firmware["type"],
+ firmware["secure"],
+ firmware["loader"],
+ )
+ if firmware["secure"] == "no":
+ xml += """%s""" % (
+ firmware["readonly"],
+ firmware["type"],
+ firmware["loader"],
+ )
xml += """"""
if caps["features"]:
xml += """"""
- if 'acpi' in caps["features"]:
+ if "acpi" in caps["features"]:
xml += """"""
- if 'apic' in caps["features"]:
+ if "apic" in caps["features"]:
xml += """"""
- if 'pae' in caps["features"]:
+ if "pae" in caps["features"]:
xml += """"""
- if firmware.get("secure", 'no') == 'yes':
+ if firmware.get("secure", "no") == "yes":
xml += """"""
xml += """"""
@@ -235,56 +258,69 @@ class wvmCreate(wvmConnect):
for volume in volumes:
- disk_opts = ''
- if volume['cache_mode'] is not None and volume['cache_mode'] != 'default':
+ disk_opts = ""
+ if volume["cache_mode"] is not None and volume["cache_mode"] != "default":
disk_opts += f"cache='{volume['cache_mode']}' "
- if volume['io_mode'] is not None and volume['io_mode'] != 'default':
+ if volume["io_mode"] is not None and volume["io_mode"] != "default":
disk_opts += f"io='{volume['io_mode']}' "
- if volume['discard_mode'] is not None and volume['discard_mode'] != 'default':
+ if volume["discard_mode"] is not None and volume["discard_mode"] != "default":
disk_opts += f"discard='{volume['discard_mode']}' "
- if volume['detect_zeroes_mode'] is not None and volume['detect_zeroes_mode'] != 'default':
+ if volume["detect_zeroes_mode"] is not None and volume["detect_zeroes_mode"] != "default":
disk_opts += f"detect_zeroes='{volume['detect_zeroes_mode']}' "
- stg = self.get_storage_by_vol_path(volume['path'])
+ stg = self.get_storage_by_vol_path(volume["path"])
stg_type = util.get_xml_path(stg.XMLDesc(0), "/pool/@type")
- if volume['device'] == 'cdrom': add_cd = False
+ if volume["device"] == "cdrom":
+ add_cd = False
- if stg_type == 'rbd':
+ if stg_type == "rbd":
ceph_user, secret_uuid, ceph_hosts = get_rbd_storage_data(stg)
xml += """
- """ % (volume['type'], disk_opts)
+ """ % (
+ volume["type"],
+ disk_opts,
+ )
xml += """
-