From 0b94cda82744b2db34009e0080600cb92212de32 Mon Sep 17 00:00:00 2001
From: Bernardo Dal Seno <bdalseno@google.com>
Date: Tue, 26 Mar 2013 23:22:06 +0100
Subject: [PATCH] cfgupgrade: Add support for newly refactored ipolicies

Instance policies in the configuration are upgraded and downgraded. Both
operations are idempotent.

Signed-off-by: Bernardo Dal Seno <bdalseno@google.com>
Reviewed-by: Helga Velroyen <helgav@google.com>
---
 tools/cfgupgrade | 56 ++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 54 insertions(+), 2 deletions(-)

diff --git a/tools/cfgupgrade b/tools/cfgupgrade
index 8e5002837..eefabec5f 100755
--- a/tools/cfgupgrade
+++ b/tools/cfgupgrade
@@ -102,17 +102,42 @@ def CheckHostname(path):
   return False
 
 
+def UpgradeIPolicy(ipolicy):
+  minmax_keys = ["min", "max"]
+  if any((k in ipolicy) for k in minmax_keys):
+    minmax = {}
+    ipolicy["minmax"] = minmax
+    for key in minmax_keys:
+      if key in ipolicy:
+        minmax[key] = ipolicy[key]
+        del ipolicy[key]
+      else:
+        minmax[key] = {}
+
+
 def UpgradeNetworks(config_data):
   networks = config_data.get("networks", None)
   if not networks:
     config_data["networks"] = {}
 
 
+def UpgradeCluster(config_data):
+  cluster = config_data.get("cluster", None)
+  if cluster is None:
+    raise Error("Cannot find cluster")
+  ipolicy = cluster.get("ipolicy", None)
+  if ipolicy:
+    UpgradeIPolicy(ipolicy)
+
+
 def UpgradeGroups(config_data):
   for group in config_data["nodegroups"].values():
     networks = group.get("networks", None)
     if not networks:
       group["networks"] = {}
+    ipolicy = group.get("ipolicy", None)
+    if ipolicy:
+      UpgradeIPolicy(ipolicy)
 
 
 def UpgradeInstances(config_data):
@@ -215,10 +240,33 @@ def UpgradeAll(config_data):
   UpgradeWatcher()
   UpgradeFileStoragePaths(config_data)
   UpgradeNetworks(config_data)
+  UpgradeCluster(config_data)
   UpgradeGroups(config_data)
   UpgradeInstances(config_data)
 
 
+def DowngradeIPolicy(ipolicy):
+  # Downgrade IPolicy to 2.7 (stable)
+  minmax_keys = ["min", "max"]
+  specs_is_split = any((k in ipolicy) for k in minmax_keys)
+  if not specs_is_split:
+    if "minmax" in ipolicy:
+      minmax = ipolicy["minmax"]
+      del ipolicy["minmax"]
+    else:
+      minmax = {}
+    for key in minmax_keys:
+      spec = minmax.get(key, {})
+      ipolicy[key] = spec
+
+
+def DowngradeGroups(config_data):
+  for group in config_data["nodegroups"].values():
+    ipolicy = group.get("ipolicy", None)
+    if ipolicy:
+      DowngradeIPolicy(ipolicy)
+
+
 def DowngradeStorageTypes(cluster):
   # Remove storage types to downgrade to 2.7
   if "enabled_storage_types" in cluster:
@@ -232,12 +280,16 @@ def DowngradeCluster(config_data):
   if cluster is None:
     raise Error("Cannot find cluster")
   DowngradeStorageTypes(cluster)
+  ipolicy = cluster.get("ipolicy", None)
+  if ipolicy:
+    DowngradeIPolicy(ipolicy)
 
 
 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.
   DowngradeCluster(config_data)
+  DowngradeGroups(config_data)
 
 
 def main():
@@ -356,8 +408,8 @@ def main():
                    config_minor, config_revision))
     DowngradeAll(config_data)
 
-  # Upgrade from 2.{0..6} to 2.7
-  elif config_major == 2 and config_minor in (0, 1, 2, 3, 4, 5, 6):
+  # Upgrade from 2.{0..7} to 2.7
+  elif config_major == 2 and config_minor in range(0, 8):
     if config_revision != 0:
       logging.warning("Config revision is %s, not 0", config_revision)
     UpgradeAll(config_data)
-- 
GitLab