Skip to content

Commit

Permalink
Set external route target only on first service RI for left and last …
Browse files Browse the repository at this point in the history
…service RI for right network.

Change-Id: I89046353892b34d93bbd56d068eca919e9291a7e
Closes-Bug: 1436642
(cherry picked from commit 186dc05)
  • Loading branch information
Sachin Bansal committed Apr 3, 2015
1 parent 847cd79 commit e857b31
Showing 1 changed file with 37 additions and 24 deletions.
61 changes: 37 additions & 24 deletions src/config/schema-transformer/to_bgp.py
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,11 @@ def __init__(self, name):
for ri in self.obj.get_routing_instances() or []:
ri_name = ri['to'][-1]
if ri_name not in self.rinst:
if ri_name.startswith('service-'):
sc_id = ri_name[8:44]
self.locate_routing_instance(ri_name, sc_id)
continue

self.locate_routing_instance(ri_name)
for policy in NetworkPolicyST.values():
if policy.internal and name in policy.network_back_ref:
Expand Down Expand Up @@ -539,6 +544,19 @@ def extend_to_external_routers(self, extend):
router.delete_routing_instance(self.name)
# end extend_to_external_routers

def _ri_needs_external_rt(self, ri_name, sc_id):
if sc_id is None:
return False
sc = ServiceChain.get(sc_id)
if sc is None:
return False
if self.name == sc.left_vn:
return ri_name.endswith(sc.service_list[0].replace(':', '_'))
elif self.name == sc.right_vn:
return ri_name.endswith(sc.service_list[-1].replace(':', '_'))
return False
# end _ri_needs_external_rt

def locate_routing_instance_no_target(self, rinst_name):
""" locate a routing instance but do not allocate a route target """
if rinst_name in self.rinst:
Expand Down Expand Up @@ -583,7 +601,12 @@ def locate_routing_instance(self, rinst_name, service_chain=None):

rt_key = "target:%s:%d" % (self.get_autonomous_system(), rtgt_num)
rtgt_obj = RouteTargetST.locate(rt_key)
inst_tgt_data = InstanceTargetType()
if is_default:
inst_tgt_data = InstanceTargetType()
elif self._ri_needs_external_rt(rinst_name, service_chain):
inst_tgt_data = InstanceTargetType(import_export="export")
else:
inst_tgt_data = None

try:
try:
Expand All @@ -594,30 +617,21 @@ def locate_routing_instance(self, rinst_name, service_chain=None):
_vnc_lib.routing_instance_delete(id=rinst_obj.uuid)
rinst_obj = None
else:
rinst_obj.set_route_target(rtgt_obj, inst_tgt_data)
for rt in self.rt_list:
rtgt_obj = RouteTarget(rt)
if is_default:
inst_tgt_data = InstanceTargetType()
else:
inst_tgt_data = InstanceTargetType(
import_export="export")
rinst_obj.add_route_target(rtgt_obj, inst_tgt_data)

rinst_obj.set_route_target(rtgt_obj, InstanceTargetType())
if inst_tgt_data:
for rt in self.rt_list:
rtgt_obj = RouteTarget(rt)
rinst_obj.add_route_target(rtgt_obj, inst_tgt_data)
_vnc_lib.routing_instance_update(rinst_obj)
except NoIdError:
rinst_obj = None
if rinst_obj is None:
rinst_obj = RoutingInstance(rinst_name, self.obj)
rinst_obj.set_route_target(rtgt_obj, inst_tgt_data)
for rt in self.rt_list:
rtgt_obj = RouteTarget(rt)
if is_default:
inst_tgt_data = InstanceTargetType()
else:
inst_tgt_data = InstanceTargetType(
import_export="export")
rinst_obj.add_route_target(rtgt_obj, inst_tgt_data)
rinst_obj.set_route_target(rtgt_obj, InstanceTargetType())
if inst_tgt_data:
for rt in self.rt_list:
rtgt_obj = RouteTarget(rt)
rinst_obj.add_route_target(rtgt_obj, inst_tgt_data)
_vnc_lib.routing_instance_create(rinst_obj)
except HttpError as he:
_sandesh._logger.error(
Expand Down Expand Up @@ -686,10 +700,9 @@ def set_route_target_list(self, rt_list):
RouteTargetST.locate(rt)
ri.update_route_target_list(rt_add, rt_del)
for ri_obj in self.rinst.values():
if ri == ri_obj:
continue
ri_obj.update_route_target_list(rt_add, rt_del,
import_export='export')
if self._ri_needs_external_rt(ri_obj.name, ri_obj.service_chain):
ri_obj.update_route_target_list(rt_add, rt_del,
import_export='export')
for (prefix, nexthop) in self.route_table.items():
left_ri = self._get_routing_instance_from_route(nexthop)
if left_ri is not None:
Expand Down

0 comments on commit e857b31

Please sign in to comment.