LGTM. Thanks, Jose
On Apr 16 15:19, Ilias Tsitsimpis wrote: > Implement upgrade/downgrade of the config file to support disks as > top-level citizens. During downgrade, disks that are not attached to any > instance will be removed from config file. > > Signed-off-by: Ilias Tsitsimpis <[email protected]> > --- > test/py/cfgupgrade_unittest.py | 1 + > tools/cfgupgrade | 80 > +++++++++++++++++++++++++++++++++++------- > 2 files changed, 68 insertions(+), 13 deletions(-) > > diff --git a/test/py/cfgupgrade_unittest.py b/test/py/cfgupgrade_unittest.py > index e30d22c..7360316 100755 > --- a/test/py/cfgupgrade_unittest.py > +++ b/test/py/cfgupgrade_unittest.py > @@ -52,6 +52,7 @@ def GetMinimalConfig(): > "zeroing_image": "", > }, > "instances": {}, > + "disks": {}, > "networks": {}, > "nodegroups": {}, > "nodes": { > diff --git a/tools/cfgupgrade b/tools/cfgupgrade > index 158a841..ab94cfe 100755 > --- a/tools/cfgupgrade > +++ b/tools/cfgupgrade > @@ -237,22 +237,27 @@ def UpgradeInstances(config_data): > if "disks" not in iobj: > raise Error("Instance '%s' doesn't have a disks entry?!" % instance) > disks = iobj["disks"] > - for idx, dobj in enumerate(disks): > - RemovePhysicalId(dobj) > + if not all(isinstance(d, str) for d in disks): > + # Disks are not top level citizens > + for idx, dobj in enumerate(disks): > + RemovePhysicalId(dobj) > > - expected = "disk/%s" % idx > - current = dobj.get("iv_name", "") > - if current != expected: > - logging.warning("Updating iv_name for instance %s/disk %s" > - " from '%s' to '%s'", > - instance, idx, current, expected) > - dobj["iv_name"] = expected > + expected = "disk/%s" % idx > + current = dobj.get("iv_name", "") > + if current != expected: > + logging.warning("Updating iv_name for instance %s/disk %s" > + " from '%s' to '%s'", > + instance, idx, current, expected) > + dobj["iv_name"] = expected > > - if "dev_type" in dobj: > - UpgradeDiskDevType(dobj) > + if "dev_type" in dobj: > + UpgradeDiskDevType(dobj) > > - if not "spindles" in dobj: > - missing_spindles = True > + if not "spindles" in dobj: > + missing_spindles = True > + > + if not "uuid" in dobj: > + dobj["uuid"] = utils.io.NewUUID() > > if GetExclusiveStorageValue(config_data) and missing_spindles: > # We cannot be sure that the instances that are missing spindles have > @@ -390,6 +395,27 @@ def UpgradeInstanceIndices(config_data): > ChangeInstanceIndices(config_data, "name", "uuid") > > > +def UpgradeTopLevelDisks(config_data): > + """Upgrades the disks as config top level citizens.""" > + if "instances" not in config_data: > + raise Error("Can't find the 'instances' key in the configuration!") > + > + if "disks" in config_data: > + # Disks are already top level citizens > + return > + > + config_data["disks"] = dict() > + for iobj in config_data["instances"].values(): > + disk_uuids = [] > + for disk in iobj["disks"]: > + duuid = disk["uuid"] > + disk["serial_no"] = 1 > + disk["ctime"] = disk["mtime"] = iobj["ctime"] > + config_data["disks"][duuid] = disk > + disk_uuids.append(duuid) > + iobj["disks"] = disk_uuids > + > + > def UpgradeAll(config_data): > config_data["version"] = version.BuildVersion(TARGET_MAJOR, TARGET_MINOR, > 0) > UpgradeRapiUsers() > @@ -401,6 +427,7 @@ def UpgradeAll(config_data): > UpgradeInstances(config_data) > UpgradeNodeIndices(config_data) > UpgradeInstanceIndices(config_data) > + UpgradeTopLevelDisks(config_data) > > > # DOWNGRADE ------------------------------------------------------------ > @@ -431,6 +458,32 @@ def DowngradeInstances(config_data): > del iobj["osparams_private"] > > > +def DowngradeTopLevelDisks(config_data): > + """Downgrade the disks from config top level citizens.""" > + if "instances" not in config_data: > + raise Error("Can't find the 'instances' key in the configuration!") > + > + if "disks" not in config_data: > + # Disks are not top level citizens > + return > + > + for iobj in config_data["instances"].values(): > + disks = list() > + for disk_uuid in iobj["disks"]: > + disk_obj = config_data["disks"][disk_uuid] > + del disk_obj["serial_no"] > + del disk_obj["ctime"] > + del disk_obj["mtime"] > + disks.append(disk_obj) > + del config_data["disks"][disk_uuid] > + iobj["disks"] = disks > + > + for disk_uuid in config_data["disks"].keys(): > + print("Disk %s is not attached to any Instance and will be removed." > + % disk_uuid) > + del config_data["disks"] > + > + > 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. > @@ -438,6 +491,7 @@ def DowngradeAll(config_data): > DOWNGRADE_MINOR, 0) > DowngradeCluster(config_data) > DowngradeInstances(config_data) > + DowngradeTopLevelDisks(config_data) > > > def main(): > -- > 1.9.1 > -- Jose Antonio Lopes Ganeti Engineering Google Germany GmbH Dienerstr. 12, 80331, München Registergericht und -nummer: Hamburg, HRB 86891 Sitz der Gesellschaft: Hamburg Geschäftsführer: Graham Law, Christine Elizabeth Flores Steuernummer: 48/725/00206 Umsatzsteueridentifikationsnummer: DE813741370
