1
# Copyright 2013 NEC Corporation. All rights reserved.
3
# Licensed under the Apache License, Version 2.0 (the "License"); you may
4
# not use this file except in compliance with the License. You may obtain
5
# a copy of the License at
7
# http://www.apache.org/licenses/LICENSE-2.0
9
# Unless required by applicable law or agreed to in writing, software
10
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12
# License for the specific language governing permissions and limitations
15
import sqlalchemy as sa
16
from sqlalchemy import orm
17
from sqlalchemy.orm import exc as sa_exc
19
from neutron.db import l3_db
20
from neutron.db import models_v2
21
from neutron.openstack.common import log as logging
23
LOG = logging.getLogger(__name__)
26
class RouterProvider(models_v2.model_base.BASEV2):
27
"""Represents a binding of router_id to provider."""
28
provider = sa.Column(sa.String(255))
29
router_id = sa.Column(sa.String(36),
30
sa.ForeignKey('routers.id', ondelete="CASCADE"),
33
router = orm.relationship(l3_db.Router, uselist=False,
34
backref=orm.backref('provider', uselist=False,
39
def _get_router_providers_query(query, provider=None, router_ids=None):
41
query = query.filter_by(provider=provider)
43
column = RouterProvider.router_id
44
query = query.filter(column.in_(router_ids))
48
def get_router_providers(session, provider=None, router_ids=None):
49
"""Retrieve a list of a pair of router ID and its provider."""
50
query = session.query(RouterProvider)
51
query = _get_router_providers_query(query, provider, router_ids)
52
return [{'provider': router.provider, 'router_id': router.router_id}
56
def get_routers_by_provider(session, provider, router_ids=None):
57
"""Retrieve a list of router IDs with the given provider."""
58
query = session.query(RouterProvider.router_id)
59
query = _get_router_providers_query(query, provider, router_ids)
60
return [router[0] for router in query]
63
def get_router_count_by_provider(session, provider, tenant_id=None):
64
"""Return the number of routers with the given provider."""
65
query = session.query(RouterProvider).filter_by(provider=provider)
67
query = (query.join('router').
68
filter(l3_db.Router.tenant_id == tenant_id))
72
def get_provider_by_router(session, router_id):
73
"""Retrieve a provider of the given router."""
75
binding = (session.query(RouterProvider).
76
filter_by(router_id=router_id).
78
except sa_exc.NoResultFound:
80
return binding.provider
83
def add_router_provider_binding(session, provider, router_id):
84
"""Add a router provider association."""
85
LOG.debug("Add provider binding "
86
"(router=%(router_id)s, provider=%(provider)s)",
87
{'router_id': router_id, 'provider': provider})
88
binding = RouterProvider(provider=provider, router_id=router_id)