Commit cd3b4ff4 replaced "drbd8" with "drbd" as the dev_type for DRBD disks.
Commit 73d6b4a7 further introduced config upgrade for disks to replace "drbd8"
with "drbd".

However, when cfgupgrade is run against a 2.8 config, the disks have still
dev_type "drbd8" and are not considered for upgrade of their logical IDs during
ChangeNodeIndices(). As a result, upgrading an existing config eventually fails,
as later stages expect DRBD disk logical IDs to contain node UUIDs and not node
names:

 Traceback (most recent call last):
   File "/usr/share/ganeti/cfgupgrade", line 582, in <module>
     main()
   File "/usr/share/ganeti/cfgupgrade", line 555, in main
     offline=True)
   File "/usr/share/ganeti/ganeti/config.py", line 205, in __init__
     self._OpenConfig(accept_foreign)
   File "/usr/share/ganeti/ganeti/config.py", line 2347, in _OpenConfig
     self._UpgradeConfig()
   File "/usr/share/ganeti/ganeti/config.py", line 2391, in _UpgradeConfig
     self._WriteConfig()
   File "/usr/share/ganeti/ganeti/config.py", line 2455, in _WriteConfig
     config_errors = self._UnlockedVerifyConfig()
   File "/usr/share/ganeti/ganeti/config.py", line 818, in _UnlockedVerifyConfig
     _, duplicates = self._UnlockedComputeDRBDMap()
   File "/usr/share/ganeti/ganeti/config.py", line 1006, in 
_UnlockedComputeDRBDMap
     instance, disk, my_dict))
   File "/usr/share/ganeti/ganeti/config.py", line 989, in _AppendUsedMinors
     (get_node_name_fn(node_uuid), instance.name))
   File "/usr/share/ganeti/ganeti/config.py", line 2073, in _UnlockedGetNodeName
     raise errors.OpExecError("Unknown node: %s" % node_spec)
 ganeti.errors.OpExecError: Unknown node: node1.example.com

There are three possible solutions to this:

  1. Modify cfgupgrade to explicitly consider "drbd8" in addition to LDS_DRBD.
  2. Include "drbd8" in constants.LDS_DRBD, which is only used for membership
     checks anyway.
  3. Move LEG_DEV_TYPE_MAP introduced in objects.Disk with commit 73d6b4a7 to
     constants.py and make information about legacy device types globally
     available.

Since it's a one-time change and constants.py is mostly free from legacy
stuff, I chose to go with 1. Also, in order not to rely on LDS_DRBD providing a
.union() method, an additional check against "drbd8" is performed.

This fixes issue #594.

Signed-off-by: Apollon Oikonomopoulos <[email protected]>
---
 tools/cfgupgrade |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/cfgupgrade b/tools/cfgupgrade
index 554877f..9e2ef22 100755
--- a/tools/cfgupgrade
+++ b/tools/cfgupgrade
@@ -288,7 +288,7 @@ def GetNewNodeIndex(nodes_by_old_key, old_key, 
new_key_field):
 
 def ChangeNodeIndices(config_data, old_key_field, new_key_field):
   def ChangeDiskNodeIndices(disk):
-    if disk["dev_type"] in constants.LDS_DRBD:
+    if disk["dev_type"] in constants.LDS_DRBD or disk["dev_type"] == "drbd8":
       for i in range(0, 2):
         disk["logical_id"][i] = GetNewNodeIndex(nodes_by_old_key,
                                                 disk["logical_id"][i],
-- 
1.7.10.4

Reply via email to