summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Behrens <cbehrens@codestud.com>2011-11-02 14:16:58 -0700
committerChris Behrens <cbehrens@codestud.com>2011-11-02 15:41:54 -0700
commit39c261e683dd8deff157462b7a320c329e3a22f5 (patch)
treedf53dc89a746fc14dc802c60f4980ad4b035701d
parente1b4b282d0e41f97cf1beeee2f213e7cf39fc951 (diff)
downloadnova-39c261e683dd8deff157462b7a320c329e3a22f5.tar.gz
nova-39c261e683dd8deff157462b7a320c329e3a22f5.tar.xz
nova-39c261e683dd8deff157462b7a320c329e3a22f5.zip
Reserve memory/disk for dom0/host OS
Only when scheduling with distributed scheduler for now. Adds flags: flags.DEFINE_integer('reserved_host_disk_mb', 0, 'Amount of disk in MB to reserve for host/dom0') flags.DEFINE_integer('reserved_host_memory_mb', 512, 'Amount of memory in MB to reserve for host/dom0') Change-Id: Ib9b8a4deca241db399a8541ab21697ab08e29dd6
-rw-r--r--nova/scheduler/zone_manager.py28
-rw-r--r--nova/tests/scheduler/test_host_filter.py17
-rw-r--r--nova/tests/scheduler/test_least_cost.py1
3 files changed, 37 insertions, 9 deletions
diff --git a/nova/scheduler/zone_manager.py b/nova/scheduler/zone_manager.py
index 3ccd5015e..f6d895a55 100644
--- a/nova/scheduler/zone_manager.py
+++ b/nova/scheduler/zone_manager.py
@@ -22,9 +22,8 @@ import thread
import traceback
import UserDict
-from novaclient import v1_1 as novaclient
-
from eventlet import greenpool
+from novaclient import v1_1 as novaclient
from nova import db
from nova import flags
@@ -33,9 +32,13 @@ from nova import utils
FLAGS = flags.FLAGS
flags.DEFINE_integer('zone_db_check_interval', 60,
- 'Seconds between getting fresh zone info from db.')
+ 'Seconds between getting fresh zone info from db.')
flags.DEFINE_integer('zone_failures_to_offline', 3,
- 'Number of consecutive errors before marking zone offline')
+ 'Number of consecutive errors before marking zone offline')
+flags.DEFINE_integer('reserved_host_disk_mb', 0,
+ 'Amount of disk in MB to reserve for host/dom0')
+flags.DEFINE_integer('reserved_host_memory_mb', 512,
+ 'Amount of memory in MB to reserve for host/dom0')
class ZoneState(object):
@@ -228,17 +231,26 @@ class ZoneManager(object):
for compute in compute_nodes:
all_disk = compute['local_gb']
all_ram = compute['memory_mb']
- host = compute['service']['host']
+ service = compute['service']
+ if not service:
+ LOG.warn(_("No service for compute ID %s") % compute['id'])
+ continue
+ host = service['host']
caps = self.service_states.get(host, None)
- host_info_map[host] = HostInfo(host, caps=caps,
- free_disk_gb=all_disk,
- free_ram_mb=all_ram)
+ host_info = HostInfo(host, caps=caps,
+ free_disk_gb=all_disk, free_ram_mb=all_ram)
+ # Reserve resources for host/dom0
+ host_info.consume_resources(FLAGS.reserved_host_disk_mb * 1024,
+ FLAGS.reserved_host_memory_mb)
+ host_info_map[host] = host_info
# "Consume" resources from the host the instance resides on.
instances = self._instance_get_all(context)
for instance in instances:
host = instance['host']
+ if not host:
+ continue
host_info = host_info_map.get(host, None)
if not host_info:
continue
diff --git a/nova/tests/scheduler/test_host_filter.py b/nova/tests/scheduler/test_host_filter.py
index 96f26b23c..b5b5aadef 100644
--- a/nova/tests/scheduler/test_host_filter.py
+++ b/nova/tests/scheduler/test_host_filter.py
@@ -56,7 +56,8 @@ class HostFilterTestCase(test.TestCase):
def setUp(self):
super(HostFilterTestCase, self).setUp()
default_host_filters = ['AllHostsFilter']
- self.flags(default_host_filters=default_host_filters)
+ self.flags(default_host_filters=default_host_filters,
+ reserved_host_disk_mb=0, reserved_host_memory_mb=0)
self.instance_type = dict(name='tiny',
memory_mb=30,
vcpus=10,
@@ -139,6 +140,20 @@ class HostFilterTestCase(test.TestCase):
self.assertEquals('host3', just_hosts[1])
self.assertEquals('host2', just_hosts[0])
+ def test_instance_type_filter_reserved_memory(self):
+ self.flags(reserved_host_memory_mb=2048)
+ hf = nova.scheduler.filters.InstanceTypeFilter()
+ # filter all hosts that can support 30 ram and 300 disk after
+ # reserving 2048 ram
+ cooked = hf.instance_type_to_filter(self.instance_type)
+ all_hosts = self._get_all_hosts()
+ hosts = hf.filter_hosts(all_hosts, cooked)
+ self.assertEquals(2, len(hosts))
+ just_hosts = [host for host, hostinfo in hosts]
+ just_hosts.sort()
+ self.assertEquals('host4', just_hosts[1])
+ self.assertEquals('host3', just_hosts[0])
+
def test_instance_type_filter_extra_specs(self):
hf = nova.scheduler.filters.InstanceTypeFilter()
# filter all hosts that can support 30 ram and 300 disk
diff --git a/nova/tests/scheduler/test_least_cost.py b/nova/tests/scheduler/test_least_cost.py
index ba6cdb686..a45e95181 100644
--- a/nova/tests/scheduler/test_least_cost.py
+++ b/nova/tests/scheduler/test_least_cost.py
@@ -32,6 +32,7 @@ def scale(hostinfo):
class LeastCostTestCase(test.TestCase):
def setUp(self):
super(LeastCostTestCase, self).setUp()
+ self.flags(reserved_host_disk_mb=0, reserved_host_memory_mb=0)
self.zone_manager = fake_zone_manager.FakeZoneManager()