summaryrefslogtreecommitdiff
path: root/cloudinit
diff options
context:
space:
mode:
authorBlair Zajac <blair@orcaware.com>2013-03-10 19:43:54 -0700
committerBlair Zajac <blair@orcaware.com>2013-03-10 19:43:54 -0700
commiteab08ade4bc56219e98bcc1d5568b75b6f4bb6ea (patch)
treea1cbec673aba78580f08c5c285fa60e0f3054f00 /cloudinit
parent73cba9d1f841020b0ee1304f204923d994dd5363 (diff)
downloadvyos-cloud-init-eab08ade4bc56219e98bcc1d5568b75b6f4bb6ea.tar.gz
vyos-cloud-init-eab08ade4bc56219e98bcc1d5568b75b6f4bb6ea.zip
Refactor util.get_mount_info() to facilitate unit testing.
Refactor the parsing portion of util.get_mount_info() into a new util.parse_mount_info() method. Now util.get_mount_info() opens /proc/$$/mountinfo, splits on newlines and passes the lines to util.parse_mount_info().
Diffstat (limited to 'cloudinit')
-rw-r--r--cloudinit/util.py77
1 files changed, 43 insertions, 34 deletions
diff --git a/cloudinit/util.py b/cloudinit/util.py
index 709d5cca..0c30f771 100644
--- a/cloudinit/util.py
+++ b/cloudinit/util.py
@@ -1576,42 +1576,16 @@ def expand_package_list(version_fmt, pkgs):
return pkglist
-def get_mount_info(path, log=LOG):
- # Use /proc/$$/mountinfo to find the device where path is mounted.
- # This is done because with a btrfs filesystem using os.stat(path)
- # does not return the ID of the device.
- #
- # Here, / has a device of 18 (decimal).
- #
- # $ stat /
- # File: '/'
- # Size: 234 Blocks: 0 IO Block: 4096 directory
- # Device: 12h/18d Inode: 256 Links: 1
- # Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
- # Access: 2013-01-13 07:31:04.358011255 +0000
- # Modify: 2013-01-13 18:48:25.930011255 +0000
- # Change: 2013-01-13 18:48:25.930011255 +0000
- # Birth: -
- #
- # Find where / is mounted:
- #
- # $ mount | grep ' / '
- # /dev/vda1 on / type btrfs (rw,subvol=@,compress=lzo)
- #
- # And the device ID for /dev/vda1 is not 18:
- #
- # $ ls -l /dev/vda1
- # brw-rw---- 1 root disk 253, 1 Jan 13 08:29 /dev/vda1
- #
- # So use /proc/$$/mountinfo to find the device underlying the
- # input path.
+def parse_mount_info(path, mountinfo_lines, log=LOG):
+ """Return the mount information for PATH given the lines from
+ /proc/$$/mountinfo."""
+
path_elements = [e for e in path.split('/') if e]
devpth = None
fs_type = None
match_mount_point = None
match_mount_point_elements = None
- mountinfo_path = '/proc/%s/mountinfo' % os.getpid()
- for line in load_file(mountinfo_path).splitlines():
+ for i, line in enumerate(mountinfo_lines):
parts = line.split()
mount_point = parts[4]
@@ -1638,8 +1612,8 @@ def get_mount_info(path, log=LOG):
try:
i = parts.index('-')
except ValueError:
- log.debug("Did not find column named '-' in %s",
- mountinfo_path)
+ log.debug("Did not find column named '-' in line %d: %s",
+ i + 1, line)
return None
# Get the path to the device.
@@ -1647,7 +1621,8 @@ def get_mount_info(path, log=LOG):
fs_type = parts[i + 1]
devpth = parts[i + 2]
except IndexError:
- log.debug("Too few columns in %s after '-' column", mountinfo_path)
+ log.debug("Too few columns after '-' column in line %d: %s",
+ i + 1, line)
return None
match_mount_point = mount_point
@@ -1657,3 +1632,37 @@ def get_mount_info(path, log=LOG):
return (devpth, fs_type, match_mount_point)
else:
return None
+
+
+def get_mount_info(path, log=LOG):
+ # Use /proc/$$/mountinfo to find the device where path is mounted.
+ # This is done because with a btrfs filesystem using os.stat(path)
+ # does not return the ID of the device.
+ #
+ # Here, / has a device of 18 (decimal).
+ #
+ # $ stat /
+ # File: '/'
+ # Size: 234 Blocks: 0 IO Block: 4096 directory
+ # Device: 12h/18d Inode: 256 Links: 1
+ # Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
+ # Access: 2013-01-13 07:31:04.358011255 +0000
+ # Modify: 2013-01-13 18:48:25.930011255 +0000
+ # Change: 2013-01-13 18:48:25.930011255 +0000
+ # Birth: -
+ #
+ # Find where / is mounted:
+ #
+ # $ mount | grep ' / '
+ # /dev/vda1 on / type btrfs (rw,subvol=@,compress=lzo)
+ #
+ # And the device ID for /dev/vda1 is not 18:
+ #
+ # $ ls -l /dev/vda1
+ # brw-rw---- 1 root disk 253, 1 Jan 13 08:29 /dev/vda1
+ #
+ # So use /proc/$$/mountinfo to find the device underlying the
+ # input path.
+ mountinfo_path = '/proc/%s/mountinfo' % os.getpid()
+ lines = load_file(mountinfo_path).splitlines()
+ return parse_mount_info(path, lines, log)