On Wed, Apr 8, 2015 at 4:37 PM, 'Klaus Aehlig' via ganeti-devel < [email protected]> wrote:
> > > commit 343d53a31a9e438dae3ba53c8778fa50d0660286 > Merge: 6af5421 5e68cc5 > Author: Klaus Aehlig <[email protected]> > Date: Wed Apr 8 16:26:01 2015 +0200 > > Merge branch 'stable-2.12' into stable-2.13 > > * stable-2.12 > Fix typos > > * stable-2.11 > (no changes) > > * stable-2.10 > fix typos in design-file-based-storage.rst doc > Switch to our osminor > Provide an alternative for os.minor working around its bug > Fix typo > CanTieredAlloc test: make instances big enough > After master-failover verify reachability of master IP > Report failure to deactivate old master IP in exit code > Expose warnings during master-failover > Fix manpage for gnt-cluster copyfile > > Conflicts: > lib/storage/bdev.py: trivial > lib/utils/storage.py: take stable-2.13 > Didn't you just combine here? LGTM otherwise. > > Signed-off-by: Klaus Aehlig <[email protected]> > > diff --cc lib/utils/storage.py > index c8aa2b9,e742d5e..0b7e388 > --- a/lib/utils/storage.py > +++ b/lib/utils/storage.py > @@@ -220,73 -217,11 +220,83 @@@ def GetDiskLabels(prefix, num_disks, st > yield prefix + _GetDiskSuffix(i) > > > +def CreateBdevPartitionMapping(image_path): > + """Create dm device for each partition of disk image. > + > + This operation will allocate a loopback and a device-mapper device to > map > + partitions. > + You must call L{ReleaseBdevPartitionMapping} to clean up resources > allocated > + by this function call. > + > + @type image_path: string > + @param image_path: path of multi-partition disk image > + @rtype: tuple(string, list(string)) or NoneType > + @return: returns the tuple(loopback_device, list(device_mapper_files)) > if > + image_path is a multi-partition disk image. otherwise, returns None. > + > + """ > + # Unfortunately, there are two different losetup commands in this > world. > + # One has the '-s' switch and the other has the '--show' switch to > provide the > + # same functionality. > + result = utils_process.RunCmd(["losetup", "-f", "-s", image_path]) > + if result.failed and "invalid option -- 's'" in result.stderr: > + result = utils_process.RunCmd(["losetup", "-f", "--show", > image_path]) > + if result.failed: > + raise errors.CommandError("Failed to setup loop device for %s: %s" % > + (image_path, result.output)) > + loop_dev_path = result.stdout.strip() > + logging.debug("Loop dev %s allocated for %s", loop_dev_path, > image_path) > + > + result = utils_process.RunCmd(["kpartx", "-a", "-v", loop_dev_path]) > + if result.failed: > + # Just try to cleanup allocated loop device > + utils_process.RunCmd(["losetup", "-d", loop_dev_path]) > + raise errors.CommandError("Failed to add partition mapping for %s: > %s" % > + (image_path, result.output)) > + dm_devs = [x.split(" ") for x in result.stdout.split("\n") if x] > + if dm_devs: > + dm_dev_paths = [utils_io.PathJoin("/dev/mapper", x[2]) for x in > dm_devs] > + return (loop_dev_path, dm_dev_paths) > + else: > + # image_path is not a multi partition disk image, no need to use > + # device-mapper. > + logging.debug("Release loop dev %s allocated for %s", > + loop_dev_path, image_path) > + ReleaseBdevPartitionMapping(loop_dev_path) > + return None > + > + > +def ReleaseBdevPartitionMapping(loop_dev_path): > + """Release allocated dm devices and loopback devices. > + > + @type loop_dev_path: string > + @param loop_dev_path: path of loopback device returned by > + L{CreateBdevPartitionMapping} > + > + """ > + result = utils_process.RunCmd(["kpartx", "-d", loop_dev_path]) > + if result.failed: > + raise errors.CommandError("Failed to release partition mapping of > %s: %s" % > + (loop_dev_path, result.output)) > + > + # The invocation of udevadm settle was added here because users had > issues > + # with the loopback device still being busy after kpartx / earlier > commands > + # did their work. > + result = utils_process.RunCmd(["udevadm", "settle"]) > + if result.failed: > + raise errors.CommandError("Waiting on udev failed: %s" % > result.output) > + > + result = utils_process.RunCmd(["losetup", "-d", loop_dev_path]) > + if result.failed: > + raise errors.CommandError("Failed to detach %s: %s" % > + (loop_dev_path, result.output)) > ++ > ++ > + def osminor(dev): > + """Return the device minor number from a raw device number. > + > + This is a replacement for os.minor working around the issue that > + Python's os.minor still has the old definition. See Ganeti issue > + 1058 for more details. > + """ > + return (dev & 0xff) | ((dev >> 12) & ~0xff) > > -- > Klaus Aehlig > Google Germany GmbH, Dienerstr. 12, 80331 Muenchen > Registergericht und -nummer: Hamburg, HRB 86891 > Sitz der Gesellschaft: Hamburg > Geschaeftsfuehrer: Graham Law, Christine Elizabeth Flores > Hrvoje Ribicic Ganeti Engineering Google Germany GmbH Dienerstr. 12, 80331, München Registergericht und -nummer: Hamburg, HRB 86891 Sitz der Gesellschaft: Hamburg Geschäftsführer: Graham Law, Christine Elizabeth Flores Steuernummer: 48/725/00206 Umsatzsteueridentifikationsnummer: DE813741370
