diff --git a/image_creator/dialog_menu.py b/image_creator/dialog_menu.py index 858dc19a0e88728f2f67c3664bde921711a2bdbb..bb4bb1ab65c6a8b84324d4b934a1b463a8049971 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 fee232a21d3a7407b8781f4bcfbf74f1ad386f57..fdd0d519d56b772ef522f73b0bc6e1ac20b020d2 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 f761d990a43d3816cb52d6a8bf0ea8edf579a539..fb92f29928df5bb2b4c5b96576c7614b77e23a61 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 dbcb12767ddc7fdecbf74c60d382207144df15b1..4db1e19ecb1477481af6f351e24d543d1c55c14e 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'))