mirror of
https://github.com/retspen/webvirtcloud
synced 2026-11-10 04:06:47 +00:00
fix(instances): a clone size of a digit that is no number gets the form's refusal
clone_data checked the clone's vCPUs and memory with str.isdigit(), which takes characters such as a superscript two that int() refuses: the user saw Python's "invalid literal for int()" instead of the refusal. It now checks with str.isdecimal(), whose characters int() reads.
This commit is contained in:
parent
337063bf7b
commit
02ab78fe94
2 changed files with 9 additions and 1 deletions
|
|
@ -137,7 +137,7 @@ def clone_data(user, instance, fields):
|
||||||
("memory", instance.config_memory,
|
("memory", instance.config_memory,
|
||||||
_("Enter a whole number of memory (MiB) for the clone"))):
|
_("Enter a whole number of memory (MiB) for the clone"))):
|
||||||
value = fields.get(f"clone-{key}") or str(source)
|
value = fields.get(f"clone-{key}") or str(source)
|
||||||
if not value.isdigit() or int(value) < 1:
|
if not value.isdecimal() or int(value) < 1:
|
||||||
raise util.OperationError(refusal)
|
raise util.OperationError(refusal)
|
||||||
# None: as the VM, nothing to change after the copy
|
# None: as the VM, nothing to change after the copy
|
||||||
data[key] = int(value) if int(value) != source else None
|
data[key] = int(value) if int(value) != source else None
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ from uuid import uuid4
|
||||||
|
|
||||||
import libvirt
|
import libvirt
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
|
from django.contrib.messages import get_messages
|
||||||
from django.core.exceptions import PermissionDenied
|
from django.core.exceptions import PermissionDenied
|
||||||
from django.test import TransactionTestCase
|
from django.test import TransactionTestCase
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
|
|
@ -116,6 +117,13 @@ class CloneJobTestCase(TransactionTestCase):
|
||||||
self.assertIsNone(op)
|
self.assertIsNone(op)
|
||||||
self.proxy.clone_instance.assert_not_called()
|
self.proxy.clone_instance.assert_not_called()
|
||||||
|
|
||||||
|
def test_a_digit_that_is_not_a_number_is_refused_with_the_reason(self):
|
||||||
|
# superscript two: str.isdigit() takes it, int() does not
|
||||||
|
response = self.client.post(reverse("instances:clone", args=[self.source.pk]),
|
||||||
|
{"name": "copy", "disk-vda": "copy.qcow2", "clone-net-mac-0": "52:54:00:00:00:01",
|
||||||
|
"submission_key": "key-clone003", "clone-vcpu": "\u00b2"})
|
||||||
|
self.assertEqual([str(m) for m in get_messages(response.wsgi_request)], ["Enter a whole number of vCPUs for the clone"])
|
||||||
|
|
||||||
def test_a_clone_that_cannot_start_is_made_with_a_warning(self):
|
def test_a_clone_that_cannot_start_is_made_with_a_warning(self):
|
||||||
self.proxy.start.side_effect = libvirt.libvirtError("no memory")
|
self.proxy.start.side_effect = libvirt.libvirtError("no memory")
|
||||||
op, result = self.clone_with(**{"clone-start": "true"})
|
op, result = self.clone_with(**{"clone-start": "true"})
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue