diff --git a/nova/api/openstack/compute/extensions.py b/nova/api/openstack/compute/extensions.py
index 1a01928bcd..01b728a308 100644
--- a/nova/api/openstack/compute/extensions.py
+++ b/nova/api/openstack/compute/extensions.py
@@ -28,11 +28,11 @@ FLAGS = flags.FLAGS
class ExtensionManager(base_extensions.ExtensionManager):
def __init__(self):
LOG.audit(_('Initializing extension manager.'))
-
self.cls_list = FLAGS.osapi_compute_extension
self.PluginManager = pluginmanager.PluginManager('nova',
'compute-extensions')
self.PluginManager.load_plugins()
self.cls_list.append(self.PluginManager.plugin_extension_factory)
self.extensions = {}
+ self.sorted_ext_list = []
self._load_extensions()
diff --git a/nova/api/openstack/extensions.py b/nova/api/openstack/extensions.py
index 27306514e1..716dccd752 100644
--- a/nova/api/openstack/extensions.py
+++ b/nova/api/openstack/extensions.py
@@ -179,10 +179,16 @@ class ExtensionManager(object):
example extension implementation.
"""
-
def is_loaded(self, alias):
return alias in self.extensions
+ def sorted_extensions(self):
+ if self.sorted_ext_list is None:
+ self.sorted_ext_list = sorted(self.extensions.iteritems())
+
+ for _alias, ext in self.sorted_ext_list:
+ yield ext
+
def register(self, ext):
# Do nothing if the extension doesn't check out
if not self._check_extension(ext):
@@ -195,6 +201,7 @@ class ExtensionManager(object):
raise exception.NovaException("Found duplicate extension: %s"
% alias)
self.extensions[alias] = ext
+ self.sorted_ext_list = None
def get_resources(self):
"""Returns a list of ResourceExtension objects."""
@@ -202,8 +209,7 @@ class ExtensionManager(object):
resources = []
resources.append(ResourceExtension('extensions',
ExtensionsResource(self)))
-
- for ext in self.extensions.values():
+ for ext in self.sorted_extensions():
try:
resources.extend(ext.get_resources())
except AttributeError:
@@ -215,7 +221,7 @@ class ExtensionManager(object):
def get_controller_extensions(self):
"""Returns a list of ControllerExtension objects."""
controller_exts = []
- for ext in self.extensions.values():
+ for ext in self.sorted_extensions():
try:
controller_exts.extend(ext.get_controller_extensions())
except AttributeError:
diff --git a/nova/api/openstack/volume/extensions.py b/nova/api/openstack/volume/extensions.py
index ac880d6e5f..b21b9d1454 100644
--- a/nova/api/openstack/volume/extensions.py
+++ b/nova/api/openstack/volume/extensions.py
@@ -27,8 +27,8 @@ FLAGS = flags.FLAGS
class ExtensionManager(base_extensions.ExtensionManager):
def __init__(self):
LOG.audit(_('Initializing extension manager.'))
-
self.cls_list = FLAGS.osapi_volume_extension
self.extensions = {}
self.plugins = []
+ self.sorted_ext_list = []
self._load_extensions()
diff --git a/nova/tests/integrated/api_samples/all_extensions/server-get-resp.xml b/nova/tests/integrated/api_samples/all_extensions/server-get-resp.xml
index 3441eedcd1..6f2d8587fc 100644
--- a/nova/tests/integrated/api_samples/all_extensions/server-get-resp.xml
+++ b/nova/tests/integrated/api_samples/all_extensions/server-get-resp.xml
@@ -1,5 +1,5 @@
-
+
@@ -14,9 +14,9 @@
-
-
+
+
-
+
\ No newline at end of file
diff --git a/nova/tests/integrated/api_samples/all_extensions/server-get-resp.xml.tpl b/nova/tests/integrated/api_samples/all_extensions/server-get-resp.xml.tpl
index 585492ffe0..8211a3e0a4 100644
--- a/nova/tests/integrated/api_samples/all_extensions/server-get-resp.xml.tpl
+++ b/nova/tests/integrated/api_samples/all_extensions/server-get-resp.xml.tpl
@@ -1,5 +1,5 @@
-
+
diff --git a/nova/tests/integrated/api_samples/all_extensions/server-post-resp.xml b/nova/tests/integrated/api_samples/all_extensions/server-post-resp.xml
index 3edac38e40..1754dc7005 100644
--- a/nova/tests/integrated/api_samples/all_extensions/server-post-resp.xml
+++ b/nova/tests/integrated/api_samples/all_extensions/server-post-resp.xml
@@ -1,8 +1,8 @@
-
+
-
-
+
+