Skip to content

Commit

Permalink
Merge "Route aggregate support in schema transformer"
Browse files Browse the repository at this point in the history
  • Loading branch information
Zuul authored and opencontrail-ci-admin committed Jan 11, 2016
2 parents a30ba0a + 9d7963d commit 205496a
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 4 deletions.
75 changes: 71 additions & 4 deletions src/config/schema-transformer/config_db.py
Expand Up @@ -1244,7 +1244,7 @@ def evaluate(self):
for ri_name in self.routing_instances:
ri = RoutingInstanceST.get(ri_name)
if ri:
ri.update_routing_policy()
ri.update_routing_policy_and_aggregates()
# end evaluate

def get_prefixes(self, ip_version):
Expand Down Expand Up @@ -1767,6 +1767,7 @@ def __init__(self, name, obj=None):
self.add_to_parent(self.obj)
self.route_target = None
self.routing_policys = {}
self.route_aggregates = set()
if self.obj.get_parent_fq_name() in [common.IP_FABRIC_VN_FQ_NAME,
common.LINK_LOCAL_VN_FQ_NAME]:
return
Expand Down Expand Up @@ -1816,7 +1817,7 @@ def _get_service_id_from_ri(name):
return ri_name[8:44]
# end _get_service_id_from_ri

def update_routing_policy(self):
def update_routing_policy_and_aggregates(self):
if not self.service_chain:
return
sc = ServiceChain.get(self.service_chain)
Expand All @@ -1830,10 +1831,14 @@ def update_routing_policy(self):
rp_dict = dict((rp, attr.get_left_sequence())
for rp, attr in si.routing_policys.items()
if attr.get_left_sequence())
ra_set = set(ra for ra, if_type in si.route_aggregates.items()
if if_type == 'left')
elif sc.right_vn == self.virtual_network:
rp_dict = dict((rp, attr.get_right_sequence())
for rp, attr in si.routing_policys.items()
if attr.get_right_sequence())
ra_set = set(ra for ra, if_type in si.route_aggregates.items()
if if_type == 'right')
else:
break
for rp_name in self.routing_policys:
Expand All @@ -1848,7 +1853,16 @@ def update_routing_policy(self):
if rp:
rp.add_routing_instance(self, seq)
self.routing_policys = rp_dict
# end update_routing_policy
for ra_name in self.route_aggregates - ra_set:
ra = RouteAggregateST.get(ra_name)
if ra:
ra.delete_routing_instance(self)
for ra_name in ra_set - self.route_aggregates:
ra = RouteAggregateST.get(ra_name)
if ra:
ra.add_routing_instance(self)
self.route_aggregates = ra_set
# end update_routing_policy_and_aggregates

def locate_route_target(self):
old_rtgt = self._cassandra.get_route_target(self.name)
Expand Down Expand Up @@ -2067,7 +2081,12 @@ def delete_obj(self):
rp = RoutingPolicyST.get(rp_name)
if rp:
rp.delete_routing_instance(self.name)
for ra_name in self.route_aggregates:
ra = RouteAggregateST.get(ra_name)
if ra:
ra.delete_routing_instance(self.name)
self.routing_policys = {}
self.route_aggregates = set()
bgpaas_server_name = self.obj.get_fq_name_str() + ':bgpaas-server'
bgpaas_server = BgpRouterST.get(bgpaas_server_name)
if bgpaas_server:
Expand Down Expand Up @@ -3379,11 +3398,14 @@ def __init__(self, name, obj=None):
self.left_vn_str = None
self.right_vn_str = None
self.routing_policys = {}
self.route_aggregates = {}
self.update(obj)
self.network_policys = NetworkPolicyST.get_by_service_instance(self.name)
self.route_tables = RouteTableST.get_by_service_instance(self.name)
for ref in self.obj.get_routing_policy_back_refs() or []:
self.routing_policys[':'.join(ref['to'])] = ref['attr']
for ref in self.obj.get_route_aggregate_back_refs() or []:
self.route_aggregate[':'.join(ref['to'])] = ref['attr'].interface_type
# end __init__

def update(self, obj=None):
Expand Down Expand Up @@ -3571,6 +3593,51 @@ def delete_routing_instance(self, ri):
'routing_instance', ri.obj.uuid,
None, 'DELETE')
self.routing_instances.discard(ri.name)

# end delete_routing_instance
# end RoutingPolicyST

