[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[LORAX 1/4] livemedia-creator: Add support for making ami images



From: "Brian C. Lane" <bcl redhat com>

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.
---
 src/sbin/livemedia-creator |   41 ++++++++++++++++++++++++++++++-----------
 1 files changed, 30 insertions(+), 11 deletions(-)

diff --git a/src/sbin/livemedia-creator b/src/sbin/livemedia-creator
index 23c9b3f..e91c050 100755
--- a/src/sbin/livemedia-creator
+++ b/src/sbin/livemedia-creator
@@ -46,7 +46,7 @@ from pykickstart.version import makeVersion
 from pylorax.base import DataHolder
 from pylorax.treebuilder import TreeBuilder, RuntimeBuilder, udev_escape
 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
 
 
@@ -406,6 +406,23 @@ def get_kernels( boot_dir ):
     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,
                  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:
+        if not img_mount or not img_mount.mount_dir:
+            return None
+
         kernel_list = get_kernels( joinpaths( img_mount.mount_dir, "boot" ) )
         log.debug( "kernel_list = {0}".format(kernel_list) )
         if kernel_list:
@@ -592,7 +612,7 @@ if __name__ == '__main__':
         log.error("You need to run this as root")
         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"
                    " exist.".format( opts.lorax_templates ) )
         sys.exit( 1 )
@@ -614,10 +634,6 @@ if __name__ == '__main__':
         log.error( "--make-appliance is not yet implemented." )
         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:
         log.error( "virt-install needs an install iso." )
         sys.exit( 1 )
@@ -701,13 +717,16 @@ if __name__ == '__main__':
         result_dir = make_livecd( opts.disk_image or disk_img, opts.squashfs_args,
                                   opts.lorax_templates,
                                   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:
-            os.unlink( disk_img )
+    # cleanup the mess
+    if disk_img and not opts.keep_image and not opts.disk_image:
+        os.unlink( disk_img )
 
-        if opts.result_dir:
-            shutil.copytree( result_dir, opts.result_dir )
-            shutil.rmtree( result_dir )
+    if opts.result_dir and result_dir:
+        shutil.copytree( result_dir, opts.result_dir )
+        shutil.rmtree( result_dir )
 
     log.info("SUMMARY")
     log.info("-------")
-- 
1.7.7.6


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]