diff options
author | Chris Behrens <cbehrens@codestud.com> | 2011-11-02 14:16:58 -0700 |
---|---|---|
committer | Chris Behrens <cbehrens@codestud.com> | 2011-11-02 15:41:54 -0700 |
commit | 39c261e683dd8deff157462b7a320c329e3a22f5 (patch) | |
tree | df53dc89a746fc14dc802c60f4980ad4b035701d | |
parent | e1b4b282d0e41f97cf1beeee2f213e7cf39fc951 (diff) | |
download | nova-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.py | 28 | ||||
-rw-r--r-- | nova/tests/scheduler/test_host_filter.py | 17 | ||||
-rw-r--r-- | nova/tests/scheduler/test_least_cost.py | 1 |
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() |