neutron/neutron/db/l3_attrs_db.py
Boden R 54444407f4 use l3 api def from neutron-lib
Commit I81748aa0e48b1275df3e1ea41b1d36a117d0097d added the l3 extension
API definition to neutron-lib and commit
I2324a3a02789c798248cab41c278a2d9981d24be rehomed the l3 exceptions,
while Ifd79eb1a92853e49bd4ef028e7a7bd89811c6957 shims the l3
exceptions.

This patch consumes the l3 api def by:
- Removing the code from neutron that's now in lib.
- Using lib's version of the code where applicable.
- Tidying up the related unit tests as now that the l3 api def from lib
is used the necessary fixture is already setup in the parent chain when
setting up the unit test class.

NeutronLibImpact

Change-Id: If2e66e06b83e15ee2851ea2bc3b64ad366e675dd
2017-12-15 07:03:14 -07:00

67 lines
2.9 KiB
Python

# Copyright (c) 2014 OpenStack Foundation. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from neutron_lib.api.definitions import l3 as l3_apidef
from neutron_lib.api.validators import availability_zone as az_validator
from oslo_config import cfg
from neutron._i18n import _
from neutron.db import _resource_extend as resource_extend
from neutron.db.models import l3_attrs
def get_attr_info():
"""Returns api visible attr names and their default values."""
return {'distributed': {'default': cfg.CONF.router_distributed},
'ha': {'default': cfg.CONF.l3_ha},
'ha_vr_id': {'default': 0},
'availability_zone_hints': {
'default': '[]',
'transform_to_db': az_validator.convert_az_list_to_string,
'transform_from_db': az_validator.convert_az_string_to_list}
}
@resource_extend.has_resource_extenders
class ExtraAttributesMixin(object):
"""Mixin class to enable router's extra attributes."""
@staticmethod
@resource_extend.extends([l3_apidef.ROUTERS])
def _extend_extra_router_dict(router_res, router_db):
extra_attrs = router_db['extra_attributes'] or {}
for name, info in get_attr_info().items():
from_db = info.get('transform_from_db', lambda x: x)
router_res[name] = from_db(extra_attrs.get(name, info['default']))
def _ensure_extra_attr_model(self, context, router_db):
if not router_db['extra_attributes']:
kwargs = {k: v['default'] for k, v in get_attr_info().items()}
kwargs['router_id'] = router_db['id']
new = l3_attrs.RouterExtraAttributes(**kwargs)
context.session.add(new)
router_db['extra_attributes'] = new
def set_extra_attr_value(self, context, router_db, key, value):
# set a single value explicitly
with context.session.begin(subtransactions=True):
if key in get_attr_info():
info = get_attr_info()[key]
to_db = info.get('transform_to_db', lambda x: x)
self._ensure_extra_attr_model(context, router_db)
router_db['extra_attributes'].update({key: to_db(value)})
return
raise RuntimeError(_("Tried to set a key '%s' that doesn't exist "
"in the extra attributes table.") % key)