from django.db.models import CharField, IntegerField, Model from django.utils.functional import cached_property from django.utils.translation import gettext_lazy as _ from libvirt import virConnect from vrtManager.connection import connection_manager from vrtManager.hostdetails import wvmHostDetails class Compute(Model): name = CharField(_("name"), max_length=64, unique=True) hostname = CharField(_("hostname"), max_length=64) login = CharField(_("login"), max_length=20) password = CharField(_("password"), max_length=14, blank=True, null=True) details = CharField(_("details"), max_length=64, null=True, blank=True) type = IntegerField() @cached_property def status(self): """True if WebVirtCloud can connect to the host (within the connect timeout; a host that failed recently is not tried again at once).""" return isinstance(self.connection, virConnect) @cached_property def connection_error(self): """Why the host cannot be reached, or None.""" return None if self.status else str(self.connection) @cached_property def connection(self): try: return connection_manager.get_connection( self.hostname, self.login, self.password, self.type, ) except Exception as e: return e @cached_property def proxy(self): return wvmHostDetails( self.hostname, self.login, self.password, self.type, ) @cached_property def cpu_count(self): return self.proxy.get_node_info()[3] @cached_property def cpu_usage(self): return round(self.proxy.get_cpu_usage(diff=False).get('usage')) @cached_property def ram_size(self): return self.proxy.get_node_info()[2] @cached_property def ram_usage(self): return self.proxy.get_memory_usage()["percent"] def __str__(self): return self.name