43
36
ondelete="CASCADE"),
45
38
nexthop = sa.Column(sa.String(64), nullable=False, primary_key=True)
48
class RouterRule_db_mixin(l3_db.L3_NAT_db_mixin):
49
"""Mixin class to support route rule configuration on a router."""
50
def update_router(self, context, id, router):
52
with context.session.begin(subtransactions=True):
53
router_db = self._get_router(context, id)
54
if 'router_rules' in r:
55
self._update_router_rules(context,
58
updated = super(RouterRule_db_mixin, self).update_router(
60
updated['router_rules'] = self._get_router_rules_by_router_id(
65
def create_router(self, context, router):
67
with context.session.begin(subtransactions=True):
68
router_db = super(RouterRule_db_mixin, self).create_router(
70
if 'router_rules' in r:
71
self._update_router_rules(context,
75
LOG.debug('No rules in router')
76
router_db['router_rules'] = self._get_router_rules_by_router_id(
77
context, router_db['id'])
81
def _update_router_rules(self, context, router, rules):
82
if len(rules) > cfg.CONF.ROUTER.max_router_rules:
83
raise routerrule.RulesExhausted(
84
router_id=router['id'],
85
quota=cfg.CONF.ROUTER.max_router_rules)
86
del_context = context.session.query(RouterRule)
87
del_context.filter_by(router_id=router['id']).delete()
88
context.session.expunge_all()
89
LOG.debug('Updating router rules to %s', rules)
91
router_rule = RouterRule(
92
router_id=router['id'],
93
destination=rule['destination'],
94
source=rule['source'],
95
action=rule['action'])
96
router_rule.nexthops = [NextHop(nexthop=hop)
97
for hop in rule['nexthops']]
98
context.session.add(router_rule)
99
context.session.flush()
101
def _make_router_rule_list(self, router_rules):
103
for rule in router_rules:
104
hops = [hop['nexthop'] for hop in rule['nexthops']]
105
ruleslist.append({'id': rule['id'],
106
'destination': rule['destination'],
107
'source': rule['source'],
108
'action': rule['action'],
112
def _get_router_rules_by_router_id(self, context, id):
113
query = context.session.query(RouterRule)
114
router_rules = query.filter_by(router_id=id).all()
115
return self._make_router_rule_list(router_rules)
117
def get_router(self, context, id, fields=None):
118
with context.session.begin(subtransactions=True):
119
router = super(RouterRule_db_mixin, self).get_router(
121
router['router_rules'] = self._get_router_rules_by_router_id(
125
def get_routers(self, context, filters=None, fields=None,
126
sorts=None, limit=None, marker=None,
128
with context.session.begin(subtransactions=True):
129
routers = super(RouterRule_db_mixin, self).get_routers(
130
context, filters, fields, sorts=sorts, limit=limit,
131
marker=marker, page_reverse=page_reverse)
132
for router in routers:
133
router['router_rules'] = self._get_router_rules_by_router_id(
134
context, router['id'])
137
def get_sync_data(self, context, router_ids=None, active=None):
138
"""Query routers and their related floating_ips, interfaces."""
139
with context.session.begin(subtransactions=True):
140
routers = super(RouterRule_db_mixin,
141
self).get_sync_data(context, router_ids,
143
for router in routers:
144
router['router_rules'] = self._get_router_rules_by_router_id(
145
context, router['id'])