Check if remote files exist before uploading
[snf-image-creator] / image_creator / main.py
index 4b86f7c..99a35e3 100644 (file)
@@ -181,8 +181,8 @@ def image_creator():
         for extension in ('', '.meta', '.md5sum'):
             filename = "%s%s" % (options.outfile, extension)
             if os.path.exists(filename):
-                raise FatalError("Output file %s exists "
-                                 "(use --force to overwrite it)" % filename)
+                raise FatalError("Output file `%s' exists "
+                                 "(use --force to overwrite it)." % filename)
 
     # Check if the authentication token is valid. The earlier the better
     if options.token is not None:
@@ -191,9 +191,24 @@ def image_creator():
             if account is None:
                 raise FatalError("The authentication token you provided is not"
                                  " valid!")
+            else:
+                kamaki = Kamaki(account, out)
         except ClientError as e:
             raise FatalError("Astakos client: %d %s" % (e.status, e.message))
 
+    if options.upload and not options.force:
+        if kamaki.object_exists(options.upload):
+            raise FatalError("Remote pithos object `%s' exists "
+                             "(use --force to overwrite it)." % options.upload)
+        if kamaki.object_exists("%s.md5sum" % options.upload):
+            raise FatalError("Remote pithos object `%s.md5sum' exists "
+                             "(use --force to overwrite it)." % options.upload)
+
+    if options.register and not options.force:
+        if kamaki.object_exists("%s.meta" % options.upload):
+            raise FatalError("Remote pithos object `%s.meta' exists "
+                             "(use --force to overwrite it)." % options.upload)
+
     disk = Disk(options.source, out, options.tmp)
 
     def signal_handler(signum, frame):
@@ -206,7 +221,7 @@ def image_creator():
 
         image = disk.get_image(snapshot)
 
-        # If no customization is to be applied, the image should be mounted ro
+        # If no customization is to be done, the image should be mounted ro
         ro = (not (options.sysprep or options.shrink) or options.print_sysprep)
         image.mount(ro)
         try:
@@ -224,6 +239,13 @@ def image_creator():
                 return 0
 
             if options.sysprep:
+                err_msg = "Unable to perform the system preparation tasks. " \
+                    "Couldn't mount the media%s. Use --no-sysprep if you " \
+                    "don't won't to perform any system preparation task."
+                if not image.mounted:
+                    raise FatalError(err_msg % "")
+                elif image.mounted_ro:
+                    raise FatalError(err_msg % " read-write")
                 image.os.do_sysprep()
 
             metadata = image.os.meta
@@ -265,19 +287,12 @@ def image_creator():
             uploaded_obj = ""
             if options.upload:
                 out.output("Uploading image to pithos:")
-                kamaki = Kamaki(account, out)
                 with open(snapshot, 'rb') as f:
                     uploaded_obj = kamaki.upload(
                         f, size, options.upload,
-                        "(1/4)  Calculating block hashes",
-                        "(2/4)  Uploading missing blocks")
-
-                out.output("(3/4)  Uploading metadata file ...", False)
-                kamaki.upload(StringIO.StringIO(metastring),
-                              size=len(metastring),
-                              remote_path="%s.%s" % (options.upload, 'meta'))
-                out.success('done')
-                out.output("(4/4)  Uploading md5sum file ...", False)
+                        "(1/3)  Calculating block hashes",
+                        "(2/3)  Uploading missing blocks")
+                out.output("(3/3)  Uploading md5sum file ...", False)
                 md5sumstr = '%s %s\n' % (checksum,
                                          os.path.basename(options.upload))
                 kamaki.upload(StringIO.StringIO(md5sumstr),
@@ -293,6 +308,11 @@ def image_creator():
                 kamaki.register(options.register, uploaded_obj, metadata,
                                 options.public)
                 out.success('done')
+                out.output("Uploading metadata file ...", False)
+                kamaki.upload(StringIO.StringIO(metastring),
+                              size=len(metastring),
+                              remote_path="%s.%s" % (options.upload, 'meta'))
+                out.success('done')
                 out.output()
         except ClientError as e:
             raise FatalError("Pithos client: %d %s" % (e.status, e.message))