More significant work
This commit is contained in:
@ -3,17 +3,46 @@
|
||||
import os, socket, time, uuid, threading, libvirt, kazoo.client
|
||||
|
||||
class NodeInstance(threading.Thread):
|
||||
def __init__(self, name, zk):
|
||||
def __init__(self, name, node_list, zk):
|
||||
super(NodeInstance, self).__init__()
|
||||
# Passed-in variables on creation
|
||||
self.zkey = '/nodes/%s' % name
|
||||
self.zk = zk
|
||||
self.name = name
|
||||
self.stop_thread = threading.Event()
|
||||
self.node_list = node_list
|
||||
self.domainlist = []
|
||||
|
||||
# Get value functions
|
||||
def getfreemem():
|
||||
return self.memfree
|
||||
|
||||
def getcpuload():
|
||||
return self.cpuload
|
||||
|
||||
def getname():
|
||||
return self.name
|
||||
|
||||
# Shutdown the thread
|
||||
def stop(self):
|
||||
self.stop_thread.set()
|
||||
|
||||
# Flush all VMs on the host
|
||||
def flush(self):
|
||||
for domain in self.domainlist:
|
||||
# Determine the best target hypervisor
|
||||
least_mem = (2^64)/8
|
||||
least_load = 999.0
|
||||
least_host = ""
|
||||
for node in node_list:
|
||||
node_freemem = node.getfreemem()
|
||||
if node_freemem < least_mem:
|
||||
least_mem = node_freemem
|
||||
least_host = node.getname()
|
||||
|
||||
self.zk.set('/domains/' + domain + '/state', b'migrate')
|
||||
self.zk.set('/domains/' + domain + '/hypervisor', least_host.encode('ascii'))
|
||||
|
||||
def run(self):
|
||||
if self.name == socket.gethostname():
|
||||
self.setup_local_node()
|
||||
@ -42,10 +71,18 @@ class NodeInstance(threading.Thread):
|
||||
self.zk.set(self.zkey + '/memfree', str(self.memfree).encode('ascii'))
|
||||
self.zk.set(self.zkey + '/cpuload', str(self.cpuload).encode('ascii'))
|
||||
print("Free memory: %s | Load: %s" % ( self.memfree, self.cpuload ))
|
||||
time.sleep(1)
|
||||
if self.stop_thread.is_set():
|
||||
break
|
||||
print("Active domains: %s" % self.domainlist)
|
||||
for x in range(0,50):
|
||||
time.sleep(0.1)
|
||||
if self.stop_thread.is_set():
|
||||
return
|
||||
|
||||
@zk.DataWatch(self.zkey + '/state')
|
||||
def watch_state(data, stat):
|
||||
self.state = data.decode('ascii')
|
||||
print("Version: %s, data: %s" % (stat.version, self.state))
|
||||
if self.state == 'flush':
|
||||
self.flush()
|
||||
|
||||
def setup_remote_node(self):
|
||||
@zk.DataWatch(self.zkey + '/state')
|
||||
@ -54,17 +91,17 @@ class NodeInstance(threading.Thread):
|
||||
print("Version: %s, data: %s" % (stat.version, self.state))
|
||||
|
||||
@zk.DataWatch(self.zkey + '/cpucount')
|
||||
def watch_state(data, stat):
|
||||
def watch_cpucount(data, stat):
|
||||
self.cpucount = data.decode('ascii')
|
||||
print("Version: %s, data: %s" % (stat.version, self.cpucount))
|
||||
|
||||
@zk.DataWatch(self.zkey + '/cpuload')
|
||||
def watch_state(data, stat):
|
||||
def watch_cpuload(data, stat):
|
||||
self.cpuload = data.decode('ascii')
|
||||
print("Version: %s, data: %s" % (stat.version, self.cpuload))
|
||||
|
||||
@zk.DataWatch(self.zkey + '/memfree')
|
||||
def watch_state(data, stat):
|
||||
def watch_memfree(data, stat):
|
||||
self.memfree = data.decode('ascii')
|
||||
print("Version: %s, data: %s" % (stat.version, self.memfree))
|
||||
|
||||
|
Reference in New Issue
Block a user