summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2021-06-04 16:35:00 +0000
committerGerrit Code Review <review@openstack.org>2021-06-04 16:35:00 +0000
commit6be440eb3becbb75f9546ee66ee050076a747fa6 (patch)
treed9c7dc11151c44de64b6fe4fadf05ad79cf0b11c
parente27cdb36732d98ca813c1ea62a447dd8e6a68da5 (diff)
parent33d889c3c4d85cdd272ced73951459edf7a6adb5 (diff)
downloadironic-python-agent-6be440eb3becbb75f9546ee66ee050076a747fa6.tar.gz
Merge "Refactor: use convert_image from ironic_lib"
-rw-r--r--ironic_python_agent/extensions/standby.py17
-rw-r--r--ironic_python_agent/tests/unit/extensions/test_standby.py23
-rw-r--r--requirements.txt2
3 files changed, 14 insertions, 28 deletions
diff --git a/ironic_python_agent/extensions/standby.py b/ironic_python_agent/extensions/standby.py
index ce754f82..970cf7de 100644
--- a/ironic_python_agent/extensions/standby.py
+++ b/ironic_python_agent/extensions/standby.py
@@ -23,7 +23,6 @@ from ironic_lib import exception
from oslo_concurrency import processutils
from oslo_config import cfg
from oslo_log import log
-from oslo_utils import units
import requests
from ironic_python_agent import errors
@@ -205,20 +204,8 @@ def _write_whole_disk_image(image, image_info, device):
image, device]
LOG.info('Writing image with command: {}'.format(' '.join(command)))
try:
- # TODO(dtantsur): switch to disk_utils.convert_image when it supports
- # -t and -W flags and defaults to 2 GiB memory limit.
- limits = processutils.ProcessLimits(address_space=2048 * units.Mi)
- # TODO(TheJulia): qemu-img uses a default of 8 * nCPU to determine
- # how many chunks of memory to allocate based upon the discussion in
- # https://bugzilla.redhat.com/show_bug.cgi?id=1892773.
- # Setting MALLOC_AREA_MAX=1 results in a process memory footprint of
- # ~250mb. Setting it to 3 will allow for multiple areas, but won't
- # greatly exceed the footprint.
- env_vars = {'MALLOC_ARENA_MAX': '3'}
- # Entirely disabling threading results in the same memory footprint
- # as 1 areana, but multiple threads are useful for performance
- # as the file could be fragmented/compressed.
- utils.execute(*command, prlimit=limits, env_variables=env_vars)
+ disk_utils.convert_image(image, device, out_format='host_device',
+ cache='directsync', out_of_order=True)
except processutils.ProcessExecutionError as e:
raise errors.ImageWriteError(device, e.exit_code, e.stdout, e.stderr)
diff --git a/ironic_python_agent/tests/unit/extensions/test_standby.py b/ironic_python_agent/tests/unit/extensions/test_standby.py
index f9f1d530..97dffbe8 100644
--- a/ironic_python_agent/tests/unit/extensions/test_standby.py
+++ b/ironic_python_agent/tests/unit/extensions/test_standby.py
@@ -168,22 +168,21 @@ class TestStandbyExtension(base.IronicAgentTest):
@mock.patch('ironic_lib.disk_utils.fix_gpt_partition', autospec=True)
@mock.patch('ironic_lib.disk_utils.trigger_device_rescan', autospec=True)
- @mock.patch('ironic_python_agent.utils.execute', autospec=True)
+ @mock.patch('ironic_lib.disk_utils.convert_image', autospec=True)
@mock.patch('ironic_lib.disk_utils.udev_settle', autospec=True)
@mock.patch('ironic_lib.disk_utils.destroy_disk_metadata', autospec=True)
- def test_write_image(self, wipe_mock, udev_mock, execute_mock,
+ def test_write_image(self, wipe_mock, udev_mock, convert_mock,
rescan_mock, fix_gpt_mock):
image_info = _build_fake_image_info()
device = '/dev/sda'
location = standby._image_location(image_info)
- command = ['qemu-img', 'convert', '-t', 'directsync',
- '-O', 'host_device', '-W', location, device]
standby._write_image(image_info, device)
- execute_mock.assert_called_once_with(
- *command, prlimit=mock.ANY,
- env_variables={'MALLOC_ARENA_MAX': '3'})
+ convert_mock.assert_called_once_with(location, device,
+ out_format='host_device',
+ cache='directsync',
+ out_of_order=True)
wipe_mock.assert_called_once_with(device, '')
udev_mock.assert_called_once_with()
rescan_mock.assert_called_once_with(device)
@@ -191,10 +190,10 @@ class TestStandbyExtension(base.IronicAgentTest):
@mock.patch('ironic_lib.disk_utils.fix_gpt_partition', autospec=True)
@mock.patch('ironic_lib.disk_utils.trigger_device_rescan', autospec=True)
- @mock.patch('ironic_python_agent.utils.execute', autospec=True)
+ @mock.patch('ironic_lib.disk_utils.convert_image', autospec=True)
@mock.patch('ironic_lib.disk_utils.udev_settle', autospec=True)
@mock.patch('ironic_lib.disk_utils.destroy_disk_metadata', autospec=True)
- def test_write_image_gpt_fails(self, wipe_mock, udev_mock, execute_mock,
+ def test_write_image_gpt_fails(self, wipe_mock, udev_mock, convert_mock,
rescan_mock, fix_gpt_mock):
image_info = _build_fake_image_info()
device = '/dev/sda'
@@ -202,13 +201,13 @@ class TestStandbyExtension(base.IronicAgentTest):
fix_gpt_mock.side_effect = exception.InstanceDeployFailure
standby._write_image(image_info, device)
- @mock.patch('ironic_python_agent.utils.execute', autospec=True)
+ @mock.patch('ironic_lib.disk_utils.convert_image', autospec=True)
@mock.patch('ironic_lib.disk_utils.udev_settle', autospec=True)
@mock.patch('ironic_lib.disk_utils.destroy_disk_metadata', autospec=True)
- def test_write_image_fails(self, wipe_mock, udev_mock, execute_mock):
+ def test_write_image_fails(self, wipe_mock, udev_mock, convert_mock):
image_info = _build_fake_image_info()
device = '/dev/sda'
- execute_mock.side_effect = processutils.ProcessExecutionError
+ convert_mock.side_effect = processutils.ProcessExecutionError
self.assertRaises(errors.ImageWriteError,
standby._write_image,
diff --git a/requirements.txt b/requirements.txt
index a08384d2..69d886cd 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -17,6 +17,6 @@ pyudev>=0.18 # LGPLv2.1+
requests>=2.14.2 # Apache-2.0
stevedore>=1.20.0 # Apache-2.0
tenacity>=6.2.0 # Apache-2.0
-ironic-lib>=4.5.0 # Apache-2.0
+ironic-lib>=4.7.1 # Apache-2.0
Werkzeug>=1.0.1 # BSD License
cryptography>=2.3 # BSD/Apache-2.0