def bgp(self, node): node.add_stanza("bgp") node.bgp.lo_interface = self.lo_interface super(BrocadeBaseCompiler, self).bgp(node) phy_node = self.anm['phy'].node(node) asn = phy_node.asn g_ebgp_v4 = self.anm['ebgp_v4'] g_ebgp_v6 = self.anm['ebgp_v6'] if node in g_ebgp_v4 \ and len(list(g_ebgp_v4.node(node).edges())) > 0: node.is_ebgp_v4 = True else: node.is_ebgp_v4 = False if node in g_ebgp_v6 \ and len(list(g_ebgp_v6.node(node).edges())) > 0: node.is_ebgp_v6 = True else: node.is_ebgp_v6 = False node.bgp.ipv4_advertise_subnets = [] node.bgp.ipv6_advertise_subnets = [] # Advertise loopbacks into BGP if node.ip.use_ipv4: node.bgp.ipv4_advertise_subnets = \ [node.loopback_zero.ipv4_cidr] if node.ip.use_ipv6: node.bgp.ipv6_advertise_subnets = \ [node.loopback_zero.ipv6_address] # Advertise infrastructure into eBGP if node.ip.use_ipv4 and node.is_ebgp_v4: infra_blocks = self.anm['ipv4'].data['infra_blocks' ].get(asn) or [] for infra_route in infra_blocks: node.bgp.ipv4_advertise_subnets.append(infra_route) if node.ip.use_ipv6 and node.is_ebgp_v6: infra_blocks = self.anm['ipv6'].data['infra_blocks' ].get(asn) or [] for infra_route in infra_blocks: node.bgp.ipv6_advertise_subnets.append(infra_route) self.nailed_up_routes(node) # vrf # TODO: this should be inside vrf section? node.bgp.vrfs = [] vrf_node = self.anm['vrf'].node(node) if vrf_node and vrf_node.vrf_role is 'PE': # iBGP sessions for this VRF vrf_ibgp_neighbors = defaultdict(list) g_ibgp_v4 = self.anm['ibgp_v4'] for session in sort_sessions(g_ibgp_v4.edges(vrf_node)): if session.exclude and session.vrf: data = self.ibgp_session_data(session, ip_version=4) stanza = ConfigStanza(data) vrf_ibgp_neighbors[session.vrf].append(stanza) g_ibgp_v6 = self.anm['ibgp_v6'] for session in sort_sessions(g_ibgp_v6.edges(vrf_node)): if session.exclude and session.vrf: data = self.ibgp_session_data(session, ip_version=6) stanza = ConfigStanza(data) vrf_ibgp_neighbors[session.vrf].append(stanza) # eBGP sessions for this VRF vrf_ebgp_neighbors = defaultdict(list) for session in sort_sessions(g_ebgp_v4.edges(vrf_node)): if session.exclude and session.vrf: data = self.ebgp_session_data(session, ip_version=4) stanza = ConfigStanza(data) vrf_ebgp_neighbors[session.vrf].append(stanza) for session in sort_sessions(g_ebgp_v6.edges(vrf_node)): if session.exclude and session.vrf: data = self.ebgp_session_data(session, ip_version=6) stanza = ConfigStanza(data) vrf_ebgp_neighbors[session.vrf].append(stanza) for vrf in vrf_node.node_vrf_names: rd_index = vrf_node.rd_indices[vrf] rd = '%s:%s' % (node.asn, rd_index) stanza = ConfigStanza( vrf=vrf, rd=rd, use_ipv4=node.ip.use_ipv4, use_ipv6=node.ip.use_ipv6, vrf_ebgp_neighbors=vrf_ebgp_neighbors[vrf], vrf_ibgp_neighbors=vrf_ibgp_neighbors[vrf], ) node.bgp.vrfs.append(stanza) # Retain route_target if in ibgp_vpn_v4 and RR or HRR (set in design) vpnv4_node = self.anm['ibgp_vpn_v4'].node(node) if vpnv4_node: retain = False if vpnv4_node.retain_route_target: retain = True node.bgp.vpnv4 = ConfigStanza(retain_route_target=retain)
def bgp(self, node): phy_node = self.anm['phy'].node(node) g_ipv4 = self.anm['ipv4'] if node.ip.use_ipv6: g_ipv6 = self.anm['ipv6'] asn = phy_node.asn node.asn = asn bgp_stanza = node.add_stanza("bgp") bgp_stanza.custom_config = phy_node['bgp'].custom_config node.bgp.ipv4_advertise_subnets = [] if node.ip.use_ipv4: node.bgp.ipv4_advertise_subnets = \ g_ipv4.data.infra_blocks.get(asn) or [] # could be none (if one-node AS) default empty list node.bgp.ipv6_advertise_subnets = [] if node.ip.use_ipv6: g_ipv6 = self.anm['ipv6'] node.bgp.ipv6_advertise_subnets = \ g_ipv6.data.infra_blocks.get(asn) or [] ibgp_neighbors = [] ibgp_rr_clients = [] ibgp_rr_parents = [] g_ibgp_v4 = self.anm['ibgp_v4'] for session in sort_sessions(g_ibgp_v4.edges(phy_node)): if session.exclude: log.debug('Skipping excluded ibgp session %s' % session) continue # exclude from regular ibgp config (eg VRF, VPLS, etc) data = self.ibgp_session_data(session, ip_version=4) bgp_stanza = ConfigStanza(**data) direction = session.direction if direction == 'down': ibgp_rr_clients.append(bgp_stanza) elif direction == 'up': ibgp_rr_parents.append(bgp_stanza) else: ibgp_neighbors.append(bgp_stanza) # TODO: check v6 hierarchy only created if node set to being v4 or v6 if node.ip.use_ipv6: g_ibgp_v6 = self.anm['ibgp_v6'] for session in sort_sessions(g_ibgp_v6.edges(phy_node)): if session.exclude: log.debug('Skipping excluded ibgp session %s' % session) continue # exclude from regular ibgp config (eg VRF, VPLS, etc) data = self.ibgp_session_data(session, ip_version=6) bgp_stanza = ConfigStanza(**data) direction = session.direction if direction == 'down': ibgp_rr_clients.append(bgp_stanza) elif direction == 'up': ibgp_rr_parents.append(bgp_stanza) else: ibgp_neighbors.append(bgp_stanza) # TODO: update this to use ibgp_v4 and ibgp_v6 overlays node.bgp.ibgp_neighbors = ibgp_neighbors node.bgp.ibgp_rr_clients = ibgp_rr_clients node.bgp.ibgp_rr_parents = ibgp_rr_parents # ebgp ebgp_neighbors = [] g_ebgp_v4 = self.anm['ebgp_v4'] for session in sort_sessions(g_ebgp_v4.edges(phy_node)): if session.exclude: log.debug('Skipping excluded ebgp session %s' % session) continue # exclude from regular ibgp config (eg VRF, VPLS, etc) data = self.ebgp_session_data(session, ip_version=4) bgp_stanza = ConfigStanza(**data) ebgp_neighbors.append(bgp_stanza) if node.ip.use_ipv6: g_ebgp_v6 = self.anm['ebgp_v6'] for session in sort_sessions(g_ebgp_v6.edges(phy_node)): if session.exclude: print "Exclude" log.debug('Skipping excluded ebgp session %s' % session) continue # exclude from regular ibgp config (eg VRF, VPLS, etc) data = self.ebgp_session_data(session, ip_version=6) bgp_stanza = ConfigStanza(**data) ebgp_neighbors.append(bgp_stanza) ebgp_neighbors = sorted(ebgp_neighbors, key = lambda x: x.asn) node.bgp.ebgp_neighbors = ebgp_neighbors return
def bgp(self, node): node.add_stanza("bgp") node.bgp.lo_interface = self.lo_interface super(IosBaseCompiler, self).bgp(node) phy_node = self.anm['phy'].node(node) asn = phy_node.asn g_ebgp_v4 = self.anm['ebgp_v4'] g_ebgp_v6 = self.anm['ebgp_v6'] if node in g_ebgp_v4 \ and len(list(g_ebgp_v4.node(node).edges())) > 0: node.is_ebgp_v4 = True else: node.is_ebgp_v4 = False if node in g_ebgp_v6 \ and len(list(g_ebgp_v6.node(node).edges())) > 0: node.is_ebgp_v6 = True else: node.is_ebgp_v6 = False node.bgp.ipv4_advertise_subnets = [] node.bgp.ipv6_advertise_subnets = [] # Advertise loopbacks into BGP if node.ip.use_ipv4: node.bgp.ipv4_advertise_subnets = \ [node.loopback_zero.ipv4_cidr] if node.ip.use_ipv6: node.bgp.ipv6_advertise_subnets = \ [node.loopback_zero.ipv6_address] # Advertise infrastructure into eBGP if node.ip.use_ipv4 and node.is_ebgp_v4: infra_blocks = self.anm['ipv4'].data['infra_blocks'].get(asn) or [] for infra_route in infra_blocks: node.bgp.ipv4_advertise_subnets.append(infra_route) if node.ip.use_ipv6 and node.is_ebgp_v6: infra_blocks = self.anm['ipv6'].data['infra_blocks'].get(asn) or [] for infra_route in infra_blocks: node.bgp.ipv6_advertise_subnets.append(infra_route) self.nailed_up_routes(node) # vrf # TODO: this should be inside vrf section? node.bgp.vrfs = [] vrf_node = self.anm['vrf'].node(node) if vrf_node and vrf_node.vrf_role is 'PE': # iBGP sessions for this VRF vrf_ibgp_neighbors = defaultdict(list) g_ibgp_v4 = self.anm['ibgp_v4'] for session in sort_sessions(g_ibgp_v4.edges(vrf_node)): if session.exclude and session.vrf: data = self.ibgp_session_data(session, ip_version=4) stanza = ConfigStanza(data) vrf_ibgp_neighbors[session.vrf].append(stanza) g_ibgp_v6 = self.anm['ibgp_v6'] for session in sort_sessions(g_ibgp_v6.edges(vrf_node)): if session.exclude and session.vrf: data = self.ibgp_session_data(session, ip_version=6) stanza = ConfigStanza(data) vrf_ibgp_neighbors[session.vrf].append(stanza) # eBGP sessions for this VRF vrf_ebgp_neighbors = defaultdict(list) for session in sort_sessions(g_ebgp_v4.edges(vrf_node)): if session.exclude and session.vrf: data = self.ebgp_session_data(session, ip_version=4) stanza = ConfigStanza(data) vrf_ebgp_neighbors[session.vrf].append(stanza) for session in sort_sessions(g_ebgp_v6.edges(vrf_node)): if session.exclude and session.vrf: data = self.ebgp_session_data(session, ip_version=6) stanza = ConfigStanza(data) vrf_ebgp_neighbors[session.vrf].append(stanza) for vrf in vrf_node.node_vrf_names: rd_index = vrf_node.rd_indices[vrf] rd = '%s:%s' % (node.asn, rd_index) stanza = ConfigStanza( vrf=vrf, rd=rd, use_ipv4=node.ip.use_ipv4, use_ipv6=node.ip.use_ipv6, vrf_ebgp_neighbors=vrf_ebgp_neighbors[vrf], vrf_ibgp_neighbors=vrf_ibgp_neighbors[vrf], ) node.bgp.vrfs.append(stanza) # Retain route_target if in ibgp_vpn_v4 and RR or HRR (set in design) vpnv4_node = self.anm['ibgp_vpn_v4'].node(node) if vpnv4_node: retain = False if vpnv4_node.retain_route_target: retain = True node.bgp.vpnv4 = ConfigStanza(retain_route_target=retain)
def bgp(self, node): phy_node = self.anm['phy'].node(node) g_ipv4 = self.anm['ipv4'] if node.ip.use_ipv6: g_ipv6 = self.anm['ipv6'] asn = phy_node.asn node.asn = asn bgp_stanza = node.add_stanza("bgp") if self.anm.has_overlay("bgp"): bgp_stanza.custom_config = phy_node['bgp'].custom_config else: bgp_stanza.custom_config = "" node.bgp.ipv4_advertise_subnets = [] if node.ip.use_ipv4: node.bgp.ipv4_advertise_subnets = \ g_ipv4.data.infra_blocks.get( asn) or [] # could be none (one-node AS) default empty list node.bgp.ipv6_advertise_subnets = [] if node.ip.use_ipv6: g_ipv6 = self.anm['ipv6'] node.bgp.ipv6_advertise_subnets = \ g_ipv6.data.infra_blocks.get(asn) or [] ibgp_neighbors = [] ibgp_rr_clients = [] ibgp_rr_parents = [] g_ibgp_v4 = self.anm['ibgp_v4'] bgp_node = g_ibgp_v4.node(node) if bgp_node.route_reflector == True: node.bgp.route_reflector = True for session in sort_sessions(g_ibgp_v4.edges(phy_node)): if session.exclude: log.debug('Skipping excluded ibgp session %s', session) # exclude from regular ibgp config (eg VRF, VPLS, etc) continue data = self.ibgp_session_data(session, ip_version=4) bgp_stanza = ConfigStanza(**data) direction = session.direction if direction == 'down': ibgp_rr_clients.append(bgp_stanza) elif direction == 'up': ibgp_rr_parents.append(bgp_stanza) else: ibgp_neighbors.append(bgp_stanza) # TODO: check v6 hierarchy only created if node set to being v4 or v6 if node.ip.use_ipv6: g_ibgp_v6 = self.anm['ibgp_v6'] for session in sort_sessions(g_ibgp_v6.edges(phy_node)): if session.exclude: log.debug('Skipping excluded ibgp session %s', session) # exclude from regular ibgp config (eg VRF, VPLS, etc) continue data = self.ibgp_session_data(session, ip_version=6) bgp_stanza = ConfigStanza(**data) direction = session.direction if direction == 'down': ibgp_rr_clients.append(bgp_stanza) elif direction == 'up': ibgp_rr_parents.append(bgp_stanza) else: ibgp_neighbors.append(bgp_stanza) # TODO: update this to use ibgp_v4 and ibgp_v6 overlays node.bgp.ibgp_neighbors = ibgp_neighbors node.bgp.ibgp_rr_clients = ibgp_rr_clients node.bgp.ibgp_rr_parents = ibgp_rr_parents # ebgp ebgp_neighbors = [] g_ebgp_v4 = self.anm['ebgp_v4'] for session in sort_sessions(g_ebgp_v4.edges(phy_node)): if session.exclude: log.debug('Skipping excluded ebgp session %s', session) # exclude from regular ibgp config (eg VRF, VPLS, etc) continue data = self.ebgp_session_data(session, ip_version=4) bgp_stanza = ConfigStanza(**data) ebgp_neighbors.append(bgp_stanza) if node.ip.use_ipv6: g_ebgp_v6 = self.anm['ebgp_v6'] for session in sort_sessions(g_ebgp_v6.edges(phy_node)): if session.exclude: log.debug('Skipping excluded ebgp session %s', session) # exclude from regular ibgp config (eg VRF, VPLS, etc) continue data = self.ebgp_session_data(session, ip_version=6) bgp_stanza = ConfigStanza(**data) ebgp_neighbors.append(bgp_stanza) ebgp_neighbors = sorted(ebgp_neighbors, key=lambda x: x.asn) node.bgp.ebgp_neighbors = ebgp_neighbors return
def bgp(self, node): phy_node = self.anm['phy'].node(node) g_bgp = self.anm['bgp'] g_ipv4 = self.anm['ipv4'] g_ipv6 = self.anm['ipv6'] asn = phy_node.asn node.asn = asn node.bgp.ipv4_advertise_subnets = [] if node.ip.use_ipv4: node.bgp.ipv4_advertise_subnets = g_ipv4.data.infra_blocks.get( asn) or [] # could be none (if one-node AS) default empty list node.bgp.ipv6_advertise_subnets = [] if node.ip.use_ipv6: g_ipv6 = self.anm['ipv6'] node.bgp.ipv6_advertise_subnets = g_ipv6.data.infra_blocks.get( asn) or [] ibgp_neighbors = [] ibgp_rr_clients = [] ibgp_rr_parents = [] g_ibgp_v4 = self.anm['ibgp_v4'] for session in sort_sessions(g_ibgp_v4.edges(phy_node)): if session.exclude: log.debug("Skipping excluded ibgp session %s" % session) continue # exclude from regular ibgp config (eg VRF, VPLS, etc) data = self.ibgp_session_data(session, ip_version = 4) direction = session.direction if direction == 'down': ibgp_rr_clients.append(data) elif direction == 'up': ibgp_rr_parents.append(data) else: ibgp_neighbors.append(data) #TODO: check v6 hierarchy only created if node set to being v4 or v6 g_ibgp_v6 = self.anm['ibgp_v6'] for session in sort_sessions(g_ibgp_v6.edges(phy_node)): if session.exclude: log.debug("Skipping excluded ibgp session %s" % session) continue # exclude from regular ibgp config (eg VRF, VPLS, etc) data = self.ibgp_session_data(session, ip_version = 6) direction = session.direction if direction == 'down': ibgp_rr_clients.append(data) elif direction == 'up': ibgp_rr_parents.append(data) else: ibgp_neighbors.append(data) #TODO: update this to use ibgp_v4 and ibgp_v6 overlays node.bgp.ibgp_neighbors = ibgp_neighbors node.bgp.ibgp_rr_clients = ibgp_rr_clients node.bgp.ibgp_rr_parents = ibgp_rr_parents #ebgp ebgp_neighbors = [] g_ebgp_v4 = self.anm['ebgp_v4'] for session in sort_sessions(g_ebgp_v4.edges(phy_node)): if session.exclude: log.debug("Skipping excluded ebgp session %s" % session) continue # exclude from regular ibgp config (eg VRF, VPLS, etc) data = self.ebgp_session_data(session, ip_version = 4) ebgp_neighbors.append(data) g_ebgp_v6 = self.anm['ebgp_v6'] for session in sort_sessions(g_ebgp_v6.edges(phy_node)): if session.exclude: log.debug("Skipping excluded ebgp session %s" % session) continue # exclude from regular ibgp config (eg VRF, VPLS, etc) data = self.ebgp_session_data(session, ip_version = 6) ebgp_neighbors.append(data) node.bgp.ebgp_neighbors = ebgp_neighbors node.bgp.ebgp_neighbors.sort("asn") return
def bgp(self, node): node.bgp.lo_interface = self.lo_interface super(IosBaseCompiler, self).bgp(node) # Only advertise loopbacks into eBGP if node.ip.use_ipv4: node.bgp.ipv4_advertise_subnets = [node.loopback_zero.ipv4_cidr] if node.ip.use_ipv6: node.bgp.ipv6_advertise_subnets = [node.loopback_zero.ipv6_address] # vrf #TODO: this should be inside vrf section? node.bgp.vrfs = [] vrf_node = self.anm['vrf'].node(node) if vrf_node and vrf_node.vrf_role is "PE": # iBGP sessions for this VRF vrf_ibgp_neighbors = defaultdict(list) g_ibgp_v4 = self.anm['ibgp_v4'] for session in sort_sessions(g_ibgp_v4.edges(vrf_node)): if session.exclude and session.vrf: data = self.ibgp_session_data(session, ip_version = 4) vrf_ibgp_neighbors[session.vrf].append(data) g_ibgp_v6 = self.anm['ibgp_v6'] for session in sort_sessions(g_ibgp_v6.edges(vrf_node)): if session.exclude and session.vrf: data = self.ibgp_session_data(session, ip_version = 6) vrf_ibgp_neighbors[session.vrf].append(data) # eBGP sessions for this VRF vrf_ebgp_neighbors = defaultdict(list) g_ebgp_v4 = self.anm['ebgp_v4'] for session in sort_sessions(g_ebgp_v4.edges(vrf_node)): if session.exclude and session.vrf: data = self.ebgp_session_data(session, ip_version = 4) vrf_ebgp_neighbors[session.vrf].append(data) g_ebgp_v6 = self.anm['ebgp_v6'] for session in sort_sessions(g_ebgp_v6.edges(vrf_node)): if session.exclude and session.vrf: data = self.ebgp_session_data(session, ip_version = 6) vrf_ebgp_neighbors[session.vrf].append(data) for vrf in vrf_node.node_vrf_names: rd_index = vrf_node.rd_indices[vrf] rd = "%s:%s" % (node.asn, rd_index) node.bgp.vrfs.append( vrf=vrf, rd=rd, use_ipv4=node.ip.use_ipv4, use_ipv6=node.ip.use_ipv6, vrf_ebgp_neighbors = vrf_ebgp_neighbors[vrf], vrf_ibgp_neighbors = vrf_ibgp_neighbors[vrf], ) # Retain route_target if in ibgp_vpn_v4 and RR or HRR (set in design) vpnv4_node = self.anm['ibgp_vpn_v4'].node(node) if vpnv4_node: retain = False if vpnv4_node.retain_route_target: retain = True node.bgp.vpnv4 = {'retain_route_target': retain}