Commit 1450d8ee by Dudás Ádám

manager: basic scheduler w/ mock monitor data

parent 4ddd2e68
from django.db.models import Sum
class NotEnoughMemoryException(Exception):
def __init__(self, message=None):
if message is None:
message = "No node has enough memory to accomodate the guest."
Exception.__init__(self, message)
class TraitsUnsatisfiableException(Exception):
def __init__(self, message=None):
if message is None:
message = "No node can satisfy all required traits of the guest."
Exception.__init__(self, message)
def get_node(instance, nodes): def get_node(instance, nodes):
''' Select a node for hosting an instance based on its requirements. ''' Select a node for hosting an instance based on its requirements.
''' '''
# Return first Node or None # check required traits
try: nodes = [n for n in nodes if has_traits(instance.req_traits.all(), n)]
req_traits = set(instance.req_traits.all()) if not nodes:
nodes = [n for n in nodes if req_traits.issubset(n.traits.all())] raise TraitsUnsatisfiableException()
# check required RAM
nodes = [n for n in nodes if has_enough_ram(instance.ram_size, n)]
if not nodes:
raise NotEnoughMemoryException()
# sort nodes first by processor usage, then priority
nodes.sort(key=lambda n: n.priority, reverse=True)
nodes.sort(key=processor_usage)
return nodes[0] return nodes[0]
except:
return None
def has_traits(traits, node):
"""True, if the node has all specified traits; otherwise, false.
"""
traits = set(traits)
return traits.issubset(node.traits.all())
def has_enough_ram(ram_size, node):
"""True, if the node has enough memory to accomodate a guest requiring
ram_size mebibytes of memory; otherwise, false.
"""
total = node.ram_size
used = 512 # TODO replace mock value with data from monitor
unused = total - used
overcommit = node.ram_size_with_overcommit
reserved = node.instance_set.aggregate(r=Sum('ram_size'))['r'] or 0
free = overcommit - reserved
return ram_size < unused and ram_size < free
def processor_usage(node):
"""Get a number indicating processor usage on the node.
Lower values indicate lower usage.
"""
return 0 # TODO replace mock value with data from monitor
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment