From 4ae49c6361ee0ee7d1e0670f41158ae282b29716 Mon Sep 17 00:00:00 2001
From: Apollon Oikonomopoulos <apollon@noc.grnet.gr>
Date: Wed, 20 Apr 2011 12:23:10 +0300
Subject: [PATCH] Add GRNET's configuration migration scripts

tools/cfgupgrade_grnet: Migrate GRNET's old configuration parameters
tools/upgrade-kvm-runtime: Handle kvm runtime upgrades, removing the obsolete
			   run_as parameter

Use responsibly.

Signed-off-by: Apollon Oikonomopoulos <apollon@noc.grnet.gr>
---
 Makefile.am               |  2 ++
 tools/cfgupgrade_grnet    | 56 +++++++++++++++++++++++++++++++++++++++
 tools/upgrade-kvm-runtime | 47 ++++++++++++++++++++++++++++++++
 3 files changed, 105 insertions(+)
 create mode 100755 tools/cfgupgrade_grnet
 create mode 100755 tools/upgrade-kvm-runtime

diff --git a/Makefile.am b/Makefile.am
index cc1558b9c..c8d61ec31 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -361,6 +361,8 @@ dist_tools_SCRIPTS = \
 	tools/cfgshell \
 	tools/cfgupgrade \
 	tools/cfgupgrade12 \
+	tools/cfgupgrade_grnet \
+	tools/upgrade-kvm-runtime \
 	tools/cluster-merge \
 	tools/lvmstrap \
 	tools/move-instance \
diff --git a/tools/cfgupgrade_grnet b/tools/cfgupgrade_grnet
new file mode 100755
index 000000000..02bce5587
--- /dev/null
+++ b/tools/cfgupgrade_grnet
@@ -0,0 +1,56 @@
+#!/usr/bin/env python
+
+import os
+import sys
+
+from ganeti import config
+
+
+cfg = config.ConfigWriter(cfg_file=sys.argv[1], offline=True)
+
+if "kvm" in cfg._config_data.cluster.hvparams:
+  kvm = cfg._config_data.cluster.hvparams["kvm"]
+
+  if "run_as" in kvm:
+    if kvm["run_as"]:
+      print "Found run_as HV parameter, replacing with 'user' security model"
+      kvm["security_model"] = "user"
+      kvm["security_domain"] = kvm["run_as"]
+    else:
+      print "Found empty run_as KVM HV parameter, removing"
+    del kvm["run_as"]
+
+instances = cfg._config_data.instances
+
+for name in instances:
+  instance = instances[name]
+  if "run_as" in instance.hvparams:
+    if instance.hvparams["run_as"]:
+      print "Found old 'run_as' parameter, converting to 'user' security model"
+      instance.hvparams["security_model"] = "user"
+      instance.hvparams["security_domain"] = instance.hvparams["run_as"]
+    else:
+      print "Found empty run_as KVM HV parameter, removing"
+    del instance.hvparams["run_as"]
+
+  if instance.disk_template != "blockdev":
+    continue
+
+  for disk in instance.disks:
+    if len(disk.logical_id) == 3:
+      print "Found old blockdev configuration on instance %s, fixing" % name
+      lid = disk.logical_id[2]
+      if not lid.startswith("/dev/disk/"):
+        lid = os.path.join("/dev/disk", lid)
+
+      disk.logical_id = ["manual", lid]
+      try:
+        disk.physical_id = ["manual", lid]
+      except AttributeError:
+        pass
+
+print "Verifying configuration"
+cfg.VerifyConfig()
+
+print "Writing config"
+cfg._WriteConfig()
diff --git a/tools/upgrade-kvm-runtime b/tools/upgrade-kvm-runtime
new file mode 100755
index 000000000..616386897
--- /dev/null
+++ b/tools/upgrade-kvm-runtime
@@ -0,0 +1,47 @@
+#!/usr/bin/env python
+
+import os
+import sys
+
+from glob import glob
+
+from ganeti import constants
+from ganeti import serializer
+from ganeti import utils
+from ganeti.hypervisor.hv_kvm import KVMHypervisor
+
+if len(sys.argv) == 1:
+  root = KVMHypervisor._CONF_DIR
+else:
+  root = sys.argv[1]
+
+for path in glob(os.path.join(root, "*.runtime")):
+  try:
+    data = utils.ReadFile(path)
+  except EnvironmentError, e:
+    print "Failed to read file %s: %s" % (path, str(e))
+    continue
+
+  try:
+    kvm_cmd, nics, hvparams = serializer.Load(data)
+  except Exception, e:
+    print "Failed to parse file %s: %s" % (path, str(e))
+    continue
+
+  # Replace the run_as parameter or remove it completely
+  if "run_as" in hvparams:
+    if hvparams["run_as"]:
+      print "Replacing 'run_as' in %s with 'security_model' = 'user'" % path
+      hvparams["security_model"] = "user"
+      hvparams["security_domain"] = hvparams["run_as"]
+    else:
+      print "Removing 'run_as' from %s" % path
+
+    del hvparams["run_as"]
+
+  try:
+    utils.WriteFile(path,
+                    data=serializer.Dump((kvm_cmd, nics, hvparams)),
+                    backup=True)
+  except EnvironmentError, e:
+    print "Failed to write %s" % path
-- 
GitLab