Make xenapi capabilities['enabled'] use service enabled

filters.compute_filter is enabled by default along with libvirt, but the
capabilities['enabled'] section of it is only supported by XenAPI.
This used to work by adding a parameter to capabilities, but since
the capabilities RPC is being removed, use conductor.service_update to tell
the scheduler which host is disabled.

service_update is already the way to tell the scheduler about other
disabled hosts, so to keep backwards compatibility keep host_enabled but
use service_update underneath.

Part of bp no-compute-fanout-to-scheduler

Change-Id: Ica1919cfe9a2402b2107c557c10d47e01a6c430b
This commit is contained in:
Joe Gordon 2013-08-06 18:49:55 -07:00
parent 431de91573
commit 241829b3ef
4 changed files with 28 additions and 17 deletions

View File

@ -36,7 +36,6 @@ class ComputeFilter(filters.BaseHostFilter):
def host_passes(self, host_state, filter_properties): def host_passes(self, host_state, filter_properties):
"""Returns True for only active compute nodes.""" """Returns True for only active compute nodes."""
capabilities = host_state.capabilities
service = host_state.service service = host_state.service
alive = self.servicegroup_api.service_is_up(service) alive = self.servicegroup_api.service_is_up(service)
@ -44,8 +43,4 @@ class ComputeFilter(filters.BaseHostFilter):
LOG.debug(_("%(host_state)s is disabled or has not been " LOG.debug(_("%(host_state)s is disabled or has not been "
"heard from in a while"), {'host_state': host_state}) "heard from in a while"), {'host_state': host_state})
return False return False
if not capabilities.get("enabled", True):
LOG.debug(_("%(host_state)s is disabled via capabilities"),
{'host_state': host_state})
return False
return True return True

View File

@ -671,17 +671,6 @@ class HostFiltersTestCase(test.NoDBTestCase):
'service': service}) 'service': service})
self.assertFalse(filt_cls.host_passes(host, filter_properties)) self.assertFalse(filt_cls.host_passes(host, filter_properties))
def test_compute_filter_fails_on_capability_disabled(self):
self._stub_service_is_up(True)
filt_cls = self.class_map['ComputeFilter']()
filter_properties = {'instance_type': {'memory_mb': 1024}}
capabilities = {'enabled': False}
service = {'disabled': False}
host = fakes.FakeHostState('host1', 'node1',
{'free_ram_mb': 1024, 'capabilities': capabilities,
'service': service})
self.assertFalse(filt_cls.host_passes(host, filter_properties))
def test_image_properties_filter_passes_same_inst_props(self): def test_image_properties_filter_passes_same_inst_props(self):
self._stub_service_is_up(True) self._stub_service_is_up(True)
filt_cls = self.class_map['ImagePropertiesFilter']() filt_cls = self.class_map['ImagePropertiesFilter']()

View File

@ -1959,6 +1959,8 @@ class XenAPIHostTestCase(stubs.XenAPITestBase):
self.flags(xenapi_connection_url='test_url', self.flags(xenapi_connection_url='test_url',
xenapi_connection_password='test_pass') xenapi_connection_password='test_pass')
stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests) stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests)
self.context = context.get_admin_context()
self.flags(use_local=True, group='conductor')
self.conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False) self.conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
def test_host_state(self): def test_host_state(self):
@ -2004,10 +2006,18 @@ class XenAPIHostTestCase(stubs.XenAPITestBase):
False, 'off_maintenance') False, 'off_maintenance')
def test_set_enable_host_enable(self): def test_set_enable_host_enable(self):
values = _create_service_entries(self.context, values={'nova':
['host']})
self._test_host_action(self.conn.set_host_enabled, True, 'enabled') self._test_host_action(self.conn.set_host_enabled, True, 'enabled')
service = db.service_get_by_args(self.context, 'host', 'nova-compute')
self.assertEquals(service.disabled, False)
def test_set_enable_host_disable(self): def test_set_enable_host_disable(self):
values = _create_service_entries(self.context, values={'nova':
['host']})
self._test_host_action(self.conn.set_host_enabled, False, 'disabled') self._test_host_action(self.conn.set_host_enabled, False, 'disabled')
service = db.service_get_by_args(self.context, 'host', 'nova-compute')
self.assertEquals(service.disabled, True)
def test_get_host_uptime(self): def test_get_host_uptime(self):
result = self.conn.get_host_uptime('host') result = self.conn.get_host_uptime('host')

View File

@ -21,6 +21,7 @@ Management class for host-related functions (start, reboot, etc).
from nova.compute import task_states from nova.compute import task_states
from nova.compute import vm_states from nova.compute import vm_states
from nova import conductor
from nova import context from nova import context
from nova import exception from nova import exception
from nova.objects import instance as instance_obj from nova.objects import instance as instance_obj
@ -40,6 +41,7 @@ class Host(object):
def __init__(self, session, virtapi): def __init__(self, session, virtapi):
self._session = session self._session = session
self._virtapi = virtapi self._virtapi = virtapi
self._conductor_api = conductor.API()
def host_power_action(self, _host, action): def host_power_action(self, _host, action):
"""Reboots or shuts down the host.""" """Reboots or shuts down the host."""
@ -112,8 +114,23 @@ class Host(object):
raise exception.NoValidHost(reason='Unable to find suitable ' raise exception.NoValidHost(reason='Unable to find suitable '
'host for VMs evacuation') 'host for VMs evacuation')
def set_host_enabled(self, _host, enabled): def set_host_enabled(self, host, enabled):
"""Sets the specified host's ability to accept new instances.""" """Sets the specified host's ability to accept new instances."""
# Since capabilities are gone, use service table to disable a node
# in scheduler
status = {'disabled': not enabled,
'disabled_reason': 'set by xenapi host_state'
}
cntxt = context.get_admin_context()
service = self._conductor_api.service_get_by_args(
cntxt,
host,
'nova-compute')
self._conductor_api.service_update(
cntxt,
service,
status)
args = {"enabled": jsonutils.dumps(enabled)} args = {"enabled": jsonutils.dumps(enabled)}
response = call_xenhost(self._session, "set_host_enabled", args) response = call_xenhost(self._session, "set_host_enabled", args)
return response.get("status", response) return response.get("status", response)