فهرست منبع

Assign drive letters when mounting disks on Windows minions

On newer Windows Server releases, and some platforms, the additional attached
disks are seen as removable media from within the Windows minions. This patch
will make sure that every volume will get a drive letter assigned when upon
disk mounting.
Daniel Vincze 4 سال پیش
والد
کامیت
d47f3e8231
1فایلهای تغییر یافته به همراه36 افزوده شده و 4 حذف شده
  1. 36 4
      coriolis/osmorphing/osmount/windows.py

+ 36 - 4
coriolis/osmorphing/osmount/windows.py

@@ -200,12 +200,47 @@ class WindowsMountTools(base.BaseOSMountTools):
             raise exception.CoriolisException("No filesystems found")
             raise exception.CoriolisException("No filesystems found")
         return drives
         return drives
 
 
+    def _bring_nonsystem_disks_offline(self):
+        drives = self._ignore_devices.copy()
+        drives.append(self._get_system_drive())
+        drives_to_skip = [ltr.split(":")[0] for ltr in drives]
+        self._bring_disks_offline(drives_to_skip)
+
+    def _rebring_disks_online(self):
+        self._bring_nonsystem_disks_offline()
+        self._bring_all_disks_online()
+
+    def _set_volumes_drive_letter(self):
+        enable_default_drive_letter_script_fmt = (
+            "SELECT VOLUME %s\r\n"
+            "ATTRIBUTES VOLUME CLEAR NODEFAULTDRIVELETTER\r\nEXIT")
+        volume_list_script = "LIST VOLUME\r\nEXIT"
+        volume_entry_re = r"\s+Volume ([0-9]+)\s+(.*)"
+
+        volume_list = self._run_diskpart_script(volume_list_script)
+        unhidden_volume_ids = [m.group(1) for m in [
+            re.match(volume_entry_re, l) for l in volume_list.split("\r\n")]
+            if m is not None and "HIDDEN" not in m.group(2).upper()]
+        for vol_id in unhidden_volume_ids:
+            try:
+                LOG.info(
+                    "Clearing NODEFAULTDRIVELETTER flag on volume %s" % vol_id)
+                script = enable_default_drive_letter_script_fmt % vol_id
+                self._run_diskpart_script(script)
+            except Exception as ex:
+                LOG.warn(
+                    "Exception occurred while clearing flags on volume '%s'. "
+                    "Skipping running script '%s'. Error message: %s" % (
+                        vol_id, script, ex))
+        self._rebring_disks_online()
+
     def mount_os(self):
     def mount_os(self):
         self._refresh_storage()
         self._refresh_storage()
         self._bring_all_disks_online()
         self._bring_all_disks_online()
         self._set_basic_disks_rw_mode()
         self._set_basic_disks_rw_mode()
         self._set_foreign_disks_rw_mode()
         self._set_foreign_disks_rw_mode()
         self._import_foreign_disks()
         self._import_foreign_disks()
+        self._set_volumes_drive_letter()
         self._refresh_storage()
         self._refresh_storage()
         fs_roots = utils.retry_on_error(sleep_seconds=5)(self._get_fs_roots)(
         fs_roots = utils.retry_on_error(sleep_seconds=5)(self._get_fs_roots)(
                 fail_if_empty=True)
                 fail_if_empty=True)
@@ -218,7 +253,4 @@ class WindowsMountTools(base.BaseOSMountTools):
         raise exception.OperatingSystemNotFound("root partition not found")
         raise exception.OperatingSystemNotFound("root partition not found")
 
 
     def dismount_os(self, root_drive):
     def dismount_os(self, root_drive):
-        drives = self._ignore_devices.copy()
-        drives.append(self._get_system_drive())
-        drives_to_skip = [ltr.split(":")[0] for ltr in drives]
-        self._bring_disks_offline(drives_to_skip)
+        self._bring_nonsystem_disks_offline()