Implement alternate node target fields

Implements the last additional hypervisor selector fields: vCPUs.

Addresses #11
This commit is contained in:
Joshua Boniface 2018-07-18 12:09:07 -04:00
parent bebd0af0ac
commit ca554cc9f1
3 changed files with 29 additions and 1 deletions

View File

@ -201,6 +201,7 @@ else:
transaction.create('/nodes/{}/memfree'.format(myhostname), '0'.encode('ascii')) transaction.create('/nodes/{}/memfree'.format(myhostname), '0'.encode('ascii'))
transaction.create('/nodes/{}/memused'.format(myhostname), '0'.encode('ascii')) transaction.create('/nodes/{}/memused'.format(myhostname), '0'.encode('ascii'))
transaction.create('/nodes/{}/memalloc'.format(myhostname), '0'.encode('ascii')) transaction.create('/nodes/{}/memalloc'.format(myhostname), '0'.encode('ascii'))
transaction.create('/nodes/{}/vcpualloc'.format(myhostname), '0'.encode('ascii'))
transaction.create('/nodes/{}/cpuload'.format(myhostname), '0.0'.encode('ascii')) transaction.create('/nodes/{}/cpuload'.format(myhostname), '0.0'.encode('ascii'))
transaction.create('/nodes/{}/runningdomains'.format(myhostname), ''.encode('ascii')) transaction.create('/nodes/{}/runningdomains'.format(myhostname), ''.encode('ascii'))
transaction.create('/nodes/{}/domainscount'.format(myhostname), '0'.encode('ascii')) transaction.create('/nodes/{}/domainscount'.format(myhostname), '0'.encode('ascii'))

View File

@ -45,6 +45,7 @@ class NodeInstance():
self.memused = 0 self.memused = 0
self.memfree = 0 self.memfree = 0
self.memalloc = 0 self.memalloc = 0
self.vcpualloc = 0
self.inflush = False self.inflush = False
# Zookeeper handlers for changed states # Zookeeper handlers for changed states
@ -92,6 +93,13 @@ class NodeInstance():
except AttributeError: except AttributeError:
self.memalloc = 0 self.memalloc = 0
@zk_conn.DataWatch('/nodes/{}/vcpualloc'.format(self.name))
def watch_hypervisor_vcpualloc(data, stat, event=""):
try:
self.vcpualloc = data.decode('ascii')
except AttributeError:
self.vcpualloc = 0
@zk_conn.DataWatch('/nodes/{}/runningdomains'.format(self.name)) @zk_conn.DataWatch('/nodes/{}/runningdomains'.format(self.name))
def watch_hypervisor_runningdomains(data, stat, event=""): def watch_hypervisor_runningdomains(data, stat, event=""):
try: try:
@ -113,6 +121,9 @@ class NodeInstance():
def getallocmem(self): def getallocmem(self):
return self.memalloc return self.memalloc
def getallocvcpu(self):
return self.vcpualloc
def getcpuload(self): def getcpuload(self):
return self.cpuload return self.cpuload
@ -209,10 +220,12 @@ class NodeInstance():
# Toggle state management of dead VMs to restart them # Toggle state management of dead VMs to restart them
memalloc = 0 memalloc = 0
vcpualloc = 0
for domain, instance in self.s_domain.items(): for domain, instance in self.s_domain.items():
if instance.inshutdown == False and domain in self.domain_list: if instance.inshutdown == False and domain in self.domain_list:
# Add the allocated memory to our memalloc value # Add the allocated memory to our memalloc value
memalloc += instance.getmemory() memalloc += instance.getmemory()
vcpualloc += instance.getvcpus()
if instance.getstate() == 'start' and instance.gethypervisor() == self.name: if instance.getstate() == 'start' and instance.gethypervisor() == self.name:
if instance.getdom() != None: if instance.getdom() != None:
try: try:
@ -234,6 +247,7 @@ class NodeInstance():
self.memused = int(psutil.virtual_memory().used / 1024 / 1024) self.memused = int(psutil.virtual_memory().used / 1024 / 1024)
self.memfree = int(psutil.virtual_memory().free / 1024 / 1024) self.memfree = int(psutil.virtual_memory().free / 1024 / 1024)
self.memalloc = memalloc self.memalloc = memalloc
self.vcpualloc = vcpualloc
self.cpuload = os.getloadavg()[0] self.cpuload = os.getloadavg()[0]
self.domains_count = len(lv_conn.listDomainsID()) self.domains_count = len(lv_conn.listDomainsID())
keepalive_time = int(time.time()) keepalive_time = int(time.time())
@ -242,6 +256,7 @@ class NodeInstance():
'/nodes/{}/memused'.format(self.name): str(self.memused), '/nodes/{}/memused'.format(self.name): str(self.memused),
'/nodes/{}/memfree'.format(self.name): str(self.memfree), '/nodes/{}/memfree'.format(self.name): str(self.memfree),
'/nodes/{}/memalloc'.format(self.name): str(self.memalloc), '/nodes/{}/memalloc'.format(self.name): str(self.memalloc),
'/nodes/{}/vcpualloc'.format(self.name): str(self.vcpualloc),
'/nodes/{}/cpuload'.format(self.name): str(self.cpuload), '/nodes/{}/cpuload'.format(self.name): str(self.cpuload),
'/nodes/{}/runningdomains'.format(self.name): ' '.join(self.domain_list), '/nodes/{}/runningdomains'.format(self.name): ' '.join(self.domain_list),
'/nodes/{}/domainscount'.format(self.name): str(self.domains_count), '/nodes/{}/domainscount'.format(self.name): str(self.domains_count),
@ -392,7 +407,11 @@ def findTargetHypervisorVCPUs(zk_conn, dom_uuid):
hypervisor_list = getHypervisors(zk_conn, dom_uuid) hypervisor_list = getHypervisors(zk_conn, dom_uuid)
for hypervisor in hypervisor_list: for hypervisor in hypervisor_list:
pass vcpus = int(zkhandler.readdata(zk_conn, '/nodes/{}/vcpualloc'.format(hypervisor)))
if vcpus < least_vcpus:
least_vcpus = vcpus
target_hypervisor = hypervisor
return target_hypervisor return target_hypervisor

View File

@ -73,6 +73,14 @@ class VMInstance:
return memory return memory
def getvcpus(self):
try:
vcpus = int(self.dom.info()[3])
except:
vcpus = 0
return vcpus
# Manage local node domain_list # Manage local node domain_list
def addDomainToList(self): def addDomainToList(self):
if not self.domuuid in self.thishypervisor.domain_list: if not self.domuuid in self.thishypervisor.domain_list: