[Kimchi-devel] [PATCH] [Kimchi] Removing disks.py because it was moved to gingerbase
Jose Ricardo Ziviani
joserz at linux.vnet.ibm.com
Wed Mar 9 19:16:39 UTC 2016
- I didn't find any place using this module so I'm removing the file to
avoid any confusion.
Signed-off-by: Jose Ricardo Ziviani <joserz at linux.vnet.ibm.com>
---
disks.py | 297 ---------------------------------------------------------------
1 file changed, 297 deletions(-)
delete mode 100644 disks.py
diff --git a/disks.py b/disks.py
deleted file mode 100644
index 52a793c..0000000
--- a/disks.py
+++ /dev/null
@@ -1,297 +0,0 @@
-#
-# Project Kimchi
-#
-# Copyright IBM Corp, 2015-2016
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-import os.path
-import re
-from parted import Device as PDevice
-from parted import Disk as PDisk
-
-from wok.exception import OperationFailed
-from wok.utils import run_command, wok_log
-
-
-def _get_dev_node_path(maj_min):
- """ Returns device node path given the device number 'major:min' """
-
- dm_name = "/sys/dev/block/%s/dm/name" % maj_min
- if os.path.exists(dm_name):
- with open(dm_name) as dm_f:
- content = dm_f.read().rstrip('\n')
- return "/dev/mapper/" + content
-
- uevent = "/sys/dev/block/%s/uevent" % maj_min
- with open(uevent) as ueventf:
- content = ueventf.read()
-
- data = dict(re.findall(r'(\S+)=(".*?"|\S+)', content.replace("\n", " ")))
-
- return "/dev/%s" % data["DEVNAME"]
-
-
-def _get_lsblk_devs(keys, devs=[]):
- out, err, rc = run_command(["lsblk", "-Pbo"] + [','.join(keys)] + devs)
- if rc != 0:
- raise OperationFailed("KCHDISKS0001E", {'err': err})
-
- return _parse_lsblk_output(out, keys)
-
-
-def _get_dev_major_min(name):
- maj_min = None
-
- keys = ["NAME", "MAJ:MIN"]
- dev_list = _get_lsblk_devs(keys)
-
- for dev in dev_list:
- if dev['name'].split()[0] == name:
- maj_min = dev['maj:min']
- break
- else:
- raise OperationFailed("KCHDISKS0002E", {'device': name})
-
- return maj_min
-
-
-def _is_dev_leaf(devNodePath):
- try:
- # By default, lsblk prints a device information followed by children
- # device information
- childrenCount = len(
- _get_lsblk_devs(["NAME"], [devNodePath])) - 1
- except OperationFailed as e:
- # lsblk is known to fail on multipath devices
- # Assume these devices contain children
- wok_log.error(
- "Error getting device info for %s: %s", devNodePath, e)
- return False
-
- return childrenCount == 0
-
-
-def _is_dev_extended_partition(devType, devNodePath):
- if devType != 'part':
- return False
- diskPath = devNodePath.rstrip('0123456789')
- device = PDevice(diskPath)
- try:
- extended_part = PDisk(device).getExtendedPartition()
- except NotImplementedError as e:
- wok_log.warning(
- "Error getting extended partition info for dev %s type %s: %s",
- devNodePath, devType, e.message)
- # Treate disk with unsupported partiton table as if it does not
- # contain extended partitions.
- return False
- if extended_part and extended_part.path == devNodePath:
- return True
- return False
-
-
-def _parse_lsblk_output(output, keys):
- # output is on format key="value",
- # where key can be NAME, TYPE, FSTYPE, SIZE, MOUNTPOINT, etc
- lines = output.rstrip("\n").split("\n")
- r = []
- for line in lines:
- d = {}
- for key in keys:
- expression = r"%s=\".*?\"" % key
- match = re.search(expression, line)
- field = match.group()
- k, v = field.split('=', 1)
- d[k.lower()] = v[1:-1]
- r.append(d)
- return r
-
-
-def _get_vgname(devNodePath):
- """ Return volume group name of a physical volume. If the device node path
- is not a physical volume, return empty string. """
- out, err, rc = run_command(["pvs", "--unbuffered", "--nameprefixes",
- "--noheadings", "-o", "vg_name", devNodePath])
- if rc != 0:
- return ""
-
- return re.findall(r"LVM2_VG_NAME='([^\']*)'", out)[0]
-
-
-def _is_available(name, devtype, fstype, mountpoint, majmin):
- devNodePath = _get_dev_node_path(majmin)
- # Only list unmounted and unformated and leaf and (partition or disk)
- # leaf means a partition, a disk has no partition, or a disk not held
- # by any multipath device. Physical volume belongs to no volume group
- # is also listed. Extended partitions should not be listed.
- if (devtype in ['part', 'disk', 'mpath'] and
- fstype in ['', 'LVM2_member'] and
- mountpoint == "" and
- _get_vgname(devNodePath) == "" and
- _is_dev_leaf(devNodePath) and
- not _is_dev_extended_partition(devtype, devNodePath)):
- return True
- return False
-
-
-def get_partitions_names(check=False):
- names = set()
- keys = ["NAME", "TYPE", "FSTYPE", "MOUNTPOINT", "MAJ:MIN"]
- # output is on format key="value",
- # where key can be NAME, TYPE, FSTYPE, MOUNTPOINT
- for dev in _get_lsblk_devs(keys):
- # split()[0] to avoid the second part of the name, after the
- # whiteline
- name = dev['name'].split()[0]
- if check and not _is_available(name, dev['type'], dev['fstype'],
- dev['mountpoint'], dev['maj:min']):
- continue
- names.add(name)
-
- return list(names)
-
-
-def get_partition_details(name):
- majmin = _get_dev_major_min(name)
- dev_path = _get_dev_node_path(majmin)
-
- keys = ["TYPE", "FSTYPE", "SIZE", "MOUNTPOINT"]
- try:
- dev = _get_lsblk_devs(keys, [dev_path])[0]
- except OperationFailed as e:
- wok_log.error(
- "Error getting partition info for %s: %s", name, e)
- return {}
-
- dev['available'] = _is_available(name, dev['type'], dev['fstype'],
- dev['mountpoint'], majmin)
- if dev['mountpoint']:
- # Sometimes the mountpoint comes with [SWAP] or other
- # info which is not an actual mount point. Filtering it
- regexp = re.compile(r"\[.*\]")
- if regexp.search(dev['mountpoint']) is not None:
- dev['mountpoint'] = ''
- dev['path'] = dev_path
- dev['name'] = name
- return dev
-
-
-def vgs():
- """
- lists all volume groups in the system. All size units are in bytes.
-
- [{'vgname': 'vgtest', 'size': 999653638144L, 'free': 0}]
- """
- cmd = ['vgs',
- '--units',
- 'b',
- '--nosuffix',
- '--noheading',
- '--unbuffered',
- '--options',
- 'vg_name,vg_size,vg_free']
-
- out, err, rc = run_command(cmd)
- if rc != 0:
- raise OperationFailed("KCHLVM0001E", {'err': err})
-
- if not out:
- return []
-
- # remove blank spaces and create a list of VGs
- vgs = map(lambda v: v.strip(), out.strip('\n').split('\n'))
-
- # create a dict based on data retrieved from vgs
- return map(lambda l: {'vgname': l[0],
- 'size': long(l[1]),
- 'free': long(l[2])},
- [fields.split() for fields in vgs])
-
-
-def lvs(vgname=None):
- """
- lists all logical volumes found in the system. It can be filtered by
- the volume group. All size units are in bytes.
-
- [{'lvname': 'lva', 'path': '/dev/vgtest/lva', 'size': 12345L},
- {'lvname': 'lvb', 'path': '/dev/vgtest/lvb', 'size': 12345L}]
- """
- cmd = ['lvs',
- '--units',
- 'b',
- '--nosuffix',
- '--noheading',
- '--unbuffered',
- '--options',
- 'lv_name,lv_path,lv_size,vg_name']
-
- out, err, rc = run_command(cmd)
- if rc != 0:
- raise OperationFailed("KCHLVM0001E", {'err': err})
-
- if not out:
- return []
-
- # remove blank spaces and create a list of LVs filtered by vgname, if
- # provided
- lvs = filter(lambda f: vgname is None or vgname in f,
- map(lambda v: v.strip(), out.strip('\n').split('\n')))
-
- # create a dict based on data retrieved from lvs
- return map(lambda l: {'lvname': l[0],
- 'path': l[1],
- 'size': long(l[2])},
- [fields.split() for fields in lvs])
-
-
-def pvs(vgname=None):
- """
- lists all physical volumes in the system. It can be filtered by the
- volume group. All size units are in bytes.
-
- [{'pvname': '/dev/sda3',
- 'size': 469502001152L,
- 'uuid': 'kkon5B-vnFI-eKHn-I5cG-Hj0C-uGx0-xqZrXI'},
- {'pvname': '/dev/sda2',
- 'size': 21470642176L,
- 'uuid': 'CyBzhK-cQFl-gWqr-fyWC-A50Y-LMxu-iHiJq4'}]
- """
- cmd = ['pvs',
- '--units',
- 'b',
- '--nosuffix',
- '--noheading',
- '--unbuffered',
- '--options',
- 'pv_name,pv_size,pv_uuid,vg_name']
-
- out, err, rc = run_command(cmd)
- if rc != 0:
- raise OperationFailed("KCHLVM0001E", {'err': err})
-
- if not out:
- return []
-
- # remove blank spaces and create a list of PVs filtered by vgname, if
- # provided
- pvs = filter(lambda f: vgname is None or vgname in f,
- map(lambda v: v.strip(), out.strip('\n').split('\n')))
-
- # create a dict based on data retrieved from pvs
- return map(lambda l: {'pvname': l[0],
- 'size': long(l[1]),
- 'uuid': l[2]},
- [fields.split() for fields in pvs])
--
1.9.1
More information about the Kimchi-devel
mailing list