Преглед изворни кода

Rename duplicate VG names

Duplicate VG names interfere with the OSMorphing process. This patch makes
sure there are no duplicate volume group names before activating them.
Daniel Vincze пре 2 година
родитељ
комит
252466490c
1 измењених фајлова са 38 додато и 14 уклоњено
  1. 38 14
      coriolis/osmorphing/osmount/base.py

+ 38 - 14
coriolis/osmorphing/osmount/base.py

@@ -8,6 +8,7 @@ import collections
 import itertools
 import os
 import re
+import uuid
 
 from oslo_log import log as logging
 import paramiko
@@ -16,6 +17,7 @@ from six import with_metaclass
 from coriolis import exception
 from coriolis import utils
 
+
 LOG = logging.getLogger(__name__)
 
 MAJOR_COLUMN_INDEX = 4
@@ -130,6 +132,34 @@ class BaseLinuxOSMountTools(BaseSSHOSMountTools):
         LOG.debug("Physical Volume attributes: %s", pvs)
         return pvs
 
+    def _get_vgs(self):
+        vgs_cmd = (
+            "sudo vgs -o vg_name,pv_name,vg_uuid, --noheadings --separator :")
+        out = self._exec_cmd(vgs_cmd).decode().splitlines()
+        LOG.debug("Output of %s command: %s", vgs_cmd, out)
+        vgs = {}
+        for line in out:
+            if line == "":
+                continue
+            line = line.strip().split(":")
+            if len(line) >= 3:
+                vg_name, pv_name, vg_uuid = line[0], line[1], line[2]
+                if vgs.get(vg_name) is None:
+                    vgs[vg_name] = pv_name
+                else:
+                    new_name = str(uuid.uuid4())
+                    LOG.debug(
+                        "VG with name '%s' already detected. Renaming VG with "
+                        "UUID '%s' to '%s' to avoid conflicts",
+                        vg_name, vg_uuid, new_name)
+                    self._exec_cmd("sudo vgrename %s %s" % (vg_uuid, new_name))
+                    vgs[new_name] = pv_name
+            else:
+                LOG.warning("Ignoring improper `vgs` output entry: %s", line)
+        LOG.debug("Volume groups: %s", vgs)
+
+        return vgs
+
     def _check_vgs(self):
         try:
             self._exec_cmd("sudo vgck")
@@ -500,20 +530,14 @@ class BaseLinuxOSMountTools(BaseSSHOSMountTools):
 
         lvm_dev_paths = []
         self._check_vgs()
-        pvs = self._get_pvs()
-        for vg_name in self._get_vgnames():
-            found = False
-            for pv in pvs[vg_name]:
-                if pv in dev_paths:
-                    found = True
-                    break
-            if not found:
-                continue
-            self._exec_cmd("sudo vgchange -ay %s" % vg_name)
-            self._exec_cmd("sudo vgchange --refresh")
-            dev_paths_for_group = self._exec_cmd(
-                "sudo ls -1 /dev/%s/*" % vg_name).decode().splitlines()
-            lvm_dev_paths.extend(dev_paths_for_group)
+        vgs = self._get_vgs()
+        for vg_name, pv_name in vgs.items():
+            if pv_name in dev_paths:
+                self._exec_cmd("sudo vgchange -ay %s" % vg_name)
+                self._exec_cmd("sudo vgchange --refresh")
+                dev_paths_for_group = self._exec_cmd(
+                    "sudo ls -1 /dev/%s/*" % vg_name).decode().splitlines()
+                lvm_dev_paths.extend(dev_paths_for_group)
         LOG.debug("All LVM vols to scan: %s", lvm_dev_paths)
 
         valid_filesystems = ['ext2', 'ext3', 'ext4', 'xfs', 'btrfs']