diff --git a/devops/driver/libvirt/libvirt_driver.py b/devops/driver/libvirt/libvirt_driver.py index 4b93632d..39eb8f82 100644 --- a/devops/driver/libvirt/libvirt_driver.py +++ b/devops/driver/libvirt/libvirt_driver.py @@ -43,6 +43,7 @@ from devops.models import driver from devops.models import network from devops.models import node from devops.models import volume +from devops.settings import LIBVIRT_KEYPRESS_DELAY class _LibvirtManager(object): @@ -1124,6 +1125,8 @@ class LibvirtNode(node.Node): time.sleep(1) continue self._libvirt_node.sendKey(0, 0, list(key_code), len(key_code), 0) + # Limit Keypress rate with configurable delay between sending + time.sleep(LIBVIRT_KEYPRESS_DELAY) @decorators.retry(libvirt.libvirtError) def define(self): diff --git a/devops/settings.py b/devops/settings.py index add1df2d..420a5c48 100644 --- a/devops/settings.py +++ b/devops/settings.py @@ -37,6 +37,8 @@ DRIVER_PARAMETERS = { 'use_host_cpu': get_var_as_bool('DRIVER_USE_HOST_CPU', True), 'enable_acpi': get_var_as_bool('DRIVER_ENABLE_ACPI', False), } +LIBVIRT_KEYPRESS_DELAY = float( + os.environ.get("LIBVIRT_KEYPRESS_DELAY", "0.05")) MIDDLEWARE_CLASSES = [] # required for django diff --git a/devops/tests/driver/libvirt/test_node.py b/devops/tests/driver/libvirt/test_node.py index 0f7d2349..87debde2 100644 --- a/devops/tests/driver/libvirt/test_node.py +++ b/devops/tests/driver/libvirt/test_node.py @@ -211,7 +211,11 @@ class TestLibvirtNode(LibvirtTestCase): mock.call(0, 0, [4], 1, 0), mock.call(0, 0, [28], 1, 0), ]) - self.sleep_mock.assert_called_once_with(1) + assert self.sleep_mock.call_args_list == [mock.call(0.05), + mock.call(0.05), + mock.call(0.05), + mock.call(1), + mock.call(0.05)] def test_start_reboot(self): self.node.define()