Commit f5174d2c authored by Nikos Skalkotos's avatar Nikos Skalkotos

Rename DiskDevice class to Image

Rename DiskDevice class to Image and move it to a seperate module.
Also, don't let the user access the os_type/* modules directly. In
Image class create the `os' member variable that will host an
appropriate instance of one of the OSBase classes.
parent d3f3bfbf
......@@ -48,14 +48,13 @@ from image_creator.output.cli import SimpleOutput
from image_creator.output.dialog import GaugeOutput
from image_creator.output.composite import CompositeOutput
from image_creator.disk import Disk
from image_creator.os_type import os_cls
from image_creator.dialog_wizard import wizard
from image_creator.dialog_menu import main_menu
from image_creator.dialog_util import SMALL_WIDTH, WIDTH, confirm_exit, \
Reset, update_background_title
def image_creator(d, media, out, tmp):
def create_image(d, media, out, tmp):
d.setBackgroundTitle('snf-image-creator')
......@@ -71,19 +70,14 @@ def image_creator(d, media, out, tmp):
signal.signal(signal.SIGTERM, signal_handler)
try:
snapshot = disk.snapshot()
dev = disk.get_device(snapshot)
image = disk.get_image(snapshot)
out.output("Collecting image metadata...")
metadata = {}
for (key, value) in dev.meta.items():
for (key, value) in image.meta.items():
metadata[str(key)] = str(value)
dev.mount(readonly=True)
out.output("Collecting image metadata...")
cls = os_cls(dev.distro, dev.ostype)
image_os = cls(dev.root, dev.g, out)
dev.umount()
for (key, value) in image_os.meta.items():
for (key, value) in image.os.meta.items():
metadata[str(key)] = str(value)
out.success("done")
......@@ -97,9 +91,7 @@ def image_creator(d, media, out, tmp):
session = {"dialog": d,
"disk": disk,
"snapshot": snapshot,
"device": dev,
"image_os": image_os,
"image": image,
"metadata": metadata}
msg = "snf-image-creator detected a %s system on the input media. " \
......@@ -107,8 +99,8 @@ def image_creator(d, media, out, tmp):
"image creation process?\n\nChoose <Wizard> to run the wizard," \
" <Expert> to run the snf-image-creator in expert mode or " \
"press ESC to quit the program." \
% (dev.ostype if dev.ostype == dev.distro else "%s (%s)" %
(dev.ostype, dev.distro))
% (image.ostype if image.ostype == image.distro else "%s (%s)" %
(image.ostype, image.distro))
update_background_title(session)
......@@ -226,7 +218,7 @@ def main():
out = CompositeOutput([log])
out.output("Starting %s v%s..." %
(parser.get_prog_name(), version))
ret = image_creator(d, media, out, options.tmp)
ret = create_image(d, media, out, options.tmp)
sys.exit(ret)
except Reset:
log.output("Resetting everything...")
......
......@@ -108,9 +108,9 @@ class MetadataMonitor(object):
def upload_image(session):
d = session["dialog"]
dev = session['device']
image = session['image']
meta = session['metadata']
size = dev.size
size = image.size
if "account" not in session:
d.msgbox("You need to provide your ~okeanos credentials before you "
......@@ -139,17 +139,17 @@ def upload_image(session):
gauge = GaugeOutput(d, "Image Upload", "Uploading...")
try:
out = dev.out
out = image.out
out.add(gauge)
try:
if 'checksum' not in session:
md5 = MD5(out)
session['checksum'] = md5.compute(session['snapshot'], size)
session['checksum'] = md5.compute(image.device, size)
kamaki = Kamaki(session['account'], out)
try:
# Upload image file
with open(session['snapshot'], 'rb') as f:
with open(image.device, 'rb') as f:
session["pithos_uri"] = \
kamaki.upload(f, size, filename,
"Calculating block hashes",
......@@ -188,14 +188,12 @@ def upload_image(session):
def register_image(session):
d = session["dialog"]
dev = session['device']
is_public = False
if "account" not in session:
d.msgbox("You need to provide your ~okeanos credentians before you "
"can register an images with cyclades",
width=SMALL_WIDTH)
"can register an images with cyclades", width=SMALL_WIDTH)
return False
if "pithos_uri" not in session:
......@@ -233,7 +231,7 @@ def register_image(session):
img_type = "public" if is_public else "private"
gauge = GaugeOutput(d, "Image Registration", "Registering image...")
try:
out = dev.out
out = session['image'].out
out.add(gauge)
try:
out.output("Registering %s image with Cyclades..." % img_type)
......@@ -481,7 +479,7 @@ def exclude_tasks(session):
def sysprep(session):
d = session['dialog']
image_os = session['image_os']
image = session['image']
# Is the image already shrinked?
if 'shrinked' in session and session['shrinked']:
......@@ -500,7 +498,7 @@ def sysprep(session):
if 'exec_syspreps' not in session:
session['exec_syspreps'] = []
all_syspreps = image_os.list_syspreps()
all_syspreps = image.os.list_syspreps()
# Only give the user the choice between syspreps that have not ran yet
syspreps = [s for s in all_syspreps if s not in session['exec_syspreps']]
......@@ -513,7 +511,7 @@ def sysprep(session):
choices = []
index = 0
for sysprep in syspreps:
name, descr = image_os.sysprep_info(sysprep)
name, descr = image.os.sysprep_info(sysprep)
display_name = name.replace('-', ' ').capitalize()
sysprep_help += "%s\n" % display_name
sysprep_help += "%s\n" % ('-' * len(display_name))
......@@ -536,34 +534,33 @@ def sysprep(session):
# Enable selected syspreps and disable the rest
for i in range(len(syspreps)):
if str(i + 1) in tags:
image_os.enable_sysprep(syspreps[i])
image.os.enable_sysprep(syspreps[i])
session['exec_syspreps'].append(syspreps[i])
else:
image_os.disable_sysprep(syspreps[i])
image.os.disable_sysprep(syspreps[i])
infobox = InfoBoxOutput(d, "Image Configuration")
try:
dev = session['device']
dev.out.add(infobox)
image.out.add(infobox)
try:
dev.mount(readonly=False)
image.mount(readonly=False)
try:
# The checksum is invalid. We have mounted the image rw
if 'checksum' in session:
del session['checksum']
# Monitor the metadata changes during syspreps
with MetadataMonitor(session, image_os.meta):
image_os.do_sysprep()
with MetadataMonitor(session, image.os.meta):
image.os.do_sysprep()
infobox.finalize()
# Disable syspreps that have ran
for sysprep in session['exec_syspreps']:
image_os.disable_sysprep(sysprep)
image.os.disable_sysprep(sysprep)
finally:
dev.umount()
image.umount()
finally:
dev.out.remove(infobox)
image.out.remove(infobox)
finally:
infobox.cleanup()
break
......@@ -572,7 +569,7 @@ def sysprep(session):
def shrink(session):
d = session['dialog']
dev = session['device']
image = session['image']
shrinked = 'shrinked' in session and session['shrinked']
......@@ -589,14 +586,14 @@ def shrink(session):
if not d.yesno("%s\n\nDo you want to continue?" % msg, width=WIDTH,
height=12, title="Image Shrinking"):
with MetadataMonitor(session, dev.meta):
with MetadataMonitor(session, image.meta):
infobox = InfoBoxOutput(d, "Image Shrinking", height=4)
dev.out.add(infobox)
image.out.add(infobox)
try:
dev.shrink()
image.shrink()
infobox.finalize()
finally:
dev.out.remove(infobox)
image.out.remove(infobox)
session['shrinked'] = True
update_background_title(session)
......
......@@ -43,17 +43,17 @@ WIDTH = 70
def update_background_title(session):
d = session['dialog']
dev = session['device']
disk = session['disk']
image = session['image']
MB = 2 ** 20
size = (dev.size + MB - 1) // MB
size = (image.size + MB - 1) // MB
shrinked = 'shrinked' in session and session['shrinked']
postfix = " (shrinked)" if shrinked else ''
title = "OS: %s, Distro: %s, Size: %dMB%s, Source: %s" % \
(dev.ostype, dev.distro, size, postfix,
(image.ostype, image.distro, size, postfix,
os.path.abspath(disk.source))
d.setBackgroundTitle(title)
......@@ -128,18 +128,16 @@ def extract_image(session):
gauge = GaugeOutput(d, "Image Extraction", "Extracting image...")
try:
dev = session['device']
out = dev.out
image = session['image']
out = image.out
out.add(gauge)
try:
if "checksum" not in session:
size = dev.size
md5 = MD5(out)
session['checksum'] = md5.compute(session['snapshot'],
size)
session['checksum'] = md5.compute(image.device, image.size)
# Extract image file
dev.dump(path)
image.dump(path)
# Extract metadata file
out.output("Extracting metadata file...")
......
......@@ -180,7 +180,7 @@ def wizard(session):
name = WizardInputPage(
"ImageName", "Image Name", "Please provide a name for the image:",
title="Image Name", init=session['device'].distro)
title="Image Name", init=session['image'].distro)
descr = WizardInputPage(
"ImageDescription", "Image Description",
......@@ -232,38 +232,35 @@ def wizard(session):
def create_image(session):
d = session['dialog']
disk = session['disk']
device = session['device']
snapshot = session['snapshot']
image_os = session['image_os']
image = session['image']
wizard = session['wizard']
# Save Kamaki credentials
Kamaki.save_token(wizard['Account']['auth_token'])
with_progress = OutputWthProgress(True)
out = disk.out
out = image.out
out.add(with_progress)
try:
out.clear()
#Sysprep
device.mount(False)
image_os.do_sysprep()
metadata = image_os.meta
device.umount()
image.mount(False)
image.os.do_sysprep()
metadata = image.os.meta
image.umount()
#Shrink
size = device.shrink()
size = image.shrink()
session['shrinked'] = True
update_background_title(session)
metadata.update(device.meta)
metadata.update(image.meta)
metadata['DESCRIPTION'] = wizard['ImageDescription']
#MD5
md5 = MD5(out)
session['checksum'] = md5.compute(snapshot, size)
session['checksum'] = md5.compute(image.device, size)
#Metadata
metastring = '\n'.join(
......@@ -278,7 +275,7 @@ def create_image(session):
name = "%s-%s.diskdump" % (wizard['ImageName'],
time.strftime("%Y%m%d%H%M"))
pithos_file = ""
with open(snapshot, 'rb') as f:
with open(image.device, 'rb') as f:
pithos_file = kamaki.upload(f, size, name,
"(1/4) Calculating block hashes",
"(2/4) Uploading missing blocks")
......
This diff is collapsed.
This diff is collapsed.
......@@ -38,7 +38,6 @@ from image_creator.disk import Disk
from image_creator.util import FatalError, MD5
from image_creator.output.cli import SilentOutput, SimpleOutput, \
OutputWthProgress
from image_creator.os_type import os_cls
from image_creator.kamaki_wrapper import Kamaki, ClientError
import sys
import os
......@@ -205,51 +204,47 @@ def image_creator():
try:
snapshot = disk.snapshot()
dev = disk.get_device(snapshot)
image = disk.get_image(snapshot)
# If no customization is to be applied, the image should be mounted ro
readonly = (not (options.sysprep or options.shrink) or
options.print_sysprep)
dev.mount(readonly)
cls = os_cls(dev.distro, dev.ostype)
image_os = cls(dev.root, dev.g, out)
out.output()
for sysprep in options.disabled_syspreps:
image_os.disable_sysprep(image_os.get_sysprep_by_name(sysprep))
ro = (not (options.sysprep or options.shrink) or options.print_sysprep)
image.mount(ro)
try:
for sysprep in options.disabled_syspreps:
image.os.disable_sysprep(image.os.get_sysprep_by_name(sysprep))
for sysprep in options.enabled_syspreps:
image_os.enable_sysprep(image_os.get_sysprep_by_name(sysprep))
for sysprep in options.enabled_syspreps:
image.os.enable_sysprep(image.os.get_sysprep_by_name(sysprep))
if options.print_sysprep:
image_os.print_syspreps()
out.output()
if options.print_sysprep:
image.os.print_syspreps()
out.output()
if options.outfile is None and not options.upload:
return 0
if options.outfile is None and not options.upload:
return 0
if options.sysprep:
image_os.do_sysprep()
if options.sysprep:
image.os.do_sysprep()
metadata = image_os.meta
dev.umount()
metadata = image.os.meta
finally:
image.umount()
size = options.shrink and dev.shrink() or dev.size
metadata.update(dev.meta)
size = options.shrink and image.shrink() or image.size
metadata.update(image.meta)
# Add command line metadata to the collected ones...
metadata.update(options.metadata)
md5 = MD5(out)
checksum = md5.compute(snapshot, size)
checksum = md5.compute(image.device, size)
metastring = '\n'.join(
['%s=%s' % (key, value) for (key, value) in metadata.items()])
metastring += '\n'
if options.outfile is not None:
dev.dump(options.outfile)
image.dump(options.outfile)
out.output('Dumping metadata file ...', False)
with open('%s.%s' % (options.outfile, 'meta'), 'w') as f:
......@@ -262,8 +257,8 @@ def image_creator():
os.path.basename(options.outfile)))
out.success('done')
# Destroy the device. We only need the snapshot from now on
disk.destroy_device(dev)
# Destroy the image instance. We only need the snapshot from now on
disk.destroy_image(image)
out.output()
try:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment