livemedia-creator: Add support for making ami images

AMI images are un-partitioned filesystem images with a grub.conf that
is read by the pv-grub bootloader used by EC2. Most of the actual work
making the AMI is done in the kickstart. This just creates the image
file.
This commit is contained in:
Brian C. Lane 2012-02-28 13:57:17 -08:00
parent c2c4762df2
commit 54dd513ed8

View File

@ -46,7 +46,7 @@ from pykickstart.version import makeVersion
from pylorax.base import DataHolder from pylorax.base import DataHolder
from pylorax.treebuilder import TreeBuilder, RuntimeBuilder, udev_escape from pylorax.treebuilder import TreeBuilder, RuntimeBuilder, udev_escape
from pylorax.sysutils import joinpaths, remove, linktree from pylorax.sysutils import joinpaths, remove, linktree
from pylorax.imgutils import PartitionMount, mksparse from pylorax.imgutils import PartitionMount, mksparse, mkext4img
from pylorax.executils import execWithRedirect, execWithCapture from pylorax.executils import execWithRedirect, execWithCapture
@ -406,6 +406,23 @@ def get_kernels( boot_dir ):
return [f[8:] for f in files if f.startswith("vmlinuz-")] return [f[8:] for f in files if f.startswith("vmlinuz-")]
def make_ami( disk_img, ami_img="ami-root.img", ami_label="AMI" ):
"""
Copy the / partition to an un-partitioned disk image
ami_img is the filename to write, defaults to ami-root.img
ami_label is the FS label to apply to the image
All other AMI setup is handled by the kickstart's %post
"""
with PartitionMount( disk_img ) as img_mount:
work_dir = tempfile.mkdtemp()
log.info("working dir is {0}".format(work_dir))
log.info("creating {0}".format(ami_img))
mkext4img(img_mount.mount_dir, joinpaths(work_dir, ami_img), label=ami_label)
return work_dir
def make_livecd( disk_img, squashfs_args="", templatedir=None, def make_livecd( disk_img, squashfs_args="", templatedir=None,
title="Linux", project="Linux", releasever=16 ): title="Linux", project="Linux", releasever=16 ):
""" """
@ -423,6 +440,9 @@ def make_livecd( disk_img, squashfs_args="", templatedir=None,
""" """
with PartitionMount( disk_img ) as img_mount: with PartitionMount( disk_img ) as img_mount:
if not img_mount or not img_mount.mount_dir:
return None
kernel_list = get_kernels( joinpaths( img_mount.mount_dir, "boot" ) ) kernel_list = get_kernels( joinpaths( img_mount.mount_dir, "boot" ) )
log.debug( "kernel_list = {0}".format(kernel_list) ) log.debug( "kernel_list = {0}".format(kernel_list) )
if kernel_list: if kernel_list:
@ -592,7 +612,7 @@ if __name__ == '__main__':
log.error("You need to run this as root") log.error("You need to run this as root")
sys.exit( 1 ) sys.exit( 1 )
if not os.path.exists( opts.lorax_templates ): if opts.make_iso and not os.path.exists( opts.lorax_templates ):
log.error( "The lorax templates directory ({0}) doesn't" log.error( "The lorax templates directory ({0}) doesn't"
" exist.".format( opts.lorax_templates ) ) " exist.".format( opts.lorax_templates ) )
sys.exit( 1 ) sys.exit( 1 )
@ -614,10 +634,6 @@ if __name__ == '__main__':
log.error( "--make-appliance is not yet implemented." ) log.error( "--make-appliance is not yet implemented." )
sys.exit( 1 ) sys.exit( 1 )
if opts.make_ami:
log.error( "--make-ami is not yet implemented." )
sys.exit( 1 )
if not opts.no_virt and not opts.iso and not opts.disk_image: if not opts.no_virt and not opts.iso and not opts.disk_image:
log.error( "virt-install needs an install iso." ) log.error( "virt-install needs an install iso." )
sys.exit( 1 ) sys.exit( 1 )
@ -701,13 +717,16 @@ if __name__ == '__main__':
result_dir = make_livecd( opts.disk_image or disk_img, opts.squashfs_args, result_dir = make_livecd( opts.disk_image or disk_img, opts.squashfs_args,
opts.lorax_templates, opts.lorax_templates,
opts.title, opts.project, opts.releasever ) opts.title, opts.project, opts.releasever )
elif opts.make_ami and not opts.image_only:
result_dir = make_ami(opts.disk_image or disk_img)
if not opts.keep_image and not opts.disk_image: # cleanup the mess
os.unlink( disk_img ) if disk_img and not opts.keep_image and not opts.disk_image:
os.unlink( disk_img )
if opts.result_dir: if opts.result_dir and result_dir:
shutil.copytree( result_dir, opts.result_dir ) shutil.copytree( result_dir, opts.result_dir )
shutil.rmtree( result_dir ) shutil.rmtree( result_dir )
log.info("SUMMARY") log.info("SUMMARY")
log.info("-------") log.info("-------")