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:
committed by
Gerrit Code Review
parent
462e752f54
commit
43bc41c31d
@@ -47,6 +47,10 @@ QUEUE = Queue.Queue()
|
|||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class BareMetalDeployException(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
# All functions are called from deploy() directly or indirectly.
|
# All functions are called from deploy() directly or indirectly.
|
||||||
# They are split for stub-out.
|
# 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):
|
def work_on_disk(dev, root_mb, swap_mb, ephemeral_mb, image_path):
|
||||||
"""Creates partitions and write an image to the root partition."""
|
"""Creates partitions and write an image to the root partition."""
|
||||||
|
def raise_exception(msg):
|
||||||
|
LOG.error(msg)
|
||||||
|
raise BareMetalDeployException(msg)
|
||||||
|
|
||||||
if ephemeral_mb:
|
if ephemeral_mb:
|
||||||
ephemeral_part = "%s-part1" % dev
|
ephemeral_part = "%s-part1" % dev
|
||||||
swap_part = "%s-part2" % 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
|
swap_part = "%s-part2" % dev
|
||||||
|
|
||||||
if not is_block_device(dev):
|
if not is_block_device(dev):
|
||||||
LOG.warn(_("parent device '%s' not found"), dev)
|
raise_exception(_("parent device '%s' not found") % dev)
|
||||||
return
|
|
||||||
make_partitions(dev, root_mb, swap_mb, ephemeral_mb)
|
make_partitions(dev, root_mb, swap_mb, ephemeral_mb)
|
||||||
if not is_block_device(root_part):
|
if not is_block_device(root_part):
|
||||||
LOG.warn(_("root device '%s' not found"), root_part)
|
raise_exception(_("root device '%s' not found") % root_part)
|
||||||
return
|
|
||||||
if not is_block_device(swap_part):
|
if not is_block_device(swap_part):
|
||||||
LOG.warn(_("swap device '%s' not found"), swap_part)
|
raise_exception(_("swap device '%s' not found") % swap_part)
|
||||||
return
|
if ephemeral_mb and not is_block_device(ephemeral_part):
|
||||||
|
raise_exception(_("ephemeral device '%s' not found") % ephemeral_part)
|
||||||
dd(image_path, root_part)
|
dd(image_path, root_part)
|
||||||
mkswap(swap_part)
|
mkswap(swap_part)
|
||||||
if ephemeral_mb and not is_block_device(ephemeral_part):
|
if ephemeral_mb:
|
||||||
LOG.warn(_("ephemeral device '%s' not found"), ephemeral_part)
|
|
||||||
elif ephemeral_mb:
|
|
||||||
mkfs_ephemeral(ephemeral_part)
|
mkfs_ephemeral(ephemeral_part)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import os
|
|||||||
import tempfile
|
import tempfile
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
import mock
|
||||||
import mox
|
import mox
|
||||||
|
|
||||||
from nova.cmd import baremetal_deploy_helper as bmdh
|
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)
|
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):
|
class SwitchPxeConfigTestCase(test.NoDBTestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(SwitchPxeConfigTestCase, self).setUp()
|
super(SwitchPxeConfigTestCase, self).setUp()
|
||||||
|
|||||||
Reference in New Issue
Block a user