#!/usr/bin/env python
#
# CentOS image
#
# Copyright 2018 Red Hat Inc.
#
# Authors:
#  Fam Zheng <famz@redhat.com>
#
# This code is licensed under the GPL version 2 or later.  See
# the COPYING file in the top-level directory.
#

import os
import sys
import subprocess
import basevm
import time

class CentosVM(basevm.BaseVM):
    name = "centos"
    arch = "x86_64"
    BUILD_SCRIPT = """
        set -e;
        cd $(mktemp -d);
        export SRC_ARCHIVE=/dev/vdb;
        sudo chmod a+r $SRC_ARCHIVE;
        tar -xf $SRC_ARCHIVE;
        make docker-test-block@centos7 V={verbose} J={jobs};
        make docker-test-quick@centos7 V={verbose} J={jobs};
        make docker-test-mingw@fedora V={verbose} J={jobs};
    """

    def _gen_cloud_init_iso(self):
        cidir = self._tmpdir
        mdata = open(os.path.join(cidir, "meta-data"), "w")
        mdata.writelines(["instance-id: centos-vm-0\n",
                          "local-hostname: centos-guest\n"])
        mdata.close()
        udata = open(os.path.join(cidir, "user-data"), "w")
        udata.writelines(["#cloud-config\n",
                          "chpasswd:\n",
                          "  list: |\n",
                          "    root:%s\n" % self.ROOT_PASS,
                          "    %s:%s\n" % (self.GUEST_USER, self.GUEST_PASS),
                          "  expire: False\n",
                          "users:\n",
                          "  - name: %s\n" % self.GUEST_USER,
                          "    sudo: ALL=(ALL) NOPASSWD:ALL\n",
                          "    ssh-authorized-keys:\n",
                          "    - %s\n" % basevm.SSH_PUB_KEY,
                          "  - name: root\n",
                          "    ssh-authorized-keys:\n",
                          "    - %s\n" % basevm.SSH_PUB_KEY,
                          "locale: en_US.UTF-8\n"])
        udata.close()
        subprocess.check_call(["genisoimage", "-output", "cloud-init.iso",
                               "-volid", "cidata", "-joliet", "-rock",
                               "user-data", "meta-data"],
                               cwd=cidir,
                               stdin=self._devnull, stdout=self._stdout,
                               stderr=self._stdout)
        return os.path.join(cidir, "cloud-init.iso")

    def build_image(self, img):
        cimg = self._download_with_cache("https://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud-1802.qcow2.xz")
        img_tmp = img + ".tmp"
        sys.stderr.write("Extracting the image...\n")
        subprocess.check_call(["cp", "-f", cimg, img_tmp + ".xz"])
        subprocess.check_call(["xz", "-dvf", img_tmp + ".xz"])
        subprocess.check_call(["qemu-img", "resize", img_tmp, "50G"])
        self.boot(img_tmp, extra_args = ["-cdrom", self._gen_cloud_init_iso()])
        self.wait_ssh()
        self.ssh_root_check("touch /etc/cloud/cloud-init.disabled")
        self.ssh_root_check("yum update -y")
        self.ssh_root_check("yum install -y docker make git")
        self.ssh_root_check("systemctl enable docker")
        self.ssh_root("poweroff")
        self.wait()
        if os.path.exists(img):
            os.remove(img)
        os.rename(img_tmp, img)
        return 0

if __name__ == "__main__":
    sys.exit(basevm.main(CentosVM))
