merge from trunk
This commit is contained in:
commit
9c6465abcd
|
@ -11,6 +11,8 @@
|
|||
unicode).
|
||||
- config/cloud.cfg.d/05_logging.cfg: provide a default 'output' setting, to
|
||||
redirect cloud-init stderr and stdout /var/log/cloud-init-output.log.
|
||||
- drop support for resizing partitions with parted entirely (LP: #1212492).
|
||||
This was broken as it was anyway.
|
||||
0.7.4:
|
||||
- fix issue mounting 'ephemeral0' if ephemeral0 was an alias for a
|
||||
partitioned block device with target filesystem on ephemeral0.1.
|
||||
|
|
|
@ -80,30 +80,6 @@ class ResizeFailedException(Exception):
|
|||
pass
|
||||
|
||||
|
||||
class ResizeParted(object):
|
||||
def available(self):
|
||||
myenv = os.environ.copy()
|
||||
myenv['LANG'] = 'C'
|
||||
|
||||
try:
|
||||
(out, _err) = util.subp(["parted", "--help"], env=myenv)
|
||||
if re.search(r"COMMAND.*resizepart\s+", out, re.DOTALL):
|
||||
return True
|
||||
|
||||
except util.ProcessExecutionError:
|
||||
pass
|
||||
return False
|
||||
|
||||
def resize(self, diskdev, partnum, partdev):
|
||||
before = get_size(partdev)
|
||||
try:
|
||||
util.subp(["parted", diskdev, "resizepart", partnum])
|
||||
except util.ProcessExecutionError as e:
|
||||
raise ResizeFailedException(e)
|
||||
|
||||
return (before, get_size(partdev))
|
||||
|
||||
|
||||
class ResizeGrowPart(object):
|
||||
def available(self):
|
||||
myenv = os.environ.copy()
|
||||
|
@ -279,6 +255,4 @@ def handle(_name, cfg, _cloud, log, _args):
|
|||
else:
|
||||
log.debug("'%s' %s: %s" % (entry, action, msg))
|
||||
|
||||
# LP: 1212444 FIXME re-order and favor ResizeParted
|
||||
#RESIZERS = (('growpart', ResizeGrowPart),)
|
||||
RESIZERS = (('growpart', ResizeGrowPart), ('parted', ResizeParted))
|
||||
RESIZERS = (('growpart', ResizeGrowPart),)
|
||||
|
|
|
@ -323,7 +323,7 @@ def parse_shell_config(content, keylist=None, bash=None, asuser=None,
|
|||
(output, _error) = util.subp(cmd, data=bcmd)
|
||||
|
||||
# exclude vars in bash that change on their own or that we used
|
||||
excluded = ("RANDOM", "LINENO", "_", "__v")
|
||||
excluded = ("RANDOM", "LINENO", "SECONDS", "_", "__v")
|
||||
preset = {}
|
||||
ret = {}
|
||||
target = None
|
||||
|
|
|
@ -5,12 +5,10 @@
|
|||
#
|
||||
# mode:
|
||||
# values:
|
||||
# * auto: use any option possible (growpart or parted)
|
||||
# * auto: use any option possible (any available)
|
||||
# if none are available, do not warn, but debug.
|
||||
# * growpart: use growpart to grow partitions
|
||||
# if growpart is not available, this is an error.
|
||||
# * parted: use parted (parted resizepart) to resize partitions
|
||||
# if parted is not available, this is an error.
|
||||
# * off, false
|
||||
#
|
||||
# devices:
|
||||
|
|
|
@ -258,6 +258,14 @@ iface eth0 inet static
|
|||
''')
|
||||
|
||||
|
||||
class TestParseShellConfig(MockerTestCase):
|
||||
def test_no_seconds(self):
|
||||
cfg = '\n'.join(["foo=bar", "SECONDS=2", "xx=foo"])
|
||||
# we could test 'sleep 2', but that would make the test run slower.
|
||||
ret = ds.parse_shell_config(cfg)
|
||||
self.assertEqual(ret, {"foo": "bar", "xx": "foo"})
|
||||
|
||||
|
||||
def populate_context_dir(path, variables):
|
||||
data = "# Context variables generated by OpenNebula\n"
|
||||
for (k, v) in variables.iteritems():
|
||||
|
|
|
@ -12,50 +12,9 @@ import re
|
|||
import unittest
|
||||
|
||||
# growpart:
|
||||
# mode: auto # off, on, auto, 'growpart', 'parted'
|
||||
# mode: auto # off, on, auto, 'growpart'
|
||||
# devices: ['root']
|
||||
|
||||
HELP_PARTED_NO_RESIZE = """
|
||||
Usage: parted [OPTION]... [DEVICE [COMMAND [PARAMETERS]...]...]
|
||||
Apply COMMANDs with PARAMETERS to DEVICE. If no COMMAND(s) are given, run in
|
||||
interactive mode.
|
||||
|
||||
OPTIONs:
|
||||
<SNIP>
|
||||
|
||||
COMMANDs:
|
||||
<SNIP>
|
||||
quit exit program
|
||||
rescue START END rescue a lost partition near START
|
||||
and END
|
||||
resize NUMBER START END resize partition NUMBER and its file
|
||||
system
|
||||
rm NUMBER delete partition NUMBER
|
||||
<SNIP>
|
||||
Report bugs to bug-parted@gnu.org
|
||||
"""
|
||||
|
||||
HELP_PARTED_RESIZE = """
|
||||
Usage: parted [OPTION]... [DEVICE [COMMAND [PARAMETERS]...]...]
|
||||
Apply COMMANDs with PARAMETERS to DEVICE. If no COMMAND(s) are given, run in
|
||||
interactive mode.
|
||||
|
||||
OPTIONs:
|
||||
<SNIP>
|
||||
|
||||
COMMANDs:
|
||||
<SNIP>
|
||||
quit exit program
|
||||
rescue START END rescue a lost partition near START
|
||||
and END
|
||||
resize NUMBER START END resize partition NUMBER and its file
|
||||
system
|
||||
resizepart NUMBER END resize partition NUMBER
|
||||
rm NUMBER delete partition NUMBER
|
||||
<SNIP>
|
||||
Report bugs to bug-parted@gnu.org
|
||||
"""
|
||||
|
||||
HELP_GROWPART_RESIZE = """
|
||||
growpart disk partition
|
||||
rewrite partition table so that partition takes up all the space it can
|
||||
|
@ -122,11 +81,8 @@ class TestConfig(MockerTestCase):
|
|||
# Order must be correct
|
||||
self.mocker.order()
|
||||
|
||||
@unittest.skip("until LP: #1212444 fixed")
|
||||
def test_no_resizers_auto_is_fine(self):
|
||||
subp = self.mocker.replace(util.subp, passthrough=False)
|
||||
subp(['parted', '--help'], env={'LANG': 'C'})
|
||||
self.mocker.result((HELP_PARTED_NO_RESIZE, ""))
|
||||
subp(['growpart', '--help'], env={'LANG': 'C'})
|
||||
self.mocker.result((HELP_GROWPART_NO_RESIZE, ""))
|
||||
self.mocker.replay()
|
||||
|
@ -144,15 +100,14 @@ class TestConfig(MockerTestCase):
|
|||
self.assertRaises(ValueError, self.handle, self.name, config,
|
||||
self.cloud_init, self.log, self.args)
|
||||
|
||||
@unittest.skip("until LP: #1212444 fixed")
|
||||
def test_mode_auto_prefers_parted(self):
|
||||
def test_mode_auto_prefers_growpart(self):
|
||||
subp = self.mocker.replace(util.subp, passthrough=False)
|
||||
subp(['parted', '--help'], env={'LANG': 'C'})
|
||||
self.mocker.result((HELP_PARTED_RESIZE, ""))
|
||||
subp(['growpart', '--help'], env={'LANG': 'C'})
|
||||
self.mocker.result((HELP_GROWPART_RESIZE, ""))
|
||||
self.mocker.replay()
|
||||
|
||||
ret = cc_growpart.resizer_factory(mode="auto")
|
||||
self.assertTrue(isinstance(ret, cc_growpart.ResizeParted))
|
||||
self.assertTrue(isinstance(ret, cc_growpart.ResizeGrowPart))
|
||||
|
||||
def test_handle_with_no_growpart_entry(self):
|
||||
#if no 'growpart' entry in config, then mode=auto should be used
|
||||
|
|
Loading…
Reference in New Issue