Calculate the version ID of BMC UBI volumes during build time.

- When the new ubi layout is flashed onto the BMC, the volumes
  were named kernel-0 and rofs-0 by default. This tends to be
  misleading as we can't differentiate between two different BMC
  versions.
- Now the ubi volumes will be named kernel-<versionID> and
  rofs-<versionID> calculated by getting the hash(SHA-512) of
  the version and taking the first 8 characters.
- The Uboot env needs to be updated to point to the correct
  kernelname which has now changed from kernel-0 to
  kernel-<versionID> calculated by getting the HASH(SHA-512)
  of the version and taking the first 8 characters.

Resolves openbmc/openbmc#2323

Change-Id: I258d165b399d1ff59ea86f410006f6d03fe13a2e
Signed-off-by: Saqib Khan <khansa@us.ibm.com>
diff --git a/meta-phosphor/classes/image_version.bbclass b/meta-phosphor/classes/image_version.bbclass
new file mode 100644
index 0000000..f9abb5f
--- /dev/null
+++ b/meta-phosphor/classes/image_version.bbclass
@@ -0,0 +1,26 @@
+# Base image version class extension
+
+def do_get_version(d):
+    import configparser
+    import io
+    path = d.getVar('STAGING_DIR_HOST', True) + d.getVar('sysconfdir', True)
+    path = os.path.join(path, 'os-release')
+    parser = configparser.SafeConfigParser(strict=False)
+    parser.optionxform = str
+    version = ''
+    try:
+        with open(path, 'r') as fd:
+            buf = '[root]\n' + fd.read()
+            fd = io.StringIO(buf)
+            parser.readfp(fd)
+            version = parser['root']['VERSION_ID']
+    except:
+        pass
+    return version
+
+def do_get_versionID(d):
+    import hashlib
+    version = do_get_version(d)
+    version = version.strip('"')
+    version_id = (hashlib.sha512(version.encode('utf-8')).hexdigest())[:8]
+    return version_id