summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSandy Walsh <sandy.walsh@rackspace.com>2011-02-24 15:23:15 -0800
committerSandy Walsh <sandy.walsh@rackspace.com>2011-02-24 15:23:15 -0800
commit47bbfaab52642f3ff79bcdefb8d705fb02b549f9 (patch)
tree19084b28052ab37a6d7b9415e4eaf24689ad3f97
parentc8df2602fd8f4f2cb7716e6283f3779c6895a479 (diff)
downloadnova-47bbfaab52642f3ff79bcdefb8d705fb02b549f9.tar.gz
nova-47bbfaab52642f3ff79bcdefb8d705fb02b549f9.tar.xz
nova-47bbfaab52642f3ff79bcdefb8d705fb02b549f9.zip
new tests
-rw-r--r--nova/api/openstack/zones.py4
-rw-r--r--nova/scheduler/api.py37
-rw-r--r--nova/scheduler/zone_manager.py3
-rw-r--r--nova/tests/api/openstack/test_zones.py30
-rw-r--r--nova/tests/test_zones.py6
5 files changed, 56 insertions, 24 deletions
diff --git a/nova/api/openstack/zones.py b/nova/api/openstack/zones.py
index c6c27dd4b..fecbd6fa3 100644
--- a/nova/api/openstack/zones.py
+++ b/nova/api/openstack/zones.py
@@ -53,7 +53,7 @@ class Controller(wsgi.Controller):
"""Return all zones in brief"""
# Ask the ZoneManager in the Scheduler for most recent data,
# or fall-back to the database ...
- items = api.API().get_zone_list(req.environ['nova.context'])
+ items = api.API.get_zone_list(req.environ['nova.context'])
if not items:
items = db.zone_get_all(req.environ['nova.context'])
@@ -68,7 +68,7 @@ class Controller(wsgi.Controller):
def info(self, req):
"""Return name and capabilities for this zone."""
- items = api.API().get_zone_capabilities(req.environ['nova.context'])
+ items = api.API.get_zone_capabilities(req.environ['nova.context'])
zone = dict(name=FLAGS.zone_name)
caps = FLAGS.zone_capabilities.split(';')
diff --git a/nova/scheduler/api.py b/nova/scheduler/api.py
index ac38350ed..fcff2f146 100644
--- a/nova/scheduler/api.py
+++ b/nova/scheduler/api.py
@@ -25,34 +25,37 @@ FLAGS = flags.FLAGS
LOG = logging.getLogger('nova.scheduler.api')
-class API:
- """API for interacting with the scheduler."""
+def _call_scheduler(method, context, params=None):
+ """Generic handler for RPC calls to the scheduler.
- def _call_scheduler(self, method, context, params=None):
- """Generic handler for RPC calls to the scheduler.
+ :param params: Optional dictionary of arguments to be passed to the
+ scheduler worker
- :param params: Optional dictionary of arguments to be passed to the
- scheduler worker
+ :retval: Result returned by scheduler worker
+ """
+ if not params:
+ params = {}
+ queue = FLAGS.scheduler_topic
+ kwargs = {'method': method, 'args': params}
+ return rpc.call(context, queue, kwargs)
- :retval: Result returned by scheduler worker
- """
- if not params:
- params = {}
- queue = FLAGS.scheduler_topic
- kwargs = {'method': method, 'args': params}
- return rpc.call(context, queue, kwargs)
- def get_zone_list(self, context):
+class API:
+ """API for interacting with the scheduler."""
+
+ @classmethod
+ def get_zone_list(cls, context):
"""Return a list of zones assoicated with this zone."""
- items = self._call_scheduler('get_zone_list', context)
+ items = _call_scheduler('get_zone_list', context)
for item in items:
item['api_url'] = item['api_url'].replace('\\/', '/')
return items
- def get_zone_capabilities(self, context, service=None):
+ @classmethod
+ def get_zone_capabilities(cls, context, service=None):
"""Returns a dict of key, value capabilities for this zone,
or for a particular class of services running in this zone."""
- return self._call_scheduler('get_zone_capabilities', context=context,
+ return _call_scheduler('get_zone_capabilities', context=context,
params=dict(service=service))
@classmethod
diff --git a/nova/scheduler/zone_manager.py b/nova/scheduler/zone_manager.py
index 09c9811f3..c1a50dbc3 100644
--- a/nova/scheduler/zone_manager.py
+++ b/nova/scheduler/zone_manager.py
@@ -118,8 +118,7 @@ class ZoneManager(object):
<cap>_min and <cap>_max values."""
service_dict = self.service_states
if service:
- service_dict = dict(service_name=service,
- hosts=self.service_states.get(service, {}))
+ service_dict = {service: self.service_states.get(service, {})}
# TODO(sandy) - be smarter about fabricating this structure.
# But it's likely to change once we understand what the Best-Match
diff --git a/nova/tests/api/openstack/test_zones.py b/nova/tests/api/openstack/test_zones.py
index 82b892b9e..33a66df0b 100644
--- a/nova/tests/api/openstack/test_zones.py
+++ b/nova/tests/api/openstack/test_zones.py
@@ -75,6 +75,10 @@ def zone_get_all_db(context):
]
+def zone_caps(method, context, params):
+ return dict()
+
+
class ZonesTest(test.TestCase):
def setUp(self):
super(ZonesTest, self).setUp()
@@ -93,13 +97,18 @@ class ZonesTest(test.TestCase):
self.stubs.Set(nova.db, 'zone_create', zone_create)
self.stubs.Set(nova.db, 'zone_delete', zone_delete)
+ self.old_zone_name = FLAGS.zone_name
+ self.old_zone_caps = FLAGS.zone_capabilities
+
def tearDown(self):
self.stubs.UnsetAll()
FLAGS.allow_admin_api = self.allow_admin
+ FLAGS.zone_name = self.old_zone_name
+ FLAGS.zone_capabilities = self.old_zone_caps
super(ZonesTest, self).tearDown()
def test_get_zone_list_scheduler(self):
- self.stubs.Set(api.API, '_call_scheduler', zone_get_all_scheduler)
+ self.stubs.Set(api, '_call_scheduler', zone_get_all_scheduler)
req = webob.Request.blank('/v1.0/zones')
res = req.get_response(fakes.wsgi_app())
res_dict = json.loads(res.body)
@@ -108,8 +117,7 @@ class ZonesTest(test.TestCase):
self.assertEqual(len(res_dict['zones']), 2)
def test_get_zone_list_db(self):
- self.stubs.Set(api.API, '_call_scheduler',
- zone_get_all_scheduler_empty)
+ self.stubs.Set(api, '_call_scheduler', zone_get_all_scheduler_empty)
self.stubs.Set(nova.db, 'zone_get_all', zone_get_all_db)
req = webob.Request.blank('/v1.0/zones')
res = req.get_response(fakes.wsgi_app())
@@ -162,3 +170,19 @@ class ZonesTest(test.TestCase):
self.assertEqual(res_dict['zone']['id'], 1)
self.assertEqual(res_dict['zone']['api_url'], 'http://example.com')
self.assertFalse('username' in res_dict['zone'])
+
+ def test_zone_info(self):
+ FLAGS.zone_name = 'darksecret'
+ FLAGS.zone_capabilities = 'cap1:a,b;cap2:c,d'
+ self.stubs.Set(api, '_call_scheduler', zone_caps)
+
+ body = dict(zone=dict(username='zeb', password='sneaky'))
+ req = webob.Request.blank('/v1.0/zones/info')
+
+ res = req.get_response(fakes.wsgi_app())
+ res_dict = json.loads(res.body)
+ self.assertEqual(res.status_int, 200)
+ self.assertEqual(res_dict['zone']['name'], 'darksecret')
+ self.assertEqual(res_dict['zone']['cap1'], 'a,b')
+ self.assertEqual(res_dict['zone']['cap2'], 'c,d')
+
diff --git a/nova/tests/test_zones.py b/nova/tests/test_zones.py
index 3ca71d5f1..79d766f28 100644
--- a/nova/tests/test_zones.py
+++ b/nova/tests/test_zones.py
@@ -104,6 +104,12 @@ class ZoneManagerTestCase(test.TestCase):
svc1_c=(5, 5), svc10_a=(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):
zm = zone_manager.ZoneManager()
zone_state = zone_manager.ZoneState()