flipped service_state in ZoneManager and fixed tests

This commit is contained in:
Sandy Walsh
2011-05-05 07:35:44 -07:00
parent cef477c10a
commit 9d91d098fc
3 changed files with 18 additions and 28 deletions

View File

@@ -76,11 +76,9 @@ def zone_update(context, zone_id, data):
return db.zone_update(context, zone_id, data) return db.zone_update(context, zone_id, data)
def get_zone_capabilities(context, service=None): def get_zone_capabilities(context):
"""Returns a dict of key, value capabilities for this zone, """Returns a dict of key, value capabilities for this zone."""
or for a particular class of services running in this zone.""" return _call_scheduler('get_zone_capabilities', context=context)
return _call_scheduler('get_zone_capabilities', context=context,
params=dict(service=service))
def update_service_capabilities(context, service_name, host, capabilities): def update_service_capabilities(context, service_name, host, capabilities):

View File

@@ -106,28 +106,26 @@ class ZoneManager(object):
def __init__(self): def __init__(self):
self.last_zone_db_check = datetime.min self.last_zone_db_check = datetime.min
self.zone_states = {} # { <zone_id> : ZoneState } self.zone_states = {} # { <zone_id> : ZoneState }
self.service_states = {} # { <service> : { <host> : { cap k : v }}} self.service_states = {} # { <host> : { <service> : { cap k : v }}}
self.green_pool = greenpool.GreenPool() self.green_pool = greenpool.GreenPool()
def get_zone_list(self): def get_zone_list(self):
"""Return the list of zones we know about.""" """Return the list of zones we know about."""
return [zone.to_dict() for zone in self.zone_states.values()] return [zone.to_dict() for zone in self.zone_states.values()]
def get_zone_capabilities(self, context, service=None): def get_zone_capabilities(self, context):
"""Roll up all the individual host info to generic 'service' """Roll up all the individual host info to generic 'service'
capabilities. Each capability is aggregated into capabilities. Each capability is aggregated into
<cap>_min and <cap>_max values.""" <cap>_min and <cap>_max values."""
service_dict = self.service_states hosts_dict = self.service_states
if service:
service_dict = {service: self.service_states.get(service, {})}
# TODO(sandy) - be smarter about fabricating this structure. # TODO(sandy) - be smarter about fabricating this structure.
# But it's likely to change once we understand what the Best-Match # But it's likely to change once we understand what the Best-Match
# code will need better. # code will need better.
combined = {} # { <service>_<cap> : (min, max), ... } combined = {} # { <service>_<cap> : (min, max), ... }
for service_name, host_dict in service_dict.iteritems(): for host, host_dict in hosts_dict.iteritems():
for host, caps_dict in host_dict.iteritems(): for service_name, service_dict in host_dict.iteritems():
for cap, value in caps_dict.iteritems(): for cap, value in service_dict.iteritems():
key = "%s_%s" % (service_name, cap) key = "%s_%s" % (service_name, cap)
min_value, max_value = combined.get(key, (value, value)) min_value, max_value = combined.get(key, (value, value))
min_value = min(min_value, value) min_value = min(min_value, value)
@@ -171,6 +169,6 @@ class ZoneManager(object):
"""Update the per-service capabilities based on this notification.""" """Update the per-service capabilities based on this notification."""
logging.debug(_("Received %(service_name)s service update from " logging.debug(_("Received %(service_name)s service update from "
"%(host)s: %(capabilities)s") % locals()) "%(host)s: %(capabilities)s") % locals())
service_caps = self.service_states.get(service_name, {}) service_caps = self.service_states.get(host, {})
service_caps[host] = capabilities service_caps[service_name] = capabilities
self.service_states[service_name] = service_caps self.service_states[host] = service_caps

View File

@@ -78,38 +78,32 @@ class ZoneManagerTestCase(test.TestCase):
def test_service_capabilities(self): def test_service_capabilities(self):
zm = zone_manager.ZoneManager() zm = zone_manager.ZoneManager()
caps = zm.get_zone_capabilities(self, None) caps = zm.get_zone_capabilities(None)
self.assertEquals(caps, {}) self.assertEquals(caps, {})
zm.update_service_capabilities("svc1", "host1", dict(a=1, b=2)) zm.update_service_capabilities("svc1", "host1", dict(a=1, b=2))
caps = zm.get_zone_capabilities(self, None) caps = zm.get_zone_capabilities(None)
self.assertEquals(caps, dict(svc1_a=(1, 1), svc1_b=(2, 2))) self.assertEquals(caps, dict(svc1_a=(1, 1), svc1_b=(2, 2)))
zm.update_service_capabilities("svc1", "host1", dict(a=2, b=3)) zm.update_service_capabilities("svc1", "host1", dict(a=2, b=3))
caps = zm.get_zone_capabilities(self, None) caps = zm.get_zone_capabilities(None)
self.assertEquals(caps, dict(svc1_a=(2, 2), svc1_b=(3, 3))) self.assertEquals(caps, dict(svc1_a=(2, 2), svc1_b=(3, 3)))
zm.update_service_capabilities("svc1", "host2", dict(a=20, b=30)) zm.update_service_capabilities("svc1", "host2", dict(a=20, b=30))
caps = zm.get_zone_capabilities(self, None) caps = zm.get_zone_capabilities(None)
self.assertEquals(caps, dict(svc1_a=(2, 20), svc1_b=(3, 30))) self.assertEquals(caps, dict(svc1_a=(2, 20), svc1_b=(3, 30)))
zm.update_service_capabilities("svc10", "host1", dict(a=99, b=99)) zm.update_service_capabilities("svc10", "host1", dict(a=99, b=99))
caps = zm.get_zone_capabilities(self, None) caps = zm.get_zone_capabilities(None)
self.assertEquals(caps, dict(svc1_a=(2, 20), svc1_b=(3, 30), self.assertEquals(caps, dict(svc1_a=(2, 20), svc1_b=(3, 30),
svc10_a=(99, 99), svc10_b=(99, 99))) svc10_a=(99, 99), svc10_b=(99, 99)))
zm.update_service_capabilities("svc1", "host3", dict(c=5)) zm.update_service_capabilities("svc1", "host3", dict(c=5))
caps = zm.get_zone_capabilities(self, None) caps = zm.get_zone_capabilities(None)
self.assertEquals(caps, dict(svc1_a=(2, 20), svc1_b=(3, 30), self.assertEquals(caps, dict(svc1_a=(2, 20), svc1_b=(3, 30),
svc1_c=(5, 5), svc10_a=(99, 99), svc1_c=(5, 5), svc10_a=(99, 99),
svc10_b=(99, 99))) svc10_b=(99, 99)))
caps = zm.get_zone_capabilities(self, 'svc1')
self.assertEquals(caps, dict(svc1_a=(2, 20), svc1_b=(3, 30),
svc1_c=(5, 5)))
caps = zm.get_zone_capabilities(self, 'svc10')
self.assertEquals(caps, dict(svc10_a=(99, 99), svc10_b=(99, 99)))
def test_refresh_from_db_replace_existing(self): def test_refresh_from_db_replace_existing(self):
zm = zone_manager.ZoneManager() zm = zone_manager.ZoneManager()
zone_state = zone_manager.ZoneState() zone_state = zone_manager.ZoneState()