cloud-init-dev team mailing list archive
-
cloud-init-dev team
-
Mailing list archive
-
Message #03624
Re: [Merge] ~chad.smith/cloud-init:fix-device-path-from-cmdline-regression into cloud-init:master
@smoser review comments addressed
Diff comments:
> diff --git a/cloudinit/config/cc_resizefs.py b/cloudinit/config/cc_resizefs.py
> index f774baa..eaa80bf 100644
> --- a/cloudinit/config/cc_resizefs.py
> +++ b/cloudinit/config/cc_resizefs.py
> @@ -242,8 +243,9 @@ def handle(name, cfg, _cloud, log, args):
> info = "dev=%s mnt_point=%s path=%s" % (devpth, mount_point, resize_what)
> log.debug("resize_info: %s" % info)
>
> - if not is_device_path_writable_block(devpth, info, log):
> - return
> + devpth = maybe_get_writable_device_path(devpth, info, log)
> + if not devpth:
> + return # devpath was not a writabl block device
fixed.
>
> resizer = None
> if can_skip_resize(fs_type, resize_what, devpth):
> diff --git a/requirements.txt b/requirements.txt
> index dd10d85..b44c742 100644
> --- a/requirements.txt
> +++ b/requirements.txt
> @@ -31,7 +31,7 @@ requests
> jsonpatch
>
> # For validating cloud-config sections per schema definitions
> -jsonschema
oops, reverting.
> +#jsonschema
>
> # For Python 2/3 compatibility
> six
> diff --git a/tests/unittests/test_handler/test_handler_resizefs.py b/tests/unittests/test_handler/test_handler_resizefs.py
> index 3e5d436..ff97426 100644
> --- a/tests/unittests/test_handler/test_handler_resizefs.py
> +++ b/tests/unittests/test_handler/test_handler_resizefs.py
> @@ -1,9 +1,10 @@
> # This file is part of cloud-init. See LICENSE file for license information.
>
> from cloudinit.config.cc_resizefs import (
> - can_skip_resize, handle, is_device_path_writable_block,
> + can_skip_resize, handle, maybe_get_writable_device_path,
> rootdev_from_cmdline)
>
> +from collections import namedtuple
Yeah I read docs that said introduced in 2.6 to be sure. But, best to be certain.
> import logging
> import textwrap
>
> @@ -234,41 +235,61 @@ class TestIsDevicePathWritableBlock(CiTestCase):
> 'cloudinit.config.cc_resizefs',
> {'util.is_container': {'return_value': True},
> 'os.stat': {'side_effect': OSError('Something unexpected')}},
> - is_device_path_writable_block, '/I/dont/exist', info, LOG)
> + maybe_get_writable_device_path, '/I/dont/exist', info, LOG)
> self.assertEqual(
> 'Something unexpected', str(context_manager.exception))
>
> - def test_is_device_path_writable_block_non_block(self):
> + def test_maybe_get_writable_device_path_non_block(self):
> """When device is not a block device, emit warning return False."""
> fake_devpath = self.tmp_path('dev/readwrite')
> util.write_file(fake_devpath, '', mode=0o600) # read-write
> info = 'dev=/dev/root mnt_point=/ path={0}'.format(fake_devpath)
>
> - is_writable = wrap_and_call(
> + devpath = wrap_and_call(
> 'cloudinit.config.cc_resizefs.util',
> {'is_container': {'return_value': False}},
> - is_device_path_writable_block, fake_devpath, info, LOG)
> - self.assertFalse(is_writable)
> + maybe_get_writable_device_path, fake_devpath, info, LOG)
> + self.assertIsNone(devpath)
> self.assertIn(
> "WARNING: device '{0}' not a block device. cannot resize".format(
> fake_devpath),
> self.logs.getvalue())
>
> - def test_is_device_path_writable_block_non_block_on_container(self):
> + def test_maybe_get_writable_device_path_non_block_on_container(self):
> """When device is non-block device in container, emit debug log."""
> fake_devpath = self.tmp_path('dev/readwrite')
> util.write_file(fake_devpath, '', mode=0o600) # read-write
> info = 'dev=/dev/root mnt_point=/ path={0}'.format(fake_devpath)
>
> - is_writable = wrap_and_call(
> + devpath = wrap_and_call(
> 'cloudinit.config.cc_resizefs.util',
> {'is_container': {'return_value': True}},
> - is_device_path_writable_block, fake_devpath, info, LOG)
> - self.assertFalse(is_writable)
> + maybe_get_writable_device_path, fake_devpath, info, LOG)
> + self.assertIsNone(devpath)
> self.assertIn(
> "DEBUG: device '{0}' not a block device in container."
> ' cannot resize'.format(fake_devpath),
> self.logs.getvalue())
>
> + def test_maybe_get_writable_device_path_returns_cmdline_root(self):
> + """When root device is UUID in kernel commandline, update devpath."""
> + FakeStat = namedtuple(
ok leaving this in for the branch and adding an XXX comment for future reference (as i know there are other tests which mock os.stat too.
> + 'FakeStat', ['st_mode', 'st_size', 'st_mtime']) # minimal def.
> + info = 'dev=/dev/root mnt_point=/ path=/does/not/matter'
> + devpath = wrap_and_call(
> + 'cloudinit.config.cc_resizefs',
> + {'util.get_cmdline': {'return_value': 'asdf root=UUID=my-uuid'},
> + 'util.is_container': False,
> + 'os.path.exists': False, # /dev/root doesn't exist
> + 'os.stat': {
> + 'return_value': FakeStat(25008, 0, 1)} # char block device
> + },
> + maybe_get_writable_device_path, '/dev/root', info, LOG)
> + self.assertEqual('/dev/disk/by-uuid/my-uuid', devpath)
> + self.assertIn(
> + "DEBUG: Converted /dev/root to '/dev/disk/by-uuid/my-uuid'"
> + " per kernel cmdline",
> + self.logs.getvalue())
> +
>
> # vi: ts=4 expandtab
--
https://code.launchpad.net/~chad.smith/cloud-init/+git/cloud-init/+merge/332634
Your team cloud-init commiters is requested to review the proposed merge of ~chad.smith/cloud-init:fix-device-path-from-cmdline-regression into cloud-init:master.
References