diff --git a/circle/circle/settings/base.py b/circle/circle/settings/base.py index 00150d3..5f1bbc7 100644 --- a/circle/circle/settings/base.py +++ b/circle/circle/settings/base.py @@ -576,6 +576,8 @@ SESSION_COOKIE_NAME = "csessid%x" % (((getnode() // 139) ^ MAX_NODE_RAM = get_env_variable("MAX_NODE_RAM", 1024) MAX_NODE_CPU_CORE = get_env_variable("MAX_NODE_CPU_CORE", 10) +SCHEDULER_METHOD = get_env_variable("SCHEDULER_METHOD", 'random') + # Url to download the client: (e.g. http://circlecloud.org/client/download/) CLIENT_DOWNLOAD_URL = get_env_variable('CLIENT_DOWNLOAD_URL', 'http://circlecloud.org/client/download/') diff --git a/circle/manager/scheduler.py b/circle/manager/scheduler.py index 05f3217..7fd4508 100644 --- a/circle/manager/scheduler.py +++ b/circle/manager/scheduler.py @@ -21,6 +21,10 @@ from django.utils.translation import ugettext_noop from common.models import HumanReadableException +from circle.settings.base import SCHEDULER_METHOD + +import random + logger = getLogger(__name__) @@ -50,9 +54,7 @@ class TraitsUnsatisfiableException(SchedulerError): "new virtual machine currently.") -def select_node(instance, nodes): - ''' Select a node for hosting an instance based on its requirements. - ''' +def common_select(instance, nodes): # check required traits nodes = [n for n in nodes if n.schedule_enabled and n.online and @@ -70,8 +72,32 @@ def select_node(instance, nodes): # sort nodes first by processor usage, then priority nodes.sort(key=lambda n: n.priority, reverse=True) nodes.sort(key=free_cpu_time, reverse=True) + return nodes + + +def common_evenly(instance, nodes): + nodes = common_select(instance, nodes) result = nodes[0] + return result + +def common_random(instance, nodes): + nodes = common_select(instance, nodes) + result = random.choice(nodes) + return result + + +def select_node(instance, nodes): + ''' Select a node for hosting an instance based on its requirements. + ''' + if SCHEDULER_METHOD == 'evenly': + result = common_evenly(instance, nodes) + elif SCHEDULER_METHOD == 'random': + result = common_random(instance, nodes) + else: # Default method is the random + result = common_random(instance, nodes) + + logger.info('Scheduler method: %s selected', unicode(SCHEDULER_METHOD)) logger.info('select_node: %s for %s', unicode(result), unicode(instance)) return result