Merged trunk.
This commit is contained in:
1
Authors
1
Authors
@@ -44,6 +44,7 @@ Josh Kearney <josh@jk0.org>
|
|||||||
Josh Kleinpeter <josh@kleinpeter.org>
|
Josh Kleinpeter <josh@kleinpeter.org>
|
||||||
Joshua McKenty <jmckenty@gmail.com>
|
Joshua McKenty <jmckenty@gmail.com>
|
||||||
Justin Santa Barbara <justin@fathomdb.com>
|
Justin Santa Barbara <justin@fathomdb.com>
|
||||||
|
Justin Shepherd <jshepher@rackspace.com>
|
||||||
Kei Masumoto <masumotok@nttdata.co.jp>
|
Kei Masumoto <masumotok@nttdata.co.jp>
|
||||||
Ken Pepple <ken.pepple@gmail.com>
|
Ken Pepple <ken.pepple@gmail.com>
|
||||||
Kevin Bringard <kbringard@attinteractive.com>
|
Kevin Bringard <kbringard@attinteractive.com>
|
||||||
|
@@ -96,8 +96,8 @@ class FlavorFilter(HostFilter):
|
|||||||
selected_hosts = []
|
selected_hosts = []
|
||||||
for host, services in zone_manager.service_states.iteritems():
|
for host, services in zone_manager.service_states.iteritems():
|
||||||
capabilities = services.get('compute', {})
|
capabilities = services.get('compute', {})
|
||||||
host_ram_mb = capabilities['host_memory']['free']
|
host_ram_mb = capabilities['host_memory_free']
|
||||||
disk_bytes = capabilities['disk']['available']
|
disk_bytes = capabilities['disk_available']
|
||||||
if host_ram_mb >= instance_type['memory_mb'] and \
|
if host_ram_mb >= instance_type['memory_mb'] and \
|
||||||
disk_bytes >= instance_type['local_gb']:
|
disk_bytes >= instance_type['local_gb']:
|
||||||
selected_hosts.append((host, capabilities))
|
selected_hosts.append((host, capabilities))
|
||||||
@@ -106,16 +106,16 @@ class FlavorFilter(HostFilter):
|
|||||||
#host entries (currently) are like:
|
#host entries (currently) are like:
|
||||||
# {'host_name-description': 'Default install of XenServer',
|
# {'host_name-description': 'Default install of XenServer',
|
||||||
# 'host_hostname': 'xs-mini',
|
# 'host_hostname': 'xs-mini',
|
||||||
# 'host_memory': {'total': 8244539392,
|
# 'host_memory_total': 8244539392,
|
||||||
# 'overhead': 184225792,
|
# 'host_memory_overhead': 184225792,
|
||||||
# 'free': 3868327936,
|
# 'host_memory_free': 3868327936,
|
||||||
# 'free-computed': 3840843776},
|
# 'host_memory_free_computed': 3840843776},
|
||||||
# 'host_other-config': {},
|
# 'host_other-config': {},
|
||||||
# 'host_ip_address': '192.168.1.109',
|
# 'host_ip_address': '192.168.1.109',
|
||||||
# 'host_cpu_info': {},
|
# 'host_cpu_info': {},
|
||||||
# 'disk': {'available': 32954957824,
|
# 'disk_available': 32954957824,
|
||||||
# 'total': 50394562560,
|
# 'disk_total': 50394562560,
|
||||||
# 'used': 17439604736},
|
# 'disk_used': 17439604736},
|
||||||
# 'host_uuid': 'cedb9b39-9388-41df-8891-c5c9a0c0fe5f',
|
# 'host_uuid': 'cedb9b39-9388-41df-8891-c5c9a0c0fe5f',
|
||||||
# 'host_name-label': 'xs-mini'}
|
# 'host_name-label': 'xs-mini'}
|
||||||
|
|
||||||
@@ -221,8 +221,8 @@ class JsonFilter(HostFilter):
|
|||||||
required_ram = instance_type['memory_mb']
|
required_ram = instance_type['memory_mb']
|
||||||
required_disk = instance_type['local_gb']
|
required_disk = instance_type['local_gb']
|
||||||
query = ['and',
|
query = ['and',
|
||||||
['>=', '$compute.host_memory.free', required_ram],
|
['>=', '$compute.host_memory_free', required_ram],
|
||||||
['>=', '$compute.disk.available', required_disk]
|
['>=', '$compute.disk_available', required_disk]
|
||||||
]
|
]
|
||||||
return (self._full_name(), json.dumps(query))
|
return (self._full_name(), json.dumps(query))
|
||||||
|
|
||||||
|
@@ -21,6 +21,7 @@ Tests For Compute
|
|||||||
|
|
||||||
import datetime
|
import datetime
|
||||||
import mox
|
import mox
|
||||||
|
import stubout
|
||||||
|
|
||||||
from nova import compute
|
from nova import compute
|
||||||
from nova import context
|
from nova import context
|
||||||
@@ -52,6 +53,10 @@ class FakeTime(object):
|
|||||||
self.counter += t
|
self.counter += t
|
||||||
|
|
||||||
|
|
||||||
|
def nop_report_driver_status(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class ComputeTestCase(test.TestCase):
|
class ComputeTestCase(test.TestCase):
|
||||||
"""Test case for compute"""
|
"""Test case for compute"""
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
@@ -649,6 +654,10 @@ class ComputeTestCase(test.TestCase):
|
|||||||
|
|
||||||
def test_run_kill_vm(self):
|
def test_run_kill_vm(self):
|
||||||
"""Detect when a vm is terminated behind the scenes"""
|
"""Detect when a vm is terminated behind the scenes"""
|
||||||
|
self.stubs = stubout.StubOutForTesting()
|
||||||
|
self.stubs.Set(compute_manager.ComputeManager,
|
||||||
|
'_report_driver_status', nop_report_driver_status)
|
||||||
|
|
||||||
instance_id = self._create_instance()
|
instance_id = self._create_instance()
|
||||||
|
|
||||||
self.compute.run_instance(self.context, instance_id)
|
self.compute.run_instance(self.context, instance_id)
|
||||||
|
@@ -43,16 +43,16 @@ class HostFilterTestCase(test.TestCase):
|
|||||||
# which means ... don't go above 10 hosts.
|
# which means ... don't go above 10 hosts.
|
||||||
return {'host_name-description': 'XenServer %s' % multiplier,
|
return {'host_name-description': 'XenServer %s' % multiplier,
|
||||||
'host_hostname': 'xs-%s' % multiplier,
|
'host_hostname': 'xs-%s' % multiplier,
|
||||||
'host_memory': {'total': 100,
|
'host_memory_total': 100,
|
||||||
'overhead': 10,
|
'host_memory_overhead': 10,
|
||||||
'free': 10 + multiplier * 10,
|
'host_memory_free': 10 + multiplier * 10,
|
||||||
'free-computed': 10 + multiplier * 10},
|
'host_memory_free-computed': 10 + multiplier * 10,
|
||||||
'host_other-config': {},
|
'host_other-config': {},
|
||||||
'host_ip_address': '192.168.1.%d' % (100 + multiplier),
|
'host_ip_address': '192.168.1.%d' % (100 + multiplier),
|
||||||
'host_cpu_info': {},
|
'host_cpu_info': {},
|
||||||
'disk': {'available': 100 + multiplier * 100,
|
'disk_available': 100 + multiplier * 100,
|
||||||
'total': 1000,
|
'disk_total': 1000,
|
||||||
'used': 0},
|
'disk_used': 0,
|
||||||
'host_uuid': 'xxx-%d' % multiplier,
|
'host_uuid': 'xxx-%d' % multiplier,
|
||||||
'host_name-label': 'xs-%s' % multiplier}
|
'host_name-label': 'xs-%s' % multiplier}
|
||||||
|
|
||||||
@@ -131,12 +131,12 @@ class HostFilterTestCase(test.TestCase):
|
|||||||
|
|
||||||
raw = ['or',
|
raw = ['or',
|
||||||
['and',
|
['and',
|
||||||
['<', '$compute.host_memory.free', 30],
|
['<', '$compute.host_memory_free', 30],
|
||||||
['<', '$compute.disk.available', 300]
|
['<', '$compute.disk_available', 300]
|
||||||
],
|
],
|
||||||
['and',
|
['and',
|
||||||
['>', '$compute.host_memory.free', 70],
|
['>', '$compute.host_memory_free', 70],
|
||||||
['>', '$compute.disk.available', 700]
|
['>', '$compute.disk_available', 700]
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
cooked = json.dumps(raw)
|
cooked = json.dumps(raw)
|
||||||
@@ -149,7 +149,7 @@ class HostFilterTestCase(test.TestCase):
|
|||||||
self.assertEquals('host%02d' % index, host)
|
self.assertEquals('host%02d' % index, host)
|
||||||
|
|
||||||
raw = ['not',
|
raw = ['not',
|
||||||
['=', '$compute.host_memory.free', 30],
|
['=', '$compute.host_memory_free', 30],
|
||||||
]
|
]
|
||||||
cooked = json.dumps(raw)
|
cooked = json.dumps(raw)
|
||||||
hosts = driver.filter_hosts(self.zone_manager, cooked)
|
hosts = driver.filter_hosts(self.zone_manager, cooked)
|
||||||
@@ -160,7 +160,7 @@ class HostFilterTestCase(test.TestCase):
|
|||||||
for index, host in zip([1, 2, 4, 5, 6, 7, 8, 9, 10], just_hosts):
|
for index, host in zip([1, 2, 4, 5, 6, 7, 8, 9, 10], just_hosts):
|
||||||
self.assertEquals('host%02d' % index, host)
|
self.assertEquals('host%02d' % index, host)
|
||||||
|
|
||||||
raw = ['in', '$compute.host_memory.free', 20, 40, 60, 80, 100]
|
raw = ['in', '$compute.host_memory_free', 20, 40, 60, 80, 100]
|
||||||
cooked = json.dumps(raw)
|
cooked = json.dumps(raw)
|
||||||
hosts = driver.filter_hosts(self.zone_manager, cooked)
|
hosts = driver.filter_hosts(self.zone_manager, cooked)
|
||||||
|
|
||||||
|
@@ -17,6 +17,7 @@
|
|||||||
"""Test suite for XenAPI."""
|
"""Test suite for XenAPI."""
|
||||||
|
|
||||||
import functools
|
import functools
|
||||||
|
import json
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import stubout
|
import stubout
|
||||||
@@ -665,3 +666,52 @@ class XenAPIDetermineDiskImageTestCase(test.TestCase):
|
|||||||
self.fake_instance.image_id = glance_stubs.FakeGlance.IMAGE_VHD
|
self.fake_instance.image_id = glance_stubs.FakeGlance.IMAGE_VHD
|
||||||
self.fake_instance.kernel_id = None
|
self.fake_instance.kernel_id = None
|
||||||
self.assert_disk_type(vm_utils.ImageType.DISK_VHD)
|
self.assert_disk_type(vm_utils.ImageType.DISK_VHD)
|
||||||
|
|
||||||
|
|
||||||
|
class FakeXenApi(object):
|
||||||
|
"""Fake XenApi for testing HostState."""
|
||||||
|
|
||||||
|
class FakeSR(object):
|
||||||
|
def get_record(self, ref):
|
||||||
|
return {'virtual_allocation': 10000,
|
||||||
|
'physical_utilisation': 20000}
|
||||||
|
|
||||||
|
SR = FakeSR()
|
||||||
|
|
||||||
|
|
||||||
|
class FakeSession(object):
|
||||||
|
"""Fake Session class for HostState testing."""
|
||||||
|
|
||||||
|
def async_call_plugin(self, *args):
|
||||||
|
return None
|
||||||
|
|
||||||
|
def wait_for_task(self, *args):
|
||||||
|
vm = {'total': 10,
|
||||||
|
'overhead': 20,
|
||||||
|
'free': 30,
|
||||||
|
'free-computed': 40}
|
||||||
|
return json.dumps({'host_memory': vm})
|
||||||
|
|
||||||
|
def get_xenapi(self):
|
||||||
|
return FakeXenApi()
|
||||||
|
|
||||||
|
|
||||||
|
class HostStateTestCase(test.TestCase):
|
||||||
|
"""Tests HostState, which holds metrics from XenServer that get
|
||||||
|
reported back to the Schedulers."""
|
||||||
|
|
||||||
|
def _fake_safe_find_sr(self, session):
|
||||||
|
"""None SR ref since we're ignoring it in FakeSR."""
|
||||||
|
return None
|
||||||
|
|
||||||
|
def test_host_state(self):
|
||||||
|
self.stubs = stubout.StubOutForTesting()
|
||||||
|
self.stubs.Set(vm_utils, 'safe_find_sr', self._fake_safe_find_sr)
|
||||||
|
host_state = xenapi_conn.HostState(FakeSession())
|
||||||
|
stats = host_state._stats
|
||||||
|
self.assertEquals(stats['disk_total'], 10000)
|
||||||
|
self.assertEquals(stats['disk_used'], 20000)
|
||||||
|
self.assertEquals(stats['host_memory_total'], 10)
|
||||||
|
self.assertEquals(stats['host_memory_overhead'], 20)
|
||||||
|
self.assertEquals(stats['host_memory_free'], 30)
|
||||||
|
self.assertEquals(stats['host_memory_free_computed'], 40)
|
||||||
|
Reference in New Issue
Block a user