Пример #1
0
 def __init__(self):
     self.__view = None
     self.__vms = []
     self.__project = Project()
     self.libvirtdao = LibVirtDao()
     self.__reload_flag = False
     self.__threads = []
     #Initialize catalog state
     self.refresh_vms_list()
Пример #2
0
 def __init__(self):
     self.__view = None
     self.__vms = []
     self.__project = Project()
     self.libvirtdao = LibVirtDao()
     self.__reload_flag = False
     self.__threads = []
     #Initialize catalog state
     self.refresh_vms_list()
Пример #3
0
    def on_openmenuitem__activate(self, *args):
        file_name = self.view.dialog_filechooser_open()
        if file_name is None:
            return

        try:
            project = ProjectDao.load_project(file_name)
            self.view.set_statusbar("File open succesful.")

        except IOError as e:
            self.view.dialog_file_error("IO error({0}): {1}".format(e.errno, e.strerror))
            self.view.set_statusbar("Error in file operation.")
            project = Project()
        except:
            self.view.dialog_file_error("Unknown error.")
            self.view.set_statusbar("Error in file operation.")
            project = Project()

        self.model.inject_project(project)
        self.view.projectname.set_text(project.get_project_name())
        self.reload_view_vmlist(True)
        self.view.change_title(project.get_project_file())
Пример #4
0
class VMCatalog(object):

    def __init__(self):
        self.__view = None
        self.__vms = []
        self.__project = Project()
        self.libvirtdao = LibVirtDao()
        self.__reload_flag = False
        self.__threads = []
        #Initialize catalog state
        self.refresh_vms_list()

    def get_project(self):
        return self.__project

    def inject_project(self, value):
        self.__project = value
        for vm_instance_name in self.__project.get_metadata():
            self.set_vms_metadata(self.__project.get_metadata()[vm_instance_name], vm_instance_name)

    def notify_change(self):
        self.__reload_flag = True

    def reset_change_notify(self):
        self.__reload_flag = False

#    def empty(self):
#        del self.__vms[:]

    def start_all_related_vms_once(self):
        self.scheduled_vm_launcher(True)

    def stop_all_related_vms_once(self):
        delay = 0
        for vm_instance in self.__vms:
            if vm_instance.has_defined_role():
                t = threading.Timer(delay, VMLaunchworker.stop_worker, args=(VMLaunchworker(), vm_instance),)
                t.start()
                delay += 2

    def stop_all_vms_once(self):
        delay = 0
        for vm_instance in self.__vms:
            t = threading.Timer(delay, VMLaunchworker.stop_worker, args=(VMLaunchworker(), vm_instance),)
            t.start()
            delay += 2

    def get_vm(self, name_or_instance):
        return self.__vms[self.__vms.index(name_or_instance)]

    def get_vms(self):
        return self.__vms

    def set_vms_metadata(self, metadata, vm_instance_name):
        if vm_instance_name in self.__vms:
            self.get_vm(vm_instance_name).set_metadataref(metadata)
        else:
            self.catalog(vm_instance_name)
            self.get_vm(vm_instance_name).set_metadataref(metadata)

    def get_vms_metadata(self):
        metadata = {}
        for vm_instance in self.__vms:
            metadata[vm_instance.get_name()] = vm_instance.get_metadataref()
        return metadata

    def reset(self):
        del self.__vms[:]
        self.__project.reset()
        self.refresh_vms_list()

    def refresh_vms_list(self):
        '''
        Refresh state of the vm_list
        Returns False if no status change from hypervisor
        Returns True if status change is occured
        '''
        domains = self.libvirtdao.get_domain_list()

        for vm_instance_name in domains:
            if vm_instance_name not in self.__vms:
                self.catalog(vm_instance_name)

        self.request_state_reload()

        return self.__reload_flag

    def catalog(self, vm_instance_name):
        vm_instance = self.libvirtdao.vm_build(vm_instance_name)
        vm_instance.set_metadataref(VMMetadata())
        vm_instance.set_vmcatalogref(self)
        self.__vms.append(vm_instance)

    def request_state_reload(self):
        for vm_istance in self.__vms:
            vm_istance.query_state()

    def set_view(self, view):
        if self.__view:
            msg = "This model already has a view: %s"
            raise AssertionError(msg % self.__view)
        self.__view = view

    def get_view(self):
        return self.__view

    def scheduled_vm_launcher(self, zero_delay=False):
        # Do not start launch if launch is already running.
        if len(self.__threads) is 0:
            startable = []

            # Which instances should be started
            for vm_instance in self.__vms:
                if vm_instance.get_state() is VMState.Stopped and vm_instance.has_defined_role():
                    startable.append(vm_instance)

            # Sort according to order
            startable.sort(cmp=None, key=lambda x: x.get_order(), reverse=False)
            # Sort according to start delay if same order
            startable.sort(lambda x, y: x.get_order() == y.get_order() and x.get_delay() < y.get_delay(), reverse=False)

            incr_delay = 0
            for vm_instance in startable:
                if incr_delay > 0:
                    self.__view.add_status_dialogbox(vm_instance.get_name() + " starts in " + str(incr_delay * 60) + " seconds.")
                if vm_instance is startable[-1]:
                    t = threading.Timer(incr_delay * 60, VMLaunchworker.start_worker, args=(VMLaunchworker(), self, vm_instance, True),)
                else:
                    t = threading.Timer(incr_delay * 60, VMLaunchworker.start_worker, args=(VMLaunchworker(), self, vm_instance, False),)
                if not zero_delay:
                    incr_delay = incr_delay + vm_instance.get_delay()
                t.start()
                self.__threads.append(t)

            if len(startable) is 0:
                self.__view.set_statusbar("Nothing to launch.")


    def cancel_vm_launch(self):
        if len(self.__threads) > 0:
            for thread in self.__threads:
                thread.cancel()
            self.__view.add_status_dialogbox("Launch terminated.")
            self.__view.set_statusbar("Launch terminated.")
            self.clear_vm_launch()

    def clear_vm_launch(self):
        del self.__threads[:]
