[master 6/8] livemedia-creator: Add --make-vagrant command

bcl installerbot-noreply at redhat.com
Wed Oct 21 00:59:21 UTC 2015


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

This adds support for creating Vagrant boxes using virt-install. It also
includes an example kickstart that sets up the vagrant user with the
default ssh key.

The default result, without passing --image-name, is in
/var/tmp/vagrant.tar.xz
---
 src/sbin/livemedia-creator | 83 ++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 81 insertions(+), 2 deletions(-)

diff --git a/src/sbin/livemedia-creator b/src/sbin/livemedia-creator
index 9d46de5..08068e5 100755
--- a/src/sbin/livemedia-creator
+++ b/src/sbin/livemedia-creator
@@ -32,6 +32,8 @@ import shutil
 import argparse
 import hashlib
 import glob
+import json
+from math import ceil
 
 # Use pykickstart to calculate disk image size
 from pykickstart.parser import KickstartParser
@@ -440,6 +442,41 @@ def create_pxe_config(template, images_dir, live_image_name, add_args = None):
     with open (joinpaths(images_dir, "PXE_CONFIG"), "w") as f:
         f.write(result)
 
+
+def create_vagrant_metadata(path, size=0):
+    """ Create a default Vagrant metadata.json file
+
+    :param str path: Path to metadata.json file
+    :param int size: Disk size in MiB
+    """
+    metadata = { "provider":"libvirt", "format":"qcow2", "virtual_size": ceil(size / 1024) }
+    with open(path, "wt") as f:
+        json.dump(metadata, f, indent=4)
+
+
+def update_vagrant_metadata(path, size):
+    """ Update the Vagrant metadata.json file
+
+    :param str path: Path to metadata.json file
+    :param int size: Disk size in MiB
+
+    This function makes sure that the provider, format and virtual size of the
+    metadata file are set correctly. All other values are left untouched.
+    """
+    with open(path, "rt") as f:
+        try:
+            metadata = json.load(f)
+        except ValueError as e:
+            log.error("Problem reading metadata file %s: %s", path, e)
+            return
+
+    metadata["provider"] = "libvirt"
+    metadata["format"] = "qcow2"
+    metadata["virtual_size"] = ceil(size / 1024)
+    with open(path, "wt") as f:
+        json.dump(metadata, f, indent=4)
+
+
 def make_livecd(opts, mount_dir, work_dir):
     """
     Take the content from the disk image and make a livecd out of it
@@ -673,6 +710,12 @@ def novirt_install(opts, disk_img, disk_size, repo_url):
         qcow2_img = tempfile.mktemp(prefix="disk", suffix=".img")
         execWithRedirect("qemu-img", ["convert"] + qcow2_args + [disk_img, qcow2_img], raise_err=True)
         execWithRedirect("mv", ["-f", qcow2_img, disk_img], raise_err=True)
+
+        if opts.make_vagrant:
+            pass
+
+            # tar the qcow2 file and optional json files
+
     elif opts.make_tar:
         compress_args = []
         for arg in opts.compress_args:
@@ -788,6 +831,25 @@ def virt_install(opts, install_log, disk_img, disk_size):
 
         if rc:
             raise InstallError("virt_install failed")
+    elif opts.make_vagrant:
+        compress_args = []
+        for arg in opts.compress_args:
+            compress_args += arg.split(" ", 1)
+
+        vagrant_dir = tempfile.mkdtemp()
+        metadata_path = joinpaths(vagrant_dir, "metadata.json")
+        execWithRedirect("mv", ["-f", disk_img, joinpaths(vagrant_dir, "box.img")], raise_err=True)
+        if opts.vagrant_metadata:
+            shutil.copy2(opts.vagrant_metadata, metadata_path)
+        else:
+            create_vagrant_metadata(metadata_path)
+        update_vagrant_metadata(metadata_path, disk_size)
+        if opts.vagrantfile:
+            shutil.copy2(opts.vagrantfile, joinpaths(vagrant_dir, "vagrantfile"))
+
+        rc = mktar(vagrant_dir, disk_img, opts.compression, compress_args, selinux=False)
+        if rc:
+            raise InstallError("virt_install failed")
 
 
 def make_squashfs(disk_img, work_dir, compression="xz"):
@@ -943,6 +1005,8 @@ def main():
                         help="Build a live pxe boot squashfs image of Atomic Host")
     action.add_argument("--make-oci", action="store_true",
                         help="Build an Open Container Initiative image")
+    action.add_argument("--make-vagrant", action="store_true",
+                        help="Build a Vagrant Box image")
 
     parser.add_argument("--iso", type=os.path.abspath,
                         help="Anaconda installation .iso path to use for virt-install")
@@ -1050,6 +1114,13 @@ def main():
     oci_group.add_argument("--oci-runtime",
                               help="runtime.json OCI configuration file")
 
+    # Vagrant specific commands
+    vagrant_group = parser.add_argument_group("Vagrant arguments")
+    vagrant_group.add_argument("--vagrant-metadata",
+                               help="optional metadata.json file")
+    vagrant_group.add_argument("--vagrantfile",
+                               help="optional vagrantfile")
+
     parser.add_argument("--title", default="Linux Live Media",
                         help="Substituted for @TITLE@ in bootloader config files")
     parser.add_argument("--project", default="Linux",
@@ -1122,6 +1193,10 @@ def main():
     if opts.image_name and os.path.exists(joinpaths(opts.result_dir, opts.image_name)):
         errors.append("The disk image to be created should not exist.")
 
+    # Vagrant creates a qcow2 inside a tar, turn on qcow2
+    if opts.make_vagrant:
+        opts.qcow2 = True
+
     if opts.qcow2 and not os.path.exists("/usr/bin/qemu-img"):
         errors.append("qcow2 requires the qemu-img utility to be installed.")
 
@@ -1150,7 +1225,7 @@ def main():
         list(log.error(e) for e in errors)
         sys.exit(1)
 
-    # Default to putting results into tmp
+    # Default to putting results under tmp
     if not opts.result_dir:
         opts.result_dir = opts.tmp
     else:
@@ -1173,7 +1248,11 @@ def main():
             opts.image_name = "bundle.tar.xz"
         if opts.compression == "xz" and not opts.compress_args:
             opts.compress_args = ["-9"]
-
+    elif opts.make_vagrant:
+        if not opts.image_name:
+            opts.image_name = "vagrant.tar.xz"
+        if opts.compression == "xz" and not opts.compress_args:
+            opts.compress_args = ["-9"]
 
     if opts.app_file:
         opts.app_file = joinpaths(opts.result_dir, opts.app_file)


-- 
To view this commit on github, visit https://github.com/rhinstaller/lorax/commit/04878b2a16b80d0e34ecdb0554b94a99e5645349


More information about the anaconda-patches mailing list