diff --git a/nova/cmd/baremetal_deploy_helper.py b/nova/cmd/baremetal_deploy_helper.py index 33e7114d8b72..9dfed7df9631 100644 --- a/nova/cmd/baremetal_deploy_helper.py +++ b/nova/cmd/baremetal_deploy_helper.py @@ -47,6 +47,10 @@ QUEUE = Queue.Queue() LOG = logging.getLogger(__name__) +class BareMetalDeployException(Exception): + pass + + # All functions are called from deploy() directly or indirectly. # They are split for stub-out. @@ -186,6 +190,10 @@ def get_image_mb(image_path): def work_on_disk(dev, root_mb, swap_mb, ephemeral_mb, image_path): """Creates partitions and write an image to the root partition.""" + def raise_exception(msg): + LOG.error(msg) + raise BareMetalDeployException(msg) + if ephemeral_mb: ephemeral_part = "%s-part1" % dev swap_part = "%s-part2" % dev @@ -195,20 +203,17 @@ def work_on_disk(dev, root_mb, swap_mb, ephemeral_mb, image_path): swap_part = "%s-part2" % dev if not is_block_device(dev): - LOG.warn(_("parent device '%s' not found"), dev) - return + raise_exception(_("parent device '%s' not found") % dev) make_partitions(dev, root_mb, swap_mb, ephemeral_mb) if not is_block_device(root_part): - LOG.warn(_("root device '%s' not found"), root_part) - return + raise_exception(_("root device '%s' not found") % root_part) if not is_block_device(swap_part): - LOG.warn(_("swap device '%s' not found"), swap_part) - return + raise_exception(_("swap device '%s' not found") % swap_part) + if ephemeral_mb and not is_block_device(ephemeral_part): + raise_exception(_("ephemeral device '%s' not found") % ephemeral_part) dd(image_path, root_part) mkswap(swap_part) - if ephemeral_mb and not is_block_device(ephemeral_part): - LOG.warn(_("ephemeral device '%s' not found"), ephemeral_part) - elif ephemeral_mb: + if ephemeral_mb: mkfs_ephemeral(ephemeral_part) try: diff --git a/nova/tests/virt/baremetal/test_nova_baremetal_deploy_helper.py b/nova/tests/virt/baremetal/test_nova_baremetal_deploy_helper.py index 8b52ef1ace8e..a5b4cc190d8b 100644 --- a/nova/tests/virt/baremetal/test_nova_baremetal_deploy_helper.py +++ b/nova/tests/virt/baremetal/test_nova_baremetal_deploy_helper.py @@ -20,6 +20,7 @@ import os import tempfile import time +import mock import mox from nova.cmd import baremetal_deploy_helper as bmdh @@ -271,6 +272,72 @@ class PhysicalWorkTestCase(test.NoDBTestCase): pxe_config_path, root_mb, swap_mb, ephemeral_mb) +class WorkOnDiskTestCase(test.NoDBTestCase): + def setUp(self): + super(WorkOnDiskTestCase, self).setUp() + self.image_path = '/tmp/xyz/image' + self.root_mb = 128 + self.swap_mb = 64 + self.ephemeral_mb = 256 + self.dev = '/dev/fake' + self.ephemeral_part = '/dev/fake-part1' + self.swap_part = '/dev/fake-part2' + self.root_part = '/dev/fake-part3' + + self.m_ibd = mock.Mock() + self.m_mp = mock.Mock() + self.stubs.Set(bmdh, 'is_block_device', self.m_ibd) + self.stubs.Set(bmdh, 'make_partitions', self.m_mp) + + def test_no_parent_device(self): + self.m_ibd.return_value = False + self.assertRaises(bmdh.BareMetalDeployException, + bmdh.work_on_disk, + self.dev, self.root_mb, self.swap_mb, + self.ephemeral_mb, self.image_path) + self.m_ibd.assert_called_once_with(self.dev) + self.m_mp.assert_not_called() + + def test_no_root_partition(self): + self.m_ibd.side_effect = [True, False] + calls = [mock.call(self.dev), + mock.call(self.root_part)] + self.assertRaises(bmdh.BareMetalDeployException, + bmdh.work_on_disk, + self.dev, self.root_mb, self.swap_mb, + self.ephemeral_mb, self.image_path) + self.assertEqual(self.m_ibd.call_args_list, calls) + self.m_mp.assert_called_once_with(self.dev, self.root_mb, self.swap_mb, + self.ephemeral_mb) + + def test_no_swap_partition(self): + self.m_ibd.side_effect = [True, True, False] + calls = [mock.call(self.dev), + mock.call(self.root_part), + mock.call(self.swap_part)] + self.assertRaises(bmdh.BareMetalDeployException, + bmdh.work_on_disk, + self.dev, self.root_mb, self.swap_mb, + self.ephemeral_mb, self.image_path) + self.assertEqual(self.m_ibd.call_args_list, calls) + self.m_mp.assert_called_once_with(self.dev, self.root_mb, self.swap_mb, + self.ephemeral_mb) + + def test_no_ephemeral_partition(self): + self.m_ibd.side_effect = [True, True, True, False] + calls = [mock.call(self.dev), + mock.call(self.root_part), + mock.call(self.swap_part), + mock.call(self.ephemeral_part)] + self.assertRaises(bmdh.BareMetalDeployException, + bmdh.work_on_disk, + self.dev, self.root_mb, self.swap_mb, + self.ephemeral_mb, self.image_path) + self.assertEqual(self.m_ibd.call_args_list, calls) + self.m_mp.assert_called_once_with(self.dev, self.root_mb, self.swap_mb, + self.ephemeral_mb) + + class SwitchPxeConfigTestCase(test.NoDBTestCase): def setUp(self): super(SwitchPxeConfigTestCase, self).setUp()