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:
Arata Notsu 2013-11-15 14:16:55 +09:00 committed by Gerrit Code Review
parent 462e752f54
commit 43bc41c31d
2 changed files with 81 additions and 9 deletions

View File

@ -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:

View File

@ -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()