Options
-------
+-a URL, --authentication-url=URL
+ use this authentication URL when uploading/registering images
+
+-c CLOUD, --cloud=CLOUD
+ use this saved cloud account to authenticate against a cloud when
+ uploading/registering images
--disable-sysprep=SYSPREP
prevent SYSPREP operation from running on the input media
dump image to FILE
--public
- register image with cyclades as public
+ register image with the storage service as public
--print-sysprep
print the enabled and disabled system preparation operations for this
input media
-r IMAGENAME, --register=IMAGENAME
- register the image with cyclades as IMAGENAME
+ register the image with the compute service with name IMAGENAME
-s, --silent
output only errors
-t TOKEN, --token=TOKEN
- use this token when uploading/registering images to a Synnefo
- deployment
+ use this token when uploading/registering images
--tmpdir=DIR
create large temporary image files under DIR
-u FILENAME, --upload=FILENAME
- upload the image to pithos with name FILENAME
+ save the image to the storage service with remote name FILENAME
--version
show program's version number and exit
-f, --force overwrite output files if they exist
-s, --silent output only errors
-u FILENAME, --upload=FILENAME
- upload the image to pithos with name FILENAME
+ upload the image to the storage service with name FILENAME
-r IMAGENAME, --register=IMAGENAME
- register the image with ~okeanos as IMAGENAME
+ register the image with the compute service as IMAGENAME
-m KEY=VALUE, --metadata=KEY=VALUE
add custom KEY=VALUE metadata to the image
-t TOKEN, --token=TOKEN
media
--no-sysprep don't perform any system preparation operation
--no-shrink don't shrink any partition
- --public register image with cyclades as public
+ --public register image with the compute service as public
--tmpdir=DIR create large temporary image files under DIR
Most input options are self-describing. If you want to save a local copy of
the image you create, provide a filename using the *-o* option. To upload the
-image to *pithos+*, provide valid cloud API access info (by either using a
-token with *-t* and a URL with *-a* pair or a cloud name with *-c*) and a
-filename using *-u*. If you also want to register the image with *~okeanos*, in
-addition to *-u* provide a registration name using *-r*. All images are
+image to the storage service of a cloud, provide valid cloud API access info
+(by either using a token and a URL with *-t* and *-a* respectively, or a cloud
+name with *-c*) and a remote filename using *-u*. If you also want to register
+the image with the compute service of the cloud, in addition to *-u* provide a
+registration name using *-r*. All images are
registered as *private*. Only the user that registers the image can create
VM's out of it. If you want the image to be visible by other user too, use the
*--public* option.
(ex. "Slackware Linux 14.0 with KDE")
* Registration Type: Private or Public
-After confirming, the image will be extracted, uploaded to *pithos+* and
-registered with *~okeanos*. The user will also be given the choice to keep a
-local copy of it.
+After confirming, the image will be extracted, uploaded to the storage service
+and registered with the compute service of the selected cloud. The user will
+also be given the choice to keep a local copy of it.
For most users the functionality this mode provides should be sufficient.
In the *Register* sub-menu the user can provide:
* Which cloud account to use
- * A *pithos+* filename for the uploaded *diskdump* image
- * A name for the image to use when registering it with *~cyclades*, as well as
- the registration type (*private* or *public*)
+ * A filename for the uploaded *diskdump* image
+ * A name for the image to use when registering it with the storage service of
+ the cloud, as well as the registration type (*private* or *public*)
By choosing the *Extract* menu entry, the user can dump the image to the local
file system. Finally, if the user selects *Reset*, the system will ignore
.. image:: /snapshots/wizard.png
-Then you will be asked to provide a name, a description, a registration type
-(*private* or *public*) and the authentication token corresponding to your
-*~okeanos* account. Finally, you'll be asked to confirm the provided data.
+Then you will be asked to select a cloud and provide a name, a description and
+a registration type (*private* or *public*). Finally, you'll be asked to
+confirm the provided data.
.. image:: /snapshots/confirm.png
-Choosing *YES* will create and upload the image to your *~okeanos* account.
+Choosing *YES* will create and upload the image to your cloud account.
Limitations
===========
Para-virtualized drivers
------------------------
-*~Okeanos* uses the *VirtIO* framework. The disk I/O controller and the
-Ethernet cards on the VM instances are para-virtualized and need special
-*VirtIO* drivers. Those drivers are included in the Linux Kernel mainline since
-version 2.6.25 and are shipped with all the popular Linux distributions. The
-problem is that if the driver for the para-virtualized disk I/O controller is
-built as module, it needs to be preloaded using an initial ramdisk, otherwise
-the VM won't be able to boot.
+Most synnefo deployments uses the *VirtIO* framework. The disk I/O controller
+and the Ethernet cards on the VM instances are para-virtualized and need
+special *VirtIO* drivers. Those drivers are included in the Linux Kernel
+mainline since version 2.6.25 and are shipped with all the popular Linux
+distributions. The problem is that if the driver for the para-virtualized disk
+I/O controller is built as module, it needs to be preloaded using an initial
+ramdisk, otherwise the VM won't be able to boot.
Many popular Linux distributions, like Ubuntu and Debian, will automatically
create a generic initial ramdisk file that contains many different modules,
def upload_image(session):
- """Upload the image to pithos+"""
+ """Upload the image to the storage service"""
d = session["dialog"]
image = session['image']
meta = session['metadata']
if "account" not in session:
d.msgbox("You need to select a valid cloud before you can upload "
- "images to pithos+", width=SMALL_WIDTH)
+ "images to it", width=SMALL_WIDTH)
return False
while 1:
overwrite.append(f)
if len(overwrite) > 0:
- if d.yesno("The following pithos object(s) already exist(s):\n"
- "%s\nDo you want to overwrite them?" %
+ if d.yesno("The following storage service object(s) already "
+ "exist(s):\n%s\nDo you want to overwrite them?" %
"\n".join(overwrite), width=WIDTH, defaultno=1):
continue
out.success("done")
except ClientError as e:
- d.msgbox("Error in pithos+ client: %s" % e.message,
- title="Pithos+ Client Error", width=SMALL_WIDTH)
+ d.msgbox(
+ "Error in storage service client: %s" % e.message,
+ title="Storage Service Client Error", width=SMALL_WIDTH)
if 'pithos_uri' in session:
del session['pithos_uri']
return False
finally:
gauge.cleanup()
- d.msgbox("Image file `%s' was successfully uploaded to pithos+" % filename,
+ d.msgbox("Image file `%s' was successfully uploaded" % filename,
width=SMALL_WIDTH)
return True
def register_image(session):
- """Register image with cyclades"""
+ """Register image with the compute service"""
d = session["dialog"]
is_public = False
if "account" not in session:
d.msgbox("You need to select a valid cloud before you "
- "can register an images with cyclades", width=SMALL_WIDTH)
+ "can register an images with it", width=SMALL_WIDTH)
return False
if "pithos_uri" not in session:
- d.msgbox("You need to upload the image to pithos+ before you can "
- "register it with cyclades", width=SMALL_WIDTH)
+ d.msgbox("You need to upload the image to the cloud before you can "
+ "register it", width=SMALL_WIDTH)
return False
while 1:
out.add(gauge)
try:
try:
- out.output("Registering %s image with Cyclades..." % img_type)
+ out.output("Registering %s image with the cloud..." % img_type)
kamaki = Kamaki(session['account'], out)
result = kamaki.register(name, session['pithos_uri'], metadata,
is_public)
kamaki.share("%s.md5sum" % session['upload'])
out.success('done')
except ClientError as e:
- d.msgbox("Error in pithos+ client: %s" % e.message)
+ d.msgbox("Error in storage service client: %s" % e.message)
return False
finally:
out.remove(gauge)
finally:
gauge.cleanup()
- d.msgbox("%s image `%s' was successfully registered with Cyclades as `%s'"
+ d.msgbox("%s image `%s' was successfully registered with the cloud as `%s'"
% (img_type.title(), session['upload'], name), width=SMALL_WIDTH)
return True
choices = [("Add/Edit", "Add/Edit cloud accounts"),
("Delete", "Delete existing cloud accounts"),
("Cloud", "Select cloud account to use: %s" % cloud),
- ("Upload", "Upload image to pithos+"),
- ("Register", "Register the image to cyclades: %s" % upload)]
+ ("Upload", "Upload image to the cloud"),
+ ("Register", "Register image with the cloud: %s" % upload)]
(code, choice) = d.menu(
text="Choose one of the following or press <Back> to go back.",
text="Choose one of the following or press <Exit> to exit.",
width=WIDTH, choices=choices, cancel="Exit", height=13,
default_item=default_item, menu_height=len(choices),
- title="Image Creator for ~okeanos (snf-image-creator version %s)" %
+ title="Image Creator for synnefo (snf-image-creator version %s)" %
version)
if code in (d.DIALOG_CANCEL, d.DIALOG_ESC):
out.output()
try:
- out.output("Uploading image to pithos:")
+ out.output("Uploading image to the cloud:")
account = Kamaki.get_account(wizard['Cloud'])
assert account, "Cloud: %s is not valid" % wizard['Cloud']
kamaki = Kamaki(account, out)
is_public = True if wizard['ImageRegistration'] == "Public" else \
False
- out.output('Registering %s image with cyclades ...' %
+ out.output('Registering %s image with the cloud ...' %
wizard['ImageRegistration'].lower(), False)
result = kamaki.register(wizard['ImageName'], pithos_file,
metadata, is_public)
out.output()
except ClientError as e:
- raise FatalError("Pithos client: %d %s" % (e.status, e.message))
+ raise FatalError("Storage service client: %d %s" %
+ (e.status, e.message))
finally:
out.remove(with_progress)
- msg = "The %s image was successfully uploaded to Pithos and registered " \
- "with Cyclades. Would you like to keep a local copy?" \
- % wizard['ImageRegistration'].lower()
- if not d.yesno(msg, width=PAGE_WIDTH):
+ text = "The %s image was successfully uploaded to the storage service " \
+ "and registered with the compute service of %s. Would you like " \
+ "to keep a local copy?" % \
+ (wizard['Cloud'], wizard['ImageRegistration'].lower())
+
+ if not d.yesno(text, width=PAGE_WIDTH):
extract_image(session)
# vim: set sta sts=4 shiftwidth=4 sw=4 et ai :
This is a space-seperated list of users, whose password will
be reset during deployment.
- SWAP=<n>:<size>
- If this property is present, cyclades will create a swap
- partition with given size at the end of the instance's disk.
+ If this property is present, a swap partition with given
+ size will be created at the end of the instance's disk.
This property only makes sense for Linux images.
-Properties used by the ~okeanos User Interface
+Properties used by the synnefo User Interface
----------------------------------------------
- OS
The value of this property is used to associate the image
self.CONTAINER, path)
def register(self, name, location, metadata, public=False):
- """Register an image to ~okeanos"""
+ """Register an image with cyclades"""
# Convert all metadata to strings
str_metadata = {}
parser.add_option("-u", "--upload", dest="upload", type="string",
default=False,
- help="upload the image to pithos with name FILENAME",
+ help="upload the image to the cloud with name FILENAME",
metavar="FILENAME")
parser.add_option("-r", "--register", dest="register", type="string",
default=False,
- help="register the image with ~okeanos as IMAGENAME",
+ help="register the image with a cloud as IMAGENAME",
metavar="IMAGENAME")
parser.add_option("-m", "--metadata", dest="metadata", default=[],
help="don't shrink any partition", action="store_false")
parser.add_option("--public", dest="public", default=False,
- help="register image with cyclades as public",
+ help="register image with the cloud as public",
action="store_true")
parser.add_option("--tmpdir", dest="tmp", type="string", default=None,
if options.upload and not options.force:
if kamaki.object_exists(options.upload):
- raise FatalError("Remote pithos object `%s' exists "
+ raise FatalError("Remote storage service 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)
+ raise FatalError("Remote storage service 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 "
+ raise FatalError("Remote storage service object `%s.meta' exists "
"(use --force to overwrite it)." % options.upload)
disk = Disk(options.source, out, options.tmp)
try:
uploaded_obj = ""
if options.upload:
- out.output("Uploading image to pithos:")
+ out.output("Uploading image to the storage service:")
with open(snapshot, 'rb') as f:
uploaded_obj = kamaki.upload(
f, size, options.upload,
if options.register:
img_type = 'public' if options.public else 'private'
- out.output('Registering %s image with ~okeanos ...' % img_type,
- False)
+ out.output('Registering %s image with the compute service ...'
+ % img_type, False)
result = kamaki.register(options.register, uploaded_obj,
metadata, options.public)
out.success('done')
out.output()
except ClientError as e:
- raise FatalError("Pithos client: %d %s" % (e.status, e.message))
+ raise FatalError("Service client: %d %s" % (e.status, e.message))
finally:
out.output('cleaning up ...')