-
Notifications
You must be signed in to change notification settings - Fork 1.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[BGPD]: add bgp dynamic neighbor configuration #708
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,9 +2,9 @@ | |
|
||
mkdir -p /etc/quagga | ||
if [ -f /etc/sonic/bgp_admin.yml ]; then | ||
sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/bgp_admin.yml -t /usr/share/sonic/templates/bgpd.conf.j2 > /etc/quagga/bgpd.conf | ||
sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/bgp_admin.yml -y /etc/sonic/deploymentId_asn_map.yml -t /usr/share/sonic/templates/bgpd.conf.j2 > /etc/quagga/bgpd.conf | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Do we allow the case that deploymentId_asn_map.yml does not exist? I plan to add a There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't think we will allow the case that deploymentId_asn_map doesn't exist since we will copy a sample deploymentId_asn_map.yml when building the debian package (as what we have done for snmp.yml). I don't think we do manual check for snmp.yml (correct me if I am wrong). So we might don't have to check for this yml file as well? |
||
else | ||
sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/bgpd.conf.j2 > /etc/quagga/bgpd.conf | ||
sonic-cfggen -m /etc/sonic/minigraph.xml -y /etc/sonic/deploymentId_asn_map.yml -t /usr/share/sonic/templates/bgpd.conf.j2 > /etc/quagga/bgpd.conf | ||
fi | ||
sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/zebra.conf.j2 > /etc/quagga/zebra.conf | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
deploymentId_asn_map: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why do we use a mixture of camelCaseNaming and underscore_naming here? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I thought deployementId is one unique word. Will change the naming later. |
||
"1" : 12345 |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -244,6 +244,7 @@ def parse_dpg(dpg, hname): | |
def parse_cpg(cpg, hname): | ||
bgp_sessions = [] | ||
myasn = None | ||
bgp_peers_with_range = [] | ||
for child in cpg: | ||
tag = child.tag | ||
if tag == str(QName(ns, "PeeringSessions")): | ||
|
@@ -270,12 +271,22 @@ def parse_cpg(cpg, hname): | |
hostname = router.find(str(QName(ns1, "Hostname"))).text | ||
if hostname == hname: | ||
myasn = int(asn) | ||
peers = router.find(str(QName(ns1, "Peers"))) | ||
for bgpPeer in peers.findall(str(QName(ns, "BGPPeer"))): | ||
addr = bgpPeer.find(str(QName(ns, "Address"))).text | ||
if bgpPeer.find(str(QName(ns1, "PeersRange"))) is not None: | ||
name = bgpPeer.find(str(QName(ns1, "Name"))).text | ||
range = bgpPeer.find(str(QName(ns1, "PeersRange"))).text | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'll recommend another var name rather than overriding built-in |
||
bgp_peers_with_range.append({ | ||
'name': name, | ||
'range': range | ||
}) | ||
else: | ||
for bgp_session in bgp_sessions: | ||
if hostname == bgp_session['name']: | ||
bgp_session['asn'] = int(asn) | ||
|
||
return bgp_sessions, myasn | ||
return bgp_sessions, myasn, bgp_peers_with_range | ||
|
||
|
||
def parse_meta(meta, hname): | ||
|
@@ -284,6 +295,7 @@ def parse_meta(meta, hname): | |
ntp_servers = [] | ||
mgmt_routes = [] | ||
erspan_dst = [] | ||
deploymentId = None | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'll suggest we unify to underscore_naming There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. will do |
||
device_metas = meta.find(str(QName(ns, "Devices"))) | ||
for device in device_metas.findall(str(QName(ns1, "DeviceMetadata"))): | ||
if device.find(str(QName(ns1, "Name"))).text == hname: | ||
|
@@ -302,7 +314,9 @@ def parse_meta(meta, hname): | |
mgmt_routes = value_group | ||
elif name == "ErspanDestinationIpv4": | ||
erspan_dst = value_group | ||
return syslog_servers, dhcp_servers, ntp_servers, mgmt_routes, erspan_dst | ||
elif name == "DeploymentId": | ||
deploymentId = value | ||
return syslog_servers, dhcp_servers, ntp_servers, mgmt_routes, erspan_dst, deploymentId | ||
|
||
|
||
def get_console_info(devices, dev, port): | ||
|
@@ -396,6 +410,8 @@ def parse_xml(filename, platform=None, port_config_file=None): | |
ntp_servers = [] | ||
mgmt_routes = [] | ||
erspan_dst = [] | ||
bgp_peers_with_range = None | ||
deploymentId = None | ||
|
||
hwsku_qn = QName(ns, "HwSku") | ||
hostname_qn = QName(ns, "Hostname") | ||
|
@@ -411,13 +427,13 @@ def parse_xml(filename, platform=None, port_config_file=None): | |
if child.tag == str(QName(ns, "DpgDec")): | ||
(intfs, lo_intfs, mgmt_intf, vlans, pcs, acls) = parse_dpg(child, hostname) | ||
elif child.tag == str(QName(ns, "CpgDec")): | ||
(bgp_sessions, bgp_asn) = parse_cpg(child, hostname) | ||
(bgp_sessions, bgp_asn, bgp_peers_with_range) = parse_cpg(child, hostname) | ||
elif child.tag == str(QName(ns, "PngDec")): | ||
(neighbors, devices, console_dev, console_port, mgmt_dev, mgmt_port) = parse_png(child, hostname) | ||
elif child.tag == str(QName(ns, "UngDec")): | ||
(u_neighbors, u_devices, _, _, _, _) = parse_png(child, hostname) | ||
elif child.tag == str(QName(ns, "MetadataDeclaration")): | ||
(syslog_servers, dhcp_servers, ntp_servers, mgmt_routes, erspan_dst) = parse_meta(child, hostname) | ||
(syslog_servers, dhcp_servers, ntp_servers, mgmt_routes, erspan_dst, deploymentId) = parse_meta(child, hostname) | ||
|
||
Tree = lambda: defaultdict(Tree) | ||
|
||
|
@@ -428,6 +444,7 @@ def parse_xml(filename, platform=None, port_config_file=None): | |
# TODO: alternatively (preferred), implement class containers for multiple-attribute entries, enabling sort by attr | ||
results['minigraph_bgp'] = sorted(bgp_sessions, key=lambda x: x['addr']) | ||
results['minigraph_bgp_asn'] = bgp_asn | ||
results['minigraph_bgp_peers_with_range'] = bgp_peers_with_range | ||
# TODO: sort does not work properly on all interfaces of varying lengths. Need to sort by integer group(s). | ||
|
||
phyport_intfs = [] | ||
|
@@ -466,6 +483,7 @@ def parse_xml(filename, platform=None, port_config_file=None): | |
results['ntp_servers'] = ntp_servers | ||
results['forced_mgmt_routes'] = mgmt_routes | ||
results['erspan_dst'] = erspan_dst | ||
results['deploymentId'] = deploymentId | ||
|
||
return results | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Could you add a sample minigraph with bgp peers and corresponding test to the test folder? |
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
maybe it is better to make the failure explicit? when there is bgp peers with range, then we need to generate the passive peer. if deploymentId is not available, it is probably good to make the failure explicitly?