diff --git a/box.py b/box.py new file mode 100755 index 0000000..f336f4a --- /dev/null +++ b/box.py @@ -0,0 +1,84 @@ +#!/usr/bin/env python + +import argparse +import os +import subprocess +import tempfile + + +class VMCreate: + CLOUD_IMAGE = "ci.iso" + CLOUD_INIT_FINISHED_CMD = "test /var/lib/cloud/instance/boot-finished" + + def __init__(self, args): + self.vm_name = args.name + self.cpus = args.cpus + self.memory = args.memory + self.disk_size = args.disk_size + self.ubuntu_version = args.version + self._temp_path = None + self._disk_img = self.vm_name + '.vdi' + self._tmp = None + + def run(self): + try: + self._prepare_temp() + self._download_image() + # self._convert_and_resize() + finally: + self._cleanup() + + def _prepare_temp(self): + self._tmp = tempfile.mkdtemp() + + def _download_image(self): + url = "https://cloud-images.ubuntu.com/releases/" + url += f"{self.ubuntu_version}/release/" + img = f"ubuntu-{self.ubuntu_version}-server-cloudimg-amd64.img" + url += img + print(url) + + subprocess.call(['wget', url, '-O', os.path.join(self._tmp, img)]) + + def _cleanup(self): + subprocess.call(['rm', '-fr', self._tmp]) + + +def _create(args): + return VMCreate(args).run() + + +def main(): + parser = argparse.ArgumentParser(description="Automate deployment and " + "maintenance of Ubuntu VMs using " + "VirtualBox and Ubuntu cloud images") + subparsers = parser.add_subparsers(help='supported commands') + create = subparsers.add_parser('create') + create.add_argument('name') + create.set_defaults(func=_create) + create.add_argument('-m', '--memory', default=12288, type=int, + help="amount of memory in Megabytes, default 12GB") + create.add_argument('-c', '--cpus', default=6, type=int, + help="amount of CPUs to be configured. Default 6.") + create.add_argument('-d', '--disk-size', default=20480, type=int, + help="disk size to be expanded to. By default to 20GB") + create.add_argument('-v', '--version', default="18.04", + help="Ubuntu server version. Default 18.04") + + completion = subparsers.add_parser('completion') + completion.add_argument('shell', choices=['bash'], + help="pick shell to generate completions for") + + args = parser.parse_args() + + return args.func(args) + try: + # __import__('ipdb').set_trace() + return args.func(args) + except AttributeError: + parser.print_help() + parser.exit() + + +if __name__ == '__main__': + main()