Пример #5
0
class VMCatalog(object):
    def __init__(self):
        self.__view = None
        self.__vms = []
        self.__project = Project()
        self.libvirtdao = LibVirtDao()
        self.__reload_flag = False
        self.__threads = []
        #Initialize catalog state
        self.refresh_vms_list()

    def get_project(self):
        return self.__project

    def inject_project(self, value):
        self.__project = value
        for vm_instance_name in self.__project.get_metadata():
            self.set_vms_metadata(
                self.__project.get_metadata()[vm_instance_name],
                vm_instance_name)

    def notify_change(self):
        self.__reload_flag = True

    def reset_change_notify(self):
        self.__reload_flag = False


#    def empty(self):
#        del self.__vms[:]

    def start_all_related_vms_once(self):
        self.scheduled_vm_launcher(True)

    def stop_all_related_vms_once(self):
        delay = 0
        for vm_instance in self.__vms:
            if vm_instance.has_defined_role():
                t = threading.Timer(
                    delay,
                    VMLaunchworker.stop_worker,
                    args=(VMLaunchworker(), vm_instance),
                )
                t.start()
                delay += 2

    def stop_all_vms_once(self):
        delay = 0
        for vm_instance in self.__vms:
            t = threading.Timer(
                delay,
                VMLaunchworker.stop_worker,
                args=(VMLaunchworker(), vm_instance),
            )
            t.start()
            delay += 2

    def get_vm(self, name_or_instance):
        return self.__vms[self.__vms.index(name_or_instance)]

    def get_vms(self):
        return self.__vms

    def set_vms_metadata(self, metadata, vm_instance_name):
        if vm_instance_name in self.__vms:
            self.get_vm(vm_instance_name).set_metadataref(metadata)
        else:
            self.catalog(vm_instance_name)
            self.get_vm(vm_instance_name).set_metadataref(metadata)

    def get_vms_metadata(self):
        metadata = {}
        for vm_instance in self.__vms:
            metadata[vm_instance.get_name()] = vm_instance.get_metadataref()
        return metadata

    def reset(self):
        del self.__vms[:]
        self.__project.reset()
        self.refresh_vms_list()

    def refresh_vms_list(self):
        '''
        Refresh state of the vm_list
        Returns False if no status change from hypervisor
        Returns True if status change is occured
        '''
        domains = self.libvirtdao.get_domain_list()

        for vm_instance_name in domains:
            if vm_instance_name not in self.__vms:
                self.catalog(vm_instance_name)

        self.request_state_reload()

        return self.__reload_flag

    def catalog(self, vm_instance_name):
        vm_instance = self.libvirtdao.vm_build(vm_instance_name)
        vm_instance.set_metadataref(VMMetadata())
        vm_instance.set_vmcatalogref(self)
        self.__vms.append(vm_instance)

    def request_state_reload(self):
        for vm_istance in self.__vms:
            vm_istance.query_state()

    def set_view(self, view):
        if self.__view:
            msg = "This model already has a view: %s"
            raise AssertionError(msg % self.__view)
        self.__view = view

    def get_view(self):
        return self.__view

    def scheduled_vm_launcher(self, zero_delay=False):
        # Do not start launch if launch is already running.
        if len(self.__threads) is 0:
            startable = []

            # Which instances should be started
            for vm_instance in self.__vms:
                if vm_instance.get_state(
                ) is VMState.Stopped and vm_instance.has_defined_role():
                    startable.append(vm_instance)

            # Sort according to order
            startable.sort(cmp=None,
                           key=lambda x: x.get_order(),
                           reverse=False)
            # Sort according to start delay if same order
            startable.sort(lambda x, y: x.get_order() == y.get_order() and x.
                           get_delay() < y.get_delay(),
                           reverse=False)

            incr_delay = 0
            for vm_instance in startable:
                if incr_delay > 0:
                    self.__view.add_status_dialogbox(vm_instance.get_name() +
                                                     " starts in " +
                                                     str(incr_delay * 60) +
                                                     " seconds.")
                if vm_instance is startable[-1]:
                    t = threading.Timer(
                        incr_delay * 60,
                        VMLaunchworker.start_worker,
                        args=(VMLaunchworker(), self, vm_instance, True),
                    )
                else:
                    t = threading.Timer(
                        incr_delay * 60,
                        VMLaunchworker.start_worker,
                        args=(VMLaunchworker(), self, vm_instance, False),
                    )
                if not zero_delay:
                    incr_delay = incr_delay + vm_instance.get_delay()
                t.start()
                self.__threads.append(t)

            if len(startable) is 0:
                self.__view.set_statusbar("Nothing to launch.")

    def cancel_vm_launch(self):
        if len(self.__threads) > 0:
            for thread in self.__threads:
                thread.cancel()
            self.__view.add_status_dialogbox("Launch terminated.")
            self.__view.set_statusbar("Launch terminated.")
            self.clear_vm_launch()

    def clear_vm_launch(self):
        del self.__threads[:]