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

Reply via email to