示例#1
0
    def create_overlay(self):
        from Configuration import Options

        disk_path = Const.BASE_DISK_PATH
        options = Options()
        options.disk_only = False
        options.TRIM_SUPPORT = False
        options.FREE_SUPPORT = False 
        options.MEMORY_SAVE_PATH = Const.MODIFIED_MEMORY_SNAPSHOT
        overlay = cloudlet.VM_Overlay(disk_path, options)
        app_installer = App_installer('localhost', 2222)
        overlay.start()
        app_installer.start()
        app_installer.join()
        overlay.join()

        print "[INFO] overlay metafile : %s" % overlay.overlay_metafile
        print "[INFO] overlay : %s" % str(overlay.overlay_files[0])
def main(argv):
    if not lib_cloudlet.validate_congifuration():
        sys.stderr.write("failed to validate configuration\n")
        sys.exit(1)

    CMD_BASE_CREATION       = "base"
    CMD_OVERLAY_CREATION    = "overlay"
    CMD_SYNTEHSIS           = "synthesis"
    CMD_LIST_BASE           = "list_base"
    CMD_DEL_BASE            = "del_base"
    CMD_ADD_BASE            = "add_base"
    CMD_LIST_SESSION        = "list_session"
    CMD_CLEAR_SESSION       = "clear_session"
    CMD_LIST_OVERLAY        = "list_overlay"

    commands = {
            CMD_BASE_CREATION: "create new base VM",
            CMD_OVERLAY_CREATION: "create new overlay VM on top of base VM",
            CMD_SYNTEHSIS: "test created overlay using command line",
            CMD_LIST_BASE: "show all base VM at this machine",
            CMD_ADD_BASE: "add existing base vm to DB",
            CMD_DEL_BASE: "delete base vm at database",
            }
    mode, left_args, settings = process_command_line(sys.argv[1:], commands)

    if mode == CMD_BASE_CREATION:
        # creat base VM
        if len(left_args) < 1:
            sys.stderr.write("Error, Need to path to VM disk\n")
            sys.exit(1)
        if len(left_args) > 1 :
            sys.stderr("Warning, qemu argument won't be applied to creating base vm")
        disk_image_path = left_args[0] 
        disk_path, mem_path = lib_cloudlet.create_baseVM(disk_image_path)
        print "Base VM is created from %s" % disk_image_path
        print "Disk: %s" % disk_path
        print "Mem: %s" % mem_path

    elif mode == CMD_OVERLAY_CREATION:
        # create overlay
        if len(left_args) < 1:
            sys.stderr.write("Error, Need to path to VM disk\n")
            sys.exit(1)
        disk_image_path = left_args[0] 
        qemu_args = left_args[1:]
        options = Options()
        options.TRIM_SUPPORT = not settings.disable_trim_support
        options.FREE_SUPPORT = settings.enable_free_support
        options.DISK_ONLY = settings.disk_only

        overlay = lib_cloudlet.VM_Overlay(disk_image_path, options, qemu_args)
        overlay.start()
        overlay.join()
        print "[INFO] overlay metafile : %s" % overlay.overlay_metafile
        print "[INFO] overlay : %s" % str(overlay.overlay_files[0])
    elif mode == CMD_SYNTEHSIS:
        if len(left_args) < 2:
            sys.stderr.write("Synthesis requires path to VM disk and overlay-meta\n \
                    Ex) ./cloudlet synthesis [VM disk] /path/to/precise.overlay-meta \n")
            sys.exit(1)
        disk_image_path = left_args[0] 
        meta = left_args[1]
        qemu_args = left_args[2:]
        lib_cloudlet.synthesis(disk_image_path, meta, settings.disk_only, qemu_args=qemu_args)
    elif mode == CMD_LIST_BASE:
        from db.table_def import BaseVM
        dbconn = get_database()

        basevm_list = dbconn.list_item(BaseVM)
        sys.stdout.write("hash value" + "\t\t\t\t\t" + "path\n")
        sys.stdout.write("-"*90 + "\n")
        for item in basevm_list:
            sys.stdout.write(item.hash_value + "\t" + item.disk_path + "\n")
        sys.stdout.write("-"*90 + "\n")
    elif mode == CMD_ADD_BASE:
        from db.table_def import BaseVM
        dbconn = get_database()

        if len(left_args) < 2:
            sys.stderr.write("Add existing base vm requires: \n \
                    1) base path\n \
                    2) hash value of the base\n \
                    Ex) ./cloudlet add_base /path/to/base_disk.img 4304c473a9f98480c7d6387f01158881d3440bb81c8a9452b1abdef794e51111\n")
            sys.exit(1)
        basedisk_path = os.path.abspath(left_args[0])
        base_hashvalue = left_args[1]
        if not os.path.isfile(basedisk_path):
            sys.stderr.write("Not valid file: %s\n" % basedisk_path)
            sys.exit(1)

        new_basevm = BaseVM(basedisk_path, base_hashvalue)
        dbconn.add_item(new_basevm)
    elif mode == CMD_DEL_BASE:
        from db.table_def import BaseVM
        dbconn = get_database()

        if len(left_args) < 1:
            sys.stderr.write("delete base vm requires base path\n \
                    Ex) ./cloudlet del_base /path/to/base_disk.img \n")
            sys.exit(1)
        basedisk_path = os.path.abspath(left_args[0])
        basevm_list = dbconn.list_item(BaseVM)
        deleting_base = None
        for item in basevm_list:
            if basedisk_path == item.disk_path: 
                deleting_base = item
                break

        if deleting_base:
            dbconn.del_item(item)
        else: 
            sys.stderr.write("Cannot find matching base disk\n")
            sys.exit(1)
    elif mode == CMD_LIST_SESSION:
        from db.table_def import Session
        dbconn = get_database()

        session_list = dbconn.list_item(Session)
        sys.stdout.write("session_id\t\tassociated_time\t\t\tdisassociated_time\t\tstatus\n")
        sys.stdout.write("-"*95 + "\n")
        for item in session_list:
            sys.stdout.write(str(item) + "\n")
        sys.stdout.write("-"*95 + "\n")
    elif mode == CMD_CLEAR_SESSION:
        from db.table_def import Session
        dbconn = get_database()

        session_list = dbconn.list_item(Session)
        for item in session_list:
            dbconn.session.delete(item)
        dbconn.session.commit()
    elif mode == CMD_LIST_OVERLAY:
        from db.table_def import OverlayVM
        dbconn = get_database()

        overlay_list = dbconn.list_item(OverlayVM)
        sys.stdout.write("id\tsession_id\t\tbasevm_path\t\t\t\t\t\tstatus\n")
        sys.stdout.write("-"*95 + "\n")
        for item in overlay_list:
            sys.stdout.write(str(item) + "\n")
        sys.stdout.write("-"*95 + "\n")
    else:
        sys.stdout.write("Invalid command: %s\n" % mode)
        sys.exit(1)

    return 0