From: Nikos Skalkotos Date: Tue, 18 Jun 2013 15:59:42 +0000 (+0300) Subject: Change the metadata file format to json X-Git-Tag: 0.4.1~3^2~1^2~3 X-Git-Url: https://code.grnet.gr/git/snf-image-creator/commitdiff_plain/8e58e69976b0d79f9b7758347c7bfce1ba9f6d8a Change the metadata file format to json When registring an image, use the information returned by the kamaki register method to construct the metadata file. When dumping the image to the local filesystem, store the image properties and the disk-format info in the metadata file. --- diff --git a/image_creator/dialog_menu.py b/image_creator/dialog_menu.py index 858dc19..bb4bb1a 100644 --- a/image_creator/dialog_menu.py +++ b/image_creator/dialog_menu.py @@ -40,6 +40,7 @@ snf-image-creator. import os import textwrap import StringIO +import json from image_creator import __version__ as version from image_creator.util import MD5, FatalError @@ -249,12 +250,12 @@ def register_image(session): try: out.output("Registering %s image with Cyclades..." % img_type) kamaki = Kamaki(session['account'], out) - kamaki.register(name, session['pithos_uri'], metadata, - is_public) + result = kamaki.register(name, session['pithos_uri'], metadata, + is_public) out.success('done') # Upload metadata file out.output("Uploading metadata file...") - metastring = extract_metadata_string(session) + metastring = unicode(json.dumps(result, ensure_ascii=False)) kamaki.upload(StringIO.StringIO(metastring), size=len(metastring), remote_path="%s.meta" % session['upload']) diff --git a/image_creator/dialog_util.py b/image_creator/dialog_util.py index fee232a..fdd0d51 100644 --- a/image_creator/dialog_util.py +++ b/image_creator/dialog_util.py @@ -39,6 +39,7 @@ snf-image-creator. import os import re +import json from image_creator.output.dialog import GaugeOutput from image_creator.util import MD5 from image_creator.kamaki_wrapper import Kamaki @@ -84,12 +85,14 @@ class Reset(Exception): def extract_metadata_string(session): """Convert image metadata to text""" - metadata = ['%s=%s' % (k, v) for (k, v) in session['metadata'].items()] - + metadata = {} + metadata.update(session['metadata']) if 'task_metadata' in session: - metadata.extend("%s=yes" % m for m in session['task_metadata']) + for key in session['task_metadata']: + metadata[key] = 'yes' - return '\n'.join(metadata) + '\n' + return unicode(json.dumps({'properties': metadata, + 'disk-format': 'diskdump'}, ensure_ascii=False)) def extract_image(session): diff --git a/image_creator/dialog_wizard.py b/image_creator/dialog_wizard.py index f761d99..fb92f29 100644 --- a/image_creator/dialog_wizard.py +++ b/image_creator/dialog_wizard.py @@ -39,6 +39,7 @@ snf-image-creator. import time import StringIO +import json from image_creator.kamaki_wrapper import Kamaki, ClientError from image_creator.util import MD5, FatalError @@ -292,11 +293,6 @@ def create_image(session, account): md5 = MD5(out) session['checksum'] = md5.compute(image.device, size) - #Metadata - metastring = '\n'.join( - ['%s=%s' % (key, value) for (key, value) in metadata.items()]) - metastring += '\n' - out.output() try: out.output("Uploading image to pithos:") @@ -307,14 +303,10 @@ def create_image(session, account): pithos_file = "" with open(image.device, 'rb') as f: pithos_file = kamaki.upload(f, size, name, - "(1/4) Calculating block hashes", - "(2/4) Uploading missing blocks") + "(1/3) Calculating block hashes", + "(2/3) Uploading missing blocks") - out.output("(3/4) Uploading metadata file ...", False) - kamaki.upload(StringIO.StringIO(metastring), size=len(metastring), - remote_path="%s.%s" % (name, 'meta')) - out.success('done') - out.output("(4/4) Uploading md5sum file ...", False) + out.output("(3/3) Uploading md5sum file ...", False) md5sumstr = '%s %s\n' % (session['checksum'], name) kamaki.upload(StringIO.StringIO(md5sumstr), size=len(md5sumstr), remote_path="%s.%s" % (name, 'md5sum')) @@ -325,9 +317,15 @@ def create_image(session, account): False out.output('Registering %s image with cyclades ...' % wizard['ImageRegistration'].lower(), False) - kamaki.register(wizard['ImageName'], pithos_file, metadata, - is_public) + result = kamaki.register(wizard['ImageName'], pithos_file, + metadata, is_public) out.success('done') + out.output("Uploading metadata file ...", False) + metastring = unicode(json.dumps(result, ensure_ascii=False)) + kamaki.upload(StringIO.StringIO(metastring), size=len(metastring), + remote_path="%s.%s" % (name, 'meta')) + out.success('done') + if is_public: out.output("Sharing md5sum file ...", False) kamaki.share("%s.md5sum" % name) diff --git a/image_creator/main.py b/image_creator/main.py index dbcb127..4db1e19 100644 --- a/image_creator/main.py +++ b/image_creator/main.py @@ -49,6 +49,7 @@ import os import optparse import StringIO import signal +import json def check_writable_dir(option, opt_str, value, parser): @@ -280,9 +281,9 @@ def image_creator(): md5 = MD5(out) checksum = md5.compute(image.device, size) - metastring = '\n'.join( - ['%s=%s' % (key, value) for (key, value) in metadata.items()]) - metastring += '\n' + metastring = unicode(json.dumps( + {'properties': metadata, + 'disk-format': 'diskdump'}, ensure_ascii=False)) if options.outfile is not None: image.dump(options.outfile) @@ -324,10 +325,11 @@ def image_creator(): img_type = 'public' if options.public else 'private' out.output('Registering %s image with ~okeanos ...' % img_type, False) - kamaki.register(options.register, uploaded_obj, metadata, - options.public) + result = kamaki.register(options.register, uploaded_obj, + metadata, options.public) out.success('done') out.output("Uploading metadata file ...", False) + metastring = unicode(json.dumps(result, ensure_ascii=False)) kamaki.upload(StringIO.StringIO(metastring), size=len(metastring), remote_path="%s.%s" % (options.upload, 'meta'))