Fix to return 'root_uuid' as part of command status

IPA does not return 'root_uuid' as part of command status when
provisioning of whole disk image is done using 'agent' deploy
interface from ironic. This commit fixes the issue.
Also updated Dockerfile to include package 'bsdmainutils' related
to 'hexdump' binary.

Change-Id: I89597fe4a704686fe31c064c3443fd8404a300e5
Partial-Bug: #1713916
This commit is contained in:
Shivanand Tendulker 2017-09-01 07:45:49 -04:00
parent 51bc4b538b
commit c5bf7b088f
4 changed files with 40 additions and 15 deletions

View File

@ -25,7 +25,7 @@ RUN proxy.sh apt-get update && \
proxy.sh apt-get -y upgrade && \
proxy.sh apt-get install -y --no-install-recommends gdisk python2.7 python2.7-dev \
python-pip qemu-utils parted hdparm util-linux genisoimage git gcc \
bash coreutils tgt dmidecode ipmitool psmisc dosfstools && \
bash coreutils tgt dmidecode ipmitool psmisc dosfstools bsdmainutils && \
proxy.sh apt-get --only-upgrade -t jessie-backports install -y qemu-utils
# Some cleanup

View File

@ -154,7 +154,9 @@ def _message_format(msg, image_info, device, partition_uuids):
result_msg = msg + 'root_uuid={}'
message = result_msg.format(image_info['id'], device, root_uuid)
else:
message = result_msg.format(image_info['id'], device)
root_uuid = disk_utils.get_disk_identifier(device)
result_msg = msg + 'root_uuid={}'
message = result_msg.format(image_info['id'], device, root_uuid)
return message

View File

@ -29,7 +29,8 @@ def _build_fake_image_info():
'urls': [
'http://example.org',
],
'checksum': 'abc123'
'checksum': 'abc123',
'image_type': 'whole-disk-image',
}
@ -374,6 +375,8 @@ class TestStandbyExtension(test_base.BaseTestCase):
standby._verify_image,
image_info, image_location, checksum)
@mock.patch('ironic_lib.disk_utils.get_disk_identifier',
lambda dev: 'ROOT')
@mock.patch('ironic_python_agent.hardware.dispatch_to_managers',
autospec=True)
@mock.patch('ironic_python_agent.extensions.standby._write_image',
@ -395,8 +398,9 @@ class TestStandbyExtension(test_base.BaseTestCase):
self.agent_extension.cached_image_id)
self.assertEqual('SUCCEEDED', async_result.command_status)
self.assertIn('result', async_result.command_result)
cmd_result = ('cache_image: image ({}) cached to device '
'{} ').format(image_info['id'], 'manager')
cmd_result = ('cache_image: image ({}) cached to device {} '
'root_uuid={}').format(image_info['id'], 'manager',
'ROOT')
self.assertEqual(cmd_result, async_result.command_result['result'])
@mock.patch('ironic_python_agent.hardware.dispatch_to_managers',
@ -425,6 +429,8 @@ class TestStandbyExtension(test_base.BaseTestCase):
'root_uuid')
self.assertEqual(cmd_result, async_result.command_result['result'])
@mock.patch('ironic_lib.disk_utils.get_disk_identifier',
lambda dev: 'ROOT')
@mock.patch('ironic_python_agent.hardware.dispatch_to_managers',
autospec=True)
@mock.patch('ironic_python_agent.extensions.standby._write_image',
@ -449,10 +455,12 @@ class TestStandbyExtension(test_base.BaseTestCase):
self.agent_extension.cached_image_id)
self.assertEqual('SUCCEEDED', async_result.command_status)
self.assertIn('result', async_result.command_result)
cmd_result = ('cache_image: image ({}) cached to device '
'{} ').format(image_info['id'], 'manager')
cmd_result = ('cache_image: image ({}) cached to device {} '
'root_uuid=ROOT').format(image_info['id'], 'manager')
self.assertEqual(cmd_result, async_result.command_result['result'])
@mock.patch('ironic_lib.disk_utils.get_disk_identifier',
lambda dev: 'ROOT')
@mock.patch('ironic_python_agent.hardware.dispatch_to_managers',
autospec=True)
@mock.patch('ironic_python_agent.extensions.standby._write_image',
@ -475,10 +483,12 @@ class TestStandbyExtension(test_base.BaseTestCase):
self.agent_extension.cached_image_id)
self.assertEqual('SUCCEEDED', async_result.command_status)
self.assertIn('result', async_result.command_result)
cmd_result = ('cache_image: image ({}) already present on device '
'{} ').format(image_info['id'], 'manager')
cmd_result = ('cache_image: image ({}) already present on device {} '
'root_uuid=ROOT').format(image_info['id'], 'manager')
self.assertEqual(cmd_result, async_result.command_result['result'])
@mock.patch('ironic_lib.disk_utils.get_disk_identifier',
lambda dev: 'ROOT')
@mock.patch('ironic_lib.disk_utils.create_config_drive_partition',
autospec=True)
@mock.patch('ironic_python_agent.hardware.dispatch_to_managers',
@ -513,8 +523,8 @@ class TestStandbyExtension(test_base.BaseTestCase):
self.assertEqual('SUCCEEDED', async_result.command_status)
self.assertIn('result', async_result.command_result)
cmd_result = ('prepare_image: image ({}) written to device '
'{} ').format(image_info['id'], 'manager')
cmd_result = ('prepare_image: image ({}) written to device {} '
'root_uuid=ROOT').format(image_info['id'], 'manager')
self.assertEqual(cmd_result, async_result.command_result['result'])
@mock.patch('ironic_lib.disk_utils.create_config_drive_partition',
@ -575,6 +585,8 @@ class TestStandbyExtension(test_base.BaseTestCase):
image_info['id'], 'manager', 'root_uuid')
self.assertEqual(cmd_result, async_result.command_result['result'])
@mock.patch('ironic_lib.disk_utils.get_disk_identifier',
lambda dev: 'ROOT')
@mock.patch('ironic_lib.disk_utils.create_config_drive_partition',
autospec=True)
@mock.patch('ironic_python_agent.hardware.dispatch_to_managers',
@ -607,10 +619,12 @@ class TestStandbyExtension(test_base.BaseTestCase):
self.assertEqual(0, configdrive_copy_mock.call_count)
self.assertEqual('SUCCEEDED', async_result.command_status)
self.assertIn('result', async_result.command_result)
cmd_result = ('prepare_image: image ({}) written to device '
'{} ').format(image_info['id'], 'manager')
cmd_result = ('prepare_image: image ({}) written to device {} '
'root_uuid=ROOT').format(image_info['id'], 'manager')
self.assertEqual(cmd_result, async_result.command_result['result'])
@mock.patch('ironic_lib.disk_utils.get_disk_identifier',
lambda dev: 'ROOT')
@mock.patch('ironic_lib.disk_utils.create_config_drive_partition',
autospec=True)
@mock.patch('ironic_python_agent.hardware.dispatch_to_managers',
@ -819,15 +833,17 @@ class TestStandbyExtension(test_base.BaseTestCase):
# Assert write was only called once and failed!
file_mock.write.assert_called_once_with('some')
@mock.patch('ironic_lib.disk_utils.get_disk_identifier',
lambda dev: 'ROOT')
def test__message_format_whole_disk(self):
image_info = _build_fake_image_info()
msg = 'image ({}) already present on device {}'
msg = 'image ({}) already present on device {} '
device = '/dev/fake'
partition_uuids = {}
result_msg = standby._message_format(msg, image_info,
device, partition_uuids)
expected_msg = ('image (fake_id) already present on device '
'/dev/fake')
'/dev/fake root_uuid=ROOT')
self.assertEqual(expected_msg, result_msg)
def test__message_format_partition_bios(self):

View File

@ -0,0 +1,7 @@
---
fixes:
- |
Fixes an issue wherein IPA does not return ``root_uuid`` as part of
command status when provisioning of whole disk image is performed
using ``agent`` deploy interface from ironic. See `bug 1713916
<https://bugs.launchpad.net/ironic/+bug/1713916>`_ for details.