summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/api/openstack/compute/contrib/extended_availability_zone.py22
-rw-r--r--nova/availability_zones.py21
-rw-r--r--nova/tests/test_availability_zones.py21
3 files changed, 44 insertions, 20 deletions
diff --git a/nova/api/openstack/compute/contrib/extended_availability_zone.py b/nova/api/openstack/compute/contrib/extended_availability_zone.py
index 9eec055b1..00765e209 100644
--- a/nova/api/openstack/compute/contrib/extended_availability_zone.py
+++ b/nova/api/openstack/compute/contrib/extended_availability_zone.py
@@ -21,34 +21,16 @@ from nova.api.openstack import extensions
from nova.api.openstack import wsgi
from nova.api.openstack import xmlutil
from nova import availability_zones
-from nova.openstack.common import memorycache
-# NOTE(vish): azs don't change that often, so cache them for an hour to
-# avoid hitting the db multiple times on every request.
-AZ_CACHE_SECONDS = 60 * 60
authorize = extensions.soft_extension_authorizer('compute',
'extended_availability_zone')
class ExtendedAZController(wsgi.Controller):
- def __init__(self):
- self.mc = memorycache.get_client()
-
- def _get_host_az(self, context, instance):
- host = str(instance.get('host'))
- if not host:
- return None
- cache_key = "azcache-%s" % host
- az = self.mc.get(cache_key)
- if not az:
- elevated = context.elevated()
- az = availability_zones.get_host_availability_zone(elevated, host)
- self.mc.set(cache_key, az, AZ_CACHE_SECONDS)
- return az
-
def _extend_server(self, context, server, instance):
key = "%s:availability_zone" % Extended_availability_zone.alias
- server[key] = self._get_host_az(context, instance)
+ server[key] = availability_zones.get_instance_availability_zone(
+ context, instance)
@wsgi.extends
def show(self, req, resp_obj, id):
diff --git a/nova/availability_zones.py b/nova/availability_zones.py
index 98e7f6e44..6d111c120 100644
--- a/nova/availability_zones.py
+++ b/nova/availability_zones.py
@@ -18,6 +18,12 @@
from oslo.config import cfg
from nova import db
+from nova.openstack.common import memorycache
+
+# NOTE(vish): azs don't change that often, so cache them for an hour to
+# avoid hitting the db multiple times on every request.
+AZ_CACHE_SECONDS = 60 * 60
+MC = memorycache.get_client()
availability_zone_opts = [
cfg.StrOpt('internal_service_availability_zone',
@@ -81,3 +87,18 @@ def get_availability_zones(context):
if zone not in not_available_zones:
not_available_zones.append(zone)
return (available_zones, not_available_zones)
+
+
+def get_instance_availability_zone(context, instance):
+ """Return availability zone of specified instance."""
+ host = str(instance.get('host'))
+ if not host:
+ return None
+
+ cache_key = "azcache-%s" % host
+ az = MC.get(cache_key)
+ if not az:
+ elevated = context.elevated()
+ az = get_host_availability_zone(elevated, host)
+ MC.set(cache_key, az, AZ_CACHE_SECONDS)
+ return az
diff --git a/nova/tests/test_availability_zones.py b/nova/tests/test_availability_zones.py
index 4bc6db58b..eefa1daf8 100644
--- a/nova/tests/test_availability_zones.py
+++ b/nova/tests/test_availability_zones.py
@@ -25,6 +25,7 @@ from nova import availability_zones as az
from nova import context
from nova import db
from nova import test
+from nova.tests.api.openstack import fakes
CONF = cfg.CONF
CONF.import_opt('internal_service_availability_zone',
@@ -155,3 +156,23 @@ class AvailabilityZoneTestCases(test.TestCase):
self.assertEquals(zones, ['nova-test', 'nova-test2'])
self.assertEquals(not_zones, ['nova-test3', 'nova'])
+
+ def test_get_instance_availability_zone_default_value(self):
+ """Test get right availability zone by given an instance."""
+ fake_inst_id = 162
+ fake_inst = fakes.stub_instance(fake_inst_id, host=self.host)
+
+ self.assertEqual(self.default_az,
+ az.get_instance_availability_zone(self.context, fake_inst))
+
+ def test_get_instance_availability_zone_from_aggregate(self):
+ """Test get availability zone from aggregate by given an instance."""
+ host = 'host170'
+ service = self._create_service_with_topic('compute', host)
+ self._add_to_aggregate(service, self.agg)
+
+ fake_inst_id = 174
+ fake_inst = fakes.stub_instance(fake_inst_id, host=host)
+
+ self.assertEqual(self.availability_zone,
+ az.get_instance_availability_zone(self.context, fake_inst))