From f0540e73819597c002e54c453241b1ab3cfc46a5 Mon Sep 17 00:00:00 2001 From: zzhiyuan Date: Fri, 23 Nov 2018 17:06:23 -0800 Subject: [PATCH 1/4] Fix networking.service waiting for udevadm settle (#2295) There was a fix to speed up initialization when networking used init.d but it did not carry over to systemd networking.service. This fix will apply the same change on the systemd service. The result is much less time spent being blocked in networking.service. --- files/build_templates/sonic_debian_extension.j2 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 7a0af5d82a2b..7bfbd73dd28c 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -259,9 +259,10 @@ sudo dpkg --root=$FILESYSTEM_ROOT -P {{ debname }} sudo rm -f $FILESYSTEM_ROOT/usr/sbin/policy-rc.d -## Revise /etc/init.d/networking for Arista switches +## Revise /etc/init.d/networking and /lib/systemd/system/networking.service for Arista switches if [ "$image_type" = "aboot" ]; then sudo sed -i 's/udevadm settle/udevadm settle -E \/sys\/class\/net\/eth0/' $FILESYSTEM_ROOT/etc/init.d/networking + sudo sed -i 's/udevadm settle/udevadm settle -E \/sys\/class\/net\/eth0/' $FILESYSTEM_ROOT/lib/systemd/system/networking.service fi ## copy platform rc.local From 9c6ba9484b418edd0c6d669ae8e01e6f2117e8bc Mon Sep 17 00:00:00 2001 From: lguohan Date: Fri, 23 Nov 2018 21:06:01 -0800 Subject: [PATCH 2/4] [vs]: connect to localhost instead 127.0.0.1 in check_install.py (#2296) Signed-off-by: Guohan Lu --- check_install.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check_install.py b/check_install.py index 09979f61e4ba..58923c1a139c 100755 --- a/check_install.py +++ b/check_install.py @@ -24,7 +24,7 @@ def main(): cmd_prompt = "%s@sonic:~\$ $" % args.u grub_selection = "The highlighted entry will be executed" - p = pexpect.spawn("telnet 127.0.0.1 %s" % args.p, timeout=600, logfile=sys.stdout) + p = pexpect.spawn("telnet localhost %s" % args.p, timeout=600, logfile=sys.stdout) # select ONIE embed p.expect(grub_selection) From f09488473d4a79629d161fadfce5e62123f0770d Mon Sep 17 00:00:00 2001 From: lguohan Date: Sun, 25 Nov 2018 11:33:00 -0800 Subject: [PATCH 3/4] [vs]: fail the build when build kvm image fails (#2297) Signed-off-by: Guohan Lu --- build_image.sh | 5 +++++ build_kvm_image.sh | 2 +- check_install.py | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/build_image.sh b/build_image.sh index 05eb3ca78b78..706f4e937cf6 100755 --- a/build_image.sh +++ b/build_image.sh @@ -87,6 +87,11 @@ elif [ "$IMAGE_TYPE" = "kvm" ]; then SONIC_USERNAME=$USERNAME PASSWD=$PASSWORD sudo -E ./build_kvm_image.sh $KVM_IMAGE_DISK $onie_recovery_image $OUTPUT_ONIE_IMAGE $KVM_IMAGE_DISK_SIZE + if [ $? -ne 0 ]; then + echo "Error : build kvm image failed" + exit 1 + fi + [ -r $KVM_IMAGE_DISK ] || { echo "Error : $KVM_IMAGE_DISK not generated!" exit 1 diff --git a/build_kvm_image.sh b/build_kvm_image.sh index 2e1f767329aa..b08db96f573c 100755 --- a/build_kvm_image.sh +++ b/build_kvm_image.sh @@ -56,7 +56,7 @@ prepare_installer_disk -vga std \ -drive file=$DISK,media=disk,if=virtio,index=0 \ -drive file=$INSTALLER_DISK,if=virtio,index=1 \ - -serial telnet:localhost:$KVM_PORT,server > $kvm_log 2>&1 & + -serial telnet:127.0.0.1:$KVM_PORT,server > $kvm_log 2>&1 & kvm_pid=$! diff --git a/check_install.py b/check_install.py index 58923c1a139c..09979f61e4ba 100755 --- a/check_install.py +++ b/check_install.py @@ -24,7 +24,7 @@ def main(): cmd_prompt = "%s@sonic:~\$ $" % args.u grub_selection = "The highlighted entry will be executed" - p = pexpect.spawn("telnet localhost %s" % args.p, timeout=600, logfile=sys.stdout) + p = pexpect.spawn("telnet 127.0.0.1 %s" % args.p, timeout=600, logfile=sys.stdout) # select ONIE embed p.expect(grub_selection) From 7056b49af70f2e00bb10080f962c7f696bb18d0b Mon Sep 17 00:00:00 2001 From: Nikos <31227248+nikos-github@users.noreply.github.com> Date: Mon, 26 Nov 2018 18:19:12 -0800 Subject: [PATCH 4/4] Routing application split config support (#2286) * Routing application split config support Signed-off-by: nikos * Routing application split config support Routing application split config support Signed-off-by: nikos --- dockers/docker-fpm-frr/Dockerfile.j2 | 6 ++++++ dockers/docker-fpm-frr/config.sh | 7 ++++++- files/build_templates/sonic_debian_extension.j2 | 11 +++++++++++ rules/config | 9 +++++++++ rules/docker-fpm-frr.mk | 1 + slave.mk | 14 ++++++++++++++ src/sonic-config-engine/minigraph.py | 5 +++++ 7 files changed, 52 insertions(+), 1 deletion(-) diff --git a/dockers/docker-fpm-frr/Dockerfile.j2 b/dockers/docker-fpm-frr/Dockerfile.j2 index d0fd6f53d6b5..6f046af6cf27 100644 --- a/dockers/docker-fpm-frr/Dockerfile.j2 +++ b/dockers/docker-fpm-frr/Dockerfile.j2 @@ -1,6 +1,9 @@ FROM docker-config-engine ARG docker_container_name +ARG frr_user_uid +ARG frr_user_gid + RUN [ -f /etc/rsyslog.conf ] && sed -ri "s/%syslogtag%/$docker_container_name#%syslogtag%/;" /etc/rsyslog.conf # Make apt-get non-interactive @@ -18,6 +21,9 @@ RUN apt-get install -y libdbus-1-3 libdaemon0 libjansson4 libc-ares2 iproute lib COPY debs/{{ deb }} /debs/ {%- endfor %} +RUN groupadd -g ${frr_user_gid} frr +RUN useradd -u ${frr_user_uid} -g ${frr_user_gid} -M -s /bin/false frr + # Install locally-built Debian packages and implicitly install their dependencies {%- for deb in docker_fpm_frr_debs.split(' ') %} RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /debs/{{ deb }} diff --git a/dockers/docker-fpm-frr/config.sh b/dockers/docker-fpm-frr/config.sh index a0039abf5e73..5e481d0c8516 100755 --- a/dockers/docker-fpm-frr/config.sh +++ b/dockers/docker-fpm-frr/config.sh @@ -1,7 +1,12 @@ #!/bin/bash mkdir -p /etc/frr -sonic-cfggen -d -t /usr/share/sonic/templates/frr.conf.j2 >/etc/frr/frr.conf + +CONFIG_TYPE=`sonic-cfggen -d -v 'DEVICE_METADATA["localhost"]["docker_routing_config_mode"]'` + +if [ -z "$CONFIG_TYPE" ] || [ "$CONFIG_TYPE" == "unified" ]; then + sonic-cfggen -d -t /usr/share/sonic/templates/frr.conf.j2 >/etc/frr/frr.conf +fi sonic-cfggen -d -t /usr/share/sonic/templates/isolate.j2 >/usr/sbin/bgp-isolate chown root:root /usr/sbin/bgp-isolate diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 7bfbd73dd28c..e0a7585c3003 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -320,3 +320,14 @@ sudo cp target/files/$MLNX_FW_FILE $FILESYSTEM_ROOT/etc/mlnx/fw-SPC.mfa j2 platform/mellanox/mlnx-fw-upgrade.j2 | sudo tee $FILESYSTEM_ROOT/usr/bin/mlnx-fw-upgrade.sh sudo chmod 755 $FILESYSTEM_ROOT/usr/bin/mlnx-fw-upgrade.sh {% endif %} + +{%- if SONIC_ROUTING_STACK == "frr" %} +sudo mkdir $FILESYSTEM_ROOT/etc/sonic/frr +sudo touch $FILESYSTEM_ROOT/etc/sonic/frr/frr.conf +sudo touch $FILESYSTEM_ROOT/etc/sonic/frr/vtysh.conf +sudo cp dockers/docker-fpm-frr/daemons.conf $FILESYSTEM_ROOT/etc/sonic/frr/ +sudo cp dockers/docker-fpm-frr/daemons $FILESYSTEM_ROOT/etc/sonic/frr/ +sudo chown -R $FRR_USER_UID:$FRR_USER_GID $FILESYSTEM_ROOT/etc/sonic/frr +sudo chmod 750 $FILESYSTEM_ROOT/etc/sonic/frr +sudo chmod -R 640 $FILESYSTEM_ROOT/etc/sonic/frr/ +{%- endif %} diff --git a/rules/config b/rules/config index 3e7608d85a73..86139c71540f 100644 --- a/rules/config +++ b/rules/config @@ -75,3 +75,12 @@ ENABLE_ORGANIZATION_EXTENSIONS = y # build: build kernel from source # download: download pre-built kernel from Azure storage. DEFAULT_KERNEL_PROCURE_METHOD = build + +# FRR user and group id values. These only take effect when SONIC_ROUTING_STACK is frr. +# Note: these values match the admin uid/gid of the host's admin account. If these values +# change and user doesn't want the frr uid/gid to potentially match a random user on the +# host, then either the appropriate account and group will need to be created on the host +# manually or changes need to be made when the image is built to create the account and +# group during installation. +FRR_USER_UID = 1000 +FRR_USER_GID = 1000 diff --git a/rules/docker-fpm-frr.mk b/rules/docker-fpm-frr.mk index eedbc13c4e6c..f9a858611fa1 100644 --- a/rules/docker-fpm-frr.mk +++ b/rules/docker-fpm-frr.mk @@ -9,5 +9,6 @@ SONIC_DOCKER_IMAGES += $(DOCKER_FPM_FRR) $(DOCKER_FPM_FRR)_CONTAINER_NAME = bgp $(DOCKER_FPM_FRR)_RUN_OPT += --net=host --privileged -t $(DOCKER_FPM_FRR)_RUN_OPT += -v /etc/sonic:/etc/sonic:ro +$(DOCKER_FPM_FRR)_RUN_OPT += -v /etc/sonic/frr:/etc/frr:rw $(DOCKER_FPM_FRR)_BASE_IMAGE_FILES += vtysh:/usr/bin/vtysh diff --git a/slave.mk b/slave.mk index 1f24a8a9c97b..93811b43371c 100644 --- a/slave.mk +++ b/slave.mk @@ -116,6 +116,14 @@ endif MAKEFLAGS += -j $(SONIC_BUILD_JOBS) export SONIC_CONFIG_MAKE_JOBS +############################################################################### +## Routing stack related exports +############################################################################### + +export SONIC_ROUTING_STACK +export FRR_USER_UID +export FRR_USER_GID + ############################################################################### ## Dumping key config attributes associated to current building exercise ############################################################################### @@ -134,6 +142,10 @@ $(info "SHUTDOWN_BGP_ON_START" : "$(SHUTDOWN_BGP_ON_START)") $(info "ENABLE_PFCWD_ON_START" : "$(ENABLE_PFCWD_ON_START)") $(info "INSTALL_DEBUG_TOOLS" : "$(INSTALL_DEBUG_TOOLS)") $(info "ROUTING_STACK" : "$(SONIC_ROUTING_STACK)") +ifeq ($(SONIC_ROUTING_STACK),frr) +$(info "FRR_USER_UID" : "$(FRR_USER_UID)") +$(info "FRR_USER_GID" : "$(FRR_USER_GID)") +endif $(info "ENABLE_SYNCD_RPC" : "$(ENABLE_SYNCD_RPC)") $(info "ENABLE_ORGANIZATION_EXTENSIONS" : "$(ENABLE_ORGANIZATION_EXTENSIONS)") $(info "HTTP_PROXY" : "$(HTTP_PROXY)") @@ -463,6 +475,8 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_DOCKER_IMAGES)) : $(TARGET_PATH)/%.gz : .pl --build-arg uid=$(UID) \ --build-arg guid=$(GUID) \ --build-arg docker_container_name=$($*.gz_CONTAINER_NAME) \ + --build-arg frr_user_uid=$(FRR_USER_UID) \ + --build-arg frr_user_gid=$(FRR_USER_GID) \ --label Tag=$(SONIC_GET_VERSION) \ -t $* $($*.gz_PATH) $(LOG) docker save $* | gzip -c > $@ diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 2352229decf1..879be0f95d7a 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -422,6 +422,7 @@ def parse_xml(filename, platform=None, port_config_file=None): neighbors = None devices = None hostname = None + docker_routing_config_mode = "unified" port_speeds_default = {} port_speed_png = {} port_descriptions = {} @@ -437,11 +438,14 @@ def parse_xml(filename, platform=None, port_config_file=None): hwsku_qn = QName(ns, "HwSku") hostname_qn = QName(ns, "Hostname") + docker_routing_config_mode_qn = QName(ns, "DockerRoutingConfigMode") for child in root: if child.tag == str(hwsku_qn): hwsku = child.text if child.tag == str(hostname_qn): hostname = child.text + if child.tag == str(docker_routing_config_mode_qn): + docker_routing_config_mode = child.text (ports, alias_map) = get_port_config(hwsku, platform, port_config_file) port_alias_map.update(alias_map) @@ -464,6 +468,7 @@ def parse_xml(filename, platform=None, port_config_file=None): results['DEVICE_METADATA'] = {'localhost': { 'bgp_asn': bgp_asn, 'deployment_id': deployment_id, + 'docker_routing_config_mode': docker_routing_config_mode, 'hostname': hostname, 'hwsku': hwsku, 'type': current_device['type']