In Kimchi 2.0, Templates recorded in objectstore will not have
'storagepool' anymore. Instead, each disk in disks field will have a new
entry:
"pool": {"name": ..., "type": ...}
This change is necessary in order to support old objectstore in new
Kimchi version, which has lots of changes in Template backend.
Signed-off-by: Rodrigo Trujillo <rodrigo.trujillo(a)linux.vnet.ibm.com>
---
root.py | 2 ++
utils.py | 47 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 49 insertions(+)
diff --git a/root.py b/src/wok/plugins/kimchi/root.py
index 6af053e..4fbe0fc 100644
--- a/root.py
+++ b/root.py
@@ -27,6 +27,7 @@ from wok.plugins.kimchi.control import sub_nodes
from wok.plugins.kimchi.model import model as kimchiModel
from wok.plugins.kimchi.utils import upgrade_objectstore_data
from wok.plugins.kimchi.utils import upgrade_objectstore_schema
+from wok.plugins.kimchi.utils import upgrade_objectstore_template_disks
from wok.root import WokRoot
@@ -71,6 +72,7 @@ class KimchiRoot(WokRoot):
upgrade_objectstore_data('icon', 'images',
'plugins/kimchi/')
upgrade_objectstore_data('storagepool', '/storagepools',
'/plugins/kimchi')
+ upgrade_objectstore_template_disks(self.model.conn)
def get_custom_conf(self):
return config.KimchiConfig()
diff --git a/utils.py b/src/wok/plugins/kimchi/utils.py
index a5f5e97..0997faa 100644
--- a/utils.py
+++ b/utils.py
@@ -30,6 +30,7 @@ from urlparse import urlparse
from wok.exception import InvalidParameter, OperationFailed
from wok.plugins.kimchi import config
from wok.utils import wok_log
+from wok.xmlutils.utils import xpath_get_text
MAX_REDIRECTION_ALLOWED = 5
@@ -171,3 +172,49 @@ def upgrade_objectstore_data(item, old_uri, new_uri):
if conn:
conn.close()
wok_log.info("%d '%s' entries upgraded in objectstore.", total,
item)
+
+
+def upgrade_objectstore_template_disks(libv_conn):
+ """
+ Upgrade the value of a given JSON's item of all Templates.
+ Removes 'storagepool' entry and adds
+ 'pool: { name: ..., type: ... }'
+ """
+ total = 0
+ try:
+ conn = sqlite3.connect(config.get_object_store(), timeout=10)
+ cursor = conn.cursor()
+ sql = "SELECT id, json FROM objects WHERE type='template'"
+ cursor.execute(sql)
+ for row in cursor.fetchall():
+ template = json.loads(row[1])
+
+ # Get pool info
+ pool_uri = template['storagepool']
+ pool_name = pool_name_from_uri(pool_uri)
+ pool = libv_conn.get().storagePoolLookupByName(
+ pool_name.encode("utf-8"))
+ pool_type = xpath_get_text(pool.XMLDesc(0), "/pool/@type")[0]
+
+ # Update json
+ new_disks = []
+ for disk in template['disks']:
+ disk['pool'] = {'name': pool_uri,
+ 'type': pool_type}
+ new_disks.append(disk)
+ template['disks'] = new_disks
+ del template['storagepool']
+
+ sql = "UPDATE objects SET json=? WHERE id=?"
+ cursor.execute(sql, (json.dumps(template), row[0]))
+ conn.commit()
+ total += 1
+ except sqlite3.Error, e:
+ if conn:
+ conn.rollback()
+ raise OperationFailed("KCHUTILS0006E")
+ wok_log.error("Error while upgrading objectstore data:", e.args[0])
+ finally:
+ if conn:
+ conn.close()
+ wok_log.info("%d 'template' entries upgraded in objectstore.",
total)
--
2.1.0