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>
|
||||
Joshua McKenty <jmckenty@gmail.com>
|
||||
Justin Santa Barbara <justin@fathomdb.com>
|
||||
Justin Shepherd <jshepher@rackspace.com>
|
||||
Kei Masumoto <masumotok@nttdata.co.jp>
|
||||
Ken Pepple <ken.pepple@gmail.com>
|
||||
Kevin Bringard <kbringard@attinteractive.com>
|
||||
|
@@ -96,8 +96,8 @@ class FlavorFilter(HostFilter):
|
||||
selected_hosts = []
|
||||
for host, services in zone_manager.service_states.iteritems():
|
||||
capabilities = services.get('compute', {})
|
||||
host_ram_mb = capabilities['host_memory']['free']
|
||||
disk_bytes = capabilities['disk']['available']
|
||||
host_ram_mb = capabilities['host_memory_free']
|
||||
disk_bytes = capabilities['disk_available']
|
||||
if host_ram_mb >= instance_type['memory_mb'] and \
|
||||
disk_bytes >= instance_type['local_gb']:
|
||||
selected_hosts.append((host, capabilities))
|
||||
@@ -106,16 +106,16 @@ class FlavorFilter(HostFilter):
|
||||
#host entries (currently) are like:
|
||||
# {'host_name-description': 'Default install of XenServer',
|
||||
# 'host_hostname': 'xs-mini',
|
||||
# 'host_memory': {'total': 8244539392,
|
||||
# 'overhead': 184225792,
|
||||
# 'free': 3868327936,
|
||||
# 'free-computed': 3840843776},
|
||||
# 'host_memory_total': 8244539392,
|
||||
# 'host_memory_overhead': 184225792,
|
||||
# 'host_memory_free': 3868327936,
|
||||
# 'host_memory_free_computed': 3840843776},
|
||||
# 'host_other-config': {},
|
||||
# 'host_ip_address': '192.168.1.109',
|
||||
# 'host_cpu_info': {},
|
||||
# 'disk': {'available': 32954957824,
|
||||
# 'total': 50394562560,
|
||||
# 'used': 17439604736},
|
||||
# 'disk_available': 32954957824,
|
||||
# 'disk_total': 50394562560,
|
||||
# 'disk_used': 17439604736},
|
||||
# 'host_uuid': 'cedb9b39-9388-41df-8891-c5c9a0c0fe5f',
|
||||
# 'host_name-label': 'xs-mini'}
|
||||
|
||||
@@ -221,8 +221,8 @@ class JsonFilter(HostFilter):
|
||||
required_ram = instance_type['memory_mb']
|
||||
required_disk = instance_type['local_gb']
|
||||
query = ['and',
|
||||
['>=', '$compute.host_memory.free', required_ram],
|
||||
['>=', '$compute.disk.available', required_disk]
|
||||
['>=', '$compute.host_memory_free', required_ram],
|
||||
['>=', '$compute.disk_available', required_disk]
|
||||
]
|
||||
return (self._full_name(), json.dumps(query))
|
||||
|
||||
|
@@ -21,6 +21,7 @@ Tests For Compute
|
||||
|
||||
import datetime
|
||||
import mox
|
||||
import stubout
|
||||
|
||||
from nova import compute
|
||||
from nova import context
|
||||
@@ -52,6 +53,10 @@ class FakeTime(object):
|
||||
self.counter += t
|
||||
|
||||
|
||||
def nop_report_driver_status(self):
|
||||
pass
|
||||
|
||||
|
||||
class ComputeTestCase(test.TestCase):
|
||||
"""Test case for compute"""
|
||||
def setUp(self):
|
||||
@@ -649,6 +654,10 @@ class ComputeTestCase(test.TestCase):
|
||||
|
||||
def test_run_kill_vm(self):
|
||||
"""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()
|
||||
|
||||
self.compute.run_instance(self.context, instance_id)
|
||||
|
@@ -43,16 +43,16 @@ class HostFilterTestCase(test.TestCase):
|
||||
# which means ... don't go above 10 hosts.
|
||||
return {'host_name-description': 'XenServer %s' % multiplier,
|
||||
'host_hostname': 'xs-%s' % multiplier,
|
||||
'host_memory': {'total': 100,
|
||||
'overhead': 10,
|
||||
'free': 10 + multiplier * 10,
|
||||
'free-computed': 10 + multiplier * 10},
|
||||
'host_memory_total': 100,
|
||||
'host_memory_overhead': 10,
|
||||
'host_memory_free': 10 + multiplier * 10,
|
||||
'host_memory_free-computed': 10 + multiplier * 10,
|
||||
'host_other-config': {},
|
||||
'host_ip_address': '192.168.1.%d' % (100 + multiplier),
|
||||
'host_cpu_info': {},
|
||||
'disk': {'available': 100 + multiplier * 100,
|
||||
'total': 1000,
|
||||
'used': 0},
|
||||
'disk_available': 100 + multiplier * 100,
|
||||
'disk_total': 1000,
|
||||
'disk_used': 0,
|
||||
'host_uuid': 'xxx-%d' % multiplier,
|
||||
'host_name-label': 'xs-%s' % multiplier}
|
||||
|
||||
@@ -131,12 +131,12 @@ class HostFilterTestCase(test.TestCase):
|
||||
|
||||
raw = ['or',
|
||||
['and',
|
||||
['<', '$compute.host_memory.free', 30],
|
||||
['<', '$compute.disk.available', 300]
|
||||
['<', '$compute.host_memory_free', 30],
|
||||
['<', '$compute.disk_available', 300]
|
||||
],
|
||||
['and',
|
||||
['>', '$compute.host_memory.free', 70],
|
||||
['>', '$compute.disk.available', 700]
|
||||
['>', '$compute.host_memory_free', 70],
|
||||
['>', '$compute.disk_available', 700]
|
||||
]
|
||||
]
|
||||
cooked = json.dumps(raw)
|
||||
@@ -149,7 +149,7 @@ class HostFilterTestCase(test.TestCase):
|
||||
self.assertEquals('host%02d' % index, host)
|
||||
|
||||
raw = ['not',
|
||||
['=', '$compute.host_memory.free', 30],
|
||||
['=', '$compute.host_memory_free', 30],
|
||||
]
|
||||
cooked = json.dumps(raw)
|
||||
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):
|
||||
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)
|
||||
hosts = driver.filter_hosts(self.zone_manager, cooked)
|
||||
|
||||
|
@@ -17,6 +17,7 @@
|
||||
"""Test suite for XenAPI."""
|
||||
|
||||
import functools
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
import stubout
|
||||
@@ -665,3 +666,52 @@ class XenAPIDetermineDiskImageTestCase(test.TestCase):
|
||||
self.fake_instance.image_id = glance_stubs.FakeGlance.IMAGE_VHD
|
||||
self.fake_instance.kernel_id = None
|
||||
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