from ganeti import netutils
from ganeti import pathutils
+from ganeti.utils import version
+
options = None
args = None
#: Target major version we will upgrade to
TARGET_MAJOR = 2
#: Target minor version we will upgrade to
-TARGET_MINOR = 9
+TARGET_MINOR = 10
#: Target major version for downgrade
DOWNGRADE_MAJOR = 2
#: Target minor version for downgrade
-DOWNGRADE_MINOR = 8
+DOWNGRADE_MINOR = 9
# map of legacy device types
# (mapping differing old LD_* constants to new DT_* constants)
DEV_TYPE_OLD_NEW = {"lvm": constants.DT_PLAIN, "drbd8": constants.DT_DRBD8}
# (mapping differing new DT_* constants to old LD_* constants)
-DEV_TYPE_NEW_OLD = {v:k for k,v in DEV_TYPE_OLD_NEW.items()}
+DEV_TYPE_NEW_OLD = dict((v, k) for k, v in DEV_TYPE_OLD_NEW.items())
class Error(Exception):
return ret
+def RemovePhysicalId(disk):
+ if "children" in disk:
+ for d in disk["children"]:
+ RemovePhysicalId(d)
+ if "physical_id" in disk:
+ del disk["physical_id"]
+
+
def ChangeDiskDevType(disk, dev_type_map):
"""Replaces disk's dev_type attributes according to the given map.
raise Error("Instance '%s' doesn't have a disks entry?!" % instance)
disks = iobj["disks"]
for idx, dobj in enumerate(disks):
+ RemovePhysicalId(dobj)
+
expected = "disk/%s" % idx
current = dobj.get("iv_name", "")
if current != expected:
def UpgradeAll(config_data):
- config_data["version"] = constants.BuildVersion(TARGET_MAJOR,
- TARGET_MINOR, 0)
+ config_data["version"] = version.BuildVersion(TARGET_MAJOR, TARGET_MINOR, 0)
UpgradeRapiUsers()
UpgradeWatcher()
UpgradeFileStoragePaths(config_data)
UpgradeInstanceIndices(config_data)
-def DowngradeDiskDevType(disk):
- """Downgrades the disks' device type."""
- ChangeDiskDevType(disk, DEV_TYPE_NEW_OLD)
+def DowngradeNDParams(ndparams):
+ for param in ["ovs", "ovs_link", "ovs_name"]:
+ if param in ndparams:
+ del ndparams[param]
-def DowngradeDisks(disks, owner):
- for disk in disks:
- # Remove spindles to downgrade to 2.8
- if "spindles" in disk:
- logging.warning("Removing spindles (value=%s) from disk %s (%s) of"
- " instance %s",
- disk["spindles"], disk["iv_name"], disk["uuid"], owner)
- del disk["spindles"]
- if "dev_type" in disk:
- DowngradeDiskDevType(disk)
+def DowngradeNicParams(nicparams):
+ if "vlan" in nicparams:
+ del nicparams["vlan"]
-def DowngradeInstances(config_data):
- if "instances" not in config_data:
- raise Error("Cannot find the 'instances' key in the configuration!")
- for (iname, iobj) in config_data["instances"].items():
- if "disks" not in iobj:
- raise Error("Cannot find 'disks' key for instance %s" % iname)
- DowngradeDisks(iobj["disks"], iname)
+def DowngradeHVParams(hvparams):
+ for hv in ["xen-pvm", "xen-hvm"]:
+ if hv not in hvparams:
+ continue
+ for param in ["cpuid", "soundhw"]:
+ if param in hvparams[hv]:
+ del hvparams[hv][param]
-def DowngradeNodeIndices(config_data):
- ChangeNodeIndices(config_data, "uuid", "name")
+
+def DowngradeCluster(config_data):
+ cluster = config_data["cluster"]
+ if "ndparams" in cluster:
+ DowngradeNDParams(cluster["ndparams"])
+ if "nicparams" in cluster:
+ DowngradeNicParams(cluster["nicparams"][constants.PP_DEFAULT])
+ if "hvparams" in cluster:
+ DowngradeHVParams(cluster["hvparams"])
+
+
+def DowngradeNodeGroups(config_data):
+ for (_, ngobj) in config_data["nodegroups"].items():
+ if "ndparams" in ngobj:
+ DowngradeNDParams(ngobj["ndparams"])
-def DowngradeInstanceIndices(config_data):
- ChangeInstanceIndices(config_data, "uuid", "name")
+def DowngradeNodes(config_data):
+ for (_, nobj) in config_data["nodes"].items():
+ if "ndparams" in nobj:
+ DowngradeNDParams(nobj["ndparams"])
+
+
+def DowngradeInstances(config_data):
+ for (_, iobj) in config_data["instances"].items():
+ DowngradeHVParams(iobj["hvparams"])
+ for nic in iobj["nics"]:
+ DowngradeNicParams(nic["nicparams"])
def DowngradeAll(config_data):
# Any code specific to a particular version should be labeled that way, so
# it can be removed when updating to the next version.
- config_data["version"] = constants.BuildVersion(DOWNGRADE_MAJOR,
- DOWNGRADE_MINOR, 0)
+ config_data["version"] = version.BuildVersion(DOWNGRADE_MAJOR,
+ DOWNGRADE_MINOR, 0)
+ DowngradeCluster(config_data)
+ DowngradeNodeGroups(config_data)
+ DowngradeNodes(config_data)
DowngradeInstances(config_data)
- DowngradeNodeIndices(config_data)
- DowngradeInstanceIndices(config_data)
def main():
raise Error("Unable to determine configuration version")
(config_major, config_minor, config_revision) = \
- constants.SplitVersion(config_version)
+ version.SplitVersion(config_version)
logging.info("Found configuration version %s (%d.%d.%d)",
config_version, config_major, config_minor, config_revision)
config_minor, config_revision))
DowngradeAll(config_data)
- # Upgrade from 2.{0..7} to 2.9
+ # Upgrade from 2.{0..9} to 2.10
elif config_major == 2 and config_minor in range(0, 10):
if config_revision != 0:
logging.warning("Config revision is %s, not 0", config_revision)