class RouteAggregateST(DBBaseST):
_dict = {}
obj_type = 'route_aggregate'

def __init__(self, name, obj=None):
self.name = name
self.service_instances = {}
self.routing_instances = set()
self.update(obj)
# end __init__

def update(self, obj=None):
self.obj = obj or self.read_vnc_obj(fq_name=self.name)
new_refs = dict((':'.join(ref['to']), ref['attr'].interface_type)
for ref in self.obj.get_service_instance_refs() or [])
for ref in set(self.service_instances.keys()) - set(new_refs.keys()):
si = ServiceInstanceST.get(ref)
if si and self.name in si.route_aggregates:
del si.route_aggregates[self.name]
for ref in set(new_refs.keys()):
si = ServiceInstanceST.get(ref)
if si:
si.route_aggregates[self.name] = new_refs[ref]
self.service_instances = new_refs
self.update_multiple_refs('routing_instance', self.obj)
# end update

def add_routing_instance(self, ri):
if ri.name in self.routing_instances:
return
self._vnc_lib.ref_update('route_aggregate', self.obj.uuid,
'routing_instance', ri.obj.uuid,
None, 'ADD')
self.routing_instances.add(ri.name)
# end add_routing_instance

def delete_routing_instance(self, ri):
if ri.name not in self.routing_instances:
return
self._vnc_lib.ref_update('route_aggregate', self.obj.uuid,
'routing_instance', ri.obj.uuid,
None, 'DELETE')
self.routing_instances.discard(ri.name)
# end delete_routing_instance
# end RouteAggregateST
15 changes: 15 additions & 0 deletions src/config/schema-transformer/test/test_service.py
Expand Up @@ -637,6 +637,21 @@ def test_service_policy(self):
rp.del_service_instance(si_obj)
self._vnc_lib.routing_policy_update(rp)
self.wait_to_remove_link(ident_name, ':'.join(self.get_ri_name(vn1_obj, sc_ri_name)))
self._vnc_lib.routing_policy_delete(id=rp.uuid)

ra = RouteAggregate('ra1')
sit = ServiceInterfaceTag(interface_type='left')
ra.add_service_instance(si_obj, sit)
self._vnc_lib.route_aggregate_create(ra)
self.wait_to_get_object(config_db.RouteAggregateST,
ra.get_fq_name_str())
ident_name = self.get_obj_imid(ra)
self.wait_to_get_link(ident_name, ':'.join(self.get_ri_name(vn1_obj, sc_ri_name)))
ra.del_service_instance(si_obj)
self._vnc_lib.route_aggregate_update(ra)
self.wait_to_remove_link(ident_name, ':'.join(self.get_ri_name(vn1_obj, sc_ri_name)))
self._vnc_lib.route_aggregate_delete(id=ra.uuid)

vn1_obj.del_network_policy(np)
vn2_obj.del_network_policy(np)
self._vnc_lib.virtual_network_update(vn1_obj)
Expand Down
4 changes: 4 additions & 0 deletions src/config/schema-transformer/to_bgp.py
Expand Up @@ -88,6 +88,7 @@ class SchemaTransformer(object):
'service_instance': {
'self': ['network_policy'],
'routing_policy': ['network_policy'],
'route_aggregate': ['network_policy'],
'virtual_machine': ['network_policy'],
'network_policy': ['virtual_machine']
},
Expand Down Expand Up @@ -127,6 +128,9 @@ class SchemaTransformer(object):
},
'routing_policy': {
'self': ['service_instance'],
},
'route_aggregate': {
'self': ['service_instance'],
}
}

Expand Down
4 changes: 4 additions & 0 deletions src/schema/vnc_cfg.xsd
Expand Up @@ -1432,6 +1432,10 @@ targetNamespace="http://www.contrailsystems.com/2012/VNC-CONFIG/0">
<!--#IFMAP-SEMANTICS-IDL
Link('project-routing-policy', 'project', 'routing-policy', ['has']) -->

<xsd:element name="project-route-aggregate"/>
<!--#IFMAP-SEMANTICS-IDL
Link('project-route-aggregate', 'project', 'route-aggregate', ['has']) -->

<xsd:element name="customer-attachment-virtual-machine-interface"/>
<!--#IFMAP-SEMANTICS-IDL
Exclude('customer-attachment-virtual-machine-interface',
Expand Down

0 comments on commit 205496a

Please sign in to comment.