Skip to content

Commit

Permalink
Do not create right service RI for nat instances
Browse files Browse the repository at this point in the history
If a service instance is in-network-nat mode, the traffic on the right side
is always routed in the primary RI. The service RI is not used for anything.
However, since all routes from primary RIs will still be copied into it.
With this commit, we won't create the right RI for such instances.

(cherry picked from commit 0db0a71)

Do not set VRF assign rules for right interfaces of nat instances

We are planning not to link service RI with the primary RI of the
right networks of in-network-nat instances. We should also not
set VRF assign rules.

Partial-Bug: 1554175
Closes-Bug: 1562200
(cherry picked from commit 0354c2b)

Change-Id: I3c043fcf8a9b585acac8ea8bcb449ea5c91879d6
  • Loading branch information
Sachin Bansal committed Apr 8, 2016
1 parent 9ee7875 commit 0414ff4
Showing 1 changed file with 51 additions and 36 deletions.
87 changes: 51 additions & 36 deletions src/config/schema-transformer/config_db.py
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,8 @@ def _update_primary_ri_to_service_ri_connection(self, sc, si_name,
primary_ri = self.get_primary_routing_instance()
service_ri_name = self.get_service_name(sc.name, si_name)
service_ri = RoutingInstanceST.get(service_ri_name)
if service_ri is None:
return
if (multi_policy_enabled and
service_ri_name in primary_ri.connections):
primary_ri.delete_connection(service_ri)
Expand Down Expand Up @@ -391,8 +393,8 @@ def delete_inactive_service_chains(self, old_scs, new_scs=None):
# VNs that are referring to this SC.
service_chain_list = old_scs[remote_vn_name]
for service_chain in service_chain_list or []:
if new_scs and\
service_chain in (new_scs.get(remote_vn_name) or []):
if new_scs and service_chain in (new_scs.get(remote_vn_name)
or []):
continue
if service_chain in (remote_service_chain_list or []):
service_chain.destroy()
Expand Down Expand Up @@ -2492,11 +2494,21 @@ def _create(self, si_info):
service_ri1.obj.add_route_target(rt_obj.obj,
InstanceTargetType('import'))
self._vnc_lib.routing_instance_update(service_ri1.obj)
ri_obj = RoutingInstanceST.create(service_name2, vn2_obj, has_pnf)
service_ri2 = RoutingInstanceST.locate(service_name2, ri_obj)
if service_ri2 is None:
self.log_error("service_ri2 is None")
return

mode = si_info[service]['mode']
nat_service = (mode == "in-network-nat")
transparent = (mode not in ["in-network", "in-network-nat"])
self._logger.info("service chain %s: creating %s chain",
self.name, mode)

if not nat_service:
ri_obj = RoutingInstanceST.create(service_name2, vn2_obj, has_pnf)
service_ri2 = RoutingInstanceST.locate(service_name2, ri_obj)
if service_ri2 is None:
self.log_error("service_ri2 is None")
return
else:
service_ri2 = None

if first_node:
first_node = False
Expand All @@ -2505,12 +2517,6 @@ def _create(self, si_info):
rt_list.add(vn1_obj.get_route_target())
service_ri1.update_route_target_list(rt_add_export=rt_list)

mode = si_info[service]['mode']
nat_service = (mode == "in-network-nat")
transparent = (mode not in ["in-network", "in-network-nat"])
self._logger.info("service chain %s: creating %s chain",
self.name, mode)

if transparent:
v4_address, v6_address = vn1_obj.allocate_service_chain_ip(
service_name1)
Expand All @@ -2519,7 +2525,7 @@ def _create(self, si_info):
return
service_ri1.add_service_info(vn2_obj, service, v4_address,
v6_address)
if self.direction == "<>":
if service_ri2 and self.direction == "<>":
service_ri2.add_service_info(vn1_obj, service, v4_address,
v6_address)

Expand All @@ -2535,21 +2541,24 @@ def _create(self, si_info):
if not result:
return
self._vnc_lib.routing_instance_update(service_ri1.obj)
self._vnc_lib.routing_instance_update(service_ri2.obj)

rt_list = set(vn2_obj.rt_list)
if vn2_obj.allow_transit:
rt_list.add(vn2_obj.get_route_target())
service_ri2.update_route_target_list(rt_add_export=rt_list)

if not multi_policy_enabled:
service_ri2.add_connection(vn2_obj.get_primary_routing_instance())
else:
# add primary ri's target to service ri
rt_obj = RouteTargetST.get(vn2_obj.get_route_target())
service_ri2.obj.add_route_target(rt_obj.obj,
InstanceTargetType('import'))
self._vnc_lib.routing_instance_update(service_ri2.obj)
if service_ri2:
self._vnc_lib.routing_instance_update(service_ri2.obj)

if service_ri2:
rt_list = set(vn2_obj.rt_list)
if vn2_obj.allow_transit:
rt_list.add(vn2_obj.get_route_target())
service_ri2.update_route_target_list(rt_add_export=rt_list)

if not multi_policy_enabled:
service_ri2.add_connection(
vn2_obj.get_primary_routing_instance())
else:
# add primary ri's target to service ri
rt_obj = RouteTargetST.get(vn2_obj.get_route_target())
service_ri2.obj.add_route_target(rt_obj.obj,
InstanceTargetType('import'))
self._vnc_lib.routing_instance_update(service_ri2.obj)

self.created = True
self.partially_created = False
Expand Down Expand Up @@ -3238,8 +3247,10 @@ def recreate_vrf_assign_table(self):
if vn is None:
return
vm_pt = self.get_virtual_machine_or_port_tuple()
if not vm_pt or vm_pt.get_service_mode() not in ['in-network',
'in-network-nat']:
if not vm_pt:
return
smode = vm_pt.get_service_mode()
if smode not in ['in-network', 'in-network-nat']:
return

vrf_table = VrfAssignTableType()
Expand Down Expand Up @@ -3270,7 +3281,12 @@ def recreate_vrf_assign_table(self):

policy_rule_count = 0
si_name = vm_pt.service_instance
for service_chain_list in vn.service_chains.values():
if smode == 'in-network-nat' and self.service_interface_type == 'right':
vn_service_chains = []
else:
vn_service_chains = vn.service_chains.values()

for service_chain_list in vn_service_chains:
for service_chain in service_chain_list:
if not service_chain.created:
continue
Expand All @@ -3283,10 +3299,9 @@ def recreate_vrf_assign_table(self):
dst_port=dp,
protocol=service_chain.protocol)

vrf_rule = VrfAssignRuleType(
match_condition=mc,
routing_instance=ri_name,
ignore_acl=True)
vrf_rule = VrfAssignRuleType(match_condition=mc,
routing_instance=ri_name,
ignore_acl=True)
vrf_table.add_vrf_assign_rule(vrf_rule)
policy_rule_count += 1
# end for service_chain
Expand Down

0 comments on commit 0414ff4

Please sign in to comment.