Control resource extension process defining required extensions

Blueprint l3-ext-gw-modes

The resource extension process is slightly altered so that an
API extension can specify which extensions should be processed before
its attributes can be processed. This is needed to ensure the
l3-ext-gw-mode API extension sets up correctly validators and other
attributes for the external_gateway_info attribute

Change-Id: I7c05746e67b1324a73082dde8b5c862d631c083c
This commit is contained in:
Salvatore
2013-05-15 15:05:30 +02:00
committed by Salvatore Orlando
parent 79aebab3f4
commit 79b1a89aa1

View File

@@ -448,23 +448,47 @@ class ExtensionManager(object):
wants to extend this map.
"""
update_exts = []
for ext in self.extensions.itervalues():
if not hasattr(ext, 'get_extended_resources'):
continue
if hasattr(ext, 'update_attributes_map'):
update_exts.append(ext)
try:
extended_attrs = ext.get_extended_resources(version)
for resource, resource_attrs in extended_attrs.iteritems():
if attr_map.get(resource, None):
attr_map[resource].update(resource_attrs)
else:
attr_map[resource] = resource_attrs
if extended_attrs:
attributes.EXT_NSES[ext.get_alias()] = ext.get_namespace()
except AttributeError:
LOG.exception(_("Error fetching extended attributes for "
"extension '%s'"), ext.get_name())
processed_exts = set()
exts_to_process = self.extensions.copy()
# Iterate until there are unprocessed extensions or if no progress
# is made in a whole iteration
while exts_to_process:
processed_ext_count = len(processed_exts)
for ext_name, ext in exts_to_process.items():
if not hasattr(ext, 'get_extended_resources'):
del exts_to_process[ext_name]
continue
if hasattr(ext, 'update_attributes_map'):
update_exts.append(ext)
if hasattr(ext, 'get_required_extensions'):
# Process extension only if all required extensions
# have been processed already
required_exts_set = set(ext.get_required_extensions())
if required_exts_set - processed_exts:
continue
try:
extended_attrs = ext.get_extended_resources(version)
for resource, resource_attrs in extended_attrs.iteritems():
if attr_map.get(resource, None):
attr_map[resource].update(resource_attrs)
else:
attr_map[resource] = resource_attrs
if extended_attrs:
attributes.EXT_NSES[ext.get_alias()] = (
ext.get_namespace())
except AttributeError:
LOG.exception(_("Error fetching extended attributes for "
"extension '%s'"), ext.get_name())
processed_exts.add(ext_name)
del exts_to_process[ext_name]
if len(processed_exts) == processed_ext_count:
# Exit loop as no progress was made
break
if exts_to_process:
# NOTE(salv-orlando): Consider wheter this error should be fatal
LOG.error(_("It was impossible to process the following "
"extensions: %s because of missing requirements."),
','.join(exts_to_process.keys()))
"""Extending extensions' attributes map."""
for ext in update_exts: