baremetal: stop deployment if block devices are not available
In this case deploy-helper should abort immediately and make sure that the instance's status set to ERROR. Closes-Bug: 1251525 Change-Id: Ic09f171edb0fe3a449c7adfe622ab48709c73252
This commit is contained in:
parent
462e752f54
commit
43bc41c31d
|
@ -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:
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue