From 5d0805bb52ec360c525098d1b2104e1bba73ce7e Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Thu, 8 Jun 2017 21:33:27 +0000 Subject: [PATCH 1/6] [bgp] Save admin state and set default state to shutdown --- .../base_image_files/bgp_neighbor | 46 +++++++++++++++++++ dockers/docker-fpm-quagga/bgpd.conf.j2 | 3 ++ dockers/docker-fpm-quagga/start.sh | 6 ++- rules/docker-fpm-quagga.mk | 1 + 4 files changed, 55 insertions(+), 1 deletion(-) create mode 100755 dockers/docker-fpm-quagga/base_image_files/bgp_neighbor diff --git a/dockers/docker-fpm-quagga/base_image_files/bgp_neighbor b/dockers/docker-fpm-quagga/base_image_files/bgp_neighbor new file mode 100755 index 00000000000..78dd73a5a45 --- /dev/null +++ b/dockers/docker-fpm-quagga/base_image_files/bgp_neighbor @@ -0,0 +1,46 @@ +#!/bin/bash -e + +usage(){ + echo "Usage: $0 " + exit 255 +} + +[[ $# -ne 2 ]] && usage + +COMMAND=$1 +NEIGHBOR_IP=$2 + +if [ "$COMMAND" == "shutdown" ]; then + CMD_PREFIX="" +elif [ "$COMMAND" == "startup" ]; then + CMD_PREFIX="no" +else + usage +fi + +ASN=`vtysh -c "show ip bgp su" | sed -n "s/.*AS number \([0-9]\+\).*/\1/p"` +if [ -z "$ASN" ]; then + exit 255 +fi + +[ -f /etc/sonic/bgp_admin.yml ] || echo "bgp_admin_state:" > /etc/sonic/bgp_admin.yml + +if [ "$NEIGHBOR_IP" == "0.0.0.0" ] ; then + for NEIGHBOR in `vtysh -c "show run" | grep nei | grep -oE "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" | sort | uniq`; do + vtysh -c "configure terminal" -c "router bgp $ASN" -c "$CMD_PREFIX neighbor $NEIGHBOR shutdown" + + # Save admin state in config file + sed -i "/^\s*$NEIGHBOR:/d" /etc/sonic/bgp_admin.yml + [ "$COMMAND" == "shutdown" ] || echo " $NEIGHBOR: on" >> /etc/sonic/bgp_admin.yml + done + +else + # Examine bgp neighbor exists first + vtysh -c "show ip bgp neighbor $NEIGHBOR_IP" | grep -q "BGP neighbor is" + + vtysh -c "configure terminal" -c "router bgp $ASN" -c "$CMD_PREFIX neighbor $NEIGHBOR_IP shutdown" + + # Save admin state in config file + sed -i "/^\s*$NEIGHBOR_IP:/d" /etc/sonic/bgp_admin.yml + [ "$COMMAND" == "shutdown" ] || echo " $NEIGHBOR_IP: on" >> /etc/sonic/bgp_admin.yml +fi diff --git a/dockers/docker-fpm-quagga/bgpd.conf.j2 b/dockers/docker-fpm-quagga/bgpd.conf.j2 index fff27678c95..a08c6a30632 100644 --- a/dockers/docker-fpm-quagga/bgpd.conf.j2 +++ b/dockers/docker-fpm-quagga/bgpd.conf.j2 @@ -50,6 +50,9 @@ router bgp {{ minigraph_bgp_asn }} {% if bgp_session['asn'] != 0 %} neighbor {{ bgp_session['addr'] }} remote-as {{ bgp_session['asn'] }} neighbor {{ bgp_session['addr'] }} description {{ bgp_session['name'] }} +{% if not bgp_admin_state or not bgp_admin_state[bgp_session['addr']] %} + neighbor {{ bgp_session['addr'] }} shutdown +{% endif %} {% if minigraph_devices[inventory_hostname]['type'] == 'ToRRouter' %} neighbor {{ bgp_session['addr'] }} allowas-in 1 {% endif %} diff --git a/dockers/docker-fpm-quagga/start.sh b/dockers/docker-fpm-quagga/start.sh index a02117dee5e..bc3fbf4e907 100755 --- a/dockers/docker-fpm-quagga/start.sh +++ b/dockers/docker-fpm-quagga/start.sh @@ -1,7 +1,11 @@ #!/usr/bin/env bash mkdir -p /etc/quagga -sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/bgpd.conf.j2 > /etc/quagga/bgpd.conf +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 +else + sonic-cfggen -m /etc/sonic/minigraph.xml -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 sonic-cfggen -m /etc/sonic/minigraph.xml -t /usr/share/sonic/templates/isolate.j2 > /usr/sbin/bgp-isolate diff --git a/rules/docker-fpm-quagga.mk b/rules/docker-fpm-quagga.mk index a9c0511ba17..1e95c96e001 100644 --- a/rules/docker-fpm-quagga.mk +++ b/rules/docker-fpm-quagga.mk @@ -11,3 +11,4 @@ $(DOCKER_FPM_QUAGGA)_RUN_OPT += --net=host --privileged -t $(DOCKER_FPM_QUAGGA)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro $(DOCKER_FPM_QUAGGA)_BASE_IMAGE_FILES += vtysh:/usr/bin/vtysh +$(DOCKER_FPM_QUAGGA)_BASE_IMAGE_FILES += bgp_neighbor:/usr/bin/bgp_neighbor From 3fb8ae5dfca08926a18abce772500d281c415e0d Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Fri, 9 Jun 2017 21:57:00 +0000 Subject: [PATCH 2/6] Set default behavior to no shutdown --- dockers/docker-fpm-quagga/bgpd.conf.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockers/docker-fpm-quagga/bgpd.conf.j2 b/dockers/docker-fpm-quagga/bgpd.conf.j2 index a08c6a30632..0c848939df9 100644 --- a/dockers/docker-fpm-quagga/bgpd.conf.j2 +++ b/dockers/docker-fpm-quagga/bgpd.conf.j2 @@ -50,7 +50,7 @@ router bgp {{ minigraph_bgp_asn }} {% if bgp_session['asn'] != 0 %} neighbor {{ bgp_session['addr'] }} remote-as {{ bgp_session['asn'] }} neighbor {{ bgp_session['addr'] }} description {{ bgp_session['name'] }} -{% if not bgp_admin_state or not bgp_admin_state[bgp_session['addr']] %} +{% if bgp_admin_state and bgp_admin_state.has_key(bgp_session['addr']) and bgp_admin_state[bgp_session['addr']]==False or bgp_admin_state and not bgp_admin_state.has_key(bgp_session['addr']) and bgp_admin_state.has_key('all') and bgp_admin_state['all']==False %} neighbor {{ bgp_session['addr'] }} shutdown {% endif %} {% if minigraph_devices[inventory_hostname]['type'] == 'ToRRouter' %} From 66f6365c7910c76d57349ae6ec930a967df8ec9a Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Fri, 9 Jun 2017 22:08:58 +0000 Subject: [PATCH 3/6] Add build option SHUTDOWN_BGP_ON_START --- Makefile | 1 + files/build_templates/sonic_debian_extension.j2 | 5 ++++- rules/config | 4 ++++ slave.mk | 1 + 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 97f054c035b..b2938221b24 100644 --- a/Makefile +++ b/Makefile @@ -53,6 +53,7 @@ DOCKER_MGMT_BUILD = docker build --no-cache \ PLATFORM=$(PLATFORM) \ BUILD_NUMBER=$(BUILD_NUMBER) \ ENABLE_DHCP_GRAPH_SERVICE=$(ENABLE_DHCP_GRAPH_SERVICE) \ + SHUTDOWN_BGP_ON_START=$(SHUTDOWN_BGP_ON_START) \ SONIC_ENABLE_SYNCD_RPC=$(ENABLE_SYNCD_RPC) \ PASSWORD=$(PASSWORD) \ USERNAME=$(USERNAME) \ diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 94f8292fb95..00398654b12 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -131,7 +131,10 @@ sudo bash -c "echo dhcp_as_static=true >> $FILESYSTEM_ROOT/etc/sonic/updategraph {% else %} sudo bash -c "echo enabled=false > $FILESYSTEM_ROOT/etc/sonic/updategraph.conf" {% endif %} - +{% if shutdown_bgp_on_start == "y" %} +sudo bash -c "echo bgp_admin_state: > $FILESYSTEM_ROOT/etc/sonic/bgp_admin.yml" +sudo bash -c "echo ' all: off' >> $FILESYSTEM_ROOT/etc/sonic/bgp_admin.yml" +{% endif %} # Copy SNMP configuration files sudo cp $IMAGE_CONFIGS/snmp/snmp.yml $FILESYSTEM_ROOT/etc/sonic/ diff --git a/rules/config b/rules/config index 4d0fc7801c9..e813cd7ef1c 100644 --- a/rules/config +++ b/rules/config @@ -38,6 +38,10 @@ DEFAULT_PASSWORD = YourPaSsWoRd # If not set (default behavior) the default minigraph built into the image will be used. # ENABLE_DHCP_GRAPH_SERVICE = y +# SHUTDOWN_BGP_ON_START - if set to y all bgp sessions will be in admin down state when +# bgp service starts. +# SHUTDOWN_BGP_ON_START = y + # SONIC_CONFIG_DEBUG - install debug packages # Uncomment next line to enable: # SONIC_CONFIG_DEBUG = y diff --git a/slave.mk b/slave.mk index d17aea5722c..c8a1a27f32a 100644 --- a/slave.mk +++ b/slave.mk @@ -340,6 +340,7 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : .platform export sonicadmin_user="$(USERNAME)" export sonic_asic_platform="$(CONFIGURED_PLATFORM)" export enable_dhcp_graph_service="$(ENABLE_DHCP_GRAPH_SERVICE)" + export shutdown_bgp_on_start="$(SHUTDOWN_BGP_ON_START)" export installer_debs="$(addprefix $(DEBS_PATH)/,$($*_DEPENDS))" export lazy_installer_debs="$(foreach deb, $($*_INSTALLS),$(foreach device, $($(deb)_PLATFORM),$(addprefix $(device)@, $(DEBS_PATH)/$(deb))))" export installer_images="$(addprefix $(TARGET_PATH)/,$($*_DOCKERS))" From e61227f3a4908feeb22e241e66d3188f568a5d84 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Fri, 9 Jun 2017 22:10:44 +0000 Subject: [PATCH 4/6] Script change for default admin state to be on --- dockers/docker-fpm-quagga/base_image_files/bgp_neighbor | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dockers/docker-fpm-quagga/base_image_files/bgp_neighbor b/dockers/docker-fpm-quagga/base_image_files/bgp_neighbor index 78dd73a5a45..e98e246c32b 100755 --- a/dockers/docker-fpm-quagga/base_image_files/bgp_neighbor +++ b/dockers/docker-fpm-quagga/base_image_files/bgp_neighbor @@ -31,7 +31,7 @@ if [ "$NEIGHBOR_IP" == "0.0.0.0" ] ; then # Save admin state in config file sed -i "/^\s*$NEIGHBOR:/d" /etc/sonic/bgp_admin.yml - [ "$COMMAND" == "shutdown" ] || echo " $NEIGHBOR: on" >> /etc/sonic/bgp_admin.yml + [ "$COMMAND" == "startup" ] || echo " $NEIGHBOR: off" >> /etc/sonic/bgp_admin.yml done else @@ -42,5 +42,5 @@ else # Save admin state in config file sed -i "/^\s*$NEIGHBOR_IP:/d" /etc/sonic/bgp_admin.yml - [ "$COMMAND" == "shutdown" ] || echo " $NEIGHBOR_IP: on" >> /etc/sonic/bgp_admin.yml + [ "$COMMAND" == "startup" ] || echo " $NEIGHBOR_IP: off" >> /etc/sonic/bgp_admin.yml fi From 71f4ad3cc26e5341e585fd8245d0e3b0091621b4 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Fri, 9 Jun 2017 22:29:03 +0000 Subject: [PATCH 5/6] Address CR comments to bgp_neighbor script --- dockers/docker-fpm-quagga/base_image_files/bgp_neighbor | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dockers/docker-fpm-quagga/base_image_files/bgp_neighbor b/dockers/docker-fpm-quagga/base_image_files/bgp_neighbor index e98e246c32b..1d31a84d5e6 100755 --- a/dockers/docker-fpm-quagga/base_image_files/bgp_neighbor +++ b/dockers/docker-fpm-quagga/base_image_files/bgp_neighbor @@ -18,13 +18,14 @@ else usage fi -ASN=`vtysh -c "show ip bgp su" | sed -n "s/.*AS number \([0-9]\+\).*/\1/p"` +ASN=`vtysh -c "show ip bgp summary" | sed -n "s/.*AS number \([0-9]\+\).*/\1/p"` if [ -z "$ASN" ]; then exit 255 fi [ -f /etc/sonic/bgp_admin.yml ] || echo "bgp_admin_state:" > /etc/sonic/bgp_admin.yml +# Operate on all ipv4 neighbors when "neighbor_ip" = 0.0.0.0 if [ "$NEIGHBOR_IP" == "0.0.0.0" ] ; then for NEIGHBOR in `vtysh -c "show run" | grep nei | grep -oE "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" | sort | uniq`; do vtysh -c "configure terminal" -c "router bgp $ASN" -c "$CMD_PREFIX neighbor $NEIGHBOR shutdown" From 429779877be11f4af33377c727a89424f6def1e7 Mon Sep 17 00:00:00 2001 From: Taoyu Li Date: Sat, 10 Jun 2017 00:15:13 +0000 Subject: [PATCH 6/6] Fix script bug --- .../docker-fpm-quagga/base_image_files/bgp_neighbor | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/dockers/docker-fpm-quagga/base_image_files/bgp_neighbor b/dockers/docker-fpm-quagga/base_image_files/bgp_neighbor index 1d31a84d5e6..d6bd67a0a02 100755 --- a/dockers/docker-fpm-quagga/base_image_files/bgp_neighbor +++ b/dockers/docker-fpm-quagga/base_image_files/bgp_neighbor @@ -32,7 +32,11 @@ if [ "$NEIGHBOR_IP" == "0.0.0.0" ] ; then # Save admin state in config file sed -i "/^\s*$NEIGHBOR:/d" /etc/sonic/bgp_admin.yml - [ "$COMMAND" == "startup" ] || echo " $NEIGHBOR: off" >> /etc/sonic/bgp_admin.yml + if [ "$COMMAND" == "startup" ]; then + echo " $NEIGHBOR: on" >> /etc/sonic/bgp_admin.yml + else + echo " $NEIGHBOR: off" >> /etc/sonic/bgp_admin.yml + fi done else @@ -43,5 +47,9 @@ else # Save admin state in config file sed -i "/^\s*$NEIGHBOR_IP:/d" /etc/sonic/bgp_admin.yml - [ "$COMMAND" == "startup" ] || echo " $NEIGHBOR_IP: off" >> /etc/sonic/bgp_admin.yml + if [ "$COMMAND" == "startup" ]; then + echo " $NEIGHBOR_IP: on" >> /etc/sonic/bgp_admin.yml + else + echo " $NEIGHBOR_IP: off" >> /etc/sonic/bgp_admin.yml + fi